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]));
+ }
+}
+
+