Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(389)

Unified Diff: sky/shell/ios/sky_surface.mm

Issue 1171573002: Basic Sky shell for iOS targets (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: sky/shell/ios/sky_surface.mm
diff --git a/sky/shell/ios/sky_surface.mm b/sky/shell/ios/sky_surface.mm
new file mode 100644
index 0000000000000000000000000000000000000000..d8056de84be340b5ef24f8ff7d26072376583706
--- /dev/null
+++ b/sky/shell/ios/sky_surface.mm
@@ -0,0 +1,162 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "sky_surface.h"
+
+#import <QuartzCore/QuartzCore.h>
+#import <OpenGLES/EAGL.h>
+#import <OpenGLES/EAGLDrawable.h>
+
+#include "sky/shell/ui_delegate.h"
+#include "sky/shell/shell.h"
+#include "sky/shell/ios/platform_view_ios.h"
+
abarth-chromium 2015/06/05 22:56:09 Plase combine and sort these two groups of include
+#include "mojo/public/cpp/bindings/interface_request.h"
+#include "sky/services/viewport/input_event.mojom.h"
+#include "base/time/time.h"
+
+static inline sky::EventType EventTypeFromUITouchPhase(UITouchPhase phase) {
+ switch (phase) {
+ case UITouchPhaseBegan:
+ return sky::EVENT_TYPE_POINTER_DOWN;
+ case UITouchPhaseMoved:
+ case UITouchPhaseStationary:
+ // There is no EVENT_TYPE_POINTER_STATIONARY. So we just pass a move type
+ // with the same coordinates
+ return sky::EVENT_TYPE_POINTER_MOVE;
+ case UITouchPhaseEnded:
+ return sky::EVENT_TYPE_POINTER_UP;
+ case UITouchPhaseCancelled:
+ return sky::EVENT_TYPE_POINTER_CANCEL;
+ }
+
+ return sky::EVENT_TYPE_UNKNOWN;
+}
+
+@implementation SkySurface {
+ BOOL _platformViewInitialized;
+
+ sky::ViewportObserverPtr _viewport_observer;
+}
+
+- (gfx::AcceleratedWidget)acceleratedWidget {
+ return (gfx::AcceleratedWidget)self.layer;
+}
+
+- (void)layoutSubviews {
+ [super layoutSubviews];
+
+ [self configureLayerDefaults];
+
+ [self setupPlatformViewIfNecessary];
+
+ CGSize size = self.bounds.size;
+ CGFloat scale = [UIScreen mainScreen].scale;
+
+ _viewport_observer->OnViewportMetricsChanged(size.width * scale,
+ size.height * scale, scale);
+}
+
+- (void)configureLayerDefaults {
+ CAEAGLLayer* layer = reinterpret_cast<CAEAGLLayer*>(self.layer);
+ layer.allowsGroupOpacity = YES;
+ layer.opaque = YES;
+ CGFloat screenScale = [UIScreen mainScreen].scale;
+ layer.contentsScale = screenScale;
+ // Note: shouldRasterize is still NO. This is just a defensive measure
+ layer.rasterizationScale = screenScale;
+}
+
+- (void)setupPlatformViewIfNecessary {
+ if (_platformViewInitialized) {
+ return;
+ }
+
+ _platformViewInitialized = YES;
+
+ [self notifySurfaceCreation];
+ [self connectToViewportObserverAndLoad];
+}
+
+- (sky::shell::PlatformViewIOS*)platformView {
+ auto view = static_cast<sky::shell::PlatformViewIOS*>(
+ sky::shell::Shell::Shared().view());
+ DCHECK(view);
+ return view;
+}
+
+- (void)notifySurfaceCreation {
+ self.platformView->SurfaceCreated(self.acceleratedWidget);
+}
+
+- (NSString*)skyInitialLoadURL {
+ return [NSBundle mainBundle].infoDictionary[@"com.google.sky.load_url"];
+}
+
+- (void)connectToViewportObserverAndLoad {
+ auto view = sky::shell::Shell::Shared().view();
+ auto interface_request = mojo::GetProxy(&_viewport_observer);
+ view->ConnectToViewportObserver(interface_request.Pass());
+
+ mojo::String string(self.skyInitialLoadURL.UTF8String);
+ _viewport_observer->LoadURL(string);
+}
+
+- (void)notifySurfaceDestruction {
+ self.platformView->SurfaceDestroyed();
+}
+
+#pragma mark - UIResponder overrides for raw touches
+
+- (void)dispatchTouches:(NSSet*)touches phase:(UITouchPhase)phase {
+ auto eventType = EventTypeFromUITouchPhase(phase);
+ const CGFloat scale = [UIScreen mainScreen].scale;
+
+ for (UITouch* touch in touches) {
+ auto input = sky::InputEvent::New();
+ input->type = eventType;
+
+ auto timedelta = base::TimeDelta::FromSecondsD(touch.timestamp);
+ input->time_stamp = timedelta.InMilliseconds();
+
+ input->pointer_data = sky::PointerData::New();
+ input->pointer_data->kind = sky::POINTER_KIND_TOUCH;
+
+ CGPoint windowCoordinates = [touch locationInView:nil];
+
+ input->pointer_data->x = windowCoordinates.x * scale;
+ input->pointer_data->y = windowCoordinates.y * scale;
+
+ _viewport_observer->OnInputEvent(input.Pass());
+ }
+}
+
+- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event {
+ [self dispatchTouches:touches phase:UITouchPhaseBegan];
+}
+
+- (void)touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event {
+ [self dispatchTouches:touches phase:UITouchPhaseMoved];
+}
+
+- (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event {
+ [self dispatchTouches:touches phase:UITouchPhaseEnded];
+}
+
+- (void)touchesCancelled:(NSSet*)touches withEvent:(UIEvent*)event {
+ [self dispatchTouches:touches phase:UITouchPhaseCancelled];
+}
+
+#pragma mark - Misc.
+
++ (Class)layerClass {
+ return [CAEAGLLayer class];
+}
+
+- (void)dealloc {
+ [self notifySurfaceDestruction];
+ [super dealloc];
+}
+
+@end

Powered by Google App Engine
This is Rietveld 408576698