diff --git a/demo/apple/ZahnradBackend.xcworkspace/contents.xcworkspacedata b/demo/apple/ZahnradBackend.xcworkspace/contents.xcworkspacedata index 42ffb91..86a441d 100644 --- a/demo/apple/ZahnradBackend.xcworkspace/contents.xcworkspacedata +++ b/demo/apple/ZahnradBackend.xcworkspace/contents.xcworkspacedata @@ -7,6 +7,9 @@ + + diff --git a/demo/apple/iOS_CoreGraphics.xcodeproj/project.pbxproj b/demo/apple/iOS_CoreGraphics.xcodeproj/project.pbxproj new file mode 100644 index 0000000..b433fa5 --- /dev/null +++ b/demo/apple/iOS_CoreGraphics.xcodeproj/project.pbxproj @@ -0,0 +1,275 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 50F9C54A1C5FE56C009533F4 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 50F9C5491C5FE56C009533F4 /* main.m */; }; + 50F9C5611C5FE7BD009533F4 /* zahnrad.c in Sources */ = {isa = PBXBuildFile; fileRef = 50F9C55F1C5FE7BD009533F4 /* zahnrad.c */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 50F9C5451C5FE56C009533F4 /* iOS_CoreGraphics.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = iOS_CoreGraphics.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 50F9C5491C5FE56C009533F4 /* main.m */ = {isa = PBXFileReference; indentWidth = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; tabWidth = 4; }; + 50F9C5591C5FE56C009533F4 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 50F9C55F1C5FE7BD009533F4 /* zahnrad.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = zahnrad.c; path = ../../../zahnrad.c; sourceTree = ""; }; + 50F9C5601C5FE7BD009533F4 /* zahnrad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = zahnrad.h; path = ../../../zahnrad.h; sourceTree = ""; }; + 50F9C5621C5FE7D9009533F4 /* demo.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = demo.c; path = ../../demo.c; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 50F9C5421C5FE56C009533F4 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 50F9C53C1C5FE56C009533F4 = { + isa = PBXGroup; + children = ( + 50F9C5471C5FE56C009533F4 /* iOS_CoreGraphics */, + 50F9C5461C5FE56C009533F4 /* Products */, + ); + sourceTree = ""; + }; + 50F9C5461C5FE56C009533F4 /* Products */ = { + isa = PBXGroup; + children = ( + 50F9C5451C5FE56C009533F4 /* iOS_CoreGraphics.app */, + ); + name = Products; + sourceTree = ""; + }; + 50F9C5471C5FE56C009533F4 /* iOS_CoreGraphics */ = { + isa = PBXGroup; + children = ( + 50F9C5621C5FE7D9009533F4 /* demo.c */, + 50F9C55F1C5FE7BD009533F4 /* zahnrad.c */, + 50F9C5601C5FE7BD009533F4 /* zahnrad.h */, + 50F9C5491C5FE56C009533F4 /* main.m */, + 50F9C5591C5FE56C009533F4 /* Info.plist */, + 50F9C5481C5FE56C009533F4 /* Supporting Files */, + ); + path = iOS_CoreGraphics; + sourceTree = ""; + }; + 50F9C5481C5FE56C009533F4 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + ); + name = "Supporting Files"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 50F9C5441C5FE56C009533F4 /* iOS_CoreGraphics */ = { + isa = PBXNativeTarget; + buildConfigurationList = 50F9C55C1C5FE56C009533F4 /* Build configuration list for PBXNativeTarget "iOS_CoreGraphics" */; + buildPhases = ( + 50F9C5411C5FE56C009533F4 /* Sources */, + 50F9C5421C5FE56C009533F4 /* Frameworks */, + 50F9C5431C5FE56C009533F4 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = iOS_CoreGraphics; + productName = iOS_CoreGraphics; + productReference = 50F9C5451C5FE56C009533F4 /* iOS_CoreGraphics.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 50F9C53D1C5FE56C009533F4 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0720; + ORGANIZATIONNAME = richi; + TargetAttributes = { + 50F9C5441C5FE56C009533F4 = { + CreatedOnToolsVersion = 7.2; + }; + }; + }; + buildConfigurationList = 50F9C5401C5FE56C009533F4 /* Build configuration list for PBXProject "iOS_CoreGraphics" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 50F9C53C1C5FE56C009533F4; + productRefGroup = 50F9C5461C5FE56C009533F4 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 50F9C5441C5FE56C009533F4 /* iOS_CoreGraphics */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 50F9C5431C5FE56C009533F4 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 50F9C5411C5FE56C009533F4 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 50F9C5611C5FE7BD009533F4 /* zahnrad.c in Sources */, + 50F9C54A1C5FE56C009533F4 /* main.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 50F9C55A1C5FE56C009533F4 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.1; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 50F9C55B1C5FE56C009533F4 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.1; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 50F9C55D1C5FE56C009533F4 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = "Brand Assets"; + INFOPLIST_FILE = iOS_CoreGraphics/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.richi.iOS-CoreGraphics"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 50F9C55E1C5FE56C009533F4 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = "Brand Assets"; + INFOPLIST_FILE = iOS_CoreGraphics/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.richi.iOS-CoreGraphics"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 50F9C5401C5FE56C009533F4 /* Build configuration list for PBXProject "iOS_CoreGraphics" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 50F9C55A1C5FE56C009533F4 /* Debug */, + 50F9C55B1C5FE56C009533F4 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 50F9C55C1C5FE56C009533F4 /* Build configuration list for PBXNativeTarget "iOS_CoreGraphics" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 50F9C55D1C5FE56C009533F4 /* Debug */, + 50F9C55E1C5FE56C009533F4 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 50F9C53D1C5FE56C009533F4 /* Project object */; +} diff --git a/demo/apple/iOS_CoreGraphics.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/demo/apple/iOS_CoreGraphics.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..8471094 --- /dev/null +++ b/demo/apple/iOS_CoreGraphics.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/demo/apple/iOS_CoreGraphics/Info.plist b/demo/apple/iOS_CoreGraphics/Info.plist new file mode 100644 index 0000000..ff71b22 --- /dev/null +++ b/demo/apple/iOS_CoreGraphics/Info.plist @@ -0,0 +1,50 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIcons + + CFBundleIcons~ipad + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UIRequiredDeviceCapabilities + + armv7 + + UIStatusBarHidden + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + UIInterfaceOrientationPortraitUpsideDown + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/demo/apple/iOS_CoreGraphics/main.m b/demo/apple/iOS_CoreGraphics/main.m new file mode 100644 index 0000000..1bee0cf --- /dev/null +++ b/demo/apple/iOS_CoreGraphics/main.m @@ -0,0 +1,340 @@ +/* + Copyright (c) 2016 richi + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + */ + + +#import + +#include "zahnrad.h" +#include "../../demo.c" + + +static void* mem_alloc(zr_handle unused, size_t size) +{ + return calloc(1, size); +} + + +static void mem_free(zr_handle unused, void* ptr) +{ + free(ptr); +} + + +NSString* stringFromZR(const char* text, zr_size len) +{ + char cstr[len + 1]; + strncpy(cstr, text, len); + cstr[len] = 0; + return [NSString stringWithUTF8String: cstr]; +} + + +static zr_size fontTextWidth(zr_handle handle, float height, const char* text, zr_size len) +{ + UIFont* font = (__bridge UIFont*) handle.ptr; + NSString* aString = stringFromZR(text, len); + NSDictionary* attributes = @{ NSFontAttributeName: font}; + CGSize stringSize = [aString sizeWithAttributes: attributes]; + + return ceil(stringSize.width); +} + + +#pragma mark - ZRView - + + +@interface ZRView : UIView +{ + UIFont* font; + struct zr_user_font usrfnt; + struct zr_allocator alloc; + + struct demo gui; +} + +@end + + +@implementation ZRView + + +- (instancetype) initWithFrame: (CGRect) frame +{ + if (!(self = [super initWithFrame: frame])) + return self; + + alloc.userdata.ptr = NULL; + alloc.alloc = mem_alloc; + alloc.free = mem_free; + + font = [UIFont systemFontOfSize: 11]; + font = [UIFont fontWithName: @"Menlo-Regular" size: 11]; + + NSDictionary* attributes = @{NSFontAttributeName: font}; + CGSize stringSize = [@"W" sizeWithAttributes: attributes]; + + memset(&usrfnt, 0, sizeof(usrfnt)); + usrfnt.height = round(stringSize.height); + usrfnt.width = fontTextWidth; + usrfnt.userdata.ptr = (__bridge void*)(font); + + zr_init(&gui.ctx, &alloc, &usrfnt); + zr_clear(&gui.ctx); + run_demo(&gui); + + return self; +} + + +#define setColor(_c) \ +CGContextSetRGBStrokeColor(context, _c->color.r / 255.0, _c->color.g / 255.0, _c->color.b / 255.0, _c->color.a / 255.0); \ +CGContextSetRGBFillColor(context, _c->color.r / 255.0, _c->color.g / 255.0, _c->color.b / 255.0, _c->color.a / 255.0); + + +- (void) drawRect: (CGRect) rect +{ + CGContextRef context = UIGraphicsGetCurrentContext(); + UIGraphicsPushContext(context); + + UIColor* color = [UIColor blackColor]; + CGContextSetFillColorWithColor(context, color.CGColor); + CGContextFillRect(context, rect); + + const struct zr_command* cmd; + + CGContextSaveGState(context); + + zr_foreach(cmd, &gui.ctx) + { + switch (cmd->type) + { + case ZR_COMMAND_SCISSOR: + { + const struct zr_command_scissor* s = zr_command(scissor, cmd); + CGRect cr = CGRectMake(s->x, s->y, s->w, s->h); + CGContextRestoreGState(context); + CGContextSaveGState(context); + CGContextClipToRect(context, cr); + } break; + + case ZR_COMMAND_LINE: + { + const struct zr_command_line* l = zr_command(line, cmd); + setColor(l); + CGContextBeginPath(context); + CGContextMoveToPoint(context, l->begin.x + .5, l->begin.y + .5); + CGContextAddLineToPoint(context, l->end.x + .5, l->end.y + .5); + CGContextStrokePath(context); + } break; + + case ZR_COMMAND_RECT: + { + const struct zr_command_rect* r = zr_command(rect, cmd); + CGRect cr = CGRectMake(r->x, r->y, r->w, r->h); + setColor(r); + if (!r->rounding) CGContextFillRect(context, cr); + else + { + CGMutablePathRef p = CGPathCreateMutable(); + CGPathAddRoundedRect(p, nil, cr, r->rounding, r->rounding); + CGPathCloseSubpath(p); + CGContextBeginPath(context); + CGContextAddPath(context, p); + CGContextDrawPath(context, kCGPathFill); + CGPathRelease(p); + } + } break; + + case ZR_COMMAND_CIRCLE: + { + const struct zr_command_circle* c = zr_command(circle, cmd); + CGRect cr = CGRectMake(c->x, c->y, c->w, c->h); + setColor(c); + CGContextFillEllipseInRect(context, cr); + } break; + + case ZR_COMMAND_TRIANGLE: + { + const struct zr_command_triangle* t = zr_command(triangle, cmd); + setColor(t); + CGContextBeginPath(context); + CGContextMoveToPoint (context, t->a.x, t->a.y); + CGContextAddLineToPoint(context, t->b.x, t->b.y); + CGContextAddLineToPoint(context, t->c.x, t->c.y); + CGContextClosePath(context); + CGContextFillPath(context); + } break; + + case ZR_COMMAND_TEXT: + { + const struct zr_command_text* t = zr_command(text, cmd); + CGRect cr = CGRectMake(t->x, t->y, t->w, t->h); + CGContextSetRGBFillColor(context, t->background.r / 255.0, t->background.g / 255.0, t->background.b / 255.0, t->background.a / 255.0); + CGContextFillRect(context, cr); + NSString* aString = stringFromZR(t->string, t->length); + UIColor* fg = [UIColor colorWithRed: t->foreground.r / 255.0 green: t->foreground.g / 255.0 blue: t->foreground.b / 255.0 alpha: t->foreground.a / 255.0]; + UIColor* bg = [UIColor colorWithRed: t->background.r / 255.0 green: t->background.g / 255.0 blue: t->background.b / 255.0 alpha: t->background.a / 255.0]; + NSDictionary* attributes = @{ NSFontAttributeName: font, NSForegroundColorAttributeName: fg, NSBackgroundColorAttributeName: bg }; + CGSize size = [aString sizeWithAttributes: attributes]; + CGRect xr = CGRectMake(cr.origin.x, cr.origin.y + (cr.size.height - size.height) / 2.0, cr.size.width, size.height); + [aString drawInRect: xr withAttributes: attributes]; + } break; + + case ZR_COMMAND_CURVE: + case ZR_COMMAND_IMAGE: + case ZR_COMMAND_ARC: + case ZR_COMMAND_NOP: + default: + break; + } + } + + UIGraphicsPopContext(); +} + + +- (void) touchesBegan: (NSSet*) touches withEvent: (UIEvent*) event +{ + UITouch* touch = [[event allTouches] anyObject]; + CGPoint location = [touch locationInView: self]; + + zr_input_begin(&gui.ctx); + zr_input_motion(&gui.ctx, location.x, location.y); + zr_input_end(&gui.ctx); + + zr_clear(&gui.ctx); + zr_input_begin(&gui.ctx); + zr_input_button(&gui.ctx, ZR_BUTTON_LEFT, location.x, location.y, zr_true); + zr_input_end(&gui.ctx); + + run_demo(&gui); + [self setNeedsDisplay]; +} + + +- (void) touchesMoved: (NSSet*) touches withEvent: (UIEvent*) event +{ + UITouch* touch = [[event allTouches] anyObject]; + CGPoint location = [touch locationInView: self]; + + zr_clear(&gui.ctx); + + zr_input_begin(&gui.ctx); + zr_input_motion(&gui.ctx, location.x, location.y); + zr_input_end(&gui.ctx); + + run_demo(&gui); + [self setNeedsDisplay]; +} + + +- (void) touchesEnded: (NSSet*) touches withEvent: (UIEvent*) event +{ + UITouch* touch = [[event allTouches] anyObject]; + CGPoint location = [touch locationInView: self]; + + zr_clear(&gui.ctx); + zr_input_begin(&gui.ctx); + zr_input_motion(&gui.ctx, location.x, location.y); + zr_input_button(&gui.ctx, ZR_BUTTON_LEFT, location.x, location.y, zr_false); + zr_input_end(&gui.ctx); + run_demo(&gui); + + zr_clear(&gui.ctx); + zr_input_begin(&gui.ctx); + zr_input_motion(&gui.ctx, 0, 0); + zr_input_end(&gui.ctx); + + run_demo(&gui); + [self setNeedsDisplay]; +} + + +- (void) touchesCancelled: (NSSet*) touches withEvent: (UIEvent*) event +{ + [self touchesEnded: touches withEvent: event]; +} + + +@end + + +#pragma mark - ViewController - + + +@interface ViewController : UIViewController + +@property (strong, nonatomic) ZRView* zrView; + +@end + + +@implementation ViewController + + +- (void) viewDidLoad +{ + [super viewDidLoad]; + + _zrView = [[ZRView alloc] initWithFrame: self.view.bounds]; + [self.view addSubview: _zrView]; +} + + +@end + + +#pragma mark - App Delegate - + + +@interface AppDelegate : UIResponder + +@property (strong, nonatomic) UIWindow* window; +@property (strong, nonatomic) ViewController* viewController; + +@end + + +@implementation AppDelegate + + +- (BOOL) application: (UIApplication*) application didFinishLaunchingWithOptions: (NSDictionary*) launchOptions +{ + _window = [[UIWindow alloc] initWithFrame: [[UIScreen mainScreen] bounds]]; + _viewController = [ViewController new]; + _window.rootViewController = _viewController; + [_window makeKeyAndVisible]; + + return YES; +} + + +@end + + +int main(int argc, char* argv[]) +{ + @autoreleasepool + { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} + +