1// Copyright 2019 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#import "ios/chrome/browser/ui/scanner/video_preview_view.h" 6 7#include "base/check.h" 8#include "base/mac/foundation_util.h" 9#import "ios/chrome/browser/ui/util/ui_util.h" 10 11#if !defined(__has_feature) || !__has_feature(objc_arc) 12#error "This file requires ARC support." 13#endif 14 15@interface VideoPreviewView () { 16 // The current viewport size. 17 CGSize _viewportSize; 18} 19@end 20 21@implementation VideoPreviewView 22 23- (instancetype)initWithFrame:(CGRect)frame 24 viewportSize:(CGSize)previewViewportSize { 25 self = [super initWithFrame:frame]; 26 27 if (self) { 28 _viewportSize = previewViewportSize; 29 } 30 return self; 31} 32 33+ (Class)layerClass { 34 return [AVCaptureVideoPreviewLayer class]; 35} 36 37- (AVCaptureVideoPreviewLayer*)previewLayer { 38 return base::mac::ObjCCastStrict<AVCaptureVideoPreviewLayer>([self layer]); 39} 40 41- (CGRect)viewportRegionOfInterest { 42 CGRect rect = CGRectMakeCenteredRectInFrame(self.frame.size, _viewportSize); 43 CGFloat x = rect.origin.x / self.frame.size.width; 44 CGFloat y = rect.origin.y / self.frame.size.height; 45 46 CGFloat width = rect.size.width / self.frame.size.width; 47 CGFloat height = rect.size.height / self.frame.size.height; 48 49 // Vision region of interest measures the frame size from the lower left 50 // corner so reverse x & y, reverse width & height. 51 return CGRectMake(y, x, height, width); 52} 53 54- (CGRect)viewportRectOfInterest { 55 CGRect viewportRect = 56 CGRectMakeCenteredRectInFrame(self.frame.size, _viewportSize); 57 AVCaptureVideoPreviewLayer* layer = [self previewLayer]; 58 // If the layer does not have a connection, 59 // |metadataOutputRectOfInterestForRect:| does not return the right value. 60 DCHECK(layer.connection); 61 return [layer metadataOutputRectOfInterestForRect:viewportRect]; 62} 63 64@end 65