Various Fixes

This commit is contained in:
Ilya Laktyushin 2021-07-26 00:35:34 +03:00
parent 367836362a
commit 67ee626340
12 changed files with 160 additions and 216 deletions

View File

@ -86,6 +86,8 @@ typedef enum
@property (nonatomic, readonly) CGFloat minZoomLevel; @property (nonatomic, readonly) CGFloat minZoomLevel;
@property (nonatomic, readonly) CGFloat maxZoomLevel; @property (nonatomic, readonly) CGFloat maxZoomLevel;
- (void)setZoomLevel:(CGFloat)zoomLevel animated:(bool)animated;
@property (nonatomic, readonly) bool hasUltrawideCamera; @property (nonatomic, readonly) bool hasUltrawideCamera;
@property (nonatomic, readonly) bool hasTelephotoCamera; @property (nonatomic, readonly) bool hasTelephotoCamera;

View File

@ -27,6 +27,8 @@
@property (nonatomic, readonly) CGFloat minZoomLevel; @property (nonatomic, readonly) CGFloat minZoomLevel;
@property (nonatomic, readonly) CGFloat maxZoomLevel; @property (nonatomic, readonly) CGFloat maxZoomLevel;
- (void)setZoomLevel:(CGFloat)zoomLevel animated:(bool)animated;
@property (nonatomic, readonly) bool hasUltrawideCamera; @property (nonatomic, readonly) bool hasUltrawideCamera;
@property (nonatomic, readonly) bool hasTelephotoCamera; @property (nonatomic, readonly) bool hasTelephotoCamera;
@ -34,9 +36,10 @@
@property (nonatomic, copy) void(^outputSampleBuffer)(CMSampleBufferRef sampleBuffer, AVCaptureConnection *connection); @property (nonatomic, copy) void(^outputSampleBuffer)(CMSampleBufferRef sampleBuffer, AVCaptureConnection *connection);
@property (nonatomic, copy) void(^changingPosition)(void);
@property (nonatomic, copy) bool(^requestPreviewIsMirrored)(void); @property (nonatomic, copy) bool(^requestPreviewIsMirrored)(void);
@property (nonatomic, copy) void(^crossfadeNeeded)(void);
@property (nonatomic, copy) void(^recognizedQRCode)(NSString *value, AVMetadataMachineReadableCodeObject *object); @property (nonatomic, copy) void(^recognizedQRCode)(NSString *value, AVMetadataMachineReadableCodeObject *object);
@property (nonatomic, assign) bool compressVideo; @property (nonatomic, assign) bool compressVideo;

View File

@ -49,7 +49,7 @@
@property (nonatomic, copy) void(^focusPointChanged)(CGPoint point); @property (nonatomic, copy) void(^focusPointChanged)(CGPoint point);
@property (nonatomic, copy) void(^expositionChanged)(CGFloat value); @property (nonatomic, copy) void(^expositionChanged)(CGFloat value);
@property (nonatomic, copy) void(^zoomChanged)(CGFloat level); @property (nonatomic, copy) void(^zoomChanged)(CGFloat level, bool animated);
@property (nonatomic, copy) void(^shutterPressed)(bool fromHardwareButton); @property (nonatomic, copy) void(^shutterPressed)(bool fromHardwareButton);
@property (nonatomic, copy) void(^shutterReleased)(bool fromHardwareButton); @property (nonatomic, copy) void(^shutterReleased)(bool fromHardwareButton);
@ -107,8 +107,6 @@
- (UIInterfaceOrientation)interfaceOrientation; - (UIInterfaceOrientation)interfaceOrientation;
- (void)setInterfaceOrientation:(UIInterfaceOrientation)orientation animated:(bool)animated; - (void)setInterfaceOrientation:(UIInterfaceOrientation)orientation animated:(bool)animated;
- (void)layoutPreviewRelativeViews;
- (void)photoCounterButtonPressed; - (void)photoCounterButtonPressed;
@end @end

View File

@ -18,7 +18,9 @@
@interface TGCameraZoomModeView : UIView @interface TGCameraZoomModeView : UIView
@property (copy, nonatomic) void(^zoomChanged)(CGFloat zoomLevel, bool done); @property (nonatomic, assign) UIInterfaceOrientation interfaceOrientation;
@property (copy, nonatomic) void(^zoomChanged)(CGFloat zoomLevel, bool done, bool animated);
@property (nonatomic, assign) CGFloat zoomLevel; @property (nonatomic, assign) CGFloat zoomLevel;
- (void)setZoomLevel:(CGFloat)zoomLevel animated:(bool)animated; - (void)setZoomLevel:(CGFloat)zoomLevel animated:(bool)animated;

View File

@ -692,7 +692,6 @@ NSString *const PGCameraAdjustingFocusKey = @"adjustingFocus";
if (strongSelf.finishedPositionChange != nil) if (strongSelf.finishedPositionChange != nil)
strongSelf.finishedPositionChange(); strongSelf.finishedPositionChange();
[strongSelf setZoomLevel:0.0f];
[strongSelf _subscribeForCameraChanges]; [strongSelf _subscribeForCameraChanges];
}]; }];
}; };
@ -733,12 +732,20 @@ NSString *const PGCameraAdjustingFocusKey = @"adjustingFocus";
- (void)setZoomLevel:(CGFloat)zoomLevel - (void)setZoomLevel:(CGFloat)zoomLevel
{ {
[self setZoomLevel:zoomLevel animated:false];
}
- (void)setZoomLevel:(CGFloat)zoomLevel animated:(bool)animated
{
if (self.cameraMode == PGCameraModeVideo) {
animated = false;
}
[[PGCamera cameraQueue] dispatch:^ [[PGCamera cameraQueue] dispatch:^
{ {
if (self.disabled) if (self.disabled)
return; return;
[self.captureSession setZoomLevel:zoomLevel]; [self.captureSession setZoomLevel:zoomLevel animated:animated];
}]; }];
} }

View File

@ -15,6 +15,8 @@
#import <AVFoundation/AVFoundation.h> #import <AVFoundation/AVFoundation.h>
#import <SSignalKit/SSignalKit.h> #import <SSignalKit/SSignalKit.h>
#import "POPSpringAnimation.h"
const NSInteger PGCameraFrameRate = 30; const NSInteger PGCameraFrameRate = 30;
@interface PGCameraCaptureSession () <AVCaptureVideoDataOutputSampleBufferDelegate, AVCaptureAudioDataOutputSampleBufferDelegate, AVCaptureMetadataOutputObjectsDelegate> @interface PGCameraCaptureSession () <AVCaptureVideoDataOutputSampleBufferDelegate, AVCaptureAudioDataOutputSampleBufferDelegate, AVCaptureMetadataOutputObjectsDelegate>
@ -518,7 +520,11 @@ const NSInteger PGCameraFrameRate = 30;
[self setZoomLevel:1.0]; [self setZoomLevel:1.0];
} }
- (void)setZoomLevel:(CGFloat)zoomLevel - (void)setZoomLevel:(CGFloat)zoomLevel {
[self setZoomLevel:zoomLevel animated:false];
}
- (void)setZoomLevel:(CGFloat)zoomLevel animated:(bool)animated
{ {
if (![self.videoDevice respondsToSelector:@selector(setVideoZoomFactor:)]) if (![self.videoDevice respondsToSelector:@selector(setVideoZoomFactor:)])
return; return;
@ -554,7 +560,43 @@ const NSInteger PGCameraFrameRate = 30;
} }
} }
} }
device.videoZoomFactor = MAX(1.0, MIN([strongSelf maxZoomLevel], backingLevel)); CGFloat finalLevel = MAX(1.0, MIN([strongSelf maxZoomLevel], backingLevel));
if (animated) {
bool zoomingIn = finalLevel > self.videoDevice.videoZoomFactor;
bool needsCrossfade = level >= 1.0;
POPSpringAnimation *animation = [POPSpringAnimation new];
animation.property = [POPAnimatableProperty propertyWithName:@"zoom" initializer:^(POPMutableAnimatableProperty *prop)
{
prop.readBlock = ^(PGCameraCaptureSession *session, CGFloat values[])
{
if (session != nil) {
values[0] = session.videoDevice.videoZoomFactor;
}
};
prop.writeBlock = ^(PGCameraCaptureSession *session, const CGFloat values[])
{
if (session != nil) {
if ((zoomingIn && values[0] > finalLevel - 0.015) || (!zoomingIn && values[0] < finalLevel + 0.015)) {
if (needsCrossfade && session.crossfadeNeeded != nil)
session.crossfadeNeeded();
}
[session _reconfigureDevice:session->_videoDevice withBlock:^(AVCaptureDevice *device) {
device.videoZoomFactor = values[0];
}];
}
};
prop.threshold = 0.03f;
}];
animation.fromValue = @(self.videoDevice.videoZoomFactor);
animation.toValue = @(finalLevel);
animation.springSpeed = 14;
animation.springBounciness = 1;
[self pop_addAnimation:animation forKey:@"zoom"];
} else {
device.videoZoomFactor = finalLevel;
}
}]; }];
} }
@ -759,9 +801,6 @@ const NSInteger PGCameraFrameRate = 30;
[self _addAudioInputRequestAudioSession:false]; [self _addAudioInputRequestAudioSession:false];
} }
if (self.changingPosition != nil)
self.changingPosition();
[self commitConfiguration]; [self commitConfiguration];
if (self.currentMode == PGCameraModeVideo || self.currentMode == PGCameraModeSquareVideo || self.currentMode == PGCameraModeSquareSwing) if (self.currentMode == PGCameraModeVideo || self.currentMode == PGCameraModeSquareVideo || self.currentMode == PGCameraModeSquareSwing)
@ -771,6 +810,7 @@ const NSInteger PGCameraFrameRate = 30;
} }
_videoDevice = deviceForTargetPosition; _videoDevice = deviceForTargetPosition;
[self resetZoom];
[self setCurrentFlashMode:self.currentFlashMode]; [self setCurrentFlashMode:self.currentFlashMode];
@ -956,54 +996,18 @@ const NSInteger PGCameraFrameRate = 30;
{ {
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
CVPixelBufferLockBaseAddress(imageBuffer,0); CVPixelBufferLockBaseAddress(imageBuffer,0);
size_t width = CVPixelBufferGetWidth(imageBuffer); size_t width = CVPixelBufferGetWidth(imageBuffer);
size_t height = CVPixelBufferGetHeight(imageBuffer); size_t height = CVPixelBufferGetHeight(imageBuffer);
uint8_t *yBuffer = CVPixelBufferGetBaseAddressOfPlane(imageBuffer, 0);
size_t yPitch = CVPixelBufferGetBytesPerRowOfPlane(imageBuffer, 0);
uint8_t *cbCrBuffer = CVPixelBufferGetBaseAddressOfPlane(imageBuffer, 1);
size_t cbCrPitch = CVPixelBufferGetBytesPerRowOfPlane(imageBuffer, 1);
int bytesPerPixel = 4; CIImage *coreImage = [CIImage imageWithCVPixelBuffer:imageBuffer];
uint8_t *rgbBuffer = malloc(width * height * bytesPerPixel);
CIContext *ciContext = [CIContext contextWithOptions:nil];
for (size_t y = 0; y < height; y++) CGImageRef quartzImage = [ciContext createCGImage:coreImage fromRect:CGRectMake(0, 0, width, height)];
{ UIImage *image = [[UIImage alloc] initWithCGImage:quartzImage scale:1.0 orientation:orientation];
uint8_t *rgbBufferLine = &rgbBuffer[y * width * bytesPerPixel];
uint8_t *yBufferLine = &yBuffer[y * yPitch];
uint8_t *cbCrBufferLine = &cbCrBuffer[(y >> 1) * cbCrPitch];
for (size_t x = 0; x < width; x++)
{
int16_t y = yBufferLine[x];
int16_t cb = cbCrBufferLine[x & ~1] - 128;
int16_t cr = cbCrBufferLine[x | 1] - 128;
uint8_t *rgbOutput = &rgbBufferLine[x * bytesPerPixel];
int16_t r = (int16_t)round( y + cr * 1.4 );
int16_t g = (int16_t)round( y + cb * -0.343 + cr * -0.711 );
int16_t b = (int16_t)round( y + cb * 1.765);
rgbOutput[0] = 0xff;
rgbOutput[1] = clamp(b);
rgbOutput[2] = clamp(g);
rgbOutput[3] = clamp(r);
}
}
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(rgbBuffer, width, height, 8, width * bytesPerPixel, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipLast);
CGImageRef quartzImage = CGBitmapContextCreateImage(context);
UIImage *image = [UIImage imageWithCGImage:quartzImage scale:1.0 orientation:orientation];
CGContextRelease(context);
CGColorSpaceRelease(colorSpace);
CGImageRelease(quartzImage); CGImageRelease(quartzImage);
free(rgbBuffer);
CVPixelBufferUnlockBaseAddress(imageBuffer, 0); CVPixelBufferUnlockBaseAddress(imageBuffer, 0);
return image; return image;
} }
@ -1072,8 +1076,6 @@ static UIImageOrientation TGSnapshotOrientationForVideoOrientation(bool mirrored
if (!self.isRunning || self.currentMode != PGCameraModePhoto) if (!self.isRunning || self.currentMode != PGCameraModePhoto)
return; return;
if ([metadataObjects.firstObject isKindOfClass:[AVMetadataMachineReadableCodeObject class]]) if ([metadataObjects.firstObject isKindOfClass:[AVMetadataMachineReadableCodeObject class]])
{ {
AVMetadataMachineReadableCodeObject *object = (AVMetadataMachineReadableCodeObject *)metadataObjects.firstObject; AVMetadataMachineReadableCodeObject *object = (AVMetadataMachineReadableCodeObject *)metadataObjects.firstObject;

View File

@ -136,6 +136,7 @@ static CGPoint TGCameraControllerClampPointToScreenSize(__unused id self, __unus
bool _saveCapturedMedia; bool _saveCapturedMedia;
bool _shutterIsBusy; bool _shutterIsBusy;
bool _crossfadingForZoom;
UIImpactFeedbackGenerator *_feedbackGenerator; UIImpactFeedbackGenerator *_feedbackGenerator;
@ -378,13 +379,13 @@ static CGPoint TGCameraControllerClampPointToScreenSize(__unused id self, __unus
[strongSelf->_camera setFlashMode:mode]; [strongSelf->_camera setFlashMode:mode];
}; };
_interfaceView.zoomChanged = ^(CGFloat level) _interfaceView.zoomChanged = ^(CGFloat level, bool animated)
{ {
__strong TGCameraController *strongSelf = weakSelf; __strong TGCameraController *strongSelf = weakSelf;
if (strongSelf == nil) if (strongSelf == nil)
return; return;
[strongSelf->_camera setZoomLevel:level]; [strongSelf->_camera setZoomLevel:level animated:animated];
}; };
_interfaceView.shutterPressed = ^(bool fromHardwareButton) _interfaceView.shutterPressed = ^(bool fromHardwareButton)
@ -655,6 +656,12 @@ static CGPoint TGCameraControllerClampPointToScreenSize(__unused id self, __unus
}]; }];
}); });
}]; }];
if (iosMajorVersion() >= 13.0) {
[strongSelf->_feedbackGenerator impactOccurredWithIntensity:0.5];
} else {
[strongSelf->_feedbackGenerator impactOccurred];
}
}; };
_camera.finishedPositionChange = ^ _camera.finishedPositionChange = ^
@ -666,7 +673,7 @@ static CGPoint TGCameraControllerClampPointToScreenSize(__unused id self, __unus
TGDispatchOnMainThread(^ TGDispatchOnMainThread(^
{ {
[strongSelf->_previewView endTransitionAnimated:true]; [strongSelf->_previewView endTransitionAnimated:true];
[strongSelf->_interfaceView setZoomLevel:0.0f displayNeeded:false]; [strongSelf->_interfaceView setZoomLevel:1.0f displayNeeded:false];
if (strongSelf->_camera.hasFlash && strongSelf->_camera.flashActive) if (strongSelf->_camera.hasFlash && strongSelf->_camera.flashActive)
[strongSelf->_interfaceView setFlashActive:true]; [strongSelf->_interfaceView setFlashActive:true];
@ -770,6 +777,30 @@ static CGPoint TGCameraControllerClampPointToScreenSize(__unused id self, __unus
} }
} }
}; };
_camera.captureSession.crossfadeNeeded = ^{
__strong TGCameraController *strongSelf = weakSelf;
if (strongSelf != nil)
{
if (strongSelf->_crossfadingForZoom) {
return;
}
strongSelf->_crossfadingForZoom = true;
[strongSelf->_camera captureNextFrameCompletion:^(UIImage *image)
{
TGDispatchOnMainThread(^
{
[strongSelf->_previewView beginTransitionWithSnapshotImage:image animated:false];
TGDispatchAfter(0.05, dispatch_get_main_queue(), ^{
[strongSelf->_previewView endTransitionAnimated:true];
strongSelf->_crossfadingForZoom = false;
});
});
}];
};
};
} }
#pragma mark - View Life Cycle #pragma mark - View Life Cycle
@ -2128,7 +2159,6 @@ static CGPoint TGCameraControllerClampPointToScreenSize(__unused id self, __unus
} completion:nil]; } completion:nil];
_interfaceView.previewViewFrame = _previewView.frame; _interfaceView.previewViewFrame = _previewView.frame;
[_interfaceView layoutPreviewRelativeViews];
return targetFrame; return targetFrame;
} }
@ -2168,7 +2198,6 @@ static CGPoint TGCameraControllerClampPointToScreenSize(__unused id self, __unus
} }
_interfaceView.previewViewFrame = toFrame; _interfaceView.previewViewFrame = toFrame;
[_interfaceView layoutPreviewRelativeViews];
} }
- (void)beginTransitionOutWithVelocity:(CGFloat)velocity - (void)beginTransitionOutWithVelocity:(CGFloat)velocity
@ -2356,7 +2385,6 @@ static CGPoint TGCameraControllerClampPointToScreenSize(__unused id self, __unus
{ {
CGRect frame = [TGCameraController _cameraPreviewFrameForScreenSize:TGScreenSize() mode:mode]; CGRect frame = [TGCameraController _cameraPreviewFrameForScreenSize:TGScreenSize() mode:mode];
_interfaceView.previewViewFrame = frame; _interfaceView.previewViewFrame = frame;
[_interfaceView layoutPreviewRelativeViews];
[_interfaceView updateForCameraModeChangeAfterResize]; [_interfaceView updateForCameraModeChangeAfterResize];
[UIView animateWithDuration:0.3f delay:0.0f options:UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionLayoutSubviews animations:^ [UIView animateWithDuration:0.3f delay:0.0f options:UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionLayoutSubviews animations:^

View File

@ -139,8 +139,6 @@ const CGFloat TGCameraFlashControlHeight = 44.0f;
- (void)setInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation - (void)setInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{ {
_interfaceOrientation = interfaceOrientation; _interfaceOrientation = interfaceOrientation;
[self setActive:false animated:false];
} }
@end @end

View File

@ -65,9 +65,7 @@
TGCameraFlashControl *_flashControl; TGCameraFlashControl *_flashControl;
TGCameraFlashActiveView *_flashActiveView; TGCameraFlashActiveView *_flashActiveView;
TGCameraFlipButton *_topFlipButton;
bool _hasResults; bool _hasResults;
CGFloat _topPanelOffset; CGFloat _topPanelOffset;
@ -157,7 +155,7 @@
else if (widescreenWidth >= 736.0f - FLT_EPSILON) else if (widescreenWidth >= 736.0f - FLT_EPSILON)
{ {
_topPanelHeight = 44.0f; _topPanelHeight = 44.0f;
_bottomPanelHeight = 140.0f; _bottomPanelHeight = 129.0f;
_modeControlHeight = 50.0f; _modeControlHeight = 50.0f;
_counterOffset = 8.0f; _counterOffset = 8.0f;
shutterButtonWidth = 70.0f; shutterButtonWidth = 70.0f;
@ -239,13 +237,8 @@
_flashControl = [[TGCameraFlashControl alloc] initWithFrame:CGRectMake(3.0, 0, TGCameraFlashControlHeight, TGCameraFlashControlHeight)]; _flashControl = [[TGCameraFlashControl alloc] initWithFrame:CGRectMake(3.0, 0, TGCameraFlashControlHeight, TGCameraFlashControlHeight)];
[_topPanelView addSubview:_flashControl]; [_topPanelView addSubview:_flashControl];
_topFlipButton = [[TGCameraFlipButton alloc] initWithFrame:CGRectMake(0, 0, 44, 44)];
_topFlipButton.hidden = true;
[_topFlipButton addTarget:self action:@selector(flipButtonPressed) forControlEvents:UIControlEventTouchUpInside];
// [_topPanelView addSubview:_topFlipButton];
_timecodeView = [[TGCameraTimeCodeView alloc] initWithFrame:CGRectMake((frame.size.width - 120) / 2, 12, 120, 28)]; _timecodeView = [[TGCameraTimeCodeView alloc] initWithFrame:CGRectMake((frame.size.width - 120) / 2, 12, 120, 28)];
_timecodeView.hidden = true; _timecodeView.alpha = 0.0;
_timecodeView.requestedRecordingDuration = ^NSTimeInterval _timecodeView.requestedRecordingDuration = ^NSTimeInterval
{ {
__strong TGCameraMainPhoneView *strongSelf = weakSelf; __strong TGCameraMainPhoneView *strongSelf = weakSelf;
@ -254,6 +247,7 @@
return strongSelf.requestedVideoRecordingDuration(); return strongSelf.requestedVideoRecordingDuration();
}; };
_timecodeView.userInteractionEnabled = false;
[_topPanelView addSubview:_timecodeView]; [_topPanelView addSubview:_timecodeView];
_videoLandscapePanelView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 274, 44)]; _videoLandscapePanelView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 274, 44)];
@ -263,29 +257,12 @@
_videoLandscapePanelView.layer.cornerRadius = 3.5f; _videoLandscapePanelView.layer.cornerRadius = 3.5f;
[self addSubview:_videoLandscapePanelView]; [self addSubview:_videoLandscapePanelView];
_flashActiveView = [[TGCameraFlashActiveView alloc] initWithFrame:CGRectMake((frame.size.width - 40) / 2, frame.size.height - _bottomPanelHeight - 37, 40, 21)];
// [self addSubview:_flashActiveView];
_toastView = [[TGCameraToastView alloc] initWithFrame:CGRectMake(0, frame.size.height - _bottomPanelHeight - 42, frame.size.width, 32)]; _toastView = [[TGCameraToastView alloc] initWithFrame:CGRectMake(0, frame.size.height - _bottomPanelHeight - 42, frame.size.width, 32)];
_toastView.userInteractionEnabled = false; _toastView.userInteractionEnabled = false;
[self addSubview:_toastView]; [self addSubview:_toastView];
_zoomView = [[TGCameraZoomView alloc] initWithFrame:CGRectMake(10, frame.size.height - _bottomPanelHeight - _bottomPanelOffset - 18, frame.size.width - 20, 1.5f)];
_zoomView.activityChanged = ^(bool active)
{
__strong TGCameraMainPhoneView *strongSelf = weakSelf;
if (strongSelf == nil)
return;
[UIView animateWithDuration:0.3f delay:0.0f options:UIViewAnimationOptionCurveEaseInOut animations:^
{
[strongSelf _layoutFlashActiveViewForInterfaceOrientation:strongSelf->_interfaceOrientation zoomViewHidden:!active];
} completion:nil];
};
// [self addSubview:_zoomView];
_zoomModeView = [[TGCameraZoomModeView alloc] initWithFrame:CGRectMake(floor((frame.size.width - 129.0) / 2.0), frame.size.height - _bottomPanelHeight - _bottomPanelOffset - 18 - 43, 129, 43) hasUltrawideCamera:hasUltrawideCamera hasTelephotoCamera:hasTelephotoCamera]; _zoomModeView = [[TGCameraZoomModeView alloc] initWithFrame:CGRectMake(floor((frame.size.width - 129.0) / 2.0), frame.size.height - _bottomPanelHeight - _bottomPanelOffset - 18 - 43, 129, 43) hasUltrawideCamera:hasUltrawideCamera hasTelephotoCamera:hasTelephotoCamera];
_zoomModeView.zoomChanged = ^(CGFloat zoomLevel, bool done) { _zoomModeView.zoomChanged = ^(CGFloat zoomLevel, bool done, bool animated) {
__strong TGCameraMainPhoneView *strongSelf = weakSelf; __strong TGCameraMainPhoneView *strongSelf = weakSelf;
if (strongSelf == nil) if (strongSelf == nil)
return; return;
@ -302,7 +279,7 @@
} }
if (strongSelf.zoomChanged != nil) if (strongSelf.zoomChanged != nil)
strongSelf.zoomChanged(zoomLevel); strongSelf.zoomChanged(zoomLevel, animated);
}; };
[_zoomModeView setZoomLevel:1.0]; [_zoomModeView setZoomLevel:1.0];
[self addSubview:_zoomModeView]; [self addSubview:_zoomModeView];
@ -390,15 +367,13 @@
if (results.count == 0) if (results.count == 0)
{ {
_hasResults = false; _hasResults = false;
_topFlipButton.hidden = true;
_flipButton.hidden = false; _flipButton.hidden = false;
_doneButton.hidden = true; _doneButton.hidden = true;
} }
else else
{ {
_hasResults = true; _hasResults = true;
_topFlipButton.hidden = _modeControl.cameraMode == PGCameraModePhotoScan; _flipButton.hidden = false;
_flipButton.hidden = true;
_doneButton.hidden = false; _doneButton.hidden = false;
if (_modeControl.cameraMode == PGCameraModePhotoScan) { if (_modeControl.cameraMode == PGCameraModePhotoScan) {
_modeControl.hidden = true; _modeControl.hidden = true;
@ -479,11 +454,17 @@
UIInterfaceOrientation orientation = _interfaceOrientation; UIInterfaceOrientation orientation = _interfaceOrientation;
PGCameraMode cameraMode = _modeControl.cameraMode; PGCameraMode cameraMode = _modeControl.cameraMode;
if (UIInterfaceOrientationIsLandscape(orientation) && !((cameraMode == PGCameraModePhoto && previousMode == PGCameraModeSquarePhoto) || (cameraMode == PGCameraModeSquarePhoto && previousMode == PGCameraModePhoto))) [UIView animateWithDuration:0.25f delay:0.0f options:UIViewAnimationOptionCurveLinear animations:^
{ {
if (cameraMode == PGCameraModeVideo) if (cameraMode == PGCameraModeVideo)
_timecodeView.hidden = true; {
_timecodeView.alpha = 1.0;
} else {
_timecodeView.alpha = 0.0;
}
} completion:nil];
if (UIInterfaceOrientationIsLandscape(orientation) && !((cameraMode == PGCameraModePhoto && previousMode == PGCameraModeSquarePhoto) || (cameraMode == PGCameraModeSquarePhoto && previousMode == PGCameraModePhoto)))
{
[UIView animateWithDuration:0.25f delay:0.0f options:UIViewAnimationOptionCurveLinear animations:^ [UIView animateWithDuration:0.25f delay:0.0f options:UIViewAnimationOptionCurveLinear animations:^
{ {
_topPanelView.alpha = 0.0f; _topPanelView.alpha = 0.0f;
@ -492,7 +473,6 @@
{ {
if (cameraMode == PGCameraModeVideo) if (cameraMode == PGCameraModeVideo)
{ {
_timecodeView.hidden = false;
_flashControl.transform = CGAffineTransformIdentity; _flashControl.transform = CGAffineTransformIdentity;
_flashControl.interfaceOrientation = UIInterfaceOrientationPortrait; _flashControl.interfaceOrientation = UIInterfaceOrientationPortrait;
[self _layoutTopPanelViewForInterfaceOrientation:orientation]; [self _layoutTopPanelViewForInterfaceOrientation:orientation];
@ -587,9 +567,8 @@
_modeControl.hidden = false; _modeControl.hidden = false;
_cancelButton.hidden = false; _cancelButton.hidden = false;
_flashControl.hidden = false; _flashControl.hidden = false;
_flipButton.hidden = hasDoneButton; _flipButton.hidden = false;
_bottomPanelBackgroundView.hidden = false; _bottomPanelBackgroundView.hidden = false;
_topFlipButton.hidden = !hasDoneButton;
} }
[UIView animateWithDuration:0.25 animations:^ [UIView animateWithDuration:0.25 animations:^
@ -599,7 +578,6 @@
_cancelButton.alpha = alpha; _cancelButton.alpha = alpha;
_flashControl.alpha = alpha; _flashControl.alpha = alpha;
_flipButton.alpha = alpha; _flipButton.alpha = alpha;
_topFlipButton.alpha = alpha;
_bottomPanelBackgroundView.alpha = alpha; _bottomPanelBackgroundView.alpha = alpha;
if (hasDoneButton) if (hasDoneButton)
@ -611,8 +589,7 @@
_modeControl.hidden = hidden; _modeControl.hidden = hidden;
_cancelButton.hidden = hidden; _cancelButton.hidden = hidden;
_flashControl.hidden = hidden; _flashControl.hidden = hidden;
_flipButton.hidden = hidden || hasDoneButton; _flipButton.hidden = hidden;
_topFlipButton.hidden = hidden || !hasDoneButton;
_bottomPanelBackgroundView.hidden = hidden; _bottomPanelBackgroundView.hidden = hidden;
if (hasDoneButton) if (hasDoneButton)
@ -631,10 +608,8 @@
_cancelButton.alpha = alpha; _cancelButton.alpha = alpha;
_flashControl.hidden = hidden; _flashControl.hidden = hidden;
_flashControl.alpha = alpha; _flashControl.alpha = alpha;
_flipButton.hidden = hidden || hasDoneButton; _flipButton.hidden = hidden;
_flipButton.alpha = alpha; _flipButton.alpha = alpha;
_topFlipButton.hidden = hidden || !hasDoneButton;
_topFlipButton.alpha = alpha;
_bottomPanelBackgroundView.hidden = hidden; _bottomPanelBackgroundView.hidden = hidden;
_bottomPanelBackgroundView.alpha = alpha; _bottomPanelBackgroundView.alpha = alpha;
@ -664,52 +639,31 @@
{ {
[UIView animateWithDuration:0.25 delay:0.0 options:UIViewAnimationOptionCurveLinear animations:^ [UIView animateWithDuration:0.25 delay:0.0 options:UIViewAnimationOptionCurveLinear animations:^
{ {
_flashActiveView.alpha = 0.0f;
if (_modeControl.cameraMode == PGCameraModeVideo) if (_modeControl.cameraMode == PGCameraModeVideo)
{ {
_topPanelView.alpha = 0.0f; _topPanelView.alpha = 0.0f;
_videoLandscapePanelView.alpha = 0.0f; _videoLandscapePanelView.alpha = 0.0f;
} }
else
{
_flashControl.alpha = 0.0f;
}
_topFlipButton.transform = CGAffineTransformMakeRotation(TGRotationForInterfaceOrientation(orientation));
_flipButton.transform = CGAffineTransformMakeRotation(TGRotationForInterfaceOrientation(orientation)); _flipButton.transform = CGAffineTransformMakeRotation(TGRotationForInterfaceOrientation(orientation));
_flashControl.transform = CGAffineTransformMakeRotation(TGRotationForInterfaceOrientation(orientation));
_zoomModeView.interfaceOrientation = orientation;
} completion:^(__unused BOOL finished) } completion:^(__unused BOOL finished)
{ {
[self _layoutFlashActiveViewForInterfaceOrientation:orientation zoomViewHidden:!_zoomView.isActive];
if (_modeControl.cameraMode == PGCameraModeVideo) if (_modeControl.cameraMode == PGCameraModeVideo)
{ {
_flashControl.transform = CGAffineTransformIdentity;
_flashControl.interfaceOrientation = UIInterfaceOrientationPortrait;
[self _layoutTopPanelViewForInterfaceOrientation:orientation]; [self _layoutTopPanelViewForInterfaceOrientation:orientation];
if (UIInterfaceOrientationIsLandscape(orientation)) if (UIInterfaceOrientationIsLandscape(orientation))
[self _attachControlsToLandscapePanel]; [self _attachControlsToLandscapePanel];
else else
[self _attachControlsToTopPanel]; [self _attachControlsToTopPanel];
_timecodeView.hidden = false;
}
else
{
_flashControl.transform = CGAffineTransformMakeRotation(TGRotationForInterfaceOrientation(orientation));
_flashControl.interfaceOrientation = orientation;
} }
[self _layoutTopPanelSubviewsForInterfaceOrientation:orientation]; [self _layoutTopPanelSubviewsForInterfaceOrientation:orientation];
[_flashControl dismissAnimated:false];
[UIView animateWithDuration:0.2 delay:0.0 options:UIViewAnimationOptionCurveEaseInOut animations:^ [UIView animateWithDuration:0.2 delay:0.0 options:UIViewAnimationOptionCurveEaseInOut animations:^
{ {
_flashActiveView.alpha = 1.0f;
if (_modeControl.cameraMode == PGCameraModeVideo) if (_modeControl.cameraMode == PGCameraModeVideo)
{ {
if (UIInterfaceOrientationIsLandscape(orientation)) if (UIInterfaceOrientationIsLandscape(orientation))
@ -717,10 +671,6 @@
else else
_topPanelView.alpha = 1.0f; _topPanelView.alpha = 1.0f;
} }
else
{
_flashControl.alpha = 1.0f;
}
} completion:nil]; } completion:nil];
}]; }];
} }
@ -728,52 +678,11 @@
{ {
[_flashControl dismissAnimated:false]; [_flashControl dismissAnimated:false];
_topFlipButton.transform = CGAffineTransformMakeRotation(TGRotationForInterfaceOrientation(orientation));
_flipButton.transform = CGAffineTransformMakeRotation(TGRotationForInterfaceOrientation(orientation)); _flipButton.transform = CGAffineTransformMakeRotation(TGRotationForInterfaceOrientation(orientation));
_flashControl.transform = CGAffineTransformMakeRotation(TGRotationForInterfaceOrientation(orientation)); _flashControl.transform = CGAffineTransformMakeRotation(TGRotationForInterfaceOrientation(orientation));
_flashControl.interfaceOrientation = orientation; _zoomModeView.interfaceOrientation = orientation;
[self _layoutTopPanelSubviewsForInterfaceOrientation:orientation]; [self _layoutTopPanelSubviewsForInterfaceOrientation:orientation];
[self _layoutFlashActiveViewForInterfaceOrientation:orientation zoomViewHidden:!_zoomView.isActive];
if (_modeControl.cameraMode == PGCameraModeVideo)
_timecodeView.hidden = false;
}
}
- (void)_layoutFlashActiveViewForInterfaceOrientation:(UIInterfaceOrientation)orientation zoomViewHidden:(bool)zoomViewHidden
{
CGFloat zoomOffset = 0;
if (!zoomViewHidden)
zoomOffset -= 23;
_flashActiveView.transform = CGAffineTransformMakeRotation(TGRotationForInterfaceOrientation(orientation));
switch (orientation)
{
case UIInterfaceOrientationPortraitUpsideDown:
{
_flashActiveView.frame = CGRectMake((self.frame.size.width - 40) / 2, _topPanelHeight + 16, 40, 21);
}
break;
case UIInterfaceOrientationLandscapeLeft:
{
_flashActiveView.frame = CGRectMake(self.frame.size.width - 37, _topPanelHeight + (self.frame.size.height - _topPanelHeight - _bottomPanelHeight - _bottomPanelOffset - 40) / 2, 21, 40);
}
break;
case UIInterfaceOrientationLandscapeRight:
{
_flashActiveView.frame = CGRectMake(16, _topPanelHeight + (self.frame.size.height - _topPanelHeight - _bottomPanelHeight - _bottomPanelOffset - 40) / 2, 21, 40);
}
break;
default:
{
_flashActiveView.frame = CGRectMake((self.frame.size.width - 40) / 2, self.frame.size.height - _bottomPanelHeight - _bottomPanelOffset - 37 + zoomOffset, 40, 21);
}
break;
} }
} }
@ -826,13 +735,11 @@
- (void)_attachControlsToTopPanel - (void)_attachControlsToTopPanel
{ {
[_topPanelView addSubview:_flashControl];
[_topPanelView addSubview:_timecodeView]; [_topPanelView addSubview:_timecodeView];
} }
- (void)_attachControlsToLandscapePanel - (void)_attachControlsToLandscapePanel
{ {
[_videoLandscapePanelView addSubview:_flashControl];
[_videoLandscapePanelView addSubview:_timecodeView]; [_videoLandscapePanelView addSubview:_timecodeView];
} }
@ -844,24 +751,9 @@
if (superview == _videoLandscapePanelView && superviewSize.width < superviewSize.height) if (superview == _videoLandscapePanelView && superviewSize.width < superviewSize.height)
superviewSize = CGSizeMake(superviewSize.height, superviewSize.width); superviewSize = CGSizeMake(superviewSize.height, superviewSize.width);
// if (UIInterfaceOrientationIsLandscape(orientation) && _flashControl.interfaceOrientation == orientation && _flashControl.superview == _topPanelView)
// {
// if (orientation == UIInterfaceOrientationLandscapeLeft)
// _flashControl.frame = CGRectMake(7, 0, TGCameraFlashControlHeight, 370);
// else if (orientation == UIInterfaceOrientationLandscapeRight)
// _flashControl.frame = CGRectMake(7, 0, TGCameraFlashControlHeight, 370);
// }
// else
// {
// _flashControl.frame = CGRectMake(0, (superviewSize.height - TGCameraFlashControlHeight) / 2, superviewSize.width, TGCameraFlashControlHeight);
// }
_timecodeView.frame = CGRectMake((superviewSize.width - 120) / 2, (superviewSize.height - 28) / 2, 120, 28); _timecodeView.frame = CGRectMake((superviewSize.width - 120) / 2, (superviewSize.height - 28) / 2, 120, 28);
} }
- (void)layoutPreviewRelativeViews
{
}
- (void)layoutSubviews - (void)layoutSubviews
{ {
_topPanelView.frame = CGRectMake(0, _topPanelOffset, self.frame.size.width, _topPanelHeight); _topPanelView.frame = CGRectMake(0, _topPanelOffset, self.frame.size.width, _topPanelHeight);
@ -886,8 +778,6 @@
_flipButton.frame = CGRectMake(self.frame.size.width - _flipButton.frame.size.width - 20.0f, round(_shutterButton.center.y - _flipButton.frame.size.height / 2.0f), _flipButton.frame.size.width, _flipButton.frame.size.height); _flipButton.frame = CGRectMake(self.frame.size.width - _flipButton.frame.size.width - 20.0f, round(_shutterButton.center.y - _flipButton.frame.size.height / 2.0f), _flipButton.frame.size.width, _flipButton.frame.size.height);
_topFlipButton.frame = CGRectMake(self.frame.size.width - _topFlipButton.frame.size.width - 4.0f, 0.0f, _topFlipButton.frame.size.width, _topFlipButton.frame.size.height);
_toastView.frame = CGRectMake(0, self.frame.size.height - _bottomPanelHeight - _bottomPanelOffset - 32 - 16, self.frame.size.width, 32); _toastView.frame = CGRectMake(0, self.frame.size.height - _bottomPanelHeight - _bottomPanelOffset - 32 - 16, self.frame.size.width, 32);
CGFloat photosViewSize = TGPhotoThumbnailSizeForCurrentScreen().height + 4 * 2; CGFloat photosViewSize = TGPhotoThumbnailSizeForCurrentScreen().height + 4 * 2;

View File

@ -194,6 +194,8 @@
{ {
if (!hasZoom) if (!hasZoom)
[_zoomView hideAnimated:true]; [_zoomView hideAnimated:true];
[_zoomModeView setHidden:!hasZoom animated:true];
} }
#pragma mark - Video #pragma mark - Video
@ -233,11 +235,6 @@
completion(true); completion(true);
} }
- (void)layoutPreviewRelativeViews
{
}
#pragma mark - #pragma mark -
- (void)setDocumentFrameHidden:(bool)hidden - (void)setDocumentFrameHidden:(bool)hidden

View File

@ -282,20 +282,20 @@
switch (gestureRecognizer.state) { switch (gestureRecognizer.state) {
case UIGestureRecognizerStateBegan: case UIGestureRecognizerStateBegan:
self.zoomChanged(_zoomLevel, false); self.zoomChanged(_zoomLevel, false, false);
break; break;
case UIGestureRecognizerStateChanged: case UIGestureRecognizerStateChanged:
_zoomLevel = MAX(0.5, MIN(10.0, _zoomLevel - translation.x / 100.0)); _zoomLevel = MAX(0.5, MIN(10.0, _zoomLevel - translation.x / 100.0));
self.zoomChanged(_zoomLevel, false); self.zoomChanged(_zoomLevel, false, false);
break; break;
case UIGestureRecognizerStateEnded: case UIGestureRecognizerStateEnded:
self.zoomChanged(_zoomLevel, true); self.zoomChanged(_zoomLevel, true, false);
break; break;
case UIGestureRecognizerStateCancelled: case UIGestureRecognizerStateCancelled:
self.zoomChanged(_zoomLevel, true); self.zoomChanged(_zoomLevel, true, false);
break; break;
default: default:
@ -307,17 +307,17 @@
- (void)leftPressed { - (void)leftPressed {
[self setZoomLevel:0.5 animated:true]; [self setZoomLevel:0.5 animated:true];
self.zoomChanged(0.5, true); self.zoomChanged(0.5, true, true);
} }
- (void)centerPressed { - (void)centerPressed {
[self setZoomLevel:1.0 animated:true]; [self setZoomLevel:1.0 animated:true];
self.zoomChanged(1.0, true); self.zoomChanged(1.0, true, true);
} }
- (void)rightPressed { - (void)rightPressed {
[self setZoomLevel:2.0 animated:true]; [self setZoomLevel:2.0 animated:true];
self.zoomChanged(2.0, true); self.zoomChanged(2.0, true, true);
} }
- (void)setZoomLevel:(CGFloat)zoomLevel { - (void)setZoomLevel:(CGFloat)zoomLevel {
@ -329,33 +329,39 @@
_zoomLevel = zoomLevel; _zoomLevel = zoomLevel;
if (zoomLevel < 1.0) { if (zoomLevel < 1.0) {
NSString *value = [NSString stringWithFormat:@"%.1fx", zoomLevel]; NSString *value = [NSString stringWithFormat:@"%.1fx", zoomLevel];
if ([value isEqual:@"1.0x"]) { if ([value isEqual:@"1,0x"]) {
value = @"0.9x"; value = @"0,9x";
} }
value = [value stringByReplacingOccurrencesOfString:@"." withString:@","];
[_leftItem setValue:value selected:true animated:animated]; [_leftItem setValue:value selected:true animated:animated];
[_centerItem setValue:@"1" selected:false animated:animated]; [_centerItem setValue:@"1" selected:false animated:animated];
[_rightItem setValue:@"2" selected:false animated:animated]; [_rightItem setValue:@"2" selected:false animated:animated];
} else if (zoomLevel < 2.0) { } else if (zoomLevel < 2.0) {
[_leftItem setValue:@"0.5" selected:false animated:animated]; [_leftItem setValue:@"0,5" selected:false animated:animated];
if ((zoomLevel - 1.0) < 0.1) { if ((zoomLevel - 1.0) < 0.1) {
[_centerItem setValue:@"1x" selected:true animated:animated]; [_centerItem setValue:@"1x" selected:true animated:animated];
} else { } else {
NSString *value = [NSString stringWithFormat:@"%.1fx", zoomLevel]; NSString *value = [NSString stringWithFormat:@"%.1fx", zoomLevel];
if ([value isEqual:@"1.0x"]) { value = [value stringByReplacingOccurrencesOfString:@"." withString:@","];
if ([value isEqual:@"1,0x"]) {
value = @"1x"; value = @"1x";
} else if ([value isEqual:@"2,0x"]) {
value = @"1,9x";
} }
[_centerItem setValue:value selected:true animated:animated]; [_centerItem setValue:value selected:true animated:animated];
} }
[_rightItem setValue:@"2" selected:false animated:animated]; [_rightItem setValue:@"2" selected:false animated:animated];
} else { } else {
[_leftItem setValue:@"0.5" selected:false animated:animated]; [_leftItem setValue:@"0,5" selected:false animated:animated];
[_centerItem setValue:@"1" selected:false animated:animated]; [_centerItem setValue:@"1" selected:false animated:animated];
CGFloat near = round(zoomLevel); CGFloat near = round(zoomLevel);
if (ABS(zoomLevel - near) < 0.1) { if (ABS(zoomLevel - near) < 0.1) {
[_rightItem setValue:[NSString stringWithFormat:@"%dx", (int)zoomLevel] selected:true animated:animated]; [_rightItem setValue:[NSString stringWithFormat:@"%dx", (int)zoomLevel] selected:true animated:animated];
} else { } else {
[_rightItem setValue:[NSString stringWithFormat:@"%.1fx", zoomLevel] selected:true animated:animated]; NSString *value = [NSString stringWithFormat:@"%.1fx", zoomLevel];
value = [value stringByReplacingOccurrencesOfString:@"." withString:@","];
[_rightItem setValue:value selected:true animated:animated];
} }
} }
} }
@ -406,6 +412,14 @@
} }
} }
- (void)setInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
_interfaceOrientation = interfaceOrientation;
_leftItem.transform = CGAffineTransformMakeRotation(TGRotationForInterfaceOrientation(interfaceOrientation));
_centerItem.transform = CGAffineTransformMakeRotation(TGRotationForInterfaceOrientation(interfaceOrientation));
_rightItem.transform = CGAffineTransformMakeRotation(TGRotationForInterfaceOrientation(interfaceOrientation));
}
@end @end

View File

@ -1706,6 +1706,9 @@ UIImage *TGBlurredAlphaImage(UIImage *source, CGSize size)
UIImage *TGBlurredRectangularImage(UIImage *source, bool more, CGSize size, CGSize renderSize, uint32_t *averageColor, void (^pixelProcessingBlock)(void *, int, int, int)) UIImage *TGBlurredRectangularImage(UIImage *source, bool more, CGSize size, CGSize renderSize, uint32_t *averageColor, void (^pixelProcessingBlock)(void *, int, int, int))
{ {
CGSize fittedSize = fitSize(size, CGSizeMake(90, 90)); CGSize fittedSize = fitSize(size, CGSizeMake(90, 90));
if ((int)(fittedSize.width) % 2 != 0) {
fittedSize.width += 1.0;
}
CGSize fittedRenderSize = CGSizeMake(fittedSize.width / size.width * renderSize.width, fittedSize.height / size.height * renderSize.height); CGSize fittedRenderSize = CGSizeMake(fittedSize.width / size.width * renderSize.width, fittedSize.height / size.height * renderSize.height);
const struct { int width, height; } blurredContextSize = { (int)fittedSize.width, (int)fittedSize.height }; const struct { int width, height; } blurredContextSize = { (int)fittedSize.width, (int)fittedSize.height };
@ -2288,12 +2291,12 @@ UIImage *TGCropBackdropImage(UIImage *source, CGSize size)
UIImage *TGCameraPositionSwitchImage(UIImage *source, CGSize size) UIImage *TGCameraPositionSwitchImage(UIImage *source, CGSize size)
{ {
return TGBlurredRectangularImage(source, false, size, size, NULL, nil); return TGBlurredRectangularImage(source, true, size, size, NULL, nil);
} }
UIImage *TGCameraModeSwitchImage(UIImage *source, CGSize size) UIImage *TGCameraModeSwitchImage(UIImage *source, CGSize size)
{ {
return TGBlurredRectangularImage(source, false, size, size, NULL, nil); return TGBlurredRectangularImage(source, true, size, size, NULL, nil);
} }
UIImage *TGScaleAndCropImageToPixelSize(UIImage *source, CGSize size, CGSize renderSize, uint32_t *averageColor, void (^pixelProcessingBlock)(void *, int, int, int)) UIImage *TGScaleAndCropImageToPixelSize(UIImage *source, CGSize size, CGSize renderSize, uint32_t *averageColor, void (^pixelProcessingBlock)(void *, int, int, int))