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