Fix camera zoom

This commit is contained in:
Ilya Laktyushin 2021-07-25 19:10:59 +03:00
parent 53d81aef4c
commit 367836362a
2 changed files with 15 additions and 20 deletions

View File

@ -482,16 +482,16 @@ const NSInteger PGCameraFrameRate = 30;
if (backingLevel < firstMark) { if (backingLevel < firstMark) {
realLevel = 0.5 + 0.5 * (backingLevel - 1.0) / (firstMark - 1.0); realLevel = 0.5 + 0.5 * (backingLevel - 1.0) / (firstMark - 1.0);
} else if (backingLevel < secondMark) { } else if (backingLevel < secondMark) {
realLevel = 1.0 + (backingLevel - firstMark) / (secondMark - firstMark); realLevel = 1.0 + 1.0 * (backingLevel - firstMark) / (secondMark - firstMark);
} else { } else {
realLevel = 2.0 + (backingLevel - secondMark) / (self.maxZoomLevel - secondMark); realLevel = 2.0 + 6.0 * (backingLevel - secondMark) / (self.maxZoomLevel - secondMark);
} }
} else if (marks.count == 1) { } else if (marks.count == 1) {
CGFloat mark = [marks.firstObject floatValue]; CGFloat mark = [marks.firstObject floatValue];
if (backingLevel < mark) { if (backingLevel < mark) {
realLevel = 1.0 + backingLevel / mark; realLevel = 1.0 + 1.0 * (backingLevel - 1.0) / (mark - 1.0);
} else { } else {
realLevel = 2.0 + (backingLevel - mark) / (self.maxZoomLevel - mark); realLevel = 2.0 + 6.0 * (backingLevel - mark) / (self.maxZoomLevel - mark);
} }
} }
@ -511,7 +511,7 @@ const NSInteger PGCameraFrameRate = 30;
} }
- (CGFloat)maxZoomLevel { - (CGFloat)maxZoomLevel {
return MIN(6.0f, self.videoDevice.activeFormat.videoMaxZoomFactor); return MIN(16.0f, self.videoDevice.activeFormat.videoMaxZoomFactor);
} }
- (void)resetZoom { - (void)resetZoom {
@ -531,38 +531,30 @@ const NSInteger PGCameraFrameRate = 30;
return; return;
CGFloat level = zoomLevel; CGFloat level = zoomLevel;
CGFloat backingLevel = 1.0;
if (iosMajorVersion() >= 13.0 && device.isVirtualDevice) { if (iosMajorVersion() >= 13.0 && device.isVirtualDevice) {
NSArray *marks = device.virtualDeviceSwitchOverVideoZoomFactors; NSArray *marks = device.virtualDeviceSwitchOverVideoZoomFactors;
if (marks.count == 2) { if (marks.count == 2) {
CGFloat firstMark = [marks.firstObject floatValue]; CGFloat firstMark = [marks.firstObject floatValue];
CGFloat secondMark = [marks.lastObject floatValue]; CGFloat secondMark = [marks.lastObject floatValue];
if (level < 1.0) { if (level < 1.0) {
level = MAX(0.5, level); level = MAX(0.5, level);
backingLevel = 1.0 + ((level - 0.5) / 0.5) * (firstMark - 1.0);
CGFloat backingLevel = 1.0 + ((level - 0.5) / 0.5) * (firstMark - 1.0);
device.videoZoomFactor = backingLevel;
} else if (zoomLevel < 2.0) { } else if (zoomLevel < 2.0) {
CGFloat backingLevel = firstMark + (level - 1.0) * (secondMark - firstMark); backingLevel = firstMark + ((level - 1.0) / 1.0) * (secondMark - firstMark);
device.videoZoomFactor = backingLevel;
} else { } else {
CGFloat backingLevel = secondMark + (level - 2.0) * (self.maxZoomLevel - secondMark); backingLevel = secondMark + ((level - 2.0) / 6.0) * (self.maxZoomLevel - secondMark);
device.videoZoomFactor = backingLevel;
} }
} else if (marks.count == 1) { } else if (marks.count == 1) {
CGFloat mark = [marks.firstObject floatValue]; CGFloat mark = [marks.firstObject floatValue];
if (zoomLevel < 2.0) { if (zoomLevel < 2.0) {
CGFloat backingLevel = (level - 1.0) * mark; backingLevel = 1.0 + ((level - 1.0) / 1.0) * (mark - 1.0);
device.videoZoomFactor = backingLevel;
} else { } else {
CGFloat backingLevel = mark + (level - 2.0) * (self.maxZoomLevel - mark); backingLevel = mark + ((level - 2.0) / 6.0) * (self.maxZoomLevel - mark);
device.videoZoomFactor = backingLevel;
} }
} }
} else {
level = MAX(1.0, MIN(10.0, level));
device.videoZoomFactor = MAX([strongSelf minZoomLevel], MIN([strongSelf maxZoomLevel], level));
} }
device.videoZoomFactor = MAX(1.0, MIN([strongSelf maxZoomLevel], backingLevel));
}]; }];
} }

View File

@ -2522,6 +2522,9 @@ static CGPoint TGCameraControllerClampPointToScreenSize(__unused id self, __unus
case UIGestureRecognizerStateChanged: case UIGestureRecognizerStateChanged:
{ {
CGFloat delta = (gestureRecognizer.scale - 1.0f) * 1.25; CGFloat delta = (gestureRecognizer.scale - 1.0f) * 1.25;
if (_camera.zoomLevel > 2.0) {
delta *= 2.0;
}
CGFloat value = MAX(_camera.minZoomLevel, MIN(_camera.maxZoomLevel, _camera.zoomLevel + delta)); CGFloat value = MAX(_camera.minZoomLevel, MIN(_camera.maxZoomLevel, _camera.zoomLevel + delta));
[_camera setZoomLevel:value]; [_camera setZoomLevel:value];