Index: remoting/ios/ui/cursor_texture.mm |
diff --git a/remoting/ios/ui/cursor_texture.mm b/remoting/ios/ui/cursor_texture.mm |
deleted file mode 100644 |
index 9ffa5f7f12208e55cd4b579b70ef85a695e92837..0000000000000000000000000000000000000000 |
--- a/remoting/ios/ui/cursor_texture.mm |
+++ /dev/null |
@@ -1,181 +0,0 @@ |
-// 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 "remoting/ios/ui/cursor_texture.h" |
- |
-@implementation CursorTexture |
- |
-- (id)init { |
- self = [super init]; |
- if (self) { |
- _needCursorRedraw = NO; |
- _cursorDrawnToGL = webrtc::DesktopRect::MakeXYWH(0, 0, 0, 0); |
- } |
- return self; |
-} |
- |
-- (const webrtc::DesktopSize&)textureSize { |
- return _textureSize; |
-} |
- |
-- (void)setTextureSize:(const webrtc::DesktopSize&)size { |
- if (!_textureSize.equals(size)) { |
- _textureSize.set(size.width(), size.height()); |
- _needInitialize = true; |
- } |
-} |
- |
-- (const webrtc::MouseCursor&)cursor { |
- return *_cursor.get(); |
-} |
- |
-- (void)setCursor:(webrtc::MouseCursor*)cursor { |
- _cursor.reset(cursor); |
- |
- if (_cursor.get() != NULL && _cursor->image().data()) { |
- _needCursorRedraw = true; |
- } |
-} |
- |
-- (void)bindToEffect:(GLKEffectPropertyTexture*)effectProperty { |
- glGenTextures(1, &_textureId); |
- [Utility bindTextureForIOS:_textureId]; |
- |
- // This is the Cursor layer, and is stamped on top of Desktop as a |
- // transparent image |
- effectProperty.target = GLKTextureTarget2D; |
- effectProperty.name = _textureId; |
- effectProperty.envMode = GLKTextureEnvModeDecal; |
- effectProperty.enabled = GL_TRUE; |
- |
- [Utility logGLErrorCode:@"CursorTexture bindToTexture"]; |
- // Release context |
- glBindTexture(GL_TEXTURE_2D, 0); |
-} |
- |
-- (BOOL)needDrawAtPosition:(const webrtc::DesktopVector&)position { |
- return (_cursor.get() != NULL && |
- (_needInitialize || _needCursorRedraw == YES || |
- _cursorDrawnToGL.left() != position.x() - _cursor->hotspot().x() || |
- _cursorDrawnToGL.top() != position.y() - _cursor->hotspot().y())); |
-} |
- |
-- (void)drawWithMousePosition:(const webrtc::DesktopVector&)position { |
- if (_textureSize.height() == 0 && _textureSize.width() == 0) { |
- return; |
- } |
- |
- [Utility bindTextureForIOS:_textureId]; |
- |
- if (_needInitialize) { |
- glTexImage2D(GL_TEXTURE_2D, |
- 0, |
- GL_RGBA, |
- _textureSize.width(), |
- _textureSize.height(), |
- 0, |
- GL_RGBA, |
- GL_UNSIGNED_BYTE, |
- NULL); |
- |
- [Utility logGLErrorCode:@"CursorTexture initializeTextureSurfaceWithSize"]; |
- _needInitialize = false; |
- } |
- // When the cursor needs to be redraw in a different spot then we must clear |
- // the previous area. |
- |
- DCHECK([self needDrawAtPosition:position]); |
- |
- if (_cursorDrawnToGL.width() > 0 && _cursorDrawnToGL.height() > 0) { |
- webrtc::BasicDesktopFrame transparentCursor(_cursorDrawnToGL.size()); |
- |
- if (transparentCursor.data() != NULL) { |
- DCHECK(transparentCursor.kBytesPerPixel == |
- _cursor->image().kBytesPerPixel); |
- memset(transparentCursor.data(), |
- 0, |
- transparentCursor.stride() * transparentCursor.size().height()); |
- |
- [Utility drawSubRectToGLFromRectOfSize:_textureSize |
- subRect:_cursorDrawnToGL |
- data:transparentCursor.data()]; |
- |
- // there is no longer any cursor drawn to screen |
- _cursorDrawnToGL = webrtc::DesktopRect::MakeXYWH(0, 0, 0, 0); |
- } |
- } |
- |
- if (_cursor.get() != NULL) { |
- |
- CGRect screen = |
- CGRectMake(0.0, 0.0, _textureSize.width(), _textureSize.height()); |
- CGRect cursor = CGRectMake(position.x() - _cursor->hotspot().x(), |
- position.y() - _cursor->hotspot().y(), |
- _cursor->image().size().width(), |
- _cursor->image().size().height()); |
- |
- if (CGRectContainsRect(screen, cursor)) { |
- _cursorDrawnToGL = webrtc::DesktopRect::MakeXYWH(cursor.origin.x, |
- cursor.origin.y, |
- cursor.size.width, |
- cursor.size.height); |
- |
- [Utility drawSubRectToGLFromRectOfSize:_textureSize |
- subRect:_cursorDrawnToGL |
- data:_cursor->image().data()]; |
- |
- } else if (CGRectIntersectsRect(screen, cursor)) { |
- // Some of the cursor falls off screen, need to clip it |
- CGRect intersection = CGRectIntersection(screen, cursor); |
- _cursorDrawnToGL = |
- webrtc::DesktopRect::MakeXYWH(intersection.origin.x, |
- intersection.origin.y, |
- intersection.size.width, |
- intersection.size.height); |
- |
- webrtc::BasicDesktopFrame partialCursor(_cursorDrawnToGL.size()); |
- |
- if (partialCursor.data()) { |
- DCHECK(partialCursor.kBytesPerPixel == _cursor->image().kBytesPerPixel); |
- |
- uint32_t src_stride = _cursor->image().stride(); |
- uint32_t dst_stride = partialCursor.stride(); |
- |
- uint8_t* source = _cursor->image().data(); |
- source += abs((static_cast<int32_t>(cursor.origin.y) - |
- _cursorDrawnToGL.top())) * |
- src_stride; |
- source += abs((static_cast<int32_t>(cursor.origin.x) - |
- _cursorDrawnToGL.left())) * |
- _cursor->image().kBytesPerPixel; |
- uint8_t* dst = partialCursor.data(); |
- |
- for (uint32_t y = 0; y < _cursorDrawnToGL.height(); y++) { |
- memcpy(dst, source, dst_stride); |
- source += src_stride; |
- dst += dst_stride; |
- } |
- |
- [Utility drawSubRectToGLFromRectOfSize:_textureSize |
- subRect:_cursorDrawnToGL |
- data:partialCursor.data()]; |
- } |
- } |
- } |
- |
- _needCursorRedraw = false; |
- [Utility logGLErrorCode:@"CursorTexture drawWithMousePosition"]; |
- // Release context |
- glBindTexture(GL_TEXTURE_2D, 0); |
-} |
- |
-- (void)releaseTexture { |
- glDeleteTextures(1, &_textureId); |
-} |
- |
-@end |