// Copyright 2014 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. #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." #endif #import "Utility.h" @implementation Utility + (BOOL)isPad { return (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad); } + (BOOL)isInLandscapeMode { UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; if ((orientation == UIInterfaceOrientationLandscapeLeft) || (orientation == UIInterfaceOrientationLandscapeRight)) { return YES; } return NO; } + (CGSize)getOrientatedSize:(CGSize)size shouldWidthBeLongestSide:(BOOL)shouldWidthBeLongestSide { if (shouldWidthBeLongestSide && (size.height > size.width)) { return CGSizeMake(size.height, size.width); } return size; } + (void)showAlert:(NSString*)title message:(NSString*)message { UIAlertView* alert; alert = [[UIAlertView alloc] init]; alert.title = title; alert.message = message; alert.delegate = nil; [alert addButtonWithTitle:@"OK"]; [alert show]; } + (NSString*)appVersionNumberDisplayString { NSDictionary* infoDictionary = [[NSBundle mainBundle] infoDictionary]; NSString* majorVersion = [infoDictionary objectForKey:@"CFBundleShortVersionString"]; NSString* minorVersion = [infoDictionary objectForKey:@"CFBundleVersion"]; return [NSString stringWithFormat:@"Version %@ (%@)", majorVersion, minorVersion]; } + (void)bindTextureForIOS:(GLuint)glName { glBindTexture(GL_TEXTURE_2D, glName); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); } + (void)logGLErrorCode:(NSString*)funcName { GLenum errorCode = 1; while (errorCode != 0) { errorCode = glGetError(); // I don't know why this is returning an error // on the first call to this function, but if I // don't read it, then stuff doesn't work... #if DEBUG if (errorCode != 0) { NSLog(@"glerror in %@: %X", funcName, errorCode); } #endif // DEBUG } } + (void)drawSubRectToGLFromRectOfSize:(const webrtc::DesktopSize&)rectSize subRect:(const webrtc::DesktopRect&)subRect data:(const uint8_t*)data { DCHECK(rectSize.width() >= subRect.width()); DCHECK(rectSize.height() >= subRect.height()); DCHECK(rectSize.width() >= (subRect.left() + subRect.width())); DCHECK(rectSize.height() >= (subRect.top() + subRect.height())); DCHECK(data); glTexSubImage2D(GL_TEXTURE_2D, 0, subRect.left(), subRect.top(), subRect.width(), subRect.height(), GL_RGBA, GL_UNSIGNED_BYTE, data); } + (void)moveMouse:(HostProxy*)controller at:(const webrtc::DesktopVector&)point { [controller mouseAction:point wheelDelta:webrtc::DesktopVector(0, 0) whichButton:0 buttonDown:NO]; } + (void)leftClickOn:(HostProxy*)controller at:(const webrtc::DesktopVector&)point { [controller mouseAction:point wheelDelta:webrtc::DesktopVector(0, 0) whichButton:1 buttonDown:YES]; [controller mouseAction:point wheelDelta:webrtc::DesktopVector(0, 0) whichButton:1 buttonDown:NO]; } + (void)middleClickOn:(HostProxy*)controller at:(const webrtc::DesktopVector&)point { [controller mouseAction:point wheelDelta:webrtc::DesktopVector(0, 0) whichButton:2 buttonDown:YES]; [controller mouseAction:point wheelDelta:webrtc::DesktopVector(0, 0) whichButton:2 buttonDown:NO]; } + (void)rightClickOn:(HostProxy*)controller at:(const webrtc::DesktopVector&)point { [controller mouseAction:point wheelDelta:webrtc::DesktopVector(0, 0) whichButton:3 buttonDown:YES]; [controller mouseAction:point wheelDelta:webrtc::DesktopVector(0, 0) whichButton:3 buttonDown:NO]; } + (void)mouseScroll:(HostProxy*)controller at:(const webrtc::DesktopVector&)point delta:(const webrtc::DesktopVector&)delta { [controller mouseAction:point wheelDelta:delta whichButton:0 buttonDown:NO]; } @end