Chromium Code Reviews| 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 |