From f3493f0e1f92a8a284adb93ecbf350401e1c7423 Mon Sep 17 00:00:00 2001 From: "yangsu@google.com" Date: Mon, 8 Aug 2011 15:12:05 +0000 Subject: [PATCH] iOS/Cocoa SampleApp, Drawingboard, and Networking updates http://codereview.appspot.com/4843041/ http://codereview.appspot.com/4826061/ http://codereview.appspot.com/4832044/ http://codereview.appspot.com/4798055/ git-svn-id: http://skia.googlecode.com/svn/trunk@2058 2bbb7eff-a529-9590-31e7-b0007b416f81 --- experimental/CocoaSampleApp/SampleApp.xib | 77 ++- experimental/CocoaSampleApp/SkNSView.h | 3 +- experimental/CocoaSampleApp/SkNSView.mm | 82 +-- experimental/CocoaSampleApp/SkOSWindow_Mac.mm | 2 +- .../CocoaSampleApp/SkOptionsTableView.h | 3 +- .../CocoaSampleApp/SkOptionsTableView.mm | 129 ++-- experimental/CocoaSampleApp/main.m | 1 + .../DrawingBoard/SampleDrawingClient.cpp | 250 +++++++ .../DrawingBoard/SampleDrawingServer.cpp | 200 ++++++ .../DrawingBoard/SkColorPalette.cpp | 22 +- .../Shared => }/DrawingBoard/SkColorPalette.h | 0 .../DrawingBoard/SkNetPipeController.cpp | 1 - .../DrawingBoard/SkNetPipeController.h | 1 - .../Networking/SampleNetPipeReader.cpp | 110 +++ experimental/{ => Networking}/SkSockets.cpp | 77 +-- experimental/{ => Networking}/SkSockets.h | 123 ++-- .../SimpleCocoaApp/English.lproj/MainMenu.xib | 648 +++++++++++++----- experimental/SkEventNotifier.mm | 10 +- .../iOSSampleApp/Shared/SkAlertPrompt.h | 18 - .../iOSSampleApp/Shared/SkAlertPrompt.m | 49 -- .../Shared/SkOptionsTableViewController.h | 2 +- .../Shared/SkOptionsTableViewController.mm | 46 +- .../Shared/SkUIDetailViewController.mm | 22 +- experimental/iOSSampleApp/Shared/SkUIView.h | 5 +- experimental/iOSSampleApp/Shared/SkUIView.mm | 167 +++-- .../iOSSampleApp/Shared/SkiOSDeviceManager.h | 36 - .../iOSSampleApp.xcodeproj/project.pbxproj | 64 +- gyp/CocoaSampleApp.gyp | 71 +- src/utils/ios/SkOSWindow_iOS.mm | 2 +- 29 files changed, 1523 insertions(+), 698 deletions(-) create mode 100644 experimental/DrawingBoard/SampleDrawingClient.cpp create mode 100644 experimental/DrawingBoard/SampleDrawingServer.cpp rename experimental/{iOSSampleApp/Shared => }/DrawingBoard/SkColorPalette.cpp (92%) rename experimental/{iOSSampleApp/Shared => }/DrawingBoard/SkColorPalette.h (100%) rename experimental/{iOSSampleApp/Shared => }/DrawingBoard/SkNetPipeController.cpp (99%) rename experimental/{iOSSampleApp/Shared => }/DrawingBoard/SkNetPipeController.h (99%) create mode 100644 experimental/Networking/SampleNetPipeReader.cpp rename experimental/{ => Networking}/SkSockets.cpp (86%) rename experimental/{ => Networking}/SkSockets.h (61%) delete mode 100644 experimental/iOSSampleApp/Shared/SkAlertPrompt.h delete mode 100644 experimental/iOSSampleApp/Shared/SkAlertPrompt.m delete mode 100644 experimental/iOSSampleApp/Shared/SkiOSDeviceManager.h diff --git a/experimental/CocoaSampleApp/SampleApp.xib b/experimental/CocoaSampleApp/SampleApp.xib index 5983ea56e..074d52bbe 100644 --- a/experimental/CocoaSampleApp/SampleApp.xib +++ b/experimental/CocoaSampleApp/SampleApp.xib @@ -11,9 +11,9 @@ 851 + - com.apple.InterfaceBuilder.CocoaPlugin @@ -58,7 +58,7 @@ - 256 + 4352 @@ -109,14 +109,10 @@ - 67239488 - 67110912 + 68288064 + 67241216 Text Cell - - LucidaGrande - 13 - 1044 - + 6 @@ -156,7 +152,11 @@ 67239488 272630784 Text - + + LucidaGrande + 13 + 1044 + 6 @@ -192,7 +192,7 @@ MC41AA - 25 + 35 1128267776 @@ -239,11 +239,12 @@ - QSAAAEEgAABB2AAAQdgAAA + QSAAAEEgAABCFAAAQhQAAA {341, 321} + YES NSView @@ -969,6 +970,15 @@ + + + Show Menu Key Equivalents + + 2147483647 + 1 + + + Show Toolbar @@ -2298,6 +2308,14 @@ 712 + + + toggleKeyEquivalents: + + + + 719 + @@ -2738,6 +2756,7 @@ + @@ -3396,6 +3415,11 @@ + + 718 + + + @@ -3509,7 +3533,7 @@ {74, 862} {{6, 978}, {478, 20}} com.apple.InterfaceBuilder.CocoaPlugin - {{591, 416}, {242, 83}} + {{591, 396}, {279, 103}} com.apple.InterfaceBuilder.CocoaPlugin {{475, 832}, {234, 43}} com.apple.InterfaceBuilder.CocoaPlugin @@ -3631,7 +3655,7 @@ com.apple.InterfaceBuilder.CocoaPlugin - P4AAAL+AAAAAAAAAxBNAAA + P4AAAL+AAAAAAAAAw5+AAA com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -3640,6 +3664,7 @@ com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + SkTextFieldCell com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -3647,6 +3672,7 @@ com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -3678,7 +3704,7 @@ - 712 + 719 @@ -3745,11 +3771,30 @@ SkOptionsTableView NSTableView + + toggleKeyEquivalents: + id + + + toggleKeyEquivalents: + + toggleKeyEquivalents: + id + + IBProjectSource ../../experimental/CocoaSampleApp/SkOptionsTableView.h + + SkTextFieldCell + NSTextFieldCell + + IBProjectSource + ../../experimental/CocoaSampleApp/SkTextFieldCell.h + + @@ -3926,7 +3971,7 @@ 0 IBCocoaFramework YES - ../../out/gyp/SampleAppCocoa.xcodeproj + ../../out/gyp/CocoaSampleApp.xcodeproj 3 {9, 8} diff --git a/experimental/CocoaSampleApp/SkNSView.h b/experimental/CocoaSampleApp/SkNSView.h index bce8976fe..cd959f1b9 100644 --- a/experimental/CocoaSampleApp/SkNSView.h +++ b/experimental/CocoaSampleApp/SkNSView.h @@ -2,8 +2,8 @@ #import #include "SampleApp.h" -class SkOSWindow; class SkEvent; +class SkOSWindow; @class SkNSView; @protocol SkNSViewOptionsDelegate @@ -18,7 +18,6 @@ class SkEvent; NSString* fTitle; SkOSWindow* fWind; - NSOpenGLContext* fGLContext; id fOptionsDelegate; } diff --git a/experimental/CocoaSampleApp/SkNSView.mm b/experimental/CocoaSampleApp/SkNSView.mm index 44b30d6b2..4ce3d3d43 100644 --- a/experimental/CocoaSampleApp/SkNSView.mm +++ b/experimental/CocoaSampleApp/SkNSView.mm @@ -1,11 +1,8 @@ #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 @@ -43,8 +40,8 @@ } -(BOOL) inLiveResize { - if (fWind != NULL) { - NSSize s = [self frame].size; + NSSize s = [self frame].size; + if (fWind != NULL && fWind->width() != s.width && fWind->height() != s.height) { fWind->resize(s.width, s.height); [fGLContext update]; } @@ -59,27 +56,40 @@ [super dealloc]; } -- (void)layoutSubviews { - NSSize rect = self.bounds.size; - fWind->resize(rect.width, rect.height); - fWind->inval(NULL); -} - /////////////////////////////////////////////////////////////////////////////// -- (void)drawWithCanvas:(SkCanvas*)canvas { +- (void)drawSkia { fRedrawRequestPending = false; - fWind->draw(canvas); + SkCanvas canvas(fWind->getBitmap()); + 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); +- (void)setSkTitle:(const char *)title { + self.fTitle = [NSString stringWithUTF8String:title]; + [[self window] setTitle:self.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(drawSkia) withObject:nil afterDelay:0]; + } } /////////////////////////////////////////////////////////////////////////////// @@ -121,7 +131,7 @@ static SkKey raw2key(UInt32 raw) { SK_Mac1Key, k1_SkKey }, { SK_Mac2Key, k2_SkKey }, { SK_Mac3Key, k3_SkKey }, - { SK_Mac4Key, k4_SkKey }, + { SK_Mac4Key, k4_SkKey }, { SK_Mac5Key, k5_SkKey }, { SK_Mac6Key, k6_SkKey }, { SK_Mac7Key, k7_SkKey }, @@ -179,34 +189,16 @@ static SkKey raw2key(UInt32 raw) } } -/////////////////////////////////////////////////////////////////////////////// - -- (void)setSkTitle:(const char *)title { - NSString* text = [NSString stringWithUTF8String:title]; - if ([text length] > 0) - self.fTitle = text; - [[self window] setTitle:fTitle]; +- (void)swipeWithEvent:(NSEvent *)event { + CGFloat x = [event deltaX]; + if (x < 0) + ((SampleWindow*)fWind)->previousSample(); + else if (x > 0) + ((SampleWindow*)fWind)->nextSample(); + else + ((SampleWindow*)fWind)->showOverview(); } -- (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 diff --git a/experimental/CocoaSampleApp/SkOSWindow_Mac.mm b/experimental/CocoaSampleApp/SkOSWindow_Mac.mm index d56aa9bc8..dd94ea399 100644 --- a/experimental/CocoaSampleApp/SkOSWindow_Mac.mm +++ b/experimental/CocoaSampleApp/SkOSWindow_Mac.mm @@ -19,7 +19,7 @@ SkOSWindow::~SkOSWindow() { void SkOSWindow::onHandleInval(const SkIRect& r) { if (!fInvalEventIsPending) { fInvalEventIsPending = true; - (new SkEvent(kINVAL_NSVIEW_EventType))->post(this->getSinkID()); + (new SkEvent(kINVAL_NSVIEW_EventType, this->getSinkID()))->post(); } } diff --git a/experimental/CocoaSampleApp/SkOptionsTableView.h b/experimental/CocoaSampleApp/SkOptionsTableView.h index d9e77e280..33dc29f35 100644 --- a/experimental/CocoaSampleApp/SkOptionsTableView.h +++ b/experimental/CocoaSampleApp/SkOptionsTableView.h @@ -13,16 +13,17 @@ @interface SkOptionsTableView : NSTableView { NSMutableArray* fItems; const SkTDArray* fMenus; + BOOL fShowKeys; } @property (nonatomic, retain) NSMutableArray* fItems; - (void)registerMenus:(const SkTDArray*)menus; - (void)updateMenu:(const SkOSMenu*)menu; - (void)loadMenu:(const SkOSMenu*)menu; +- (IBAction)toggleKeyEquivalents:(id)sender; - (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; diff --git a/experimental/CocoaSampleApp/SkOptionsTableView.mm b/experimental/CocoaSampleApp/SkOptionsTableView.mm index 38b6da6ce..2a0cd3038 100644 --- a/experimental/CocoaSampleApp/SkOptionsTableView.mm +++ b/experimental/CocoaSampleApp/SkOptionsTableView.mm @@ -15,6 +15,8 @@ if ((self = [super initWithCoder:coder])) { self.dataSource = self; self.delegate = self; + fMenus = NULL; + fShowKeys = YES; [self setSelectionHighlightStyle:NSTableViewSelectionHighlightStyleNone]; self.fItems = [NSMutableArray array]; } @@ -31,6 +33,13 @@ [self updateMenu:menu]; } +- (IBAction)toggleKeyEquivalents:(id)sender { + fShowKeys = !fShowKeys; + NSMenuItem* item = (NSMenuItem*)sender; + [item setState:fShowKeys]; + [self reloadData]; +} + - (void)registerMenus:(const SkTDArray*)menus { fMenus = menus; for (NSUInteger i = 0; i < fMenus->count(); ++i) { @@ -65,47 +74,53 @@ - (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; + + if (SkOSMenu::kList_Type == item->getType()) { + int index = 0, count = 0; + SkOSMenu::FindListItemCount(item->getEvent(), &count); + NSMutableArray* optionstrs = [[NSMutableArray alloc] initWithCapacity:count]; + SkString options[count]; + SkOSMenu::FindListItems(item->getEvent(), options); + for (int i = 0; i < count; ++i) + [optionstrs addObject:[NSString stringWithUTF8String:options[i].c_str()]]; + SkOSMenu::FindListIndex(item->getEvent(), item->getSlotName(), &index); + option.fCell = [self createList:optionstrs current:index]; + [optionstrs release]; + } + else { + bool state = false; + SkString str; + SkOSMenu::TriState tristate; + switch (item->getType()) { + case SkOSMenu::kAction_Type: + option.fCell = [self createAction]; + break; + case SkOSMenu::kSlider_Type: + SkScalar min, max, value; + SkOSMenu::FindSliderValue(item->getEvent(), item->getSlotName(), &value); + SkOSMenu::FindSliderMin(item->getEvent(), &min); + SkOSMenu::FindSliderMax(item->getEvent(), &max); + option.fCell = [self createSlider:value + min:min + max:max]; + break; + case SkOSMenu::kSwitch_Type: + SkOSMenu::FindSwitchState(item->getEvent(), item->getSlotName(), &state); + option.fCell = [self createSwitch:(BOOL)state]; + break; + case SkOSMenu::kTriState_Type: + SkOSMenu::FindTriState(item->getEvent(), item->getSlotName(), &tristate); + option.fCell = [self createTriState:[self triStateToNSState:tristate]]; + break; + case SkOSMenu::kTextField_Type: + SkOSMenu::FindText(item->getEvent(),item->getSlotName(), &str); + option.fCell = [self createTextField:[NSString stringWithUTF8String:str.c_str()]]; + break; + default: + break; + } } [fItems addObject:option]; [option release]; @@ -118,8 +133,14 @@ - (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()]; + if (columnIndex == 0) { + const SkOSMenu::Item* item = ((SkOptionItem*)[fItems objectAtIndex:row]).fItem; + NSString* label = [NSString stringWithUTF8String:item->getLabel()]; + if (fShowKeys) + return [NSString stringWithFormat:@"%@ (%c)", label, item->getKeyEquivalent()]; + else + return label; + } else return nil; } @@ -151,7 +172,6 @@ [cell setFloatValue:[storedCell floatValue]]; break; case SkOSMenu::kSwitch_Type: - [cell setTitle:storedCell.title]; [cell setState:[(NSButtonCell*)storedCell state]]; break; case SkOSMenu::kTextField_Type: @@ -159,7 +179,6 @@ [cell setStringValue:[storedCell stringValue]]; break; case SkOSMenu::kTriState_Type: - [cell setTitle:storedCell.title]; [cell setState:[(NSButtonCell*)storedCell state]]; break; default: @@ -226,19 +245,6 @@ 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]; @@ -249,8 +255,8 @@ - (NSCell*)createSwitch:(BOOL)state { NSButtonCell* cell = [[[NSButtonCell alloc] init] autorelease]; - [cell setTitle:(state) ? @"On" : @"Off"]; [cell setState:state]; + [cell setTitle:@""]; [cell setButtonType:NSSwitchButton]; return cell; } @@ -265,15 +271,10 @@ - (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 setTitle:@""]; [cell setState:(NSInteger)state]; [cell setButtonType:NSSwitchButton]; return cell; } -@end +@end \ No newline at end of file diff --git a/experimental/CocoaSampleApp/main.m b/experimental/CocoaSampleApp/main.m index 55fa1da67..cba864a86 100644 --- a/experimental/CocoaSampleApp/main.m +++ b/experimental/CocoaSampleApp/main.m @@ -2,6 +2,7 @@ int main(int argc, char *argv[]) { + signal(SIGPIPE, SIG_IGN); NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int retVal = NSApplicationMain(argc, (const char **)argv); [pool release]; diff --git a/experimental/DrawingBoard/SampleDrawingClient.cpp b/experimental/DrawingBoard/SampleDrawingClient.cpp new file mode 100644 index 000000000..9885d518f --- /dev/null +++ b/experimental/DrawingBoard/SampleDrawingClient.cpp @@ -0,0 +1,250 @@ +#include "SampleCode.h" +#include "SkView.h" +#include "SkCanvas.h" +#include "SkGPipe.h" +#include "SkSockets.h" +#include "SkNetPipeController.h" +#include "SkCornerPathEffect.h" +#include "SkColorPalette.h" +#include "SkOSMenu.h" + +#define MAX_READ_PER_FRAME 5 +class DrawingClientView : public SampleView { +public: + DrawingClientView() { + fSocket = NULL; + fTotalBytesRead = 0; + fPalette = new SkColorPalette; + fPalette->setSize(100, 300); + fPalette->setVisibleP(true); + this->attachChildToFront(fPalette); + fPalette->unref(); + fBrushSize = SkFloatToScalar(2.5); + fAA = false; + fPaletteVisible = true; + fSync = false; + fVector = false; + } + ~DrawingClientView() { + if (fSocket) { + delete fSocket; + } + fData.reset(); + fBuffer.reset(); + } + + virtual void requestMenu(SkOSMenu* menu) { + menu->setTitle("Drawing Client"); + menu->appendTextField("Server IP", "Server IP", this->getSinkID(), "IP address or hostname"); + menu->appendSwitch("Vector", "Vector", this->getSinkID(), fVector); + menu->appendSlider("Brush Size", "Brush Size", this->getSinkID(), 1.0, 100.0, fBrushSize); + menu->appendSwitch("Anti-Aliasing", "AA", this->getSinkID(), fAA); + menu->appendSwitch("Show Color Palette", "Palette", this->getSinkID(), fPaletteVisible); + menu->appendSwitch("Sync", "Sync", this->getSinkID(), fSync); + menu->appendAction("Clear", this->getSinkID()); + } + +protected: + + static void readData(int cid, const void* data, size_t size, + SkSocket::DataType type, void* context) { + DrawingClientView* view = (DrawingClientView*)context; + view->onRead(cid, data, size, type); + } + + void onRead(int cid, const void* data, size_t size, SkSocket::DataType type) { + if (size > 0) { + fBuffer.reset(); + if (type == SkSocket::kPipeReplace_type) + fBuffer.append(size, (const char*)data); + else if (type == SkSocket::kPipeAppend_type) + fData.append(size, (const char*)data); + else { + //other types of data + } + } + } + + bool onQuery(SkEvent* evt) { + if (SampleCode::TitleQ(*evt)) { + SampleCode::TitleR(evt, "Drawing Client"); + return true; + } + + return this->INHERITED::onQuery(evt); + } + + bool onEvent(const SkEvent& evt) {; + if (SkOSMenu::FindSliderValue(&evt, "Brush Size", &fBrushSize)) + return true; + + SkString s; + if (SkOSMenu::FindText(&evt, "Server IP", &s)) { + if (NULL != fSocket) { + delete fSocket; + } + fSocket = new SkTCPClient(s.c_str(), 40000); + fSocket->connectToServer(); + fSocket->suspendWrite(); + SkDebugf("Connecting to %s\n", s.c_str()); + fData.reset(); + fBuffer.reset(); + this->inval(NULL); + return true; + } + if (SkOSMenu::FindSwitchState(&evt, "AA", &fAA) || + SkOSMenu::FindSwitchState(&evt, "Sync", &fSync)) + return true; + if (SkOSMenu::FindSwitchState(&evt, "Vector", &fVector)) { + this->clearBitmap(); + return true; + } + if (SkOSMenu::FindAction(&evt, "Clear")) { + this->clear(); + return true; + } + if (SkOSMenu::FindSwitchState(&evt, "Palette", &fPaletteVisible)) { + fPalette->setVisibleP(fPaletteVisible); + return true; + } + return this->INHERITED::onEvent(evt); + } + + virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) { + return new Click(this); + } + + virtual bool onClick(SkView::Click* click) { + switch (click->fState) { + case SkView::Click::kDown_State: + fCurrLine.moveTo(click->fCurr); + fType = SkSocket::kPipeReplace_type; + if (fSocket) + fSocket->resumeWrite(); + break; + case SkView::Click::kMoved_State: + fCurrLine.lineTo(click->fCurr); + break; + case SkView::Click::kUp_State: + fType = SkSocket::kPipeAppend_type; + break; + default: + break; + } + return true; + } + + virtual void onDrawContent(SkCanvas* canvas) { + if (fSocket) { + if (fSocket->isConnected()) { + if (fSync) { + int count = 0; + while (fSocket->readPacket(readData, this) > 0 && + count < MAX_READ_PER_FRAME) + ++count; + } + else + fSocket->readPacket(readData, this); + } + else + fSocket->connectToServer(); + } + size_t bytesRead = 0; + SkCanvas bufferCanvas(fBase); + SkCanvas* tempCanvas; + while (fTotalBytesRead < fData.count()) { + if (fVector) + tempCanvas = canvas; + else + tempCanvas = &bufferCanvas; + SkGPipeReader reader(tempCanvas); + SkGPipeReader::Status status = reader.playback(fData.begin() + fTotalBytesRead, + fData.count() - fTotalBytesRead, + &bytesRead); + SkASSERT(SkGPipeReader::kError_Status != status); + fTotalBytesRead += bytesRead; + } + if (fVector) + fTotalBytesRead = 0; + else + canvas->drawBitmap(fBase, 0, 0, NULL); + + size_t totalBytesRead = 0; + while (totalBytesRead < fBuffer.count()) { + SkGPipeReader reader(canvas); + reader.playback(fBuffer.begin() + totalBytesRead, + fBuffer.count() - totalBytesRead, + &bytesRead); + + totalBytesRead += bytesRead; + } + + SkNetPipeController controller(canvas); + SkGPipeWriter writer; + SkCanvas* writerCanvas = writer.startRecording(&controller, + SkGPipeWriter::kCrossProcess_Flag); + + //controller.disablePlayback(); + SkPaint p; + p.setColor(fPalette->getColor()); + p.setStyle(SkPaint::kStroke_Style); + p.setStrokeWidth(fBrushSize); + p.setStrokeCap(SkPaint::kRound_Cap); + p.setStrokeJoin(SkPaint::kRound_Join); + p.setAntiAlias(fAA); + p.setPathEffect(new SkCornerPathEffect(55))->unref(); + writerCanvas->drawPath(fCurrLine, p); + writer.endRecording(); + + controller.writeToSocket(fSocket, fType); + if (fType == SkSocket::kPipeAppend_type && fSocket) { + fSocket->suspendWrite(); + fCurrLine.reset(); + } + + this->inval(NULL); + } + + virtual void onSizeChange() { + this->INHERITED::onSizeChange(); + fPalette->setLoc(this->width()-100, 0); + fBase.setConfig(SkBitmap::kARGB_8888_Config, this->width(), this->height()); + fBase.allocPixels(NULL); + this->clearBitmap(); + } + +private: + void clear() { + fData.reset(); + fBuffer.reset(); + fCurrLine.reset(); + fTotalBytesRead = 0; + this->clearBitmap(); + } + void clearBitmap() { + fTotalBytesRead = 0; + fBase.eraseColor(fBGColor); + } + SkTDArray fData; + SkTDArray fBuffer; + SkBitmap fBase; + SkPath fCurrLine; + SkTCPClient* fSocket; + SkSocket::DataType fType; + SkColorPalette* fPalette; + bool fPaletteVisible; + size_t fTotalBytesRead; + SkScalar fBrushSize; + bool fAA; + bool fSync; + bool fVector; + + typedef SampleView INHERITED; +}; + + +/////////////////////////////////////////////////////////////////////////////// + +static SkView* MyFactory() { return new DrawingClientView; } +static SkViewRegister reg(MyFactory); + diff --git a/experimental/DrawingBoard/SampleDrawingServer.cpp b/experimental/DrawingBoard/SampleDrawingServer.cpp new file mode 100644 index 000000000..6542b5889 --- /dev/null +++ b/experimental/DrawingBoard/SampleDrawingServer.cpp @@ -0,0 +1,200 @@ +#include "SampleCode.h" +#include "SkView.h" +#include "SkCanvas.h" +#include "SkGPipe.h" +#include "SkSockets.h" +#include "SkNetPipeController.h" +#include "SkCornerPathEffect.h" +#include "SkOSMenu.h" +#include +class DrawingServerView : public SampleView { +public: + DrawingServerView(){ + fServer = new SkTCPServer(40000); + fServer->suspendWrite(); + fTotalBytesRead = fTotalBytesWritten = 0; + fVector = true; + } + ~DrawingServerView() { + delete fServer; + fData.reset(); + fBuffer.reset(); + fClientMap.clear(); + } + + virtual void requestMenu(SkOSMenu* menu) { + menu->setTitle("Drawing Server"); + menu->appendAction("Clear", this->getSinkID()); + menu->appendSwitch("Vector", "Vector", this->getSinkID(), fVector); + } + +protected: + static void readData(int cid, const void* data, size_t size, + SkSocket::DataType type, void* context) { + DrawingServerView* view = (DrawingServerView*)context; + view->onRead(cid, data, size, type); + } + + void onRead(int cid, const void* data, size_t size, SkSocket::DataType type) { + if (NULL == data && size <= 0) + return; + + ClientState* cs; + std::map::iterator it = fClientMap.find(cid); + if (it == fClientMap.end()) { //New client + cs = new ClientState; + cs->bufferBase = 0; + cs->bufferSize = 0; + fClientMap[cid] = cs; + } + else { + cs = it->second; + } + + if (type == SkSocket::kPipeReplace_type) { + fBuffer.remove(cs->bufferBase, cs->bufferSize); + + for (it = fClientMap.begin(); it != fClientMap.end(); ++it) { + if (cid == it->first) + continue; + else { + if (it->second->bufferBase > cs->bufferBase) { + it->second->bufferBase -= cs->bufferSize; + SkASSERT(it->second->bufferBase >= 0); + } + } + } + + cs->bufferBase = fBuffer.count(); + cs->bufferSize = size; + fBuffer.append(size, (const char*)data); + } + else if (type == SkSocket::kPipeAppend_type) { + fData.append(size, (const char*)data); + fServer->resumeWrite(); + fServer->writePacket(fData.begin() + fTotalBytesWritten, + fData.count() - fTotalBytesWritten, + SkSocket::kPipeAppend_type); + fTotalBytesWritten = fData.count(); + fServer->suspendWrite(); + //this->clearBitmap(); + } + else { + //other types of data + } + } + + // overrides from SkEventSink + bool onQuery(SkEvent* evt) { + if (SampleCode::TitleQ(*evt)) { + SampleCode::TitleR(evt, "Drawing Server"); + return true; + } + return this->INHERITED::onQuery(evt); + } + + bool onEvent(const SkEvent& evt) { + if (SkOSMenu::FindAction(&evt, "Clear")) { + this->clear(); + return true; + } + if (SkOSMenu::FindSwitchState(&evt, "Vector", &fVector)) { + this->clearBitmap(); + return true; + } + return this->INHERITED::onEvent(evt); + } + + + virtual void onDrawContent(SkCanvas* canvas) { + if (fCurrMatrix != canvas->getTotalMatrix()) { + fTotalBytesRead = 0; + fCurrMatrix = canvas->getTotalMatrix(); + } + + fServer->acceptConnections(); + if (fServer->readPacket(readData, this) > 0) { + fServer->resumeWrite(); + } + else { + fServer->suspendWrite(); + } + + size_t bytesRead; + SkCanvas bufferCanvas(fBase); + SkCanvas* tempCanvas; + while (fTotalBytesRead < fData.count()) { + if (fVector) + tempCanvas = canvas; + else + tempCanvas = &bufferCanvas; + SkGPipeReader reader(tempCanvas); + SkGPipeReader::Status stat = reader.playback(fData.begin() + fTotalBytesRead, + fData.count() - fTotalBytesRead, + &bytesRead); + SkASSERT(SkGPipeReader::kError_Status != stat); + fTotalBytesRead += bytesRead; + + if (SkGPipeReader::kDone_Status == stat) {} + } + if (fVector) + fTotalBytesRead = 0; + else + canvas->drawBitmap(fBase, 0, 0, NULL); + + size_t totalBytesRead = 0; + while (totalBytesRead < fBuffer.count()) { + SkGPipeReader reader(canvas); + reader.playback(fBuffer.begin() + totalBytesRead, + fBuffer.count() - totalBytesRead, + &bytesRead); + totalBytesRead += bytesRead; + } + + fServer->writePacket(fBuffer.begin(), fBuffer.count(), + SkSocket::kPipeReplace_type); + + this->inval(NULL); + } + + virtual void onSizeChange() { + this->INHERITED::onSizeChange(); + fBase.setConfig(SkBitmap::kARGB_8888_Config, this->width(), this->height()); + fBase.allocPixels(NULL); + this->clearBitmap(); + } + +private: + void clear() { + fData.reset(); + fBuffer.reset(); + fTotalBytesRead = fTotalBytesWritten = 0; + fClientMap.clear(); + this->clearBitmap(); + } + void clearBitmap() { + fTotalBytesRead = 0; + fBase.eraseColor(fBGColor); + } + + struct ClientState { + int bufferBase; + int bufferSize; + }; + std::map fClientMap; + SkTDArray fData; + SkTDArray fBuffer; + size_t fTotalBytesRead; + size_t fTotalBytesWritten; + SkMatrix fCurrMatrix; + SkBitmap fBase; + bool fVector; + SkTCPServer* fServer; + typedef SampleView INHERITED; +}; + + +/////////////////////////////////////////////////////////////////////////////// + +static SkView* MyFactory() { return new DrawingServerView; } +static SkViewRegister reg(MyFactory); diff --git a/experimental/iOSSampleApp/Shared/DrawingBoard/SkColorPalette.cpp b/experimental/DrawingBoard/SkColorPalette.cpp similarity index 92% rename from experimental/iOSSampleApp/Shared/DrawingBoard/SkColorPalette.cpp rename to experimental/DrawingBoard/SkColorPalette.cpp index c1c3f9400..16f224acd 100644 --- a/experimental/iOSSampleApp/Shared/DrawingBoard/SkColorPalette.cpp +++ b/experimental/DrawingBoard/SkColorPalette.cpp @@ -16,9 +16,12 @@ SkColorPalette::SkColorPalette() { fGradientRect = SkRect::MakeWH(SkIntToScalar(100), SkIntToScalar(100)); fSelected = 0; fCurrColor = 0xFF000000; - for (int i = 0; i < PaletteSlots; ++i) { - fColors[i] = 0xFF000000; - } + + fColors[0] = SK_ColorWHITE; + fColors[1] = SK_ColorBLACK; + fColors[2] = SK_ColorRED; + fColors[3] = SK_ColorGREEN; + fColors[4] = SK_ColorBLUE; } bool SkColorPalette::onEvent(const SkEvent& evt) { @@ -26,24 +29,27 @@ bool SkColorPalette::onEvent(const SkEvent& evt) { } void SkColorPalette::onDraw(SkCanvas* canvas) { - canvas->drawColor(0xFFEEEEEE); + canvas->drawColor(SK_ColorWHITE); SkPaint paint; paint.setAntiAlias(true); - paint.setStyle(SkPaint::kStrokeAndFill_Style); canvas->translate(PalettePadding, PalettePadding); + for (int i = 0; i < PaletteSlots; ++i) { if (fSelected == i) { paint.setStrokeWidth(SkIntToScalar(3)); } else { - paint.setStrokeWidth(0); + paint.setStrokeWidth(1); } - + + paint.setStyle(SkPaint::kStroke_Style); + paint.setColor(SK_ColorBLACK); + canvas->drawRect(fSlotRect, paint); + paint.setStyle(SkPaint::kFill_Style); paint.setColor(fColors[i]); canvas->drawRect(fSlotRect, paint); - canvas->translate(0, fSlotRect.height() + PalettePadding); } paint.setStrokeWidth(0); diff --git a/experimental/iOSSampleApp/Shared/DrawingBoard/SkColorPalette.h b/experimental/DrawingBoard/SkColorPalette.h similarity index 100% rename from experimental/iOSSampleApp/Shared/DrawingBoard/SkColorPalette.h rename to experimental/DrawingBoard/SkColorPalette.h diff --git a/experimental/iOSSampleApp/Shared/DrawingBoard/SkNetPipeController.cpp b/experimental/DrawingBoard/SkNetPipeController.cpp similarity index 99% rename from experimental/iOSSampleApp/Shared/DrawingBoard/SkNetPipeController.cpp rename to experimental/DrawingBoard/SkNetPipeController.cpp index e047ba873..01a844b61 100644 --- a/experimental/iOSSampleApp/Shared/DrawingBoard/SkNetPipeController.cpp +++ b/experimental/DrawingBoard/SkNetPipeController.cpp @@ -1,4 +1,3 @@ - /* * Copyright 2011 Google Inc. * diff --git a/experimental/iOSSampleApp/Shared/DrawingBoard/SkNetPipeController.h b/experimental/DrawingBoard/SkNetPipeController.h similarity index 99% rename from experimental/iOSSampleApp/Shared/DrawingBoard/SkNetPipeController.h rename to experimental/DrawingBoard/SkNetPipeController.h index b59d067ce..f38d4dab2 100644 --- a/experimental/iOSSampleApp/Shared/DrawingBoard/SkNetPipeController.h +++ b/experimental/DrawingBoard/SkNetPipeController.h @@ -1,4 +1,3 @@ - /* * Copyright 2011 Google Inc. * diff --git a/experimental/Networking/SampleNetPipeReader.cpp b/experimental/Networking/SampleNetPipeReader.cpp new file mode 100644 index 000000000..0d90286ad --- /dev/null +++ b/experimental/Networking/SampleNetPipeReader.cpp @@ -0,0 +1,110 @@ +#include "SampleCode.h" +#include "SkView.h" +#include "SkCanvas.h" +#include "SkGradientShader.h" +#include "SkGPipe.h" +#include "SkSockets.h" +#include "SkOSMenu.h" + +#define MAX_READS_PER_FRAME 5 +class NetPipeReaderView : public SampleView { +public: + NetPipeReaderView() { + fSocket = NULL; + fSync = false; + } + + ~NetPipeReaderView() { + if (fSocket) { + delete fSocket; + } + fDataArray.reset(); + } + virtual void requestMenu(SkOSMenu* menu) { + menu->setTitle("Net Pipe Reader"); + menu->appendTextField("Server IP", "Server IP", this->getSinkID(), + "IP address"); + menu->appendSwitch("Sync", "Sync", this->getSinkID(), fSync); + } + +protected: + static void readData(int cid, const void* data, size_t size, + SkSocket::DataType type, void* context) { + NetPipeReaderView* view = (NetPipeReaderView*)context; + view->onRead(data, size); + } + + void onRead(const void* data, size_t size) { + if (size > 0) + fDataArray.append(size, (const char*)data); + } + + bool onQuery(SkEvent* evt) { + if (SampleCode::TitleQ(*evt)) { + SampleCode::TitleR(evt, "Net Pipe Reader"); + return true; + } + return this->INHERITED::onQuery(evt); + } + + bool onEvent(const SkEvent& evt) {; + SkString s; + if (SkOSMenu::FindText(&evt, "Server IP", &s)) { + if (NULL != fSocket) { + delete fSocket; + } + fSocket = new SkTCPClient(s.c_str()); + fSocket->connectToServer(); + SkDebugf("Connecting to %s\n", s.c_str()); + return true; + } + if (SkOSMenu::FindSwitchState(&evt, "Sync", &fSync)) + return true; + return this->INHERITED::onEvent(evt); + } + + void onDrawContent(SkCanvas* canvas) { + if (NULL == fSocket) + return; + + if (fSocket->isConnected()) { + int dataToRemove = fDataArray.count(); + if (fSync) { + int numreads = 0; + while (fSocket->readPacket(readData, this) > 0 && + numreads < MAX_READS_PER_FRAME) { + fDataArray.remove(0, dataToRemove); + dataToRemove = fDataArray.count(); + ++numreads; + } + } + else { + if (fSocket->readPacket(readData, this) > 0) + fDataArray.remove(0, dataToRemove); + } + } + else + fSocket->connectToServer(); + + SkGPipeReader reader(canvas); + size_t bytesRead; + SkGPipeReader::Status fStatus = reader.playback(fDataArray.begin(), + fDataArray.count(), + &bytesRead); + SkASSERT(SkGPipeReader::kError_Status != fStatus); + this->inval(NULL); + } + +private: + bool fSync; + SkTDArray fDataArray; + SkTCPClient* fSocket; + typedef SampleView INHERITED; +}; + + +/////////////////////////////////////////////////////////////////////////////// + +static SkView* MyFactory() { return new NetPipeReaderView; } +static SkViewRegister reg(MyFactory); + diff --git a/experimental/SkSockets.cpp b/experimental/Networking/SkSockets.cpp similarity index 86% rename from experimental/SkSockets.cpp rename to experimental/Networking/SkSockets.cpp index dd72e64b4..ccf6010f4 100644 --- a/experimental/SkSockets.cpp +++ b/experimental/Networking/SkSockets.cpp @@ -1,4 +1,3 @@ - /* * Copyright 2011 Google Inc. * @@ -20,8 +19,6 @@ SkSocket::SkSocket() { fReadSuspended = false; fWriteSuspended = false; fSockfd = this->createSocket(); - fTimeout.tv_sec = 0; - fTimeout.tv_usec = 0; } SkSocket::~SkSocket() { @@ -31,7 +28,13 @@ SkSocket::~SkSocket() { int SkSocket::createSocket() { int sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { - //SkDebugf("ERROR opening socket\n"); + SkDebugf("ERROR opening socket\n"); + return -1; + } + int reuse = 1; + + if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(int)) < 0) { + SkDebugf("error: %s\n", strerror(errno)); return -1; } #ifdef NONBLOCKING_SOCKETS @@ -46,8 +49,9 @@ void SkSocket::closeSocket(int sockfd) { if (!fReady) return; - //SkDebugf("Closed fd:%d\n", sockfd); + shutdown(sockfd, 2); //stop sending/receiving close(sockfd); + //SkDebugf("Closed fd:%d\n", sockfd); if (FD_ISSET(sockfd, &fMasterSet)) { FD_CLR(sockfd, &fMasterSet); @@ -56,10 +60,8 @@ void SkSocket::closeSocket(int sockfd) { fMaxfd -= 1; } } - if (0 == fMaxfd) { + if (0 == fMaxfd) fConnected = false; - //SkDebugf("all connections closed\n"); - } } void SkSocket::onFailedConnection(int sockfd) { @@ -77,9 +79,10 @@ void SkSocket::addToMasterSet(int sockfd) { fMaxfd = sockfd; } -int SkSocket::readPacket(void (*onRead)(const void*, size_t, int, DataType, +int SkSocket::readPacket(void (*onRead)(int, const void*, size_t, DataType, void*), void* context) { - if (!fConnected || !fReady || NULL == onRead || fReadSuspended) + if (!fConnected || !fReady || NULL == onRead || NULL == context + || fReadSuspended) return -1; int totalBytesRead = 0; @@ -139,9 +142,9 @@ int SkSocket::readPacket(void (*onRead)(const void*, size_t, int, DataType, failure = true; break; } - //SkDebugf("read packet(done:%d, bytes:%d) from fd:%d in %d attempts\n", + //SkDebugf("read packet(done:%d, bytes:%d) from fd:%d in %d tries\n", // h.done, h.bytes, fSockfd, attempts); - stream.write(packet + HEADER_SIZE, h.bytes);\ + stream.write(packet + HEADER_SIZE, h.bytes); bytesReadInPacket = 0; attempts = 0; bytesReadInTransfer += h.bytes; @@ -156,7 +159,7 @@ int SkSocket::readPacket(void (*onRead)(const void*, size_t, int, DataType, if (bytesReadInTransfer > 0) { SkData* data = stream.copyToData(); SkASSERT(data->size() == bytesReadInTransfer); - onRead(data->data(), data->size(), i, h.type, context); + onRead(i, data->data(), data->size(), h.type, context); data->unref(); totalBytesRead += bytesReadInTransfer; @@ -206,7 +209,7 @@ int SkSocket::writePacket(void* data, size_t size, DataType type) { #ifdef NONBLOCKING_SOCKETS else if (errno == EWOULDBLOCK || errno == EAGAIN) { if (bytesWrittenInPacket > 0 || bytesWrittenInTransfer > 0) - continue; //incomplete packet or frame, keep tring + continue; //incomplete packet or frame, keep trying else break; //client not available, skip current transfer } @@ -220,10 +223,8 @@ int SkSocket::writePacket(void* data, size_t size, DataType type) { } bytesWrittenInPacket += retval; - if (bytesWrittenInPacket < PACKET_SIZE) { - //SkDebugf("Wrote %d/%d\n", bytesWrittenInPacket, PACKET_SIZE); - continue; //incomplete packet, keep tring - } + if (bytesWrittenInPacket < PACKET_SIZE) + continue; //incomplete packet, keep trying SkASSERT(bytesWrittenInPacket == PACKET_SIZE); //SkDebugf("wrote to packet(done:%d, bytes:%d) to fd:%d in %d tries\n", @@ -233,15 +234,14 @@ int SkSocket::writePacket(void* data, size_t size, DataType type) { attempts = 0; } - if (failure) { - //SkDebugf("Failed to write to fd:%d, terminating connection\n", i); + if (failure) this->onFailedConnection(i); - } totalBytesWritten += bytesWrittenInTransfer; } return totalBytesWritten; } + //////////////////////////////////////////////////////////////////////////////// SkTCPServer::SkTCPServer(int port) { sockaddr_in serverAddr; @@ -250,33 +250,32 @@ SkTCPServer::SkTCPServer(int port) { serverAddr.sin_port = htons(port); if (bind(fSockfd, (sockaddr*)&serverAddr, sizeof(serverAddr)) < 0) { - //SkDebugf("ERROR on binding\n"); + SkDebugf("ERROR on binding: %s\n", strerror(errno)); fReady = false; } } SkTCPServer::~SkTCPServer() { - this->disconnectAllConnections(); + this->disconnectAll(); } -int SkTCPServer::acceptIncomingConnections() { +int SkTCPServer::acceptConnections() { if (!fReady) return -1; -// if (fConnected) -// return 0; - listen(fSockfd, MAX_CLIENTS); - ////SkDebugf("Accepting Incoming connections\n"); + listen(fSockfd, MAX_WAITING_CLIENTS); int newfd; - - for (int i = 0; i < MAX_CLIENTS; ++i) { + for (int i = 0; i < MAX_WAITING_CLIENTS; ++i) { #ifdef NONBLOCKING_SOCKETS fd_set workingSet; FD_ZERO(&workingSet); FD_SET(fSockfd, &workingSet); - int sel = select(fSockfd + 1, &workingSet, NULL, NULL, &fTimeout); + timeval timeout; + timeout.tv_sec = 0; + timeout.tv_usec = 0; + int sel = select(fSockfd + 1, &workingSet, NULL, NULL, &timeout); if (sel < 0) { - //SkDebugf("select() failed with error %s\n", strerror(errno)); + SkDebugf("select() failed with error %s\n", strerror(errno)); continue; } if (sel == 0) //select() timed out @@ -286,10 +285,10 @@ int SkTCPServer::acceptIncomingConnections() { socklen_t clientLen = sizeof(clientAddr); newfd = accept(fSockfd, (struct sockaddr*)&clientAddr, &clientLen); if (newfd< 0) { - //SkDebugf("accept() failed with error %s\n", strerror(errno)); + SkDebugf("accept() failed with error %s\n", strerror(errno)); continue; } - //SkDebugf("New incoming connection - %d\n", newfd); + SkDebugf("New incoming connection - %d\n", newfd); fConnected = true; #ifdef NONBLOCKING_SOCKETS this->setNonBlocking(newfd); @@ -300,12 +299,10 @@ int SkTCPServer::acceptIncomingConnections() { } -int SkTCPServer::disconnectAllConnections() { - ////SkDebugf("disconnecting server\n"); +int SkTCPServer::disconnectAll() { if (!fConnected || !fReady) return -1; - for (int i = 0; i <= fMaxfd; ++i) - { + for (int i = 0; i <= fMaxfd; ++i) { if (FD_ISSET(i, &fMasterSet)) this->closeSocket(i); } @@ -331,7 +328,7 @@ SkTCPClient::SkTCPClient(const char* hostname, int port) { } } -void SkTCPClient::onFailedConnection(int sockfd) { +void SkTCPClient::onFailedConnection(int sockfd) { //cleanup and recreate socket SkASSERT(sockfd == fSockfd); this->closeSocket(fSockfd); fSockfd = this->createSocket(); @@ -358,6 +355,6 @@ int SkTCPClient::connectToServer() { } } fConnected = true; - //SkDebugf("Succesfully reached server\n"); + SkDebugf("Succesfully reached server\n"); return 0; } diff --git a/experimental/SkSockets.h b/experimental/Networking/SkSockets.h similarity index 61% rename from experimental/SkSockets.h rename to experimental/Networking/SkSockets.h index 8d32a29b7..1f47a9402 100644 --- a/experimental/SkSockets.h +++ b/experimental/Networking/SkSockets.h @@ -1,4 +1,3 @@ - /* * Copyright 2011 Google Inc. * @@ -12,19 +11,15 @@ #include #include "SkTypes.h" #include "SkStream.h" + /* PACKET and HEADER Format */ #define PACKET_SIZE 1024 #define HEADER_SIZE 20 #define CONTENT_SIZE 1004 #define DEFAULT_PORT 15555 - +#define MAX_WAITING_CLIENTS 3 #define NONBLOCKING_SOCKETS -#ifdef NONBLOCKING_SOCKETS -#define MAX_CLIENTS 3 -#else -#define MAX_CLIENTS 1 -#endif class SkSocket { public: @@ -44,7 +39,9 @@ public: kString_type, kInt_type }; - /* + + bool isConnected() { return fConnected; } + /** * Write data to the socket. Data is a pointer to the beginning of the data * to be sent and dataSize specifies the number of bytes to send. This * method will spread the data across multiple packets if the data can't all @@ -54,29 +51,40 @@ public: * was an error during the transfer, in which case the method returns -1. * For blocking sockets, write will block indefinitely if the socket at the * other end of the connection doesn't receive any data. + * NOTE: This method guarantees that all of the data will be sent unless + * there was an error, so it might block temporarily when the write buffer + * is full */ int writePacket(void* data, size_t size, DataType type = kPipeAppend_type); - - /* + + /** * Read a logical packet from socket. The data read will be stored * sequentially in the dataArray. This method will keep running until all * the data in a logical chunk has been read (assembling multiple partial * packets if necessary) and return the number of bytes successfully read, - * unless there was an error, in which case the method returns -1. NOTE: For + * unless there was an error, in which case the method returns -1. \For * nonblocking sockets, read will return 0 if there's nothing to read. For * blocking sockets, read will block indefinitely if the socket doesn't * receive any data. - * once + * NOTE: This method guarantees that all the data in a logical packet will + * be read so there might be temporary delays if it's waiting for parts of a + * packet */ - int readPacket(void (*onRead)(const void* data, size_t size,int cid, + int readPacket(void (*onRead)(int cid, const void* data, size_t size, DataType type, void*), void* context); - // Suspend network transfers until resume() is called. Leaves all - // connections in tact. + /** + * Suspend network transfers until resume() is called. Leaves all + * connections in tact. + */ void suspendAll() { fReadSuspended = fWriteSuspended = true; } - // Resume all network transfers. + /** + * Resume all network transfers. + */ void resumeAll() { fReadSuspended = fWriteSuspended = false; } - // Other helper functions + /** + * Other helper functions + */ void suspendRead() { fReadSuspended = true; } void resumeRead() { fReadSuspended = false; } void suspendWrite() { fWriteSuspended = true; } @@ -89,22 +97,34 @@ protected: DataType type; }; - // Create a socket and return its file descriptor. Returns -1 on failure + /** + * Create a socket and return its file descriptor. Returns -1 on failure + */ int createSocket(); - // Close the socket specifies by the socket file descriptor passed in. Will - // update fMaxfd + + /** + * Close the socket specified by the socket file descriptor argument. Will + * update fMaxfd and working set properly + */ void closeSocket(int sockfd); - // called when a broken or terminated connection has been detected. Closes - // the socket file descriptor and removes it from the master set by default. - // Override to handle broken connections differently + /** + * Called when a broken or terminated connection has been detected. Closes + * the socket file descriptor and removes it from the master set by default. + * Override to handle broken connections differently + */ virtual void onFailedConnection(int sockfd); - // set the socket specified by the socket file descriptor as nonblocking + /** + * Set the socket specified by the socket file descriptor as nonblocking + */ void setNonBlocking(int sockfd); - // add the socket specified by the socket file descriptor to the master - // file descriptor set, which is used to in the select() to detect new data - // or connections + + /** + * Add the socket specified by the socket file descriptor to the master + * file descriptor set, which is used to in the select() to detect new data + * or connections + */ void addToMasterSet(int sockfd); bool fConnected; @@ -114,32 +134,37 @@ protected: int fMaxfd; int fPort; int fSockfd; - // fMasterSet contains all the file descriptors to be used for read/write. - // For clients, this will only contain fSockfd. For servers, this will - // contain all the file descriptors associated with established connections - // to clients + + /** + * fMasterSet contains all the file descriptors to be used for read/write. + * For clients, this only contains the client socket. For servers, this + * contains all the file descriptors associated with established connections + * to clients + */ fd_set fMasterSet; - timeval fTimeout; }; /* * TCP server. Can accept simultaneous connections to multiple SkTCPClients and * read/write data back and forth using read/writePacket calls. Port number can - * be specified, but make sure that the clients use the same port for connections + * be specified, but make sure that client/server use the same port */ class SkTCPServer : public SkSocket { public: SkTCPServer(int port = DEFAULT_PORT); ~SkTCPServer(); - // accept any incoming connections to the server, will only accept a limited - // number of clients (specified by MAX_CLIENTS) at a time. Returns -1 on - // error. For blocking sockets, this method will block until a client has - // connected - int acceptIncomingConnections(); + /** + * Accept any incoming connections to the server, will accept 1 connection + * at a time. Returns -1 on error. For blocking sockets, this method will + * block until a client calls connectToServer() + */ + int acceptConnections(); - // disconnect all connections to clients. Returns -1 on error - int disconnectAllConnections(); + /** + * Disconnect all connections to clients. Returns -1 on error + */ + int disconnectAll(); private: typedef SkSocket INHERITED; }; @@ -153,15 +178,17 @@ class SkTCPClient : public SkSocket { public: SkTCPClient(const char* hostname, int port = DEFAULT_PORT); - // Connect to server. Returns -1 on error or failure. Make sure to call this - // before any read/write operation to make sure that a connection is - // is established or is still open and reconnect to server if necessary. For - // blocking sockets, this method will block until the connection is accepted - // by the server. + /** + * Connect to server. Returns -1 on error or failure. Call this to connect + * or reconnect to the server. For blocking sockets, this method will block + * until the connection is accepted by the server. + */ int connectToServer(); - - // Client needs to recreate the socket when a connection is broken because - // connect can only be called successfully once. +protected: + /** + * Client needs to recreate the socket when a connection is broken because + * connect can only be called successfully once. + */ virtual void onFailedConnection(int sockfd); private: sockaddr_in fServerAddr; diff --git a/experimental/SimpleCocoaApp/English.lproj/MainMenu.xib b/experimental/SimpleCocoaApp/English.lproj/MainMenu.xib index 7c6b8c88d..c62a28644 100644 --- a/experimental/SimpleCocoaApp/English.lproj/MainMenu.xib +++ b/experimental/SimpleCocoaApp/English.lproj/MainMenu.xib @@ -2,9 +2,9 @@ 1060 - 10J3250 + 10K540 851 - 1038.35 + 1038.36 461.00 com.apple.InterfaceBuilder.CocoaPlugin @@ -12,7 +12,9 @@ YES + + YES @@ -1326,6 +1328,33 @@ 274 + + YES + + + 268 + {{362, 312}, {96, 32}} + + YES + + 67239424 + 134217728 + Button + + LucidaGrande + 13 + 1044 + + + -2038284033 + 129 + + + 200 + 25 + + + {480, 360} SkNSView @@ -1343,6 +1372,194 @@ NSFontManager + + + 256 + + YES + + + 274 + + YES + + + 2304 + + YES + + + 256 + {241, 301} + + YES + + + -2147483392 + {{224, 0}, {16, 17}} + + + YES + + 100 + 40 + 1000 + + 75628096 + 2048 + + + LucidaGrande + 11 + 3100 + + + 3 + MC4zMzMzMzI5ODU2AA + + + 6 + System + headerTextColor + + 3 + MAA + + + + + 337772096 + 2048 + Text Cell + + + + 6 + System + controlBackgroundColor + + 3 + MC42NjY2NjY2ODY1AA + + + + 6 + System + controlTextColor + + + + 3 + YES + YES + + + + 135 + 40 + 1000 + + 75628096 + 2048 + + + + + + + 337772096 + 2048 + Text Cell + + + + + + 3 + YES + YES + + + + 3 + 2 + + 3 + MQA + + + 6 + System + gridColor + + 3 + MC41AA + + + 17 + -700448768 + + + 1 + 4 + 15 + 0 + YES + 0 + + + {{1, 1}, {241, 301}} + + + + + 4 + + + + -2147483392 + {{317, 1}, {15, 574}} + + + _doScroller: + 0.95370370149612427 + + + + -2147483392 + {{1, 263}, {157, 15}} + + 1 + + _doScroller: + 0.98996657133102417 + + + {243, 303} + + + 562 + + + + QSAAAEEgAABBmAAAQZgAAA + + + {243, 303} + + NSView + + + + {200, 100} + {0, 0} + {10000, 10000} + 2 + 0.0 + 15 + + + @@ -1907,14 +2124,6 @@ 493 - - - delegate - - - - 495 - alignCenter: @@ -2021,19 +2230,27 @@ - fView - - + contentView + + - 535 + 542 + + + + toggle: + + + + 649 - window - + parentWindow + - 536 + 650 @@ -3085,8 +3302,100 @@ 533 + + YES + + + + 538 + + + YES + + + + Drawer Content View + + + 539 + + + + + 629 + + + YES + + + + + + + + 630 + + + + + 631 + + + + + 632 + + + YES + + + + + + + 634 + + + YES + + + + + + 637 + + + + + 635 + + + YES + + + + + + 636 + + + + + 646 + + + YES + + + + + + 647 + + + @@ -3312,6 +3621,9 @@ 517.IBPluginDependency 533.IBPluginDependency 533.IBViewBoundsToFrameTransform + 538.IBEditorWindowLastContentRect + 538.IBPluginDependency + 539.IBPluginDependency 56.IBPluginDependency 56.ImportedFromIB2 57.IBEditorWindowLastContentRect @@ -3320,6 +3632,18 @@ 57.editorWindowContentRectSynchronizationRect 58.IBPluginDependency 58.ImportedFromIB2 + 629.IBPluginDependency + 629.IBViewBoundsToFrameTransform + 630.IBPluginDependency + 631.IBPluginDependency + 632.IBPluginDependency + 634.IBPluginDependency + 635.IBPluginDependency + 636.IBPluginDependency + 637.IBPluginDependency + 646.IBPluginDependency + 646.IBViewBoundsToFrameTransform + 647.IBPluginDependency 72.IBPluginDependency 72.ImportedFromIB2 73.IBPluginDependency @@ -3404,7 +3728,7 @@ com.apple.InterfaceBuilder.CocoaPlugin - {{547, 180}, {254, 283}} + {{559, 374}, {254, 283}} com.apple.InterfaceBuilder.CocoaPlugin {{187, 434}, {243, 243}} @@ -3449,17 +3773,17 @@ com.apple.InterfaceBuilder.CocoaPlugin - {{654, 239}, {194, 73}} + {{719, 584}, {194, 73}} com.apple.InterfaceBuilder.CocoaPlugin {{525, 802}, {197, 73}} - {{380, 836}, {489, 20}} + {{366, 657}, {485, 20}} com.apple.InterfaceBuilder.CocoaPlugin {74, 862} {{6, 978}, {478, 20}} com.apple.InterfaceBuilder.CocoaPlugin - {{604, 269}, {231, 43}} + {{669, 614}, {231, 43}} com.apple.InterfaceBuilder.CocoaPlugin {{475, 832}, {234, 43}} com.apple.InterfaceBuilder.CocoaPlugin @@ -3478,16 +3802,16 @@ com.apple.InterfaceBuilder.CocoaPlugin - {{358, 214}, {480, 360}} + {{83, 418}, {480, 360}} com.apple.InterfaceBuilder.CocoaPlugin - {{358, 214}, {480, 360}} + {{83, 418}, {480, 360}} {{33, 99}, {480, 360}} {3.40282e+38, 3.40282e+38} {0, 0} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - {{591, 420}, {83, 43}} + {{603, 614}, {83, 43}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin {{523, 2}, {178, 283}} @@ -3537,7 +3861,7 @@ com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - {{725, 289}, {246, 23}} + {{790, 634}, {221, 23}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -3570,15 +3894,34 @@ AULIAABDAgAAA + {{136, 964}, {243, 303}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - {{286, 129}, {275, 183}} + {{378, 474}, {250, 183}} com.apple.InterfaceBuilder.CocoaPlugin {{23, 794}, {245, 183}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAAAAAAAAxBNAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + P4AAAL+AAABDhgAAw6sAAA + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -3594,7 +3937,7 @@ com.apple.InterfaceBuilder.CocoaPlugin - {{452, 109}, {196, 203}} + {{517, 454}, {196, 203}} com.apple.InterfaceBuilder.CocoaPlugin {{145, 474}, {199, 203}} @@ -3622,7 +3965,7 @@ - 536 + 650 @@ -3630,9 +3973,20 @@ SampleWindow SkNSWindow + + fView + SkNSView + + + fView + + fView + SkNSView + + IBProjectSource - SampleWindow.h + ../../experimental/SimpleCocoaApp/SampleWindow.h @@ -3651,7 +4005,7 @@ IBProjectSource - SimpleCocoaAppDelegate.h + ../../experimental/SimpleCocoaApp/SimpleCocoaAppDelegate.h @@ -3659,31 +4013,28 @@ NSView IBProjectSource - SkNSView.h + ../../experimental/SimpleCocoaApp/SkNSView.h SkNSWindow NSWindow - - fView - SkNSView - - - fView - - fView - SkNSView - - IBProjectSource - SkNSWindow.h + ../../experimental/SimpleCocoaApp/SkNSWindow.h YES + + NSActionCell + NSCell + + IBFrameworkSource + AppKit.framework/Headers/NSActionCell.h + + NSApplication NSResponder @@ -3735,6 +4086,30 @@ AppKit.framework/Headers/NSBrowser.h + + NSButton + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSButton.h + + + + NSButtonCell + NSActionCell + + IBFrameworkSource + AppKit.framework/Headers/NSButtonCell.h + + + + NSCell + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSCell.h + + NSControl NSView @@ -3872,6 +4247,14 @@ AppKit.framework/Headers/NSDocumentController.h + + NSDrawer + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSDrawer.h + + NSFontManager NSObject @@ -3880,14 +4263,6 @@ AppKit.framework/Headers/NSFontManager.h - - NSFormatter - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFormatter.h - - NSMatrix NSControl @@ -4032,133 +4407,7 @@ NSObject IBFrameworkSource - Foundation.framework/Headers/NSArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSClassDescription.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObjectScripting.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSPortCoder.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSScriptClassDescription.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSScriptKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSScriptObjectSpecifiers.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSScriptWhoseTests.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLDownload.h + PrintCore.framework/Headers/PDEPluginInterface.h @@ -4176,6 +4425,30 @@ AppKit.framework/Headers/NSResponder.h + + NSScrollView + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSScrollView.h + + + + NSScroller + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSScroller.h + + + + NSTableColumn + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSTableColumn.h + + NSTableView NSControl @@ -4189,6 +4462,14 @@ AppKit.framework/Headers/NSText.h + + NSTextFieldCell + NSActionCell + + IBFrameworkSource + AppKit.framework/Headers/NSTextFieldCell.h + + NSTextView NSText @@ -4222,10 +4503,7 @@ NSWindow - - IBFrameworkSource - AppKit.framework/Headers/NSDrawer.h - + NSWindow @@ -4246,16 +4524,12 @@ 0 IBCocoaFramework - - com.apple.InterfaceBuilder.CocoaPlugin.macosx - - com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 YES - ../SimpleCocoaApp.xcodeproj + ../../../out/gyp/SimpleCocoaApp.xcodeproj 3 YES diff --git a/experimental/SkEventNotifier.mm b/experimental/SkEventNotifier.mm index 5e93b13f8..f4f8a637f 100644 --- a/experimental/SkEventNotifier.mm +++ b/experimental/SkEventNotifier.mm @@ -2,7 +2,6 @@ #include "SkEvent.h" #define SkEventClass @"SkEvenClass" @implementation SkEventNotifier -//Overwritten from NSObject - (id)init { self = [super init]; if (self) { @@ -44,9 +43,12 @@ @end //////////////////////////////////////////////////////////////////////////////// void SkEvent::SignalNonEmptyQueue() { - //post a SkEventClass event to the default notification center - [[NSNotificationCenter defaultCenter] postNotificationName:SkEventClass - object:nil]; + //post a SkEventClass event to the default notification queue + NSNotification* notification = [NSNotification notificationWithName:SkEventClass object:nil]; + [[NSNotificationQueue defaultQueue] enqueueNotification:notification + postingStyle:NSPostWhenIdle + coalesceMask:NSNotificationNoCoalescing + forModes:nil]; } void SkEvent::SignalQueueTimer(SkMSec delay) { diff --git a/experimental/iOSSampleApp/Shared/SkAlertPrompt.h b/experimental/iOSSampleApp/Shared/SkAlertPrompt.h deleted file mode 100644 index 51a1a5b1f..000000000 --- a/experimental/iOSSampleApp/Shared/SkAlertPrompt.h +++ /dev/null @@ -1,18 +0,0 @@ -/* - * 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 - - -@interface SkAlertPrompt : UIAlertView { - UITextField *textField; -} -@property (nonatomic, retain) UITextField *textField; - -- (NSString*)enteredText; - -@end diff --git a/experimental/iOSSampleApp/Shared/SkAlertPrompt.m b/experimental/iOSSampleApp/Shared/SkAlertPrompt.m deleted file mode 100644 index be0adf520..000000000 --- a/experimental/iOSSampleApp/Shared/SkAlertPrompt.m +++ /dev/null @@ -1,49 +0,0 @@ -// -// SkAlertPrompt.m -// iOSSampleApp -// -// Created by Yang Su on 7/6/11. -// 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 "SkAlertPrompt.h" - -@implementation SkAlertPrompt -@synthesize textField; - -- (id)initWithTitle:(NSString *)title - message:(NSString *)message - delegate:(id)delegate - cancelButtonTitle:(NSString *)cancelButtonTitle - otherButtonTitles:(NSString *)okayButtonTitle,... { - if (self = [super initWithTitle:title - message:message - delegate:delegate - cancelButtonTitle:cancelButtonTitle - otherButtonTitles:okayButtonTitle, nil]) { - self.textField = [[UITextField alloc] - initWithFrame:CGRectMake(12, 45, 260, 25)]; - [self.textField setBackgroundColor:[UIColor whiteColor]]; - textField.borderStyle = UITextBorderStyleLine; - [self addSubview:self.textField]; - } - return self; -} - -- (void)show { - [textField becomeFirstResponder]; - [super show]; -} - -- (NSString *)enteredText { - return textField.text; -} - -- (void)dealloc { - [textField release]; - [super dealloc]; -} - -@end diff --git a/experimental/iOSSampleApp/Shared/SkOptionsTableViewController.h b/experimental/iOSSampleApp/Shared/SkOptionsTableViewController.h index 9c715aaa7..2c9f39180 100644 --- a/experimental/iOSSampleApp/Shared/SkOptionsTableViewController.h +++ b/experimental/iOSSampleApp/Shared/SkOptionsTableViewController.h @@ -36,7 +36,7 @@ - (UITableViewCell*)createSlider:(NSString*)title min:(float)min max:(float)max default:(float)value; - (UITableViewCell*)createSwitch:(NSString*)title default:(BOOL)state; - (UITableViewCell*)createTriState:(NSString*)title default:(int)index; -- (UITableViewCell*)createTextField:(NSString*)title default:(const char*)value; +- (UITableViewCell*)createTextField:(NSString*)title default:(NSString*)value; - (UITableViewCell*)createList:(NSString*)title default:(NSString*)value; @end diff --git a/experimental/iOSSampleApp/Shared/SkOptionsTableViewController.mm b/experimental/iOSSampleApp/Shared/SkOptionsTableViewController.mm index 46a7b29b7..29f2c7e9f 100644 --- a/experimental/iOSSampleApp/Shared/SkOptionsTableViewController.mm +++ b/experimental/iOSSampleApp/Shared/SkOptionsTableViewController.mm @@ -70,22 +70,22 @@ const SkOSMenu::Item* item = menu->getItem(i); NSString* title = [NSString stringWithUTF8String:item->getLabel()]; - int index = 0; - NSArray* optionstrs = nil; if (SkOSMenu::kList_Type == item->getType()) { + int value = 0; SkOptionListItem* List = [[SkOptionListItem alloc] init]; - //List.fCmdID = item->fOSCmd; - //List.getEvent() = item->getEvent(); + List.fItem = item; List.fOptions = [[SkOptionListController alloc] initWithStyle:UITableViewStyleGrouped]; - NSArray* optionstrs = [[NSString stringWithUTF8String:item->getEvent()->findString(SkOSMenu::List_Items_Str)] - componentsSeparatedByString:[NSString stringWithUTF8String:SkOSMenu::Delimiter]]; - for (NSString* optionstr in optionstrs) { - [List.fOptions addOption:optionstr]; - } - item->getEvent()->findS32(item->getSlotName(), &index); - List.fOptions.fSelectedIndex = index; + int count = 0; + SkOSMenu::FindListItemCount(item->getEvent(), &count); + SkString options[count]; + SkOSMenu::FindListItems(item->getEvent(), options); + for (int i = 0; i < count; ++i) + [List.fOptions addOption:[NSString stringWithUTF8String:options[i].c_str()]]; + SkOSMenu::FindListIndex(item->getEvent(), item->getSlotName(), &value); + + List.fOptions.fSelectedIndex = value; List.fCell = [self createList:title default:[List.fOptions getSelectedOption]]; List.fOptions.fParentCell = List.fCell; @@ -95,32 +95,36 @@ else { SkOptionItem* option = [[SkOptionItem alloc] init]; option.fItem = item; + bool state = false; + SkString str; + SkOSMenu::TriState tristate; switch (item->getType()) { case SkOSMenu::kAction_Type: option.fCell = [self createAction:title]; break; case SkOSMenu::kSwitch_Type: - item->getEvent()->findBool(item->getSlotName(), &state); + SkOSMenu::FindSwitchState(item->getEvent(), item->getSlotName(), &state); option.fCell = [self createSwitch:title default:(BOOL)state]; 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); + SkOSMenu::FindSliderValue(item->getEvent(), item->getSlotName(), &value); + SkOSMenu::FindSliderMin(item->getEvent(), &min); + SkOSMenu::FindSliderMax(item->getEvent(), &max); option.fCell = [self createSlider:title min:min max:max default:value]; break; case SkOSMenu::kTriState_Type: - item->getEvent()->findS32(item->getSlotName(), &index); - option.fCell = [self createTriState:title default:index]; + SkOSMenu::FindTriState(item->getEvent(), item->getSlotName(), &tristate); + option.fCell = [self createTriState:title default:(int)tristate]; break; case SkOSMenu::kTextField_Type: + SkOSMenu::FindText(item->getEvent(), item->getSlotName(), &str); option.fCell = [self createTextField:title - default:item->getEvent()->findString(item->getSlotName())]; + default:[NSString stringWithUTF8String:str.c_str()]]; break; default: break; @@ -225,7 +229,7 @@ } - (UITableViewCell*)createTextField:(NSString*)title - default:(const char*)value { + default:(NSString*)value { UITableViewCell* cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:nil] autorelease]; @@ -236,7 +240,7 @@ textField.adjustsFontSizeToFitWidth = YES; textField.textAlignment = UITextAlignmentRight; textField.textColor = cell.detailTextLabel.textColor; - textField.placeholder = [NSString stringWithUTF8String:value]; + textField.placeholder = value; textField.returnKeyType = UIReturnKeyDone; [textField addTarget:self action:@selector(valueChanged:) @@ -280,7 +284,7 @@ - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell* cell = [tableView cellForRowAtIndexPath:indexPath]; - id item = [fItems objectAtIndex:indexPath.row]; + id item = [fItems objectAtIndex:[self convertPathToIndex:indexPath]]; if ([item isKindOfClass:[SkOptionListItem class]]) { SkOptionListItem* list = (SkOptionListItem*)item; diff --git a/experimental/iOSSampleApp/Shared/SkUIDetailViewController.mm b/experimental/iOSSampleApp/Shared/SkUIDetailViewController.mm index 95aa88e6c..f4976b56c 100644 --- a/experimental/iOSSampleApp/Shared/SkUIDetailViewController.mm +++ b/experimental/iOSSampleApp/Shared/SkUIDetailViewController.mm @@ -1,7 +1,6 @@ #import "SkAlertPrompt.h" #import "SkUIDetailViewController.h" #include "SampleApp.h" -#include "SkApplication.h" #include "SkCGUtils.h" #include "SkData.h" #include "SkOSMenu.h" @@ -19,10 +18,23 @@ [self createButtons]; + UISwipeGestureRecognizer* swipe = [[UISwipeGestureRecognizer alloc] + initWithTarget:self + action:@selector(handleSwipe:)]; + [self.navigationController.navigationBar addGestureRecognizer:swipe]; + [swipe release]; + swipe = [[UISwipeGestureRecognizer alloc] + initWithTarget:self + action:@selector(handleSwipe:)]; + swipe.direction = UISwipeGestureRecognizerDirectionLeft; + [self.navigationController.navigationBar addGestureRecognizer:swipe]; + [swipe release]; + fOptionsController = [[SkOptionsTableViewController alloc] initWithStyle:UITableViewStyleGrouped]; fSkUIView.fOptionsDelegate = fOptionsController; [fOptionsController registerMenus:fWind->getMenus()]; + } - (void)createButtons { @@ -62,6 +74,13 @@ [toolbar release]; } +- (void)handleSwipe:(UISwipeGestureRecognizer *)sender { + if (UISwipeGestureRecognizerDirectionRight == sender.direction) + fWind->previousSample(); + else + fWind->nextSample(); +} + - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return YES; // Overriden to allow auto rotation for any direction } @@ -71,7 +90,6 @@ [fOptionsButton release]; [fPopOverController release]; [fOptionsController release]; - application_term(); [super dealloc]; } diff --git a/experimental/iOSSampleApp/Shared/SkUIView.h b/experimental/iOSSampleApp/Shared/SkUIView.h index 76d660daa..49f7e1608 100644 --- a/experimental/iOSSampleApp/Shared/SkUIView.h +++ b/experimental/iOSSampleApp/Shared/SkUIView.h @@ -15,7 +15,8 @@ #include "SkMatrix.h" #include "FlingState.h" #include "SampleApp.h" -#include "SkiOSDeviceManager.h" + +class SkiOSDeviceManager; class SkOSWindow; class SkEvent; struct FPSState; @@ -30,7 +31,7 @@ struct FPSState; @interface SkUIView : UIView { BOOL fRedrawRequestPending; - + struct { EAGLContext* fContext; GLuint fRenderbuffer; diff --git a/experimental/iOSSampleApp/Shared/SkUIView.mm b/experimental/iOSSampleApp/Shared/SkUIView.mm index d60763ec2..c6f1e22cd 100644 --- a/experimental/iOSSampleApp/Shared/SkUIView.mm +++ b/experimental/iOSSampleApp/Shared/SkUIView.mm @@ -15,71 +15,82 @@ #include "GrGLInterface.h" #include "SkGpuDevice.h" #include "SkCGUtils.h" - -SkiOSDeviceManager::SkiOSDeviceManager() { - fGrContext = NULL; - fGrRenderTarget = NULL; - usingGL = false; -} - -SkiOSDeviceManager::~SkiOSDeviceManager() { - SkSafeUnref(fGrContext); - SkSafeUnref(fGrRenderTarget); -} - -void SkiOSDeviceManager::init(SampleWindow* win) { - win->attachGL(); - if (NULL == fGrContext) { -#ifdef USE_GL_1 - fGrContext = GrContext::Create(kOpenGL_Fixed_GrEngine, NULL); -#else - fGrContext = GrContext::Create(kOpenGL_Shaders_GrEngine, NULL); -#endif - } - fGrRenderTarget = SkGpuDevice::Current3DApiRenderTarget(); - if (NULL == fGrContext) { - SkDebugf("Failed to setup 3D"); - win->detachGL(); - } -} -bool SkiOSDeviceManager::supportsDeviceType(SampleWindow::DeviceType dType) { - switch (dType) { - case SampleWindow::kRaster_DeviceType: - case SampleWindow::kPicture_DeviceType: // fallthru - return true; - case SampleWindow::kGPU_DeviceType: - return NULL != fGrContext; - default: - return false; - } -} -bool SkiOSDeviceManager::prepareCanvas(SampleWindow::DeviceType dType, - SkCanvas* canvas, - SampleWindow* win) { - if (SampleWindow::kGPU_DeviceType == dType) { - canvas->setDevice(new SkGpuDevice(fGrContext, fGrRenderTarget))->unref(); - usingGL = true; - } - else { - //The clip needs to be applied with a device attached to the canvas - canvas->setBitmapDevice(win->getBitmap()); +class SkiOSDeviceManager : public SampleWindow::DeviceManager { +public: + SkiOSDeviceManager() { + fGrContext = NULL; + fGrRenderTarget = NULL; usingGL = false; } - return true; -} - -void SkiOSDeviceManager::publishCanvas(SampleWindow::DeviceType dType, - SkCanvas* canvas, - SampleWindow* win) { - if (SampleWindow::kGPU_DeviceType == dType) { - fGrContext->flush(); + virtual ~SkiOSDeviceManager() { + SkSafeUnref(fGrContext); + SkSafeUnref(fGrRenderTarget); } - else { - //CGContextRef cg = UIGraphicsGetCurrentContext(); - //SkCGDrawBitmap(cg, win->getBitmap(), 0, 0); + + virtual void init(SampleWindow* win) { + win->attachGL(); + if (NULL == fGrContext) { +#ifdef USE_GL_1 + fGrContext = GrContext::Create(kOpenGL_Fixed_GrEngine, NULL); +#else + fGrContext = GrContext::Create(kOpenGL_Shaders_GrEngine, NULL); +#endif + } + fGrRenderTarget = SkGpuDevice::Current3DApiRenderTarget(); + if (NULL == fGrContext) { + SkDebugf("Failed to setup 3D"); + win->detachGL(); + } + } + + virtual bool supportsDeviceType(SampleWindow::DeviceType dType) { + switch (dType) { + case SampleWindow::kRaster_DeviceType: + case SampleWindow::kPicture_DeviceType: // fallthru + return true; + case SampleWindow::kGPU_DeviceType: + return NULL != fGrContext; + default: + return false; + } } - win->presentGL(); -} + virtual bool prepareCanvas(SampleWindow::DeviceType dType, + SkCanvas* canvas, + SampleWindow* win) { + if (SampleWindow::kGPU_DeviceType == dType) { + canvas->setDevice(new SkGpuDevice(fGrContext, fGrRenderTarget))->unref(); + usingGL = true; + } + else { + //The clip needs to be applied with a device attached to the canvas + canvas->setBitmapDevice(win->getBitmap()); + usingGL = false; + } + return true; + } + virtual void publishCanvas(SampleWindow::DeviceType dType, + SkCanvas* canvas, + SampleWindow* win) { + if (SampleWindow::kGPU_DeviceType == dType) { + fGrContext->flush(); + } + else { + //CGContextRef cg = UIGraphicsGetCurrentContext(); + //SkCGDrawBitmap(cg, win->getBitmap(), 0, 0); + } + win->presentGL(); + } + + virtual void windowSizeChanged(SampleWindow* win) {} + + bool isUsingGL() { return usingGL; } + + virtual GrContext* getGrContext() { return fGrContext; } +private: + bool usingGL; + GrContext* fGrContext; + GrRenderTarget* fGrRenderTarget; +}; //////////////////////////////////////////////////////////////////////////////// @implementation SkUIView @@ -90,17 +101,8 @@ void SkiOSDeviceManager::publishCanvas(SampleWindow::DeviceType dType, #include "SkEvent.h" #include "SkWindow.h" -static float gScreenScale = 1; - #define kREDRAW_UIVIEW_GL "sk_redraw_uiview_gl_iOS" -static const float SCALE_FOR_ZOOM_LENS = 4.0; -#define Y_OFFSET_FOR_ZOOM_LENS 200 -#define SIZE_FOR_ZOOM_LENS 250 - -static const float MAX_ZOOM_SCALE = 4.0; -static const float MIN_ZOOM_SCALE = 2.0 / MAX_ZOOM_SCALE; - extern bool gDoTraceDraw; #define DO_TRACE_DRAW_MAX 100 @@ -171,6 +173,16 @@ static FPSState gFPS; - (id)initWithMyDefaults { fRedrawRequestPending = false; fFPSState = new FPSState; + + //Add gesture recognizer for single taps. Taps on the right half of the view + //will cause SampleApp to go to the next sample, taps on the left will go to + //the previous sample + UITapGestureRecognizer* tap = [[UITapGestureRecognizer alloc] + initWithTarget:self + action:@selector(handleTap:)]; + [self addGestureRecognizer:tap]; + [tap release]; + #ifdef USE_GL_1 fGL.fContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1]; #else @@ -227,6 +239,7 @@ static FPSState gFPS; fWind = new SampleWindow(self, NULL, NULL, fDevManager); application_init(); fWind->resize(self.frame.size.width, self.frame.size.height, SKWIND_CONFIG); + return self; } @@ -258,11 +271,6 @@ static FPSState gFPS; - (void)layoutSubviews { int W, H; - gScreenScale = [UIScreen mainScreen].scale; - - if ([self respondsToSelector:@selector(setContentScaleFactor:)]) { - self.contentScaleFactor = gScreenScale; - } // Allocate color buffer backing based on the current layer size glBindRenderbuffer(GL_RENDERBUFFER, fGL.fRenderbuffer); @@ -400,6 +408,15 @@ static FPSState gFPS; } } +- (void)handleTap:(UISwipeGestureRecognizer *)sender { +// CGPoint loc = [sender locationInView:self]; +// if (loc.x > self.bounds.size.width/2) +// ((SampleWindow*)fWind)->nextSample(); +// else +// ((SampleWindow*)fWind)->previousSample(); +} + + /////////////////////////////////////////////////////////////////////////////// - (void)setSkTitle:(const char *)title { diff --git a/experimental/iOSSampleApp/Shared/SkiOSDeviceManager.h b/experimental/iOSSampleApp/Shared/SkiOSDeviceManager.h deleted file mode 100644 index da4975cd2..000000000 --- a/experimental/iOSSampleApp/Shared/SkiOSDeviceManager.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef SkiOSDeviceManager_DEFINED -#define SkiOSDeviceManager_DEFINED -#include "SampleApp.h" -#include "SkCanvas.h" -#include "GrContext.h" -#include "GrGLInterface.h" -#include "SkGpuDevice.h" -#include "SkCGUtils.h" -#include "GrContext.h" -class SkiOSDeviceManager : public SampleWindow::DeviceManager { -public: - SkiOSDeviceManager(); - virtual ~SkiOSDeviceManager(); - - virtual void init(SampleWindow* win); - - virtual bool supportsDeviceType(SampleWindow::DeviceType dType); - virtual bool prepareCanvas(SampleWindow::DeviceType dType, - SkCanvas* canvas, - SampleWindow* win); - virtual void publishCanvas(SampleWindow::DeviceType dType, - SkCanvas* canvas, - SampleWindow* win); - - virtual void windowSizeChanged(SampleWindow* win) {} - - bool isUsingGL() { return usingGL; } - - virtual GrContext* getGrContext() { return fGrContext; } -private: - bool usingGL; - GrContext* fGrContext; - GrRenderTarget* fGrRenderTarget; -}; - -#endif \ No newline at end of file diff --git a/experimental/iOSSampleApp/iOSSampleApp.xcodeproj/project.pbxproj b/experimental/iOSSampleApp/iOSSampleApp.xcodeproj/project.pbxproj index 5911c623e..d1fcab1ab 100755 --- a/experimental/iOSSampleApp/iOSSampleApp.xcodeproj/project.pbxproj +++ b/experimental/iOSSampleApp/iOSSampleApp.xcodeproj/project.pbxproj @@ -429,23 +429,25 @@ 260EF18513AFD62E0064D447 /* CoreText.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 260EF18413AFD62E0064D447 /* CoreText.framework */; }; 260EF2B013AFDBD30064D447 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1D30AB110D05D00D00671497 /* Foundation.framework */; }; 263BE75813CCC7BF00CCE991 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 263BE75713CCC7BF00CCE991 /* QuartzCore.framework */; }; + 26591EB913EB16EB000DA8A8 /* TransitionView.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26591EB813EB16EB000DA8A8 /* TransitionView.cpp */; }; 265C7DE313D75752008329F6 /* SkOptionListController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 265C7DE213D75752008329F6 /* SkOptionListController.mm */; }; - 265C816C13D77860008329F6 /* SampleDrawingClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 265C816A13D77860008329F6 /* SampleDrawingClient.cpp */; }; 2662AB7013BD067900CDE7E9 /* SkiOSSampleApp-Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 2662AB6F13BD067900CDE7E9 /* SkiOSSampleApp-Debug.xcconfig */; }; 2662AB7613BD0C0D00CDE7E9 /* SkiOSSampleApp-Release.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 2662AB7513BD0C0D00CDE7E9 /* SkiOSSampleApp-Release.xcconfig */; }; 2662AB7813BD0C1E00CDE7E9 /* SkiOSSampleApp-Base.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 2662AB7713BD0C1E00CDE7E9 /* SkiOSSampleApp-Base.xcconfig */; }; 2663AC9413D5D8D400C20488 /* SkOptionsTableViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2663AC9313D5D8D400C20488 /* SkOptionsTableViewController.mm */; }; 26677D6613B4C548009319B8 /* SkData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26677D6513B4C548009319B8 /* SkData.cpp */; }; 26811E7913DEFAE8001A1609 /* SkBitSet.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26811E7813DEFAE8001A1609 /* SkBitSet.cpp */; }; - 26811E8613DEFC33001A1609 /* SampleDrawingServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 265C816B13D77860008329F6 /* SampleDrawingServer.cpp */; }; - 268F31FE13CDE72D003A1EF2 /* SkSockets.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 268F31FA13CDE726003A1EF2 /* SkSockets.cpp */; }; + 268C50D613F022820003FF9A /* SkColorPalette.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 268C50D213F022820003FF9A /* SkColorPalette.cpp */; }; + 268C50D713F022820003FF9A /* SkNetPipeController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 268C50D413F022820003FF9A /* SkNetPipeController.cpp */; }; + 268C50DA13F022AF0003FF9A /* SampleDrawingClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 268C50D813F022AF0003FF9A /* SampleDrawingClient.cpp */; }; + 268C50DB13F022AF0003FF9A /* SampleDrawingServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 268C50D913F022AF0003FF9A /* SampleDrawingServer.cpp */; }; + 268C50DF13F0230C0003FF9A /* SampleNetPipeReader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 268C50DC13F0230C0003FF9A /* SampleNetPipeReader.cpp */; }; + 268C50E013F0230C0003FF9A /* SkSockets.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 268C50DD13F0230C0003FF9A /* SkSockets.cpp */; }; 26962B2313CDF6A00039B1FB /* SkOSFile_iOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 260EE8BB13AFA7790064D447 /* SkOSFile_iOS.mm */; }; 26962C8013CE256E0039B1FB /* SkUIDetailViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 26962C7913CE256E0039B1FB /* SkUIDetailViewController.mm */; }; 26962C8113CE256E0039B1FB /* SkUIRootViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 26962C7B13CE256E0039B1FB /* SkUIRootViewController.mm */; }; 26962CA413CE265C0039B1FB /* SkOSWindow_iOS.mm in Sources */ = {isa = PBXBuildFile; fileRef = 26962CA313CE265C0039B1FB /* SkOSWindow_iOS.mm */; }; 26962CAB13CE268A0039B1FB /* SampleApp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26962CA913CE268A0039B1FB /* SampleApp.cpp */; }; - 26962CEC13CE293A0039B1FB /* SkColorPalette.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26962CE813CE293A0039B1FB /* SkColorPalette.cpp */; }; - 26962CED13CE293A0039B1FB /* SkNetPipeController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26962CEA13CE293A0039B1FB /* SkNetPipeController.cpp */; }; 26962D4F13CE2D780039B1FB /* GrGLDefaultInterface_iOS.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26962D4E13CE2D780039B1FB /* GrGLDefaultInterface_iOS.cpp */; }; 26A8AFF313E05D7000A3C111 /* GrResourceCache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 26A8AFF113E05D7000A3C111 /* GrResourceCache.cpp */; }; 26E0E40A13B4E67800866555 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 260EE9D113AFA7850064D447 /* OpenGLES.framework */; }; @@ -1325,10 +1327,9 @@ 260EE9D113AFA7850064D447 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; 260EF18413AFD62E0064D447 /* CoreText.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = System/Library/Frameworks/CoreText.framework; sourceTree = SDKROOT; }; 263BE75713CCC7BF00CCE991 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; + 26591EB813EB16EB000DA8A8 /* TransitionView.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TransitionView.cpp; sourceTree = ""; }; 265C7DE113D75752008329F6 /* SkOptionListController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SkOptionListController.h; path = Shared/SkOptionListController.h; sourceTree = ""; }; 265C7DE213D75752008329F6 /* SkOptionListController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = SkOptionListController.mm; path = Shared/SkOptionListController.mm; sourceTree = ""; }; - 265C816A13D77860008329F6 /* SampleDrawingClient.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SampleDrawingClient.cpp; sourceTree = ""; }; - 265C816B13D77860008329F6 /* SampleDrawingServer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SampleDrawingServer.cpp; sourceTree = ""; }; 2662AB6F13BD067900CDE7E9 /* SkiOSSampleApp-Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "SkiOSSampleApp-Debug.xcconfig"; sourceTree = ""; }; 2662AB7513BD0C0D00CDE7E9 /* SkiOSSampleApp-Release.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "SkiOSSampleApp-Release.xcconfig"; sourceTree = ""; }; 2662AB7713BD0C1E00CDE7E9 /* SkiOSSampleApp-Base.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "SkiOSSampleApp-Base.xcconfig"; sourceTree = ""; }; @@ -1336,11 +1337,17 @@ 2663AC9313D5D8D400C20488 /* SkOptionsTableViewController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = SkOptionsTableViewController.mm; path = Shared/SkOptionsTableViewController.mm; sourceTree = ""; }; 26677D6413B4C53E009319B8 /* SkData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SkData.h; path = core/SkData.h; sourceTree = ""; }; 26677D6513B4C548009319B8 /* SkData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkData.cpp; path = core/SkData.cpp; sourceTree = ""; }; - 266CB66113CF56E30011139A /* SkiOSDeviceManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SkiOSDeviceManager.h; path = Shared/SkiOSDeviceManager.h; sourceTree = ""; }; 26811E7813DEFAE8001A1609 /* SkBitSet.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkBitSet.cpp; path = ../../src/pdf/SkBitSet.cpp; sourceTree = SOURCE_ROOT; }; 26811E7A13DEFAF7001A1609 /* SkBitSet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SkBitSet.h; path = ../../include/pdf/SkBitSet.h; sourceTree = SOURCE_ROOT; }; - 268F31FA13CDE726003A1EF2 /* SkSockets.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkSockets.cpp; path = ../SkSockets.cpp; sourceTree = ""; }; - 268F31FB13CDE726003A1EF2 /* SkSockets.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SkSockets.h; path = ../SkSockets.h; sourceTree = ""; }; + 268C50D213F022820003FF9A /* SkColorPalette.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkColorPalette.cpp; path = ../DrawingBoard/SkColorPalette.cpp; sourceTree = SOURCE_ROOT; }; + 268C50D313F022820003FF9A /* SkColorPalette.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SkColorPalette.h; path = ../DrawingBoard/SkColorPalette.h; sourceTree = SOURCE_ROOT; }; + 268C50D413F022820003FF9A /* SkNetPipeController.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkNetPipeController.cpp; path = ../DrawingBoard/SkNetPipeController.cpp; sourceTree = SOURCE_ROOT; }; + 268C50D513F022820003FF9A /* SkNetPipeController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SkNetPipeController.h; path = ../DrawingBoard/SkNetPipeController.h; sourceTree = SOURCE_ROOT; }; + 268C50D813F022AF0003FF9A /* SampleDrawingClient.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SampleDrawingClient.cpp; path = ../DrawingBoard/SampleDrawingClient.cpp; sourceTree = SOURCE_ROOT; }; + 268C50D913F022AF0003FF9A /* SampleDrawingServer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SampleDrawingServer.cpp; path = ../DrawingBoard/SampleDrawingServer.cpp; sourceTree = SOURCE_ROOT; }; + 268C50DC13F0230C0003FF9A /* SampleNetPipeReader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SampleNetPipeReader.cpp; path = ../Networking/SampleNetPipeReader.cpp; sourceTree = SOURCE_ROOT; }; + 268C50DD13F0230C0003FF9A /* SkSockets.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkSockets.cpp; path = ../Networking/SkSockets.cpp; sourceTree = SOURCE_ROOT; }; + 268C50DE13F0230C0003FF9A /* SkSockets.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SkSockets.h; path = ../Networking/SkSockets.h; sourceTree = SOURCE_ROOT; }; 26962C7813CE256E0039B1FB /* SkUIDetailViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SkUIDetailViewController.h; path = Shared/SkUIDetailViewController.h; sourceTree = ""; }; 26962C7913CE256E0039B1FB /* SkUIDetailViewController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = SkUIDetailViewController.mm; path = Shared/SkUIDetailViewController.mm; sourceTree = ""; }; 26962C7A13CE256E0039B1FB /* SkUIRootViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SkUIRootViewController.h; path = Shared/SkUIRootViewController.h; sourceTree = ""; }; @@ -1351,10 +1358,6 @@ 26962CA513CE26730039B1FB /* SkOSWindow_iOS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SkOSWindow_iOS.h; path = ../../include/views/SkOSWindow_iOS.h; sourceTree = SOURCE_ROOT; }; 26962CA913CE268A0039B1FB /* SampleApp.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SampleApp.cpp; path = ../../samplecode/SampleApp.cpp; sourceTree = SOURCE_ROOT; }; 26962CAA13CE268A0039B1FB /* SampleApp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SampleApp.h; path = ../../samplecode/SampleApp.h; sourceTree = SOURCE_ROOT; }; - 26962CE813CE293A0039B1FB /* SkColorPalette.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkColorPalette.cpp; path = Shared/DrawingBoard/SkColorPalette.cpp; sourceTree = ""; }; - 26962CE913CE293A0039B1FB /* SkColorPalette.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SkColorPalette.h; path = Shared/DrawingBoard/SkColorPalette.h; sourceTree = ""; }; - 26962CEA13CE293A0039B1FB /* SkNetPipeController.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkNetPipeController.cpp; path = Shared/DrawingBoard/SkNetPipeController.cpp; sourceTree = ""; }; - 26962CEB13CE293A0039B1FB /* SkNetPipeController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SkNetPipeController.h; path = Shared/DrawingBoard/SkNetPipeController.h; sourceTree = ""; }; 26962D4E13CE2D780039B1FB /* GrGLDefaultInterface_iOS.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = GrGLDefaultInterface_iOS.cpp; path = ../../gpu/src/ios/GrGLDefaultInterface_iOS.cpp; sourceTree = SOURCE_ROOT; }; 26A8AFF113E05D7000A3C111 /* GrResourceCache.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GrResourceCache.cpp; sourceTree = ""; }; 26A8AFF213E05D7000A3C111 /* GrResourceCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GrResourceCache.h; sourceTree = ""; }; @@ -1456,8 +1459,7 @@ 260E002313B11F5B0064D447 /* samplecode */ = { isa = PBXGroup; children = ( - 265C816A13D77860008329F6 /* SampleDrawingClient.cpp */, - 265C816B13D77860008329F6 /* SampleDrawingServer.cpp */, + 26591EB813EB16EB000DA8A8 /* TransitionView.cpp */, 260E002413B11F5B0064D447 /* ClockFaceView.cpp */, 260E002513B11F5B0064D447 /* OverView.cpp */, 260E002613B11F5B0064D447 /* SampleAARects.cpp */, @@ -2715,7 +2717,6 @@ children = ( 26FB98D113D0C87000ACBEA0 /* SkUIView.h */, 26FB98D213D0C87000ACBEA0 /* SkUIView.mm */, - 266CB66113CF56E30011139A /* SkiOSDeviceManager.h */, 26962D4E13CE2D780039B1FB /* GrGLDefaultInterface_iOS.cpp */, 26962CA513CE26730039B1FB /* SkOSWindow_iOS.h */, 26962CA313CE265C0039B1FB /* SkOSWindow_iOS.mm */, @@ -2740,10 +2741,12 @@ 26962CE713CE29120039B1FB /* DrawingBoard */ = { isa = PBXGroup; children = ( - 26962CE813CE293A0039B1FB /* SkColorPalette.cpp */, - 26962CE913CE293A0039B1FB /* SkColorPalette.h */, - 26962CEA13CE293A0039B1FB /* SkNetPipeController.cpp */, - 26962CEB13CE293A0039B1FB /* SkNetPipeController.h */, + 268C50D813F022AF0003FF9A /* SampleDrawingClient.cpp */, + 268C50D913F022AF0003FF9A /* SampleDrawingServer.cpp */, + 268C50D213F022820003FF9A /* SkColorPalette.cpp */, + 268C50D313F022820003FF9A /* SkColorPalette.h */, + 268C50D413F022820003FF9A /* SkNetPipeController.cpp */, + 268C50D513F022820003FF9A /* SkNetPipeController.h */, ); name = DrawingBoard; sourceTree = ""; @@ -2751,8 +2754,9 @@ 26F67B2A13CB3564005DDCD2 /* Networking */ = { isa = PBXGroup; children = ( - 268F31FA13CDE726003A1EF2 /* SkSockets.cpp */, - 268F31FB13CDE726003A1EF2 /* SkSockets.h */, + 268C50DC13F0230C0003FF9A /* SampleNetPipeReader.cpp */, + 268C50DD13F0230C0003FF9A /* SkSockets.cpp */, + 268C50DE13F0230C0003FF9A /* SkSockets.h */, ); name = Networking; sourceTree = ""; @@ -3339,27 +3343,29 @@ 26F548E913B91980007CC564 /* SkBitmapProcState_opts_arm.cpp in Sources */, 26F548EC13B91980007CC564 /* SkBlitRow_opts_none.cpp in Sources */, 26F548ED13B91980007CC564 /* SkUtils_opts_none.cpp in Sources */, - 268F31FE13CDE72D003A1EF2 /* SkSockets.cpp in Sources */, 26962B2313CDF6A00039B1FB /* SkOSFile_iOS.mm in Sources */, 26962C8013CE256E0039B1FB /* SkUIDetailViewController.mm in Sources */, 26962C8113CE256E0039B1FB /* SkUIRootViewController.mm in Sources */, 26962CA413CE265C0039B1FB /* SkOSWindow_iOS.mm in Sources */, 26962CAB13CE268A0039B1FB /* SampleApp.cpp in Sources */, - 26962CEC13CE293A0039B1FB /* SkColorPalette.cpp in Sources */, - 26962CED13CE293A0039B1FB /* SkNetPipeController.cpp in Sources */, 26962D4F13CE2D780039B1FB /* GrGLDefaultInterface_iOS.cpp in Sources */, 26FB98D313D0C87000ACBEA0 /* SkUIView.mm in Sources */, 2663AC9413D5D8D400C20488 /* SkOptionsTableViewController.mm in Sources */, 265C7DE313D75752008329F6 /* SkOptionListController.mm in Sources */, - 265C816C13D77860008329F6 /* SampleDrawingClient.cpp in Sources */, 26811E7913DEFAE8001A1609 /* SkBitSet.cpp in Sources */, - 26811E8613DEFC33001A1609 /* SampleDrawingServer.cpp in Sources */, 26A8AFF313E05D7000A3C111 /* GrResourceCache.cpp in Sources */, 26FB125E13E70310001AFF6D /* SkEventNotifier.mm in Sources */, 26FB129313E704AE001AFF6D /* GrGLTexture.cpp in Sources */, 26FB129413E704B0001AFF6D /* GrContext.cpp in Sources */, 26FB12B013E70D3B001AFF6D /* GrGLRenderTarget.cpp in Sources */, 26FB12B413E70D51001AFF6D /* GrRenderTarget.cpp in Sources */, + 26591EB913EB16EB000DA8A8 /* TransitionView.cpp in Sources */, + 268C50D613F022820003FF9A /* SkColorPalette.cpp in Sources */, + 268C50D713F022820003FF9A /* SkNetPipeController.cpp in Sources */, + 268C50DA13F022AF0003FF9A /* SampleDrawingClient.cpp in Sources */, + 268C50DB13F022AF0003FF9A /* SampleDrawingServer.cpp in Sources */, + 268C50DF13F0230C0003FF9A /* SampleNetPipeReader.cpp in Sources */, + 268C50E013F0230C0003FF9A /* SkSockets.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -3397,7 +3403,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 2662AB6F13BD067900CDE7E9 /* SkiOSSampleApp-Debug.xcconfig */; buildSettings = { - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + ARCHS = "$(ARCHS_UNIVERSAL_IPHONE_OS)"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; GCC_C_LANGUAGE_STANDARD = c99; GCC_OPTIMIZATION_LEVEL = 0; diff --git a/gyp/CocoaSampleApp.gyp b/gyp/CocoaSampleApp.gyp index 90711a88b..8286f8cc4 100644 --- a/gyp/CocoaSampleApp.gyp +++ b/gyp/CocoaSampleApp.gyp @@ -53,6 +53,7 @@ '../samplecode/SampleDegenerateTwoPtRadials.cpp', '../samplecode/SampleDither.cpp', '../samplecode/SampleDitherBitmap.cpp', + '../samplecode/SampleDrawBitmap.cpp', '../samplecode/SampleDrawLooper.cpp', '../samplecode/SampleEffects.cpp', '../samplecode/SampleEmboss.cpp', @@ -117,6 +118,24 @@ # Dependencies for the pipe code in SampleApp '../src/pipe/SkGPipeRead.cpp', '../src/pipe/SkGPipeWrite.cpp', + + # DrawingBoard + '../experimental/DrawingBoard/SkColorPalette.h', + '../experimental/DrawingBoard/SkColorPalette.cpp', + '../experimental/DrawingBoard/SkNetPipeController.h', + '../experimental/DrawingBoard/SkNetPipeController.cpp', + '../experimental/DrawingBoard/SampleDrawingClient.cpp', + '../experimental/DrawingBoard/SampleDrawingServer.cpp', + + # Networking + '../experimental/Networking/SampleNetPipeReader.cpp', + '../experimental/Networking/SkSockets.cpp', + '../experimental/Networking/SkSockets.h', + + # Transition + '../src/utils/SkInterpolator.cpp', + '../include/utils/SkInterpolator.h', + '../samplecode/TransitionView.cpp', ], 'sources!': [ '../samplecode/SampleSkLayer.cpp', #relies on SkMatrix44 which doesn't compile @@ -163,14 +182,12 @@ '../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/SkOSWindow_Mac.h', + '../experimental/CocoaSampleApp/SkOSWindow_Mac.mm', '../experimental/CocoaSampleApp/SkTextFieldCell.h', '../experimental/CocoaSampleApp/SkTextFieldCell.m', - '../experimental/SkSockets.h', - '../experimental/SkSockets.cpp', '../experimental/SkEventNotifier.h', '../experimental/SkEventNotifier.mm', ], @@ -181,6 +198,10 @@ '$(SDKROOT)/System/Library/Frameworks/QuartzCore.framework', '$(SDKROOT)/System/Library/Frameworks/OpenGL.framework', ], + 'libraries!': [ + '$(SDKROOT)/System/Library/Frameworks/Carbon.framework', + '$(SDKROOT)/System/Library/Frameworks/AGL.framework', + ], }, 'xcode_settings' : { 'INFOPLIST_FILE' : '../experimental/CocoaSampleApp/SampleApp-Info.plist', @@ -189,48 +210,6 @@ '../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': { diff --git a/src/utils/ios/SkOSWindow_iOS.mm b/src/utils/ios/SkOSWindow_iOS.mm index 2f28b5159..06b313d21 100755 --- a/src/utils/ios/SkOSWindow_iOS.mm +++ b/src/utils/ios/SkOSWindow_iOS.mm @@ -21,7 +21,7 @@ SkOSWindow::~SkOSWindow() { void SkOSWindow::onHandleInval(const SkIRect& r) { if (!fInvalEventIsPending) { fInvalEventIsPending = true; - (new SkEvent(kINVAL_UIVIEW_EventType))->post(this->getSinkID()); + (new SkEvent(kINVAL_UIVIEW_EventType, this->getSinkID()))->post(); } }