Swiftgram/submodules/LegacyComponents/Sources/TGPhotoPaintController.m
Ilya Laktyushin 9937826307 Various fixes
2022-12-23 10:11:08 +04:00

2603 lines
103 KiB
Objective-C

//#import "TGPhotoPaintController.h"
//
//#import "LegacyComponentsInternal.h"
//
//#import <LegacyComponents/UIImage+TG.h>
//
//#import <LegacyComponents/TGPaintUtils.h>
//#import <LegacyComponents/TGPhotoEditorUtils.h>
//#import <LegacyComponents/TGPhotoEditorAnimation.h>
//#import "TGPhotoEditorInterfaceAssets.h"
//#import <LegacyComponents/TGObserverProxy.h>
//
//#import <LegacyComponents/TGMenuView.h>
//#import <LegacyComponents/TGModernButton.h>
//
//#import "TGMenuSheetController.h"
//
//#import <LegacyComponents/TGMediaAsset.h>
//#import <LegacyComponents/TGMediaAssetImageSignals.h>
//
//#import "TGPainting.h"
//#import <LegacyComponents/TGPaintingData.h>
//#import "TGPaintRadialBrush.h"
//#import "TGPaintEllipticalBrush.h"
//#import "TGPaintNeonBrush.h"
//#import "TGPaintArrowBrush.h"
//#import "TGPaintCanvas.h"
//#import "TGPaintingWrapperView.h"
//#import "TGPaintState.h"
//#import "TGPaintBrushPreview.h"
//#import "TGPaintSwatch.h"
//#import "TGPhotoPaintFont.h"
//#import <LegacyComponents/TGPaintUndoManager.h>
//
//#import "PGPhotoEditor.h"
//#import "TGPhotoEditorPreviewView.h"
//
//#import "TGPhotoPaintActionsView.h"
//#import "TGPhotoPaintSettingsView.h"
//
//#import "TGPhotoPaintSettingsWrapperView.h"
//#import "TGPhotoBrushSettingsView.h"
//#import "TGPhotoTextSettingsView.h"
//
//#import "TGPhotoPaintSelectionContainerView.h"
//#import "TGPhotoEntitiesContainerView.h"
//#import "TGPhotoStickerEntityView.h"
//#import "TGPhotoTextEntityView.h"
//#import "TGPhotoPaintEyedropperView.h"
//
//#import "TGPaintFaceDetector.h"
//#import "TGPhotoMaskPosition.h"
//
//const CGFloat TGPhotoPaintTopPanelSize = 44.0f;
//const CGFloat TGPhotoPaintBottomPanelSize = 79.0f;
//const CGSize TGPhotoPaintingLightMaxSize = { 1280.0f, 1280.0f };
//const CGSize TGPhotoPaintingMaxSize = { 2560.0f, 2560.0f };
//
//const CGFloat TGPhotoPaintStickerKeyboardSize = 260.0f;
//
//@interface TGPhotoPaintController () <UIScrollViewDelegate, UIGestureRecognizerDelegate, ASWatcher>
//{
// TGPaintUndoManager *_undoManager;
// TGObserverProxy *_keyboardWillChangeFrameProxy;
// CGFloat _keyboardHeight;
//
// TGModernGalleryZoomableScrollView *_scrollView;
// UIView *_scrollContentView;
//
// UIButton *_containerView;
// TGPhotoEditorSparseView *_wrapperView;
// UIView *_portraitToolsWrapperView;
// UIView *_landscapeToolsWrapperView;
//
// UIPinchGestureRecognizer *_pinchGestureRecognizer;
// UIRotationGestureRecognizer *_rotationGestureRecognizer;
//
// NSArray *_brushes;
// TGPainting *_painting;
// TGPaintCanvas *_canvasView;
// TGPaintBrushPreview *_brushPreview;
//
// CGSize _previousSize;
// UIView *_contentView;
// UIView *_contentWrapperView;
//
// UIView *_dimView;
// TGModernButton *_doneButton;
//
// TGPhotoPaintActionsView *_landscapeActionsView;
// TGPhotoPaintActionsView *_portraitActionsView;
//
// TGPhotoPaintSettingsView *_portraitSettingsView;
// TGPhotoPaintSettingsView *_landscapeSettingsView;
//
// TGPhotoPaintSettingsWrapperView *_settingsViewWrapper;
// UIView<TGPhotoPaintPanelView> *_settingsView;
// id<TGPhotoPaintStickersScreen> _stickersScreen;
//
// double _stickerStartTime;
//
// bool _appeared;
// bool _skipEntitiesSetup;
// bool _entitiesReady;
//
// TGPhotoPaintFont *_selectedTextFont;
// TGPhotoPaintTextEntityStyle _selectedTextStyle;
//
// TGPhotoEntitiesContainerView *_entitiesContainerView;
// TGPhotoPaintEntityView *_currentEntityView;
//
// TGPhotoPaintSelectionContainerView *_selectionContainerView;
// TGPhotoPaintEntitySelectionView *_entitySelectionView;
// TGPhotoPaintEyedropperView *_eyedropperView;
//
// TGPhotoTextEntityView *_editedTextView;
// CGPoint _editedTextCenter;
// CGAffineTransform _editedTextTransform;
// UIButton *_textEditingDismissButton;
//
// TGMenuContainerView *_menuContainerView;
//
// TGPaintingData *_resultData;
//
// TGPaintingWrapperView *_paintingWrapperView;
//
// bool _enableStickers;
//
// NSData *_eyedropperBackgroundData;
// CGSize _eyedropperBackgroundSize;
// NSInteger _eyedropperBackgroundBytesPerRow;
// CGBitmapInfo _eyedropperBackgroundInfo;
//
// id<LegacyComponentsContext> _context;
//}
//
//@property (nonatomic, strong) ASHandle *actionHandle;
//
//@property (nonatomic, weak) PGPhotoEditor *photoEditor;
//@property (nonatomic, weak) TGPhotoEditorPreviewView *previewView;
//
//@end
//
//@implementation TGPhotoPaintController
//
//- (instancetype)initWithContext:(id<LegacyComponentsContext>)context photoEditor:(PGPhotoEditor *)photoEditor previewView:(TGPhotoEditorPreviewView *)previewView entitiesView:(TGPhotoEntitiesContainerView *)entitiesView
//{
// self = [super initWithContext:context];
// if (self != nil)
// {
// _context = context;
// _enableStickers = photoEditor.enableStickers;
//
// _stickerStartTime = NAN;
//
// _actionHandle = [[ASHandle alloc] initWithDelegate:self releaseOnMainThread:true];
//
// self.photoEditor = photoEditor;
// self.previewView = previewView;
// _entitiesContainerView = entitiesView;
// if (entitiesView != nil) {
// _skipEntitiesSetup = true;
// }
// entitiesView.userInteractionEnabled = true;
//
// _brushes = @
// [
// [[TGPaintRadialBrush alloc] init],
// [[TGPaintEllipticalBrush alloc] init],
// [[TGPaintNeonBrush alloc] init],
// [[TGPaintArrowBrush alloc] init],
// ];
// _selectedTextFont = [[TGPhotoPaintFont availableFonts] firstObject];
// _selectedTextStyle = TGPhotoPaintTextEntityStyleFramed;
//
// _undoManager = [[TGPaintUndoManager alloc] init];
//
// CGSize size = TGScaleToSize(photoEditor.originalSize, [TGPhotoPaintController maximumPaintingSize]);
//// _painting = [[TGPainting alloc] initWithSize:size undoManager:_undoManager imageData:[_photoEditor.paintingData data]];
// _undoManager.painting = _painting;
//
// _keyboardWillChangeFrameProxy = [[TGObserverProxy alloc] initWithTarget:self targetSelector:@selector(keyboardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification];
// }
// return self;
//}
//
//- (void)dealloc
//{
// [_actionHandle reset];
//}
//
//- (void)loadView
//{
// [super loadView];
// self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
//
// _scrollView = [[TGModernGalleryZoomableScrollView alloc] initWithFrame:self.view.bounds hasDoubleTap:false];
// if (@available(iOS 11.0, *)) {
// _scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
// }
// _scrollView.contentInset = UIEdgeInsetsZero;
// _scrollView.delegate = self;
// _scrollView.showsHorizontalScrollIndicator = false;
// _scrollView.showsVerticalScrollIndicator = false;
// [self.view addSubview:_scrollView];
//
// _scrollContentView = [[UIView alloc] initWithFrame:self.view.bounds];
// [_scrollView addSubview:_scrollContentView];
//
// _containerView = [[UIButton alloc] initWithFrame:self.view.bounds];
// _containerView.clipsToBounds = true;
// [_containerView addTarget:self action:@selector(containerPressed) forControlEvents:UIControlEventTouchUpInside];
// [_scrollContentView addSubview:_containerView];
//
// _pinchGestureRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinch:)];
// _pinchGestureRecognizer.delegate = self;
// [_containerView addGestureRecognizer:_pinchGestureRecognizer];
//
// _rotationGestureRecognizer = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(handleRotate:)];
// _rotationGestureRecognizer.delegate = self;
// [_containerView addGestureRecognizer:_rotationGestureRecognizer];
//
// TGPhotoEditorPreviewView *previewView = _previewView;
// previewView.userInteractionEnabled = false;
// previewView.hidden = true;
//
// __weak TGPhotoPaintController *weakSelf = self;
// _paintingWrapperView = [[TGPaintingWrapperView alloc] init];
// _paintingWrapperView.clipsToBounds = true;
// _paintingWrapperView.shouldReceiveTouch = ^bool
// {
// __strong TGPhotoPaintController *strongSelf = weakSelf;
// if (strongSelf == nil)
// return false;
//
// return (strongSelf->_editedTextView == nil);
// };
// [_containerView addSubview:_paintingWrapperView];
//
// _contentView = [[UIView alloc] init];
// _contentView.clipsToBounds = true;
// _contentView.userInteractionEnabled = false;
// [_containerView addSubview:_contentView];
//
// _contentWrapperView = [[UIView alloc] init];
// _contentWrapperView.userInteractionEnabled = false;
// [_contentView addSubview:_contentWrapperView];
//
// if (_entitiesContainerView == nil) {
// _entitiesContainerView = [[TGPhotoEntitiesContainerView alloc] init];
// _entitiesContainerView.clipsToBounds = true;
// _entitiesContainerView.stickersContext = _stickersContext;
// }
// _entitiesContainerView.entitySelected = ^(TGPhotoPaintEntityView *sender)
// {
// __strong TGPhotoPaintController *strongSelf = weakSelf;
// if (strongSelf == nil)
// return;
//
// [strongSelf selectEntityView:sender];
// };
// _entitiesContainerView.entityRemoved = ^(TGPhotoPaintEntityView *entity)
// {
// __strong TGPhotoPaintController *strongSelf = weakSelf;
// if (strongSelf == nil)
// return;
//
// if (entity == strongSelf->_currentEntityView)
// [strongSelf _clearCurrentSelection];
//
// [strongSelf updateSettingsButton];
// };
// if (!_skipEntitiesSetup) {
// [_contentWrapperView addSubview:_entitiesContainerView];
// }
// _undoManager.entitiesContainer = _entitiesContainerView;
//
// _dimView = [[UIView alloc] init];
// _dimView.alpha = 0.0f;
// _dimView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
// _dimView.backgroundColor = UIColorRGBA(0x000000, 0.4f);
// _dimView.userInteractionEnabled = false;
// [_entitiesContainerView addSubview:_dimView];
//
// _selectionContainerView = [[TGPhotoPaintSelectionContainerView alloc] init];
// _selectionContainerView.clipsToBounds = false;
// [_containerView addSubview:_selectionContainerView];
//
// _eyedropperView = [[TGPhotoPaintEyedropperView alloc] init];
// _eyedropperView.locationChanged = ^(CGPoint location, bool finished) {
// __strong TGPhotoPaintController *strongSelf = weakSelf;
// if (strongSelf != nil)
// {
// UIColor *color = [strongSelf colorAtPoint:location];
// strongSelf->_eyedropperView.color = color;
//
// if (finished) {
// TGPaintSwatch *swatch = [TGPaintSwatch swatchWithColor:color colorLocation:0.5 brushWeight:strongSelf->_portraitSettingsView.swatch.brushWeight];
// [strongSelf setCurrentSwatch:swatch sender:nil];
//
// [strongSelf commitEyedropper:false];
// }
// }
// };
// _eyedropperView.hidden = true;
// [_selectionContainerView addSubview:_eyedropperView];
//
// _wrapperView = [[TGPhotoEditorSparseView alloc] initWithFrame:CGRectZero];
// [self.view addSubview:_wrapperView];
//
// _portraitToolsWrapperView = [[UIView alloc] initWithFrame:CGRectZero];
// _portraitToolsWrapperView.alpha = 0.0f;
// [_wrapperView addSubview:_portraitToolsWrapperView];
//
// _landscapeToolsWrapperView = [[UIView alloc] initWithFrame:CGRectZero];
// _landscapeToolsWrapperView.alpha = 0.0f;
// [_wrapperView addSubview:_landscapeToolsWrapperView];
//
// void (^undoPressed)(void) = ^
// {
// __strong TGPhotoPaintController *strongSelf = weakSelf;
// if (strongSelf != nil)
// [strongSelf->_undoManager undo];
// };
//
// void (^clearPressed)(UIView *) = ^(UIView *sender)
// {
// __strong TGPhotoPaintController *strongSelf = weakSelf;
// if (strongSelf != nil)
// [strongSelf presentClearAllAlert:sender];
// };
//
// _portraitActionsView = [[TGPhotoPaintActionsView alloc] init];
// _portraitActionsView.alpha = 0.0f;
// _portraitActionsView.undoPressed = undoPressed;
// _portraitActionsView.clearPressed = clearPressed;
// [_wrapperView addSubview:_portraitActionsView];
//
// _landscapeActionsView = [[TGPhotoPaintActionsView alloc] init];
// _landscapeActionsView.alpha = 0.0f;
// _landscapeActionsView.undoPressed = undoPressed;
// _landscapeActionsView.clearPressed = clearPressed;
// [_wrapperView addSubview:_landscapeActionsView];
//
// _doneButton = [[TGModernButton alloc] init];
// _doneButton.alpha = 0.0f;
// _doneButton.userInteractionEnabled = false;
// [_doneButton setTitle:TGLocalized(@"Common.Done") forState:UIControlStateNormal];
// _doneButton.titleLabel.font = TGSystemFontOfSize(17.0);
// [_doneButton sizeToFit];
//// [_wrapperView addSubview:_doneButton];
//
// void (^settingsPressed)(void) = ^
// {
// __strong TGPhotoPaintController *strongSelf = weakSelf;
// if (strongSelf == nil)
// return;
//
// [strongSelf commitEyedropper:true];
//
// if ([strongSelf->_currentEntityView isKindOfClass:[TGPhotoTextEntityView class]])
// [strongSelf presentTextSettingsView];
// else if ([strongSelf->_currentEntityView isKindOfClass:[TGPhotoStickerEntityView class]])
// [strongSelf mirrorSelectedStickerEntity];
// else
// [strongSelf presentBrushSettingsView];
// };
//
// void (^eyedropperPressed)(void) = ^
// {
// __strong TGPhotoPaintController *strongSelf = weakSelf;
// if (strongSelf == nil)
// return;
//
// [self enableEyedropper];
// };
//
// void (^beganColorPicking)(void) = ^
// {
// __strong TGPhotoPaintController *strongSelf = weakSelf;
// if (strongSelf == nil)
// return;
//
// [strongSelf commitEyedropper:true];
//
// if (![strongSelf->_currentEntityView isKindOfClass:[TGPhotoTextEntityView class]])
// [strongSelf setDimHidden:false animated:true];
// };
//
// void (^changedColor)(TGPhotoPaintSettingsView *, TGPaintSwatch *) = ^(TGPhotoPaintSettingsView *sender, TGPaintSwatch *swatch)
// {
// __strong TGPhotoPaintController *strongSelf = weakSelf;
// if (strongSelf == nil)
// return;
//
// [strongSelf setCurrentSwatch:swatch sender:sender];
// };
//
// void (^finishedColorPicking)(TGPhotoPaintSettingsView *, TGPaintSwatch *) = ^(TGPhotoPaintSettingsView *sender, TGPaintSwatch *swatch)
// {
// __strong TGPhotoPaintController *strongSelf = weakSelf;
// if (strongSelf == nil)
// return;
//
// [strongSelf commitEyedropper:true];
//
// [strongSelf setCurrentSwatch:swatch sender:sender];
//
// if (![strongSelf->_currentEntityView isKindOfClass:[TGPhotoTextEntityView class]])
// [strongSelf setDimHidden:true animated:true];
// };
//
// _portraitSettingsView = [[TGPhotoPaintSettingsView alloc] initWithContext:_context];
// _portraitSettingsView.eyedropperPressed = eyedropperPressed;
// _portraitSettingsView.beganColorPicking = beganColorPicking;
// _portraitSettingsView.changedColor = changedColor;
// _portraitSettingsView.finishedColorPicking = finishedColorPicking;
// _portraitSettingsView.settingsPressed = settingsPressed;
// _portraitSettingsView.layer.rasterizationScale = TGScreenScaling();
// _portraitSettingsView.interfaceOrientation = UIInterfaceOrientationPortrait;
// [_portraitToolsWrapperView addSubview:_portraitSettingsView];
//
// _landscapeSettingsView = [[TGPhotoPaintSettingsView alloc] initWithContext:_context];
// _landscapeSettingsView.eyedropperPressed = eyedropperPressed;
// _landscapeSettingsView.beganColorPicking = beganColorPicking;
// _landscapeSettingsView.changedColor = changedColor;
// _landscapeSettingsView.finishedColorPicking = finishedColorPicking;
// _landscapeSettingsView.settingsPressed = settingsPressed;
// _landscapeSettingsView.layer.rasterizationScale = TGScreenScaling();
// _landscapeSettingsView.interfaceOrientation = UIInterfaceOrientationLandscapeLeft;
// [_landscapeToolsWrapperView addSubview:_landscapeSettingsView];
//
// [self setCurrentSwatch:_portraitSettingsView.swatch sender:nil];
//
// if (![self _updateControllerInset:false])
// [self controllerInsetUpdated:UIEdgeInsetsZero];
//}
//
//- (void)setStickersContext:(id<TGPhotoPaintStickersContext>)stickersContext {
// _stickersContext = stickersContext;
// _entitiesContainerView.stickersContext = stickersContext;
//}
//
//- (void)setupCanvas
//{
// if (_canvasView == nil) {
// __weak TGPhotoPaintController *weakSelf = self;
// _canvasView = [[TGPaintCanvas alloc] initWithFrame:CGRectZero];
// _canvasView.pointInsideContainer = ^bool(CGPoint point)
// {
// __strong TGPhotoPaintController *strongSelf = weakSelf;
// if (strongSelf == nil)
// return false;
//
// return [strongSelf->_containerView pointInside:[strongSelf->_canvasView convertPoint:point toView:strongSelf->_containerView] withEvent:nil];
// };
// _canvasView.shouldDraw = ^bool
// {
// __strong TGPhotoPaintController *strongSelf = weakSelf;
// if (strongSelf == nil)
// return false;
//
// return ![strongSelf->_entitiesContainerView isTrackingAnyEntityView];
// };
// _canvasView.shouldDrawOnSingleTap = ^bool
// {
// __strong TGPhotoPaintController *strongSelf = weakSelf;
// if (strongSelf == nil)
// return false;
//
// bool rotating = (strongSelf->_rotationGestureRecognizer.state == UIGestureRecognizerStateBegan || strongSelf->_rotationGestureRecognizer.state == UIGestureRecognizerStateChanged);
// bool pinching = (strongSelf->_pinchGestureRecognizer.state == UIGestureRecognizerStateBegan || strongSelf->_pinchGestureRecognizer.state == UIGestureRecognizerStateChanged);
//
// if (strongSelf->_currentEntityView != nil && !rotating && !pinching)
// {
// [strongSelf selectEntityView:nil];
// return false;
// }
//
// return true;
// };
// _canvasView.strokeBegan = ^
// {
// __strong TGPhotoPaintController *strongSelf = weakSelf;
// if (strongSelf != nil)
// [strongSelf selectEntityView:nil];
// };
// _canvasView.strokeCommited = ^
// {
// __strong TGPhotoPaintController *strongSelf = weakSelf;
// if (strongSelf != nil)
// [strongSelf updateActionsView];
// };
// _canvasView.hitTest = ^UIView *(CGPoint point, UIEvent *event)
// {
// __strong TGPhotoPaintController *strongSelf = weakSelf;
// if (strongSelf == nil)
// return nil;
//
// return [strongSelf->_entitiesContainerView hitTest:[strongSelf->_canvasView convertPoint:point toView:strongSelf->_entitiesContainerView] withEvent:event];
// };
// _canvasView.cropRect = _photoEditor.cropRect;
// _canvasView.cropOrientation = _photoEditor.cropOrientation;
// _canvasView.originalSize = _photoEditor.originalSize;
// [_canvasView setPainting:_painting];
// [_canvasView setBrush:_brushes.firstObject];
// [self setCurrentSwatch:_portraitSettingsView.swatch sender:nil];
// [_paintingWrapperView addSubview:_canvasView];
// }
//
// _canvasView.hidden = false;
// [self.view setNeedsLayout];
//}
//
//- (void)viewDidLoad
//{
// [super viewDidLoad];
//
// PGPhotoEditor *photoEditor = _photoEditor;
// if (!_skipEntitiesSetup) {
// [_entitiesContainerView setupWithPaintingData:photoEditor.paintingData];
// }
// for (TGPhotoPaintEntityView *view in _entitiesContainerView.subviews)
// {
// if (![view isKindOfClass:[TGPhotoPaintEntityView class]])
// continue;
//
// [self _commonEntityViewSetup:view];
// }
//
// __weak TGPhotoPaintController *weakSelf = self;
// _undoManager.historyChanged = ^
// {
// __strong TGPhotoPaintController *strongSelf = weakSelf;
// if (strongSelf != nil)
// [strongSelf updateActionsView];
// };
//
// [self updateActionsView];
//}
//
//- (void)viewDidAppear:(BOOL)animated
//{
// [super viewDidAppear:animated];
//
// [self transitionIn];
//}
//
//#pragma mark - Tab Bar
//
//- (TGPhotoEditorTab)availableTabs
//{
// TGPhotoEditorTab result = TGPhotoEditorPaintTab | TGPhotoEditorEraserTab | TGPhotoEditorTextTab;
// if (_enableStickers && _stickersContext != nil) {
// result |= TGPhotoEditorStickerTab;
// }
// return result;
//}
//
//- (void)handleTabAction:(TGPhotoEditorTab)tab
//{
// [self commitEyedropper:true];
//
// switch (tab)
// {
// case TGPhotoEditorStickerTab:
// {
// [self presentStickersView];
// }
// break;
//
// case TGPhotoEditorTextTab:
// {
// [self createNewTextLabel];
// }
// break;
//
// case TGPhotoEditorPaintTab:
// {
// [self selectEntityView:nil];
//
// if (_canvasView.state.eraser)
// [self toggleEraserMode];
// }
// break;
//
// case TGPhotoEditorEraserTab:
// {
// [self selectEntityView:nil];
// [self toggleEraserMode];
// }
// break;
//
// default:
// break;
// }
//}
//
//- (TGPhotoEditorTab)activeTab
//{
// TGPhotoEditorTab tabs = TGPhotoEditorNoneTab;
//
// if (_currentEntityView != nil)
// return tabs;
//
// if (_canvasView.state.eraser)
// tabs |= TGPhotoEditorEraserTab;
// else
// tabs |= TGPhotoEditorPaintTab;
//
// return tabs;
//}
//
//#pragma mark - Undo & Redo
//
//- (void)updateActionsView
//{
// if (_portraitActionsView == nil || _landscapeActionsView == nil)
// return;
//
// NSArray *views = @[ _portraitActionsView, _landscapeActionsView ];
// for (TGPhotoPaintActionsView *view in views)
// {
// [view setUndoEnabled:_undoManager.canUndo];
// [view setClearEnabled:_undoManager.canUndo];
// }
//}
//
//- (void)presentClearAllAlert:(UIView *)sender
//{
// TGMenuSheetController *controller = [[TGMenuSheetController alloc] initWithContext:_context dark:false];
// controller.dismissesByOutsideTap = true;
// controller.narrowInLandscape = true;
// controller.permittedArrowDirections = UIPopoverArrowDirectionUp;
// __weak TGMenuSheetController *weakController = controller;
//
// __weak TGPhotoPaintController *weakSelf = self;
// NSArray *items = @
// [
// [[TGMenuSheetButtonItemView alloc] initWithTitle:TGLocalized(@"Paint.ClearConfirm") type:TGMenuSheetButtonTypeDestructive fontSize:20.0 action:^
// {
// __strong TGMenuSheetController *strongController = weakController;
// if (strongController == nil)
// return;
//
// __strong TGPhotoPaintController *strongSelf = weakSelf;
// if (strongSelf == nil)
// return;
//
// [strongSelf->_painting clear];
// [strongSelf->_undoManager reset];
//
// [strongSelf->_entitiesContainerView removeAll];
// [strongSelf _clearCurrentSelection];
//
// [strongSelf updateSettingsButton];
//
// [strongController dismissAnimated:true manual:false completion:nil];
// }],
// [[TGMenuSheetButtonItemView alloc] initWithTitle:TGLocalized(@"Common.Cancel") type:TGMenuSheetButtonTypeCancel fontSize:20.0 action:^
// {
// __strong TGMenuSheetController *strongController = weakController;
// if (strongController != nil)
// [strongController dismissAnimated:true];
// }]
// ];
//
// [controller setItemViews:items];
// controller.sourceRect = ^
// {
// __strong TGPhotoPaintController *strongSelf = weakSelf;
// if (strongSelf == nil)
// return CGRectZero;
// return [sender convertRect:sender.bounds toView:strongSelf.view];
// };
// [controller presentInViewController:self.parentViewController sourceView:self.view animated:true];
//}
//
//- (void)_clearCurrentSelection
//{
// _scrollView.pinchGestureRecognizer.enabled = true;
// _currentEntityView = nil;
// if (_entitySelectionView != nil)
// {
// [_entitySelectionView removeFromSuperview];
// _entitySelectionView = nil;
// }
//}
//
//#pragma mark - Data Handling
//
//- (UIImage *)eyedropperImage
//{
// UIImage *backgroundImage = [self.photoEditor currentResultImage];
//
// CGSize fittedSize = TGFitSize(_painting.size, TGPhotoEditorResultImageMaxSize);
// UIImage *paintingImage = _painting.isEmpty ? nil : [_painting imageWithSize:fittedSize andData:NULL];
// NSMutableArray *entities = [[NSMutableArray alloc] init];
//
// UIImage *entitiesImage = nil;
// if (paintingImage == nil && _entitiesContainerView.entitiesCount < 1)
// {
// return backgroundImage;
// }
// else if (_entitiesContainerView.entitiesCount > 0)
// {
// for (TGPhotoPaintEntityView *view in _entitiesContainerView.subviews)
// {
// if (![view isKindOfClass:[TGPhotoPaintEntityView class]])
// continue;
//
// TGPhotoPaintEntity *entity = [view entity];
// if (entity != nil) {
// [entities addObject:entity];
// }
// }
// entitiesImage = [_entitiesContainerView imageInRect:_entitiesContainerView.bounds background:nil still:true];
// }
//
// if (entitiesImage == nil && paintingImage == nil) {
// return backgroundImage;
// } else {
// UIGraphicsBeginImageContextWithOptions(fittedSize, false, 1.0);
//
// [backgroundImage drawInRect:CGRectMake(0.0, 0.0, fittedSize.width, fittedSize.height)];
// [paintingImage drawInRect:CGRectMake(0.0, 0.0, fittedSize.width, fittedSize.height)];
// [entitiesImage drawInRect:CGRectMake(0.0, 0.0, fittedSize.width, fittedSize.height)];
//
// UIImage *result = UIGraphicsGetImageFromCurrentImageContext();
// UIGraphicsEndImageContext();
// return result;
// }
//}
//
//- (TGPaintingData *)_prepareResultData
//{
// if (_resultData != nil)
// return _resultData;
//
// NSData *data = nil;
// CGSize fittedSize = TGFitSize(_painting.size, TGPhotoEditorResultImageMaxSize);
// UIImage *image = _painting.isEmpty ? nil : [_painting imageWithSize:fittedSize andData:&data];
// NSMutableArray *entities = [[NSMutableArray alloc] init];
//
// bool hasAnimatedEntities = false;
// UIImage *stillImage = nil;
// if (image == nil && _entitiesContainerView.entitiesCount < 1)
// {
// _resultData = nil;
// return _resultData;
// }
// else if (_entitiesContainerView.entitiesCount > 0)
// {
// for (TGPhotoPaintEntityView *view in _entitiesContainerView.subviews)
// {
// if (![view isKindOfClass:[TGPhotoPaintEntityView class]])
// continue;
//
// TGPhotoPaintEntity *entity = [view entity];
// if (entity != nil) {
// if (entity.animated) {
// hasAnimatedEntities = true;
// }
// [entities addObject:entity];
// }
// }
//
// if (hasAnimatedEntities) {
// for (TGPhotoPaintEntity *entity in entities) {
// if ([entity isKindOfClass:[TGPhotoPaintTextEntity class]]) {
// TGPhotoPaintTextEntity *textEntity = (TGPhotoPaintTextEntity *)entity;
// for (TGPhotoPaintEntityView *view in _entitiesContainerView.subviews)
// {
// if (![view isKindOfClass:[TGPhotoPaintEntityView class]])
// continue;
//
// if (view.entityUUID == textEntity.uuid) {
// textEntity.renderImage = [(TGPhotoTextEntityView *)view image];
// break;
// }
// }
// }
// }
// }
//
// if (!hasAnimatedEntities) {
// image = [_entitiesContainerView imageInRect:_entitiesContainerView.bounds background:image still:false];
// } else {
// stillImage = [_entitiesContainerView imageInRect:_entitiesContainerView.bounds background:image still:true];
// }
// }
//
//// _resultData = [TGPaintingData dataWithPaintingData:data image:image stillImage:stillImage entities:entities undoManager:_undoManager];
// return _resultData;
//}
//
//- (UIImage *)image
//{
// TGPaintingData *paintingData = [self _prepareResultData];
// return paintingData.image;
//}
//
//- (TGPaintingData *)paintingData
//{
// return [self _prepareResultData];
//}
//
//- (void)enableEyedropper {
// if (!_eyedropperView.isHidden)
// return;
//
// [self selectEntityView:nil];
//
// self.controlVideoPlayback(false);
// [_entitiesContainerView updateVisibility:false];
//
// UIImage *image = [self eyedropperImage];
// CGImageRef cgImage = image.CGImage;
// CFDataRef pixelData = CGDataProviderCopyData(CGImageGetDataProvider(cgImage));
//
// _eyedropperBackgroundData = (__bridge NSData *)pixelData;
// _eyedropperBackgroundSize = image.size;
// _eyedropperBackgroundBytesPerRow = CGImageGetBytesPerRow(cgImage);
// _eyedropperBackgroundInfo = CGImageGetBitmapInfo(cgImage);
//
// [_eyedropperView update];
// [_eyedropperView present];
//}
//
//- (void)commitEyedropper:(bool)immediate {
// self.controlVideoPlayback(true);
// [_entitiesContainerView updateVisibility:true];
//
// _eyedropperBackgroundData = nil;
// _eyedropperBackgroundSize = CGSizeZero;
// _eyedropperBackgroundBytesPerRow = 0;
// _eyedropperBackgroundInfo = 0;
//
// double timeout = immediate ? 0.0 : 0.2;
// TGDispatchAfter(timeout, dispatch_get_main_queue(), ^{
// [_eyedropperView dismiss];
// });
//}
//
//- (UIColor *)colorFromData:(NSData *)data width:(NSInteger)width height:(NSInteger)height x:(NSInteger)x y:(NSInteger)y bpr:(NSInteger)bpr {
// uint8_t *pixel = (uint8_t *)data.bytes + bpr * y + x * 4;
// if (_eyedropperBackgroundInfo & kCGBitmapByteOrder32Little) {
// return [UIColor colorWithRed:pixel[2] / 255.0 green:pixel[1] / 255.0 blue:pixel[0] / 255.0 alpha:1.0];
// } else {
// return [UIColor colorWithRed:pixel[0] / 255.0 green:pixel[1] / 255.0 blue:pixel[2] / 255.0 alpha:1.0];
// }
//}
//
//- (UIColor *)colorAtPoint:(CGPoint)point
//{
// CGPoint convertedPoint = CGPointMake(point.x / _eyedropperView.bounds.size.width * _eyedropperBackgroundSize.width, point.y / _eyedropperView.bounds.size.height * _eyedropperBackgroundSize.height);
// UIColor *backgroundColor = [self colorFromData:_eyedropperBackgroundData width:_eyedropperBackgroundSize.width height:_eyedropperBackgroundSize.height x:convertedPoint.x y:convertedPoint.y bpr:_eyedropperBackgroundBytesPerRow];
// return backgroundColor;
//}
//
//
//#pragma mark - Entities
//
//- (void)selectEntityView:(TGPhotoPaintEntityView *)view
//{
// if (_editedTextView != nil)
// return;
//
// if (_currentEntityView != nil)
// {
// if (_currentEntityView == view)
// {
// [self showMenuForEntityView];
// return;
// }
//
// [self _clearCurrentSelection];
// }
//
// _currentEntityView = view;
// [self updateSettingsButton];
//
// _scrollView.pinchGestureRecognizer.enabled = _currentEntityView == nil;
//
// if (view != nil)
// {
// [_currentEntityView.superview bringSubviewToFront:_currentEntityView];
// }
// else
// {
// [self hideMenu];
// return;
// }
//
// if ([view isKindOfClass:[TGPhotoTextEntityView class]])
// {
// TGPaintSwatch *textSwatch = ((TGPhotoPaintTextEntity *)view.entity).swatch;
// [self setCurrentSwatch:[TGPaintSwatch swatchWithColor:textSwatch.color colorLocation:textSwatch.colorLocation brushWeight:_portraitSettingsView.swatch.brushWeight] sender:nil];
// }
//
// _entitySelectionView = [view createSelectionView];
// view.selectionView = _entitySelectionView;
// [_selectionContainerView addSubview:_entitySelectionView];
//
// __weak TGPhotoPaintController *weakSelf = self;
// _entitySelectionView.entityResized = ^(CGFloat scale)
// {
// __strong TGPhotoPaintController *strongSelf = weakSelf;
// if (strongSelf == nil)
// return;
//
// [strongSelf->_entitySelectionView.entityView scale:scale absolute:true];
// };
// _entitySelectionView.entityRotated = ^(CGFloat angle)
// {
// __strong TGPhotoPaintController *strongSelf = weakSelf;
// if (strongSelf == nil)
// return;
//
// [strongSelf->_entitySelectionView.entityView rotate:angle absolute:true];
// };
//
// [_entitySelectionView update];
//}
//
//- (void)deleteEntityView:(TGPhotoPaintEntityView *)view
//{
// [_undoManager unregisterUndoWithUUID:view.entityUUID];
//
// [view removeFromSuperview];
//
// [self _clearCurrentSelection];
//
// [self updateActionsView];
// [self updateSettingsButton];
//}
//
//- (void)duplicateEntityView:(TGPhotoPaintEntityView *)view
//{
// TGPhotoPaintEntity *entity = [view.entity duplicate];
// entity.position = [self startPositionRelativeToEntity:entity];
//
// TGPhotoPaintEntityView *entityView = nil;
// if ([entity isKindOfClass:[TGPhotoPaintStickerEntity class]])
// {
// TGPhotoStickerEntityView *stickerView = (TGPhotoStickerEntityView *)[_entitiesContainerView createEntityViewWithEntity:entity];
// [self _commonEntityViewSetup:stickerView];
// entityView = stickerView;
// }
// else
// {
// TGPhotoTextEntityView *textView = (TGPhotoTextEntityView *)[_entitiesContainerView createEntityViewWithEntity:entity];
// [self _commonEntityViewSetup:textView];
// entityView = textView;
// }
//
// [self selectEntityView:entityView];
// [self _registerEntityRemovalUndo:entity];
// [self updateActionsView];
//}
//
//- (void)editEntityView:(TGPhotoPaintEntityView *)view
//{
// if ([view isKindOfClass:[TGPhotoTextEntityView class]])
// [(TGPhotoTextEntityView *)view beginEditing];
//}
//
//#pragma mark Menu
//
//- (void)showMenuForEntityView
//{
// if (_menuContainerView != nil)
// {
// TGMenuContainerView *container = _menuContainerView;
// bool isShowingMenu = container.isShowingMenu;
// _menuContainerView = nil;
//
// [container removeFromSuperview];
//
// if (!isShowingMenu && container.menuView.userInfo[@"entity"] == _currentEntityView)
// {
// if ([_currentEntityView isKindOfClass:[TGPhotoTextEntityView class]])
// [self editEntityView:_currentEntityView];
//
// return;
// }
// }
//
// UIView *parentView = self.view;
// _menuContainerView = [[TGMenuContainerView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, parentView.frame.size.width, parentView.frame.size.height)];
// [parentView addSubview:_menuContainerView];
//
// NSArray *actions = nil;
//
// if ([_currentEntityView isKindOfClass:[TGPhotoStickerEntityView class]])
// {
// actions = @
// [
// @{ @"title": TGLocalized(@"Paint.Delete"), @"action": @"delete" },
// @{ @"title": TGLocalized(@"Paint.Duplicate"), @"action": @"duplicate" },
// ];
// }
// else
// {
// actions = @
// [
// @{ @"title": TGLocalized(@"Paint.Delete"), @"action": @"delete" },
// @{ @"title": TGLocalized(@"Paint.Edit"), @"action": @"edit" },
// @{ @"title": TGLocalized(@"Paint.Duplicate"), @"action": @"duplicate" },
// ];
// }
//
// [_menuContainerView.menuView setUserInfo:@{ @"entity": _currentEntityView }];
// [_menuContainerView.menuView setButtonsAndActions:actions watcherHandle:_actionHandle];
// [_menuContainerView.menuView sizeToFit];
//
// CGRect sourceRect = CGRectOffset([_currentEntityView convertRect:_currentEntityView.bounds toView:_menuContainerView], 0, -15.0f);
// [_menuContainerView showMenuFromRect:sourceRect animated:false];
//}
//
//- (void)hideMenu
//{
// [_menuContainerView hideMenu];
//}
//
//- (void)actionStageActionRequested:(NSString *)action options:(id)options
//{
// if ([action isEqualToString:@"menuAction"])
// {
// NSString *menuAction = options[@"action"];
// TGPhotoPaintEntityView *entity = options[@"userInfo"][@"entity"];
//
// if ([menuAction isEqualToString:@"delete"])
// {
// [self deleteEntityView:entity];
// }
// else if ([menuAction isEqualToString:@"duplicate"])
// {
// [self duplicateEntityView:entity];
// }
// else if ([menuAction isEqualToString:@"edit"])
// {
// [self editEntityView:entity];
// }
// }
// else if ([action isEqualToString:@"menuWillHide"])
// {
// }
//}
//
//#pragma mark View
//
//- (CGPoint)centerPointFittedCropRect
//{
// return [_previewView convertPoint:TGPaintCenterOfRect(_previewView.bounds) toView:_entitiesContainerView];
//}
//
//- (CGFloat)startRotation
//{
// return TGCounterRotationForOrientation(_photoEditor.cropOrientation) - _photoEditor.cropRotation;
//}
//
//- (CGPoint)startPositionRelativeToEntity:(TGPhotoPaintEntity *)entity
//{
// const CGPoint offset = CGPointMake(200.0f, 200.0f);
//
// if (entity != nil)
// {
// return TGPaintAddPoints(entity.position, offset);
// }
// else
// {
// const CGFloat minimalDistance = 100.0f;
// CGPoint position = [self centerPointFittedCropRect];
//
// while (true)
// {
// bool occupied = false;
// for (TGPhotoPaintEntityView *view in _entitiesContainerView.subviews)
// {
// if (![view isKindOfClass:[TGPhotoPaintEntityView class]])
// continue;
//
// CGPoint location = view.center;
// CGFloat distance = sqrt(pow(location.x - position.x, 2) + pow(location.y - position.y, 2));
// if (distance < minimalDistance)
// occupied = true;
// }
//
// if (!occupied)
// break;
// else
// position = TGPaintAddPoints(position, offset);
// }
//
// return position;
// }
//}
//
//- (void)_commonEntityViewSetup:(TGPhotoPaintEntityView *)entityView
//{
// [self hideMenu];
//
// __weak TGPhotoPaintController *weakSelf = self;
// entityView.shouldTouchEntity = ^bool (__unused TGPhotoPaintEntityView *sender)
// {
// __strong TGPhotoPaintController *strongSelf = weakSelf;
// if (strongSelf == nil)
// return false;
//
// return ![strongSelf->_canvasView isTracking] && ![strongSelf->_entitiesContainerView isTrackingAnyEntityView];
// };
// entityView.entityBeganDragging = ^(TGPhotoPaintEntityView *sender)
// {
// __strong TGPhotoPaintController *strongSelf = weakSelf;
// if (strongSelf != nil && sender != strongSelf->_entitySelectionView.entityView)
// [strongSelf selectEntityView:sender];
// };
// entityView.entityChanged = ^(TGPhotoPaintEntityView *sender)
// {
// __strong TGPhotoPaintController *strongSelf = weakSelf;
// if (strongSelf == nil)
// return;
//
// if (sender == strongSelf->_entitySelectionView.entityView)
// [strongSelf->_entitySelectionView update];
//
// [strongSelf updateActionsView];
// };
//
// if ([entityView isKindOfClass:[TGPhotoTextEntityView class]]) {
// TGPhotoTextEntityView *textView = (TGPhotoTextEntityView *)entityView;
//
// __weak TGPhotoPaintController *weakSelf = self;
// textView.beganEditing = ^(TGPhotoTextEntityView *sender)
// {
// __strong TGPhotoPaintController *strongSelf = weakSelf;
// if (strongSelf == nil)
// return;
//
// [strongSelf bringTextEntityViewFront:sender];
// };
//
// textView.finishedEditing = ^(__unused TGPhotoTextEntityView *sender)
// {
// __strong TGPhotoPaintController *strongSelf = weakSelf;
// if (strongSelf == nil)
// return;
//
// [strongSelf sendTextEntityViewBack];
// };
// }
//}
//
//- (void)_registerEntityRemovalUndo:(TGPhotoPaintEntity *)entity
//{
// [_undoManager registerUndoWithUUID:entity.uuid block:^(__unused TGPainting *painting, TGPhotoEntitiesContainerView *entitiesContainer, NSInteger uuid)
// {
// [entitiesContainer removeViewWithUUID:uuid];
// }];
//}
//
//#pragma mark Stickers
//
//
//- (void)createNewStickerWithDocument:(id)document animated:(bool)animated transitionPoint:(CGPoint)transitionPoint snapshotView:(UIView *)snapshotView
//{
// TGPhotoPaintStickerEntity *entity = [[TGPhotoPaintStickerEntity alloc] initWithDocument:document baseSize:[self _stickerBaseSizeForCurrentPainting] animated:animated];
// [self _setStickerEntityPosition:entity];
//
//
// TGPhotoStickerEntityView *stickerView = (TGPhotoStickerEntityView *)[_entitiesContainerView createEntityViewWithEntity:entity];
//
// bool hasStickers = false;
// TGPhotoStickerEntityView *existingStickerView;
// for (TGPhotoPaintEntityView *view in _entitiesContainerView.subviews) {
// if ([view isKindOfClass:[TGPhotoStickerEntityView class]]) {
// hasStickers = true;
//
// if (((TGPhotoStickerEntityView *)view).documentId == stickerView.documentId) {
// existingStickerView = (TGPhotoStickerEntityView *)view;
// }
// break;
// }
// }
//
// [_entitiesContainerView addSubview:stickerView];
// [self _commonEntityViewSetup:stickerView];
//
// __weak TGPhotoPaintController *weakSelf = self;
// stickerView.started = ^(double duration) {
// __strong TGPhotoPaintController *strongSelf = weakSelf;
// if (strongSelf != nil) {
// TGPhotoEditorController *editorController = (TGPhotoEditorController *)strongSelf.parentViewController;
// if (![editorController isKindOfClass:[TGPhotoEditorController class]])
// return;
//
// if (!hasStickers) {
// [editorController setMinimalVideoDuration:duration];
// }
// }
// };
//
// NSTimeInterval currentTime = NAN;
// NSTimeInterval stickerStartTime = _stickerStartTime;
// TGPhotoEditorController *editorController = (TGPhotoEditorController *)self.parentViewController;
// if ([editorController isKindOfClass:[TGPhotoEditorController class]]) {
// currentTime = editorController.currentTime;
// }
//
// if (!isnan(currentTime)) {
// [stickerView seekTo:currentTime];
// [stickerView play];
// } else {
// NSTimeInterval currentTime = CACurrentMediaTime();
// if (!isnan(stickerStartTime)) {
// if (existingStickerView != nil) {
// [stickerView copyStickerView:existingStickerView];
// } else {
// NSTimeInterval position = currentTime - stickerStartTime;
// [stickerView seekTo:position];
// [stickerView play];
// }
// } else {
// _stickerStartTime = currentTime;
// [stickerView play];
// }
// }
//
// [self selectEntityView:stickerView];
// _entitySelectionView.alpha = 0.0f;
//
// [_entitySelectionView fadeIn];
//
// [self _registerEntityRemovalUndo:entity];
// [self updateActionsView];
//}
//
//- (void)mirrorSelectedStickerEntity
//{
// if ([_currentEntityView isKindOfClass:[TGPhotoStickerEntityView class]])
// [((TGPhotoStickerEntityView *)_currentEntityView) mirror];
//}
//
//#pragma mark Text
//
//- (void)createNewTextLabel
//{
// TGPaintSwatch *currentSwatch = _portraitSettingsView.swatch;
// TGPaintSwatch *whiteSwatch = [TGPaintSwatch swatchWithColor:UIColorRGB(0xffffff) colorLocation:1.0f brushWeight:currentSwatch.brushWeight];
// TGPaintSwatch *blackSwatch = [TGPaintSwatch swatchWithColor:UIColorRGB(0x000000) colorLocation:0.85f brushWeight:currentSwatch.brushWeight];
// [self setCurrentSwatch:_selectedTextStyle == TGPhotoPaintTextEntityStyleOutlined ? blackSwatch : whiteSwatch sender:nil];
//
// CGFloat maxWidth = [self fittedContentSize].width - 26.0f;
// TGPhotoPaintTextEntity *entity = [[TGPhotoPaintTextEntity alloc] initWithText:@"" font:_selectedTextFont swatch:_portraitSettingsView.swatch baseFontSize:[self _textBaseFontSizeForCurrentPainting] maxWidth:maxWidth style:_selectedTextStyle];
// entity.position = [self startPositionRelativeToEntity:nil];
// entity.angle = [self startRotation];
//
// TGPhotoTextEntityView *textView = (TGPhotoTextEntityView *)[_entitiesContainerView createEntityViewWithEntity:entity];
// [_entitiesContainerView addSubview:textView];
// [self _commonEntityViewSetup:textView];
//
// [self selectEntityView:textView];
//
// [self _registerEntityRemovalUndo:entity];
// [self updateActionsView];
//
// [textView beginEditing];
//}
//
//- (void)bringTextEntityViewFront:(TGPhotoTextEntityView *)entityView
//{
// _editedTextView = entityView;
// entityView.inhibitGestures = true;
//
// [_dimView.superview insertSubview:_dimView belowSubview:entityView];
//
// _textEditingDismissButton = [[UIButton alloc] initWithFrame:_dimView.bounds];
// _dimView.userInteractionEnabled = true;
// [_textEditingDismissButton addTarget:self action:@selector(_dismissButtonTapped) forControlEvents:UIControlEventTouchUpInside];
// [_dimView addSubview:_textEditingDismissButton];
//
// _editedTextCenter = entityView.center;
// _editedTextTransform = entityView.transform;
//
// _entitySelectionView.alpha = 0.0f;
//
// void (^changeBlock)(void) = ^
// {
// entityView.center = [self centerPointFittedCropRect];
// entityView.transform = CGAffineTransformMakeRotation([self startRotation]);
//
// _dimView.alpha = 1.0f;
// };
//
// _contentView.userInteractionEnabled = true;
// _contentWrapperView.userInteractionEnabled = true;
//
// if (iosMajorVersion() >= 7)
// {
// [UIView animateWithDuration:0.4 delay:0.0 usingSpringWithDamping:0.8f initialSpringVelocity:0.0f options:kNilOptions animations:changeBlock completion:nil];
// }
// else
// {
// [UIView animateWithDuration:0.35 delay:0.0 options:UIViewAnimationOptionCurveEaseInOut animations:changeBlock completion:nil];
// }
//
// [self setInterfaceHidden:true animated:true];
//}
//
//- (void)_dismissButtonTapped
//{
// TGPhotoTextEntityView *entityView = _editedTextView;
// [entityView endEditing];
//}
//
//- (void)sendTextEntityViewBack
//{
// _contentView.userInteractionEnabled = false;
// _contentWrapperView.userInteractionEnabled = false;
//
// _dimView.userInteractionEnabled = false;
// [_textEditingDismissButton removeFromSuperview];
// _textEditingDismissButton = nil;
//
// TGPhotoTextEntityView *entityView = _editedTextView;
// _editedTextView = nil;
//
// void (^changeBlock)(void) = ^
// {
// entityView.center = _editedTextCenter;
// entityView.transform = _editedTextTransform;
// _dimView.alpha = 0.0f;
// };
//
// void (^completionBlock)(BOOL) = ^(__unused BOOL finished)
// {
// [_dimView.superview bringSubviewToFront:_dimView];
// entityView.inhibitGestures = false;
//
// if (entityView.isEmpty)
// {
// [self deleteEntityView:entityView];
// }
// else
// {
// [_entitySelectionView update];
// [_entitySelectionView fadeIn];
// }
// };
//
// if (iosMajorVersion() >= 7)
// {
// [UIView animateWithDuration:0.4 delay:0.0 usingSpringWithDamping:0.8f initialSpringVelocity:0.0f options:kNilOptions animations:changeBlock completion:completionBlock];
// }
// else
// {
// [UIView animateWithDuration:0.35 delay:0.0 options:UIViewAnimationOptionCurveEaseInOut animations:changeBlock completion:completionBlock];
// }
//
// [self setInterfaceHidden:false animated:true];
//
// TGMenuContainerView *container = _menuContainerView;
// _menuContainerView = nil;
// [container removeFromSuperview];
//}
//
//- (void)containerPressed
//{
// if (_currentEntityView == nil)
// return;
//
// if ([_currentEntityView isKindOfClass:[TGPhotoTextEntityView class]])
// {
// TGPhotoTextEntityView *textEntityView = (TGPhotoTextEntityView *)_currentEntityView;
// if ([textEntityView isEditing])
// {
// [textEntityView endEditing];
// return;
// }
// }
// [self selectEntityView:nil];
//}
//
//#pragma mark - Relative Size Calculation
//
//- (CGSize)_stickerBaseSizeForCurrentPainting
//{
// CGSize fittedSize = [self fittedContentSize];
// CGFloat maxSide = MAX(fittedSize.width, fittedSize.height);
// CGFloat side = ceil(maxSide * 0.3125f);
// return CGSizeMake(side, side);
//}
//
//- (CGFloat)_textBaseFontSizeForCurrentPainting
//{
// CGSize fittedSize = [self fittedContentSize];
// CGFloat maxSide = MAX(fittedSize.width, fittedSize.height);
// return ceil(maxSide * 0.08f);
//}
//
//- (CGFloat)_brushBaseWeightForCurrentPainting
//{
// return 15.0f / TGPhotoPaintingMaxSize.width * _painting.size.width;
//}
//
//- (CGFloat)_brushWeightRangeForCurrentPainting
//{
// return 125.0f / TGPhotoPaintingMaxSize.width * _painting.size.width;
//}
//
//- (CGFloat)_brushWeightForSize:(CGFloat)size
//{
// CGFloat scale = MAX(0.001, _scrollView.zoomScale);
// return ([self _brushBaseWeightForCurrentPainting] + [self _brushWeightRangeForCurrentPainting] * size) / scale;
//}
//
//+ (CGSize)maximumPaintingSize
//{
// static dispatch_once_t onceToken;
// static CGSize size;
// dispatch_once(&onceToken, ^
// {
// CGSize screenSize = TGScreenSize();
// if ((NSInteger)screenSize.height == 480)
// size = TGPhotoPaintingLightMaxSize;
// else
// size = TGPhotoPaintingMaxSize;
// });
// return size;
//}
//
//#pragma mark - Settings
//
//- (void)setCurrentSwatch:(TGPaintSwatch *)swatch sender:(id)sender
//{
// [_canvasView setBrushColor:swatch.color];
// [_canvasView setBrushWeight:[self _brushWeightForSize:swatch.brushWeight]];
// if ([_currentEntityView isKindOfClass:[TGPhotoTextEntityView class]])
// [(TGPhotoTextEntityView *)_currentEntityView setSwatch:swatch];
//
// if (sender != _landscapeSettingsView)
// [_landscapeSettingsView setSwatch:swatch];
//
// if (sender != _portraitSettingsView)
// [_portraitSettingsView setSwatch:swatch];
//}
//
//- (void)updateSettingsButton
//{
// if ([_currentEntityView isKindOfClass:[TGPhotoTextEntityView class]]) {
// TGPhotoPaintSettingsViewIcon icon;
// switch (((TGPhotoTextEntityView *)_currentEntityView).entity.style) {
// case TGPhotoPaintTextEntityStyleRegular:
// icon = TGPhotoPaintSettingsViewIconTextRegular;
// break;
// case TGPhotoPaintTextEntityStyleOutlined:
// icon = TGPhotoPaintSettingsViewIconTextOutlined;
// break;
// case TGPhotoPaintTextEntityStyleFramed:
// icon = TGPhotoPaintSettingsViewIconTextFramed;
// break;
// }
// [self setSettingsButtonIcon:icon];
// }
// else if ([_currentEntityView isKindOfClass:[TGPhotoStickerEntityView class]]) {
// [self setSettingsButtonIcon:TGPhotoPaintSettingsViewIconMirror];
// }
// else {
// TGPhotoPaintSettingsViewIcon icon = TGPhotoPaintSettingsViewIconBrushPen;
// if ([_canvasView.state.brush isKindOfClass:[TGPaintEllipticalBrush class]]) {
// icon = TGPhotoPaintSettingsViewIconBrushMarker;
// } else if ([_canvasView.state.brush isKindOfClass:[TGPaintNeonBrush class]]) {
// icon = TGPhotoPaintSettingsViewIconBrushNeon;
// } else if ([_canvasView.state.brush isKindOfClass:[TGPaintArrowBrush class]]) {
// icon = TGPhotoPaintSettingsViewIconBrushArrow;
// }
// [self setSettingsButtonIcon:icon];
// }
// [self _updateTabs];
//}
//
//- (void)setSettingsButtonIcon:(TGPhotoPaintSettingsViewIcon)icon
//{
// [_portraitSettingsView setIcon:icon animated:true];
// [_landscapeSettingsView setIcon:icon animated:true];
//}
//
//- (void)settingsWrapperPressed
//{
// [_settingsView dismissWithCompletion:^
// {
// [_settingsView removeFromSuperview];
// _settingsView = nil;
//
// [_settingsViewWrapper removeFromSuperview];
// }];
//}
//
//- (UIView *)settingsViewWrapper
//{
// if (_settingsViewWrapper == nil)
// {
// _settingsViewWrapper = [[TGPhotoPaintSettingsWrapperView alloc] initWithFrame:self.parentViewController.view.bounds];
// _settingsViewWrapper.exclusiveTouch = true;
//
// __weak TGPhotoPaintController *weakSelf = self;
// _settingsViewWrapper.pressed = ^(__unused CGPoint location)
// {
// __strong TGPhotoPaintController *strongSelf = weakSelf;
// if (strongSelf != nil)
// [strongSelf settingsWrapperPressed];
// };
// _settingsViewWrapper.suppressTouchAtPoint = ^bool(CGPoint location)
// {
// __strong TGPhotoPaintController *strongSelf = weakSelf;
// if (strongSelf == nil)
// return false;
//
// UIView *view = [strongSelf.view hitTest:[strongSelf.view convertPoint:location fromView:nil] withEvent:nil];
// if ([view isKindOfClass:[TGModernButton class]])
// return true;
//
// if ([view isKindOfClass:[TGPaintCanvas class]])
// return true;
//
// if (view == strongSelf->_portraitToolsWrapperView || view == strongSelf->_landscapeToolsWrapperView)
// return true;
//
// return false;
// };
// }
//
// [self.parentViewController.view addSubview:_settingsViewWrapper];
//
// return _settingsViewWrapper;
//}
//
//- (TGPaintBrushPreview *)brushPreview
//{
// if ([_brushes.firstObject previewImage] != nil)
// return nil;
//
// if (_brushPreview == nil)
// _brushPreview = [[TGPaintBrushPreview alloc] init];
//
// return _brushPreview;
//}
//
//- (void)presentBrushSettingsView
//{
// TGPhotoBrushSettingsView *view = [[TGPhotoBrushSettingsView alloc] initWithBrushes:_brushes preview:[self brushPreview]];
// [view setBrush:_painting.brush];
//
// __weak TGPhotoPaintController *weakSelf = self;
// view.brushChanged = ^(TGPaintBrush *brush)
// {
// __strong TGPhotoPaintController *strongSelf = weakSelf;
// if (strongSelf == nil)
// return;
//
// if (strongSelf->_canvasView.state.eraser && (brush.lightSaber || brush.arrow))
// brush = strongSelf->_brushes.firstObject;
//
// [strongSelf->_canvasView setBrush:brush];
//
// [strongSelf settingsWrapperPressed];
// [strongSelf updateSettingsButton];
// };
// _settingsView = view;
// [view sizeToFit];
//
// UIView *wrapper = [self settingsViewWrapper];
// wrapper.userInteractionEnabled = true;
// [wrapper addSubview:view];
//
// [self viewWillLayoutSubviews];
//
// [view present];
//}
//
//- (void)presentTextSettingsView
//{
// TGPhotoTextSettingsView *view = [[TGPhotoTextSettingsView alloc] initWithFonts:[TGPhotoPaintFont availableFonts] selectedFont:_selectedTextFont selectedStyle:_selectedTextStyle];
//
// __weak TGPhotoPaintController *weakSelf = self;
// view.fontChanged = ^(TGPhotoPaintFont *font)
// {
// __strong TGPhotoPaintController *strongSelf = weakSelf;
// if (strongSelf == nil)
// return;
//
// strongSelf->_selectedTextFont = font;
//
// TGPhotoTextEntityView *textView = (TGPhotoTextEntityView *)strongSelf->_currentEntityView;
// [textView setFont:font];
//
// [strongSelf settingsWrapperPressed];
// [strongSelf updateSettingsButton];
// };
// view.styleChanged = ^(TGPhotoPaintTextEntityStyle style)
// {
// __strong TGPhotoPaintController *strongSelf = weakSelf;
// if (strongSelf == nil)
// return;
//
// strongSelf->_selectedTextStyle = style;
//
// if (style == TGPhotoPaintTextEntityStyleOutlined && [strongSelf->_portraitSettingsView.swatch.color isEqual:UIColorRGB(0xffffff)])
// {
// TGPaintSwatch *currentSwatch = strongSelf->_portraitSettingsView.swatch;
// TGPaintSwatch *blackSwatch = [TGPaintSwatch swatchWithColor:UIColorRGB(0x000000) colorLocation:0.85f brushWeight:currentSwatch.brushWeight];
// [strongSelf setCurrentSwatch:blackSwatch sender:nil];
// }
// else if (style != TGPhotoPaintTextEntityStyleOutlined && [strongSelf->_portraitSettingsView.swatch.color isEqual:UIColorRGB(0x000000)])
// {
// TGPaintSwatch *currentSwatch = strongSelf->_portraitSettingsView.swatch;
// TGPaintSwatch *whiteSwatch = [TGPaintSwatch swatchWithColor:UIColorRGB(0xffffff) colorLocation:1.0f brushWeight:currentSwatch.brushWeight];
// [strongSelf setCurrentSwatch:whiteSwatch sender:nil];
// }
//
// TGPhotoTextEntityView *textView = (TGPhotoTextEntityView *)strongSelf->_currentEntityView;
// [textView setStyle:style];
//
// [strongSelf settingsWrapperPressed];
// [strongSelf updateSettingsButton];
// };
//
// _settingsView = view;
// [view sizeToFit];
//
// UIView *wrapper = [self settingsViewWrapper];
// wrapper.userInteractionEnabled = true;
// [wrapper addSubview:view];
//
// [self viewWillLayoutSubviews];
//
// [view present];
//}
//
//- (void)toggleEraserMode
//{
// _canvasView.state.eraser = !_canvasView.state.isEraser;
//
// if (_canvasView.state.eraser)
// {
// if (_canvasView.state.brush.lightSaber || _canvasView.state.brush.arrow)
// [_canvasView setBrush:_brushes.firstObject];
// }
//
// [_portraitSettingsView setHighlighted:_canvasView.state.isEraser];
// [_landscapeSettingsView setHighlighted:_canvasView.state.isEraser];
//
// [self updateSettingsButton];
// [self _updateTabs];
//}
//
//#pragma mark - Scroll View
//
//- (CGSize)fittedContentSize
//{
// return [TGPhotoPaintController fittedContentSize:_photoEditor.cropRect orientation:_photoEditor.cropOrientation originalSize:_photoEditor.originalSize];
//}
//
//+ (CGSize)fittedContentSize:(CGRect)cropRect orientation:(UIImageOrientation)orientation originalSize:(CGSize)originalSize {
// CGSize fittedOriginalSize = TGScaleToSize(originalSize, [TGPhotoPaintController maximumPaintingSize]);
// CGFloat scale = fittedOriginalSize.width / originalSize.width;
//
// CGSize size = CGSizeMake(cropRect.size.width * scale, cropRect.size.height * scale);
// if (orientation == UIImageOrientationLeft || orientation == UIImageOrientationRight)
// size = CGSizeMake(size.height, size.width);
//
// return CGSizeMake(floor(size.width), floor(size.height));
//}
//
//- (CGRect)fittedCropRect:(bool)originalSize
//{
// return [TGPhotoPaintController fittedCropRect:_photoEditor.cropRect originalSize:_photoEditor.originalSize keepOriginalSize:originalSize];
//}
//
//+ (CGRect)fittedCropRect:(CGRect)cropRect originalSize:(CGSize)originalSize keepOriginalSize:(bool)keepOriginalSize {
// CGSize fittedOriginalSize = TGScaleToSize(originalSize, [TGPhotoPaintController maximumPaintingSize]);
// CGFloat scale = fittedOriginalSize.width / originalSize.width;
//
// CGSize size = fittedOriginalSize;
// if (!keepOriginalSize)
// size = CGSizeMake(cropRect.size.width * scale, cropRect.size.height * scale);
//
// return CGRectMake(-cropRect.origin.x * scale, -cropRect.origin.y * scale, size.width, size.height);
//}
//
//- (CGPoint)fittedCropCenterScale:(CGFloat)scale
//{
// return [TGPhotoPaintController fittedCropRect:_photoEditor.cropRect centerScale:scale];
//}
//
//+ (CGPoint)fittedCropRect:(CGRect)cropRect centerScale:(CGFloat)scale
//{
// CGSize size = CGSizeMake(cropRect.size.width * scale, cropRect.size.height * scale);
// CGRect rect = CGRectMake(cropRect.origin.x * scale, cropRect.origin.y * scale, size.width, size.height);
//
// return CGPointMake(CGRectGetMidX(rect), CGRectGetMidY(rect));
//}
//
//- (void)resetScrollView
//{
// CGSize fittedContentSize = [self fittedContentSize];
// CGRect fittedCropRect = [self fittedCropRect:false];
// _contentWrapperView.frame = CGRectMake(0.0f, 0.0f, fittedContentSize.width, fittedContentSize.height);
//
// CGFloat scale = _contentView.bounds.size.width / fittedCropRect.size.width;
// _contentWrapperView.transform = CGAffineTransformMakeScale(scale, scale);
// _contentWrapperView.frame = CGRectMake(0.0f, 0.0f, _contentView.bounds.size.width, _contentView.bounds.size.height);
//
// CGSize contentSize = [self contentSize];
// _scrollView.minimumZoomScale = 1.0f;
// _scrollView.maximumZoomScale = 1.0f;
// _scrollView.normalZoomScale = 1.0f;
// _scrollView.zoomScale = 1.0f;
// _scrollView.contentSize = contentSize;
// [self contentView].frame = CGRectMake(0.0f, 0.0f, contentSize.width, contentSize.height);
//
// [self adjustZoom];
// _scrollView.zoomScale = _scrollView.normalZoomScale;
//}
//
//- (void)scrollViewWillBeginZooming:(UIScrollView *)__unused scrollView withView:(UIView *)__unused view
//{
//}
//
//- (void)scrollViewDidZoom:(UIScrollView *)__unused scrollView
//{
// [self adjustZoom];
//}
//
//- (void)scrollViewDidEndZooming:(UIScrollView *)__unused scrollView withView:(UIView *)__unused view atScale:(CGFloat)__unused scale
//{
// [self adjustZoom];
//
// TGPaintSwatch *currentSwatch = _portraitSettingsView.swatch;
// [_canvasView setBrushWeight:[self _brushWeightForSize:currentSwatch.brushWeight]];
//
// if (_scrollView.zoomScale < _scrollView.normalZoomScale - FLT_EPSILON)
// {
// [TGHacks setAnimationDurationFactor:0.5f];
// [_scrollView setZoomScale:_scrollView.normalZoomScale animated:true];
// [TGHacks setAnimationDurationFactor:1.0f];
// }
//}
//
//- (UIView *)contentView
//{
// return _scrollContentView;
//}
//
//- (CGSize)contentSize
//{
// return _scrollView.frame.size;
//}
//
//- (UIView *)viewForZoomingInScrollView:(UIScrollView *)__unused scrollView
//{
// return [self contentView];
//}
//
//- (void)adjustZoom
//{
// CGSize contentSize = [self contentSize];
// CGSize boundsSize = _scrollView.frame.size;
// if (contentSize.width < FLT_EPSILON || contentSize.height < FLT_EPSILON || boundsSize.width < FLT_EPSILON || boundsSize.height < FLT_EPSILON)
// return;
//
// CGFloat scaleWidth = boundsSize.width / contentSize.width;
// CGFloat scaleHeight = boundsSize.height / contentSize.height;
// CGFloat minScale = MIN(scaleWidth, scaleHeight);
// CGFloat maxScale = MAX(scaleWidth, scaleHeight);
// maxScale = MAX(maxScale, minScale * 3.0f);
//
// if (ABS(maxScale - minScale) < 0.01f)
// maxScale = minScale;
//
// _scrollView.contentInset = UIEdgeInsetsZero;
//
// if (_scrollView.minimumZoomScale != 0.05f)
// _scrollView.minimumZoomScale = 0.05f;
// if (_scrollView.normalZoomScale != minScale)
// _scrollView.normalZoomScale = minScale;
// if (_scrollView.maximumZoomScale != maxScale)
// _scrollView.maximumZoomScale = maxScale;
//
// CGRect contentFrame = [self contentView].frame;
//
// if (boundsSize.width > contentFrame.size.width)
// contentFrame.origin.x = (boundsSize.width - contentFrame.size.width) / 2.0f;
// else
// contentFrame.origin.x = 0;
//
// if (boundsSize.height > contentFrame.size.height)
// contentFrame.origin.y = (boundsSize.height - contentFrame.size.height) / 2.0f;
// else
// contentFrame.origin.y = 0;
//
// [self contentView].frame = contentFrame;
//
// _scrollView.scrollEnabled = ABS(_scrollView.zoomScale - _scrollView.normalZoomScale) > FLT_EPSILON;
//}
//
//#pragma mark - Gestures
//
//- (void)handlePinch:(UIPinchGestureRecognizer *)gestureRecognizer
//{
// [_entitiesContainerView handlePinch:gestureRecognizer];
//}
//
//- (void)handleRotate:(UIRotationGestureRecognizer *)gestureRecognizer
//{
// [_entitiesContainerView handleRotate:gestureRecognizer];
//}
//
//- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)__unused gestureRecognizer
//{
// if (gestureRecognizer == _pinchGestureRecognizer && _currentEntityView == nil) {
// return false;
// }
// return !_canvasView.isTracking;
//}
//
//- (BOOL)gestureRecognizer:(UIGestureRecognizer *)__unused gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)__unused otherGestureRecognizer
//{
// return true;
//}
//
//#pragma mark - Transitions
//
//- (void)transitionIn
//{
// _portraitSettingsView.layer.shouldRasterize = true;
// _landscapeSettingsView.layer.shouldRasterize = true;
//
// [UIView animateWithDuration:0.3f animations:^
// {
// _portraitToolsWrapperView.alpha = 1.0f;
// _landscapeToolsWrapperView.alpha = 1.0f;
//
// _portraitActionsView.alpha = 1.0f;
// _landscapeActionsView.alpha = 1.0f;
// } completion:^(__unused BOOL finished)
// {
// _portraitSettingsView.layer.shouldRasterize = false;
// _landscapeSettingsView.layer.shouldRasterize = false;
// }];
//
// if (self.presentedForAvatarCreation) {
// _canvasView.hidden = true;
// }
//}
//
//+ (CGRect)photoContainerFrameForParentViewFrame:(CGRect)parentViewFrame toolbarLandscapeSize:(CGFloat)toolbarLandscapeSize orientation:(UIInterfaceOrientation)orientation panelSize:(CGFloat)panelSize hasOnScreenNavigation:(bool)hasOnScreenNavigation
//{
// CGRect frame = [TGPhotoEditorTabController photoContainerFrameForParentViewFrame:parentViewFrame toolbarLandscapeSize:toolbarLandscapeSize orientation:orientation panelSize:panelSize hasOnScreenNavigation:hasOnScreenNavigation];
//
// switch (orientation)
// {
// case UIInterfaceOrientationLandscapeLeft:
// frame.origin.x -= TGPhotoPaintTopPanelSize;
// break;
//
// case UIInterfaceOrientationLandscapeRight:
// frame.origin.x += TGPhotoPaintTopPanelSize;
// break;
//
// default:
// frame.origin.y += TGPhotoPaintTopPanelSize;
// break;
// }
//
// return frame;
//}
//
//- (CGRect)_targetFrameForTransitionInFromFrame:(CGRect)fromFrame
//{
// CGSize referenceSize = [self referenceViewSize];
// CGRect containerFrame = [TGPhotoPaintController photoContainerFrameForParentViewFrame:CGRectMake(0, 0, referenceSize.width, referenceSize.height) toolbarLandscapeSize:self.toolbarLandscapeSize orientation:self.effectiveOrientation panelSize:TGPhotoPaintTopPanelSize + TGPhotoPaintBottomPanelSize hasOnScreenNavigation:self.hasOnScreenNavigation];
//
// CGSize fittedSize = TGScaleToSize(fromFrame.size, containerFrame.size);
// CGRect toFrame = CGRectMake(containerFrame.origin.x + (containerFrame.size.width - fittedSize.width) / 2, containerFrame.origin.y + (containerFrame.size.height - fittedSize.height) / 2, fittedSize.width, fittedSize.height);
//
// return toFrame;
//}
//
//- (void)_finishedTransitionInWithView:(UIView *)transitionView
//{
// _appeared = true;
//
// if ([transitionView isKindOfClass:[TGPhotoEditorPreviewView class]]) {
//
// } else {
// [transitionView removeFromSuperview];
// }
//
// [self setupCanvas];
// _entitiesContainerView.hidden = false;
//
// TGPhotoEditorPreviewView *previewView = _previewView;
// [previewView setPaintingHidden:true];
// previewView.hidden = false;
// [_containerView insertSubview:previewView belowSubview:_paintingWrapperView];
// [self updateContentViewLayout];
// [previewView performTransitionInIfNeeded];
//
// CGRect rect = [self fittedCropRect:true];
// _entitiesContainerView.frame = CGRectMake(0, 0, rect.size.width, rect.size.height);
// _entitiesContainerView.transform = CGAffineTransformMakeRotation(_photoEditor.cropRotation);
//
// CGSize fittedOriginalSize = TGScaleToSize(_photoEditor.originalSize, [TGPhotoPaintController maximumPaintingSize]);
// CGSize rotatedSize = TGRotatedContentSize(fittedOriginalSize, _photoEditor.cropRotation);
// CGPoint centerPoint = CGPointMake(rotatedSize.width / 2.0f, rotatedSize.height / 2.0f);
//
// CGFloat scale = fittedOriginalSize.width / _photoEditor.originalSize.width;
// CGPoint offset = TGPaintSubtractPoints(centerPoint, [self fittedCropCenterScale:scale]);
//
// CGPoint boundsCenter = TGPaintCenterOfRect(_contentWrapperView.bounds);
// _entitiesContainerView.center = TGPaintAddPoints(boundsCenter, offset);
//
// if (!_skipEntitiesSetup || _entitiesReady) {
// [_contentWrapperView addSubview:_entitiesContainerView];
// }
// _entitiesReady = true;
// [self resetScrollView];
//}
//
//- (void)prepareForCustomTransitionOut
//{
// _previewView.hidden = true;
// _canvasView.hidden = true;
// _contentView.hidden = true;
// [UIView animateWithDuration:0.3f animations:^
// {
// _portraitToolsWrapperView.alpha = 0.0f;
// _landscapeToolsWrapperView.alpha = 0.0f;
// } completion:nil];
//}
//
//- (void)transitionOutSwitching:(bool)__unused switching completion:(void (^)(void))completion
//{
// [_stickersScreen invalidate];
//
// TGPhotoEditorPreviewView *previewView = self.previewView;
// previewView.interactionEnded = nil;
//
// _portraitSettingsView.layer.shouldRasterize = true;
// _landscapeSettingsView.layer.shouldRasterize = true;
//
// [UIView animateWithDuration:0.3f animations:^
// {
// _portraitToolsWrapperView.alpha = 0.0f;
// _landscapeToolsWrapperView.alpha = 0.0f;
//
// _portraitActionsView.alpha = 0.0f;
// _landscapeActionsView.alpha = 0.0f;
// } completion:^(__unused BOOL finished)
// {
// if (completion != nil)
// completion();
// }];
//}
//
//- (CGRect)transitionOutSourceFrameForReferenceFrame:(CGRect)referenceFrame orientation:(UIInterfaceOrientation)orientation
//{
// CGRect containerFrame = [TGPhotoPaintController photoContainerFrameForParentViewFrame:self.view.frame toolbarLandscapeSize:self.toolbarLandscapeSize orientation:orientation panelSize:TGPhotoPaintTopPanelSize + TGPhotoPaintBottomPanelSize hasOnScreenNavigation:self.hasOnScreenNavigation];
//
// CGSize fittedSize = TGScaleToSize(referenceFrame.size, containerFrame.size);
// return CGRectMake(containerFrame.origin.x + (containerFrame.size.width - fittedSize.width) / 2, containerFrame.origin.y + (containerFrame.size.height - fittedSize.height) / 2, fittedSize.width, fittedSize.height);
//}
//
//- (void)_animatePreviewViewTransitionOutToFrame:(CGRect)targetFrame saving:(bool)saving parentView:(UIView *)parentView completion:(void (^)(void))completion
//{
// _dismissing = true;
//
// [_entitySelectionView removeFromSuperview];
// _entitySelectionView = nil;
//
// TGPhotoEditorPreviewView *previewView = self.previewView;
// [previewView prepareForTransitionOut];
//
// UIInterfaceOrientation orientation = self.effectiveOrientation;
// CGRect containerFrame = [TGPhotoPaintController photoContainerFrameForParentViewFrame:self.view.frame toolbarLandscapeSize:self.toolbarLandscapeSize orientation:orientation panelSize:TGPhotoPaintTopPanelSize + TGPhotoPaintBottomPanelSize hasOnScreenNavigation:self.hasOnScreenNavigation];
// CGRect referenceFrame = CGRectMake(0, 0, self.photoEditor.rotatedCropSize.width, self.photoEditor.rotatedCropSize.height);
// CGRect rect = CGRectOffset([self transitionOutSourceFrameForReferenceFrame:referenceFrame orientation:orientation], -containerFrame.origin.x, -containerFrame.origin.y);
// previewView.frame = rect;
//
// UIView *snapshotView = nil;
// POPSpringAnimation *snapshotAnimation = nil;
// NSMutableArray *animations = [[NSMutableArray alloc] init];
//
// if (saving && CGRectIsNull(targetFrame) && parentView != nil)
// {
// snapshotView = [previewView snapshotViewAfterScreenUpdates:false];
// snapshotView.frame = [_containerView convertRect:previewView.frame toView:parentView];
//
// UIView *canvasSnapshotView = [_paintingWrapperView resizableSnapshotViewFromRect:[_paintingWrapperView convertRect:previewView.bounds fromView:previewView] afterScreenUpdates:false withCapInsets:UIEdgeInsetsZero];
// canvasSnapshotView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
// canvasSnapshotView.transform = _contentView.transform;
// canvasSnapshotView.frame = snapshotView.bounds;
// [snapshotView addSubview:canvasSnapshotView];
//
// UIView *entitiesSnapshotView = [_contentWrapperView resizableSnapshotViewFromRect:[_contentWrapperView convertRect:previewView.bounds fromView:previewView] afterScreenUpdates:false withCapInsets:UIEdgeInsetsZero];
// entitiesSnapshotView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
// entitiesSnapshotView.transform = _contentView.transform;
// entitiesSnapshotView.frame = snapshotView.bounds;
// [snapshotView addSubview:entitiesSnapshotView];
//
// CGSize fittedSize = TGScaleToSize(previewView.frame.size, self.view.frame.size);
// targetFrame = CGRectMake((self.view.frame.size.width - fittedSize.width) / 2, (self.view.frame.size.height - fittedSize.height) / 2, fittedSize.width, fittedSize.height);
//
// [parentView addSubview:snapshotView];
//
// snapshotAnimation = [TGPhotoEditorAnimation prepareTransitionAnimationForPropertyNamed:kPOPViewFrame];
// snapshotAnimation.fromValue = [NSValue valueWithCGRect:snapshotView.frame];
// snapshotAnimation.toValue = [NSValue valueWithCGRect:targetFrame];
// [animations addObject:snapshotAnimation];
// }
//
// targetFrame = CGRectOffset(targetFrame, -containerFrame.origin.x, -containerFrame.origin.y);
// CGPoint targetCenter = TGPaintCenterOfRect(targetFrame);
//
// POPSpringAnimation *previewAnimation = [TGPhotoEditorAnimation prepareTransitionAnimationForPropertyNamed:kPOPViewFrame];
// previewAnimation.fromValue = [NSValue valueWithCGRect:previewView.frame];
// previewAnimation.toValue = [NSValue valueWithCGRect:targetFrame];
// [animations addObject:previewAnimation];
//
// POPSpringAnimation *previewAlphaAnimation = [TGPhotoEditorAnimation prepareTransitionAnimationForPropertyNamed:kPOPViewAlpha];
// previewAlphaAnimation.fromValue = @(previewView.alpha);
// previewAlphaAnimation.toValue = @(0.0f);
// [animations addObject:previewAnimation];
//
// POPSpringAnimation *entitiesAnimation = [TGPhotoEditorAnimation prepareTransitionAnimationForPropertyNamed:kPOPViewCenter];
// entitiesAnimation.fromValue = [NSValue valueWithCGPoint:_contentView.center];
// entitiesAnimation.toValue = [NSValue valueWithCGPoint:targetCenter];
// [animations addObject:entitiesAnimation];
//
// CGFloat targetEntitiesScale = targetFrame.size.width / _contentView.frame.size.width;
// POPSpringAnimation *entitiesScaleAnimation = [TGPhotoEditorAnimation prepareTransitionAnimationForPropertyNamed:kPOPViewScaleXY];
// entitiesScaleAnimation.fromValue = [NSValue valueWithCGSize:CGSizeMake(1.0f, 1.0f)];
// entitiesScaleAnimation.toValue = [NSValue valueWithCGSize:CGSizeMake(targetEntitiesScale, targetEntitiesScale)];
// [animations addObject:entitiesScaleAnimation];
//
// POPSpringAnimation *entitiesAlphaAnimation = [TGPhotoEditorAnimation prepareTransitionAnimationForPropertyNamed:kPOPViewAlpha];
// entitiesAlphaAnimation.fromValue = @(_canvasView.alpha);
// entitiesAlphaAnimation.toValue = @(0.0f);
// [animations addObject:entitiesAlphaAnimation];
//
// POPSpringAnimation *paintingAnimation = [TGPhotoEditorAnimation prepareTransitionAnimationForPropertyNamed:kPOPViewCenter];
// paintingAnimation.fromValue = [NSValue valueWithCGPoint:_paintingWrapperView.center];
// paintingAnimation.toValue = [NSValue valueWithCGPoint:targetCenter];
// [animations addObject:paintingAnimation];
//
// CGFloat targetPaintingScale = targetFrame.size.width / _paintingWrapperView.frame.size.width;
// POPSpringAnimation *paintingScaleAnimation = [TGPhotoEditorAnimation prepareTransitionAnimationForPropertyNamed:kPOPViewScaleXY];
// paintingScaleAnimation.fromValue = [NSValue valueWithCGSize:CGSizeMake(1.0f, 1.0f)];
// paintingScaleAnimation.toValue = [NSValue valueWithCGSize:CGSizeMake(targetPaintingScale, targetPaintingScale)];
// [animations addObject:paintingScaleAnimation];
//
// POPSpringAnimation *paintingAlphaAnimation = [TGPhotoEditorAnimation prepareTransitionAnimationForPropertyNamed:kPOPViewAlpha];
// paintingAlphaAnimation.fromValue = @(_paintingWrapperView.alpha);
// paintingAlphaAnimation.toValue = @(0.0f);
// [animations addObject:paintingAlphaAnimation];
//
// [TGPhotoEditorAnimation performBlock:^(__unused bool allFinished)
// {
// [snapshotView removeFromSuperview];
//
// if (completion != nil)
// completion();
// } whenCompletedAllAnimations:animations];
//
// if (snapshotAnimation != nil)
// [snapshotView pop_addAnimation:snapshotAnimation forKey:@"frame"];
// [previewView pop_addAnimation:previewAnimation forKey:@"frame"];
// [previewView pop_addAnimation:previewAlphaAnimation forKey:@"alpha"];
//
// [_contentView pop_addAnimation:entitiesAnimation forKey:@"frame"];
// [_contentView pop_addAnimation:entitiesScaleAnimation forKey:@"scale"];
// [_contentView pop_addAnimation:entitiesAlphaAnimation forKey:@"alpha"];
//
// [_paintingWrapperView pop_addAnimation:paintingAnimation forKey:@"frame"];
// [_paintingWrapperView pop_addAnimation:paintingScaleAnimation forKey:@"scale"];
// [_paintingWrapperView pop_addAnimation:paintingAlphaAnimation forKey:@"alpha"];
//
// if (saving)
// {
// _contentView.hidden = true;
// _paintingWrapperView.hidden = true;
// previewView.hidden = true;
// }
//}
//
//- (CGRect)transitionOutReferenceFrame
//{
// TGPhotoEditorPreviewView *previewView = _previewView;
// return [previewView convertRect:previewView.bounds toView:self.view];
//}
//
//- (UIView *)transitionOutReferenceView
//{
// return _previewView;
//}
//
//- (UIView *)snapshotView
//{
// TGPhotoEditorPreviewView *previewView = self.previewView;
// return [previewView originalSnapshotView];
//}
//
//- (void)setInterfaceHidden:(bool)hidden animated:(bool)animated
//{
// CGFloat targetAlpha = hidden ? 0.0f : 1.0;
// void (^changeBlock)(void) = ^
// {
// _portraitActionsView.alpha = targetAlpha;
// _landscapeActionsView.alpha = targetAlpha;
// _portraitSettingsView.alpha = targetAlpha;
// _landscapeSettingsView.alpha = targetAlpha;
// };
//
// if (animated)
// [UIView animateWithDuration:0.25 animations:changeBlock];
// else
// changeBlock();
//
// TGPhotoEditorController *editorController = (TGPhotoEditorController *)self.parentViewController;
// if (![editorController isKindOfClass:[TGPhotoEditorController class]])
// return;
//
// [editorController setToolbarHidden:hidden animated:animated];
//}
//
//- (void)setDimHidden:(bool)hidden animated:(bool)animated
//{
// if (!hidden)
// {
// [_entitySelectionView fadeOut];
//
// if ([_currentEntityView isKindOfClass:[TGPhotoTextEntityView class]])
// [_dimView.superview insertSubview:_dimView belowSubview:_currentEntityView];
// else
// [_dimView.superview bringSubviewToFront:_dimView];
//
// [_doneButton.superview bringSubviewToFront:_doneButton];
// }
// else
// {
// [_entitySelectionView fadeIn];
//
// [_dimView.superview bringSubviewToFront:_dimView];
//
// [_doneButton.superview bringSubviewToFront:_doneButton];
// }
//
// void (^changeBlock)(void) = ^
// {
// _dimView.alpha = hidden ? 0.0f : 1.0f;
// _doneButton.alpha = hidden ? 0.0f : 1.0f;
// };
//
// if (animated)
// [UIView animateWithDuration:0.25 animations:changeBlock];
// else
// changeBlock();
//}
//
//- (id)currentResultRepresentation
//{
// return TGPaintCombineCroppedImages(self.photoEditor.currentResultImage, [self image], true, _photoEditor.originalSize, _photoEditor.cropRect, _photoEditor.cropOrientation, _photoEditor.cropRotation, false);
//}
//
//#pragma mark - Layout
//
//- (void)viewWillLayoutSubviews
//{
// [super viewWillLayoutSubviews];
//
// [self updateLayout:[[LegacyComponentsGlobals provider] applicationStatusBarOrientation]];
// [_entitySelectionView update];
//}
//
//- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
//{
// [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
//
// if (_menuContainerView != nil)
// {
// [_menuContainerView removeFromSuperview];
// _menuContainerView = nil;
// }
//
// [self updateLayout:toInterfaceOrientation];
//}
//
//- (void)updateContentViewLayout
//{
// CGAffineTransform rotationTransform = CGAffineTransformMakeRotation(TGRotationForOrientation(_photoEditor.cropOrientation));
// _contentView.transform = rotationTransform;
// _contentView.frame = self.previewView.frame;
// [self resetScrollView];
//}
//
//- (void)updateLayout:(UIInterfaceOrientation)orientation
//{
// if ([self inFormSheet] || [UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad)
// {
// _landscapeToolsWrapperView.hidden = true;
// orientation = UIInterfaceOrientationPortrait;
// }
//
// CGSize referenceSize = [self referenceViewSize];
// CGFloat screenSide = MAX(referenceSize.width, referenceSize.height) + 2 * TGPhotoPaintBottomPanelSize;
//
// bool sizeUpdated = false;
// if (!CGSizeEqualToSize(referenceSize, _previousSize)) {
// sizeUpdated = true;
// _previousSize = referenceSize;
// }
//
// CGFloat panelToolbarPortraitSize = TGPhotoPaintBottomPanelSize + TGPhotoEditorToolbarSize;
// CGFloat panelToolbarLandscapeSize = TGPhotoPaintBottomPanelSize + self.toolbarLandscapeSize;
//
// UIEdgeInsets safeAreaInset = [TGViewController safeAreaInsetForOrientation:orientation hasOnScreenNavigation:self.hasOnScreenNavigation];
// UIEdgeInsets screenEdges = UIEdgeInsetsMake((screenSide - referenceSize.height) / 2, (screenSide - referenceSize.width) / 2, (screenSide + referenceSize.height) / 2, (screenSide + referenceSize.width) / 2);
// screenEdges.top += safeAreaInset.top;
// screenEdges.left += safeAreaInset.left;
// screenEdges.bottom -= safeAreaInset.bottom;
// screenEdges.right -= safeAreaInset.right;
//
// CGRect containerFrame = [TGPhotoPaintController photoContainerFrameForParentViewFrame:CGRectMake(0, 0, referenceSize.width, referenceSize.height) toolbarLandscapeSize:self.toolbarLandscapeSize orientation:orientation panelSize:TGPhotoPaintTopPanelSize + TGPhotoPaintBottomPanelSize hasOnScreenNavigation:self.hasOnScreenNavigation];
//
// _settingsViewWrapper.frame = self.parentViewController.view.bounds;
//
// _doneButton.frame = CGRectMake(screenEdges.right - _doneButton.frame.size.width - 8.0, screenEdges.top + 2.0, _doneButton.frame.size.width, _doneButton.frame.size.height);
//
// if (_settingsView != nil)
// [_settingsView setInterfaceOrientation:orientation];
//
// switch (orientation)
// {
// case UIInterfaceOrientationLandscapeLeft:
// {
// _landscapeSettingsView.interfaceOrientation = orientation;
//
// [UIView performWithoutAnimation:^
// {
// _landscapeToolsWrapperView.frame = CGRectMake(0, screenEdges.top, panelToolbarLandscapeSize, _landscapeToolsWrapperView.frame.size.height);
// _landscapeSettingsView.frame = CGRectMake(panelToolbarLandscapeSize - TGPhotoPaintBottomPanelSize, 0, TGPhotoPaintBottomPanelSize, _landscapeSettingsView.frame.size.height);
// }];
//
// _landscapeToolsWrapperView.frame = CGRectMake(screenEdges.left, screenEdges.top, panelToolbarLandscapeSize, referenceSize.height);
// _landscapeSettingsView.frame = CGRectMake(_landscapeSettingsView.frame.origin.x, _landscapeSettingsView.frame.origin.y, _landscapeSettingsView.frame.size.width, _landscapeToolsWrapperView.frame.size.height);
//
// _portraitToolsWrapperView.frame = CGRectMake(screenEdges.left, screenSide - panelToolbarPortraitSize, referenceSize.width, panelToolbarPortraitSize);
// _portraitSettingsView.frame = CGRectMake(0, 0, _portraitToolsWrapperView.frame.size.width, TGPhotoPaintBottomPanelSize);
//
// _landscapeActionsView.frame = CGRectMake(screenEdges.right - TGPhotoPaintTopPanelSize, screenEdges.top, TGPhotoPaintTopPanelSize, referenceSize.height);
//
// _settingsView.frame = CGRectMake(self.toolbarLandscapeSize + 50.0f + safeAreaInset.left, 0.0f, _settingsView.frame.size.width, _settingsView.frame.size.height);
// }
// break;
//
// case UIInterfaceOrientationLandscapeRight:
// {
// _landscapeSettingsView.interfaceOrientation = orientation;
//
// [UIView performWithoutAnimation:^
// {
// _landscapeToolsWrapperView.frame = CGRectMake(screenSide - panelToolbarLandscapeSize, screenEdges.top, panelToolbarLandscapeSize, _landscapeToolsWrapperView.frame.size.height);
// _landscapeSettingsView.frame = CGRectMake(0, 0, TGPhotoPaintBottomPanelSize, _landscapeSettingsView.frame.size.height);
// }];
//
// _landscapeToolsWrapperView.frame = CGRectMake(screenEdges.right - panelToolbarLandscapeSize, screenEdges.top, panelToolbarLandscapeSize, referenceSize.height);
// _landscapeSettingsView.frame = CGRectMake(_landscapeSettingsView.frame.origin.x, _landscapeSettingsView.frame.origin.y, _landscapeSettingsView.frame.size.width, _landscapeToolsWrapperView.frame.size.height);
//
// _portraitToolsWrapperView.frame = CGRectMake(screenEdges.top, screenSide - panelToolbarPortraitSize, referenceSize.width, panelToolbarPortraitSize);
// _portraitSettingsView.frame = CGRectMake(0, 0, _portraitToolsWrapperView.frame.size.width, TGPhotoPaintBottomPanelSize);
//
// _landscapeActionsView.frame = CGRectMake(screenEdges.left, screenEdges.top, TGPhotoPaintTopPanelSize, referenceSize.height);
//
// _settingsView.frame = CGRectMake(_settingsViewWrapper.frame.size.width - _settingsView.frame.size.width - self.toolbarLandscapeSize - 50.0f - safeAreaInset.right, 0.0f, _settingsView.frame.size.width, _settingsView.frame.size.height);
// }
// break;
//
// default:
// {
// CGFloat x = _landscapeToolsWrapperView.frame.origin.x;
// if (x < screenSide / 2)
// x = 0;
// else
// x = screenSide - TGPhotoEditorPanelSize;
// _landscapeToolsWrapperView.frame = CGRectMake(x, screenEdges.top, panelToolbarLandscapeSize, referenceSize.height);
//
// _portraitToolsWrapperView.frame = CGRectMake(screenEdges.left, screenEdges.bottom - panelToolbarPortraitSize, referenceSize.width, panelToolbarPortraitSize);
// _portraitSettingsView.frame = CGRectMake(0, 0, referenceSize.width, TGPhotoPaintBottomPanelSize);
//
// _portraitActionsView.frame = CGRectMake(screenEdges.left, screenEdges.top, referenceSize.width, TGPhotoPaintTopPanelSize);
//
// if ([_context currentSizeClass] == UIUserInterfaceSizeClassRegular)
// {
// _settingsView.frame = CGRectMake(_settingsViewWrapper.frame.size.width / 2.0f - 10.0f, _settingsViewWrapper.frame.size.height - _settingsView.frame.size.height - TGPhotoEditorToolbarSize - 50.0f, _settingsView.frame.size.width, _settingsView.frame.size.height);
// }
// else
// {
// _settingsView.frame = CGRectMake(_settingsViewWrapper.frame.size.width - _settingsView.frame.size.width, _settingsViewWrapper.frame.size.height - _settingsView.frame.size.height - TGPhotoEditorToolbarSize - 50.0f - safeAreaInset.bottom, _settingsView.frame.size.width, _settingsView.frame.size.height);
// }
// }
// break;
// }
//
// PGPhotoEditor *photoEditor = self.photoEditor;
// TGPhotoEditorPreviewView *previewView = self.previewView;
//
// CGSize fittedSize = TGScaleToSize(photoEditor.rotatedCropSize, containerFrame.size);
// CGRect previewFrame = CGRectMake((containerFrame.size.width - fittedSize.width) / 2, (containerFrame.size.height - fittedSize.height) / 2, fittedSize.width, fittedSize.height);
//
// CGFloat visibleArea = self.view.frame.size.height - _keyboardHeight;
// CGFloat yCenter = visibleArea / 2.0f;
// CGFloat offset = yCenter - _previewView.center.y - containerFrame.origin.y;
// CGFloat offsetHeight = _keyboardHeight > FLT_EPSILON ? offset : 0.0f;
//
// _wrapperView.frame = CGRectMake((referenceSize.width - screenSide) / 2, (referenceSize.height - screenSide) / 2 + offsetHeight, screenSide, screenSide);
//
// if (_dismissing || (previewView.superview != _containerView && previewView.superview != self.view))
// return;
//
// if (previewView.superview == self.view)
// {
// previewFrame = CGRectMake(containerFrame.origin.x + (containerFrame.size.width - fittedSize.width) / 2, containerFrame.origin.y + (containerFrame.size.height - fittedSize.height) / 2, fittedSize.width, fittedSize.height);
// }
//
// UIImageOrientation cropOrientation = _photoEditor.cropOrientation;
// CGRect cropRect = _photoEditor.cropRect;
// CGSize originalSize = _photoEditor.originalSize;
// CGFloat rotation = _photoEditor.cropRotation;
//
// CGAffineTransform rotationTransform = CGAffineTransformMakeRotation(TGRotationForOrientation(cropOrientation));
// _contentView.transform = rotationTransform;
// _contentView.frame = previewFrame;
//
// _scrollView.frame = self.view.bounds;
//
// if (sizeUpdated) {
// [self resetScrollView];
// }
// [self adjustZoom];
//
// _paintingWrapperView.transform = CGAffineTransformMakeRotation(TGRotationForOrientation(cropOrientation));
// _paintingWrapperView.frame = previewFrame;
//
// CGFloat originalWidth = TGOrientationIsSideward(cropOrientation, NULL) ? previewFrame.size.height : previewFrame.size.width;
// CGFloat ratio = originalWidth / cropRect.size.width;
// CGRect originalFrame = CGRectMake(-cropRect.origin.x * ratio, -cropRect.origin.y * ratio, originalSize.width * ratio, originalSize.height * ratio);
//
// previewView.frame = previewFrame;
//
// if ([self presentedForAvatarCreation]) {
// CGAffineTransform transform = CGAffineTransformMakeRotation(TGRotationForOrientation(photoEditor.cropOrientation));
// if (photoEditor.cropMirrored)
// transform = CGAffineTransformScale(transform, -1.0f, 1.0f);
// previewView.transform = transform;
// }
//
// CGSize fittedOriginalSize = CGSizeMake(originalSize.width * ratio, originalSize.height * ratio);
// CGSize rotatedSize = TGRotatedContentSize(fittedOriginalSize, rotation);
// CGPoint centerPoint = CGPointMake(rotatedSize.width / 2.0f, rotatedSize.height / 2.0f);
//
// CGFloat scale = fittedOriginalSize.width / _photoEditor.originalSize.width;
// CGPoint centerOffset = TGPaintSubtractPoints(centerPoint, [self fittedCropCenterScale:scale]);
//
// _canvasView.transform = CGAffineTransformIdentity;
// _canvasView.frame = originalFrame;
// _canvasView.transform = CGAffineTransformMakeRotation(rotation);
// _canvasView.center = TGPaintAddPoints(TGPaintCenterOfRect(_paintingWrapperView.bounds), centerOffset);
//
// _selectionContainerView.transform = CGAffineTransformRotate(rotationTransform, rotation);
// _selectionContainerView.frame = previewFrame;
// _eyedropperView.frame = _selectionContainerView.bounds;
//
// _containerView.frame = CGRectMake(containerFrame.origin.x, containerFrame.origin.y + offsetHeight, containerFrame.size.width, containerFrame.size.height);
//}
//
//#pragma mark - Keyboard Avoidance
//
//- (void)keyboardWillChangeFrame:(NSNotification *)notification
//{
// UIView *parentView = self.view;
//
// NSTimeInterval duration = notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] == nil ? 0.3 : [notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
// int curve = [notification.userInfo[UIKeyboardAnimationCurveUserInfoKey] intValue];
// CGRect screenKeyboardFrame = [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
// CGRect keyboardFrame = [parentView convertRect:screenKeyboardFrame fromView:nil];
//
// CGFloat keyboardHeight = (keyboardFrame.size.height <= FLT_EPSILON || keyboardFrame.size.width <= FLT_EPSILON) ? 0.0f : (parentView.frame.size.height - keyboardFrame.origin.y);
// keyboardHeight = MAX(keyboardHeight, 0.0f);
//
// _keyboardHeight = keyboardHeight;
//
// [self keyboardHeightChangedTo:keyboardHeight duration:duration curve:curve];
//}
//
//- (void)keyboardHeightChangedTo:(CGFloat)height duration:(NSTimeInterval)duration curve:(NSInteger)curve
//{
// CGSize referenceSize = [self referenceViewSize];
// CGFloat screenSide = MAX(referenceSize.width, referenceSize.height) + 2 * TGPhotoPaintBottomPanelSize;
//
// CGRect containerFrame = [TGPhotoPaintController photoContainerFrameForParentViewFrame:CGRectMake(0, 0, referenceSize.width, referenceSize.height) toolbarLandscapeSize:self.toolbarLandscapeSize orientation:self.effectiveOrientation panelSize:TGPhotoPaintTopPanelSize + TGPhotoPaintBottomPanelSize hasOnScreenNavigation:self.hasOnScreenNavigation];
//
// CGFloat visibleArea = self.view.frame.size.height - height;
// CGFloat yCenter = visibleArea / 2.0f;
// CGFloat offset = yCenter - _previewView.center.y - containerFrame.origin.y;
// CGFloat offsetHeight = height > FLT_EPSILON ? offset : 0.0f;
//
// [UIView animateWithDuration:duration delay:0.0 options:curve animations:^
// {
// _wrapperView.frame = CGRectMake((referenceSize.width - screenSide) / 2, (referenceSize.height - screenSide) / 2 + offsetHeight, _wrapperView.frame.size.width, _wrapperView.frame.size.height);
// _containerView.frame = CGRectMake(containerFrame.origin.x, containerFrame.origin.y + offsetHeight, containerFrame.size.width, containerFrame.size.height);
// } completion:nil];
//}
//
//- (void)_setStickerEntityPosition:(TGPhotoPaintStickerEntity *)entity
//{
// TGStickerMaskDescription *mask = [_stickersContext maskDescriptionForDocument:entity.document];
// int64_t documentId = [_stickersContext documentIdForDocument:entity.document];
// TGPhotoMaskPosition *position = [self _positionForMaskDescription:mask documentId:documentId];
// if (position != nil)
// {
// entity.position = position.center;
// entity.angle = position.angle;
// entity.scale = position.scale;
// }
// else
// {
// entity.position = [self startPositionRelativeToEntity:nil];
// entity.angle = [self startRotation];
// }
//}
//
//- (TGPhotoMaskPosition *)_positionForMaskDescription:(TGStickerMaskDescription *)mask documentId:(int64_t)documentId
//{
// if (mask == nil)
// return nil;
//
// TGPhotoMaskAnchor anchor = [TGPhotoMaskPosition anchorOfMask:mask];
// if (anchor == TGPhotoMaskAnchorNone)
// return nil;
//
// TGPaintFace *face = [self _randomFaceWithVacantAnchor:anchor documentId:documentId];
// if (face == nil)
// return nil;
//
// CGPoint referencePoint = CGPointZero;
// CGFloat referenceWidth = 0.0f;
// CGFloat angle = 0.0f;
// CGSize baseSize = [self _stickerBaseSizeForCurrentPainting];
// CGRect faceBounds = [TGPaintFaceUtils transposeRect:face.bounds paintingSize:_painting.size originalSize:_photoEditor.originalSize];
//
// switch (anchor)
// {
// case TGPhotoMaskAnchorForehead:
// {
// referencePoint = [TGPaintFaceUtils transposePoint:[face foreheadPoint] paintingSize:_painting.size originalSize:_photoEditor.originalSize];
// referenceWidth = faceBounds.size.width;
// angle = face.angle;
// }
// break;
//
// case TGPhotoMaskAnchorEyes:
// {
// CGPoint point = [face eyesCenterPointAndDistance:&referenceWidth];
// referenceWidth = [TGPaintFaceUtils transposeWidth:referenceWidth paintingSize:_painting.size originalSize:_photoEditor.originalSize];
// referencePoint = [TGPaintFaceUtils transposePoint:point paintingSize:_painting.size originalSize:_photoEditor.originalSize];
// angle = [face eyesAngle];
// }
// break;
//
// case TGPhotoMaskAnchorMouth:
// {
// referencePoint = [TGPaintFaceUtils transposePoint:[face mouthPoint] paintingSize:_painting.size originalSize:_photoEditor.originalSize];
// referenceWidth = faceBounds.size.width;
// angle = face.angle;
// }
// break;
//
// case TGPhotoMaskAnchorChin:
// {
// referencePoint = [TGPaintFaceUtils transposePoint:[face chinPoint] paintingSize:_painting.size originalSize:_photoEditor.originalSize];
// referenceWidth = faceBounds.size.width;
// angle = face.angle;
// }
// break;
//
// default:
// break;
// }
//
// CGFloat scale = referenceWidth / baseSize.width * mask.zoom;
//
// CGPoint xComp = CGPointMake(sin(M_PI_2 - angle) * referenceWidth * mask.point.x,
// cos(M_PI_2 - angle) * referenceWidth * mask.point.x);
// CGPoint yComp = CGPointMake(cos(M_PI_2 + angle) * referenceWidth * mask.point.y,
// sin(M_PI_2 + angle) * referenceWidth * mask.point.y);
//
// CGPoint position = CGPointMake(referencePoint.x + xComp.x + yComp.x, referencePoint.y + xComp.y + yComp.y);
//
// return [TGPhotoMaskPosition maskPositionWithCenter:position scale:scale angle:angle];
//}
//
//- (TGPaintFace *)_randomFaceWithVacantAnchor:(TGPhotoMaskAnchor)anchor documentId:(int64_t)documentId
//{
// NSInteger randomIndex = (NSInteger)arc4random_uniform((uint32_t)self.faces.count);
// NSInteger count = self.faces.count;
// NSInteger remaining = self.faces.count;
//
// for (NSInteger i = randomIndex; remaining > 0; (i = (i + 1) % count), remaining--)
// {
// TGPaintFace *face = self.faces[i];
// if (![self _isFaceAnchorOccupied:face anchor:anchor documentId:documentId])
// return face;
// }
//
// return nil;
//}
//
//- (bool)_isFaceAnchorOccupied:(TGPaintFace *)face anchor:(TGPhotoMaskAnchor)anchor documentId:(int64_t)documentId
//{
// CGPoint anchorPoint = CGPointZero;
// switch (anchor)
// {
// case TGPhotoMaskAnchorForehead:
// {
// anchorPoint = [TGPaintFaceUtils transposePoint:[face foreheadPoint] paintingSize:_painting.size originalSize:_photoEditor.originalSize];
// }
// break;
//
// case TGPhotoMaskAnchorEyes:
// {
// anchorPoint = [TGPaintFaceUtils transposePoint:[face eyesCenterPointAndDistance:NULL] paintingSize:_painting.size originalSize:_photoEditor.originalSize];
// }
// break;
//
// case TGPhotoMaskAnchorMouth:
// {
// anchorPoint = [TGPaintFaceUtils transposePoint:[face mouthPoint] paintingSize:_painting.size originalSize:_photoEditor.originalSize];
// }
// break;
//
// case TGPhotoMaskAnchorChin:
// {
// anchorPoint = [TGPaintFaceUtils transposePoint:[face chinPoint] paintingSize:_painting.size originalSize:_photoEditor.originalSize];
// }
// break;
//
// default:
// {
//
// }
// break;
// }
//
// CGRect faceBounds = [TGPaintFaceUtils transposeRect:face.bounds paintingSize:_painting.size originalSize:_photoEditor.originalSize];
// CGFloat minDistance = faceBounds.size.width * 1.1;
//
// for (TGPhotoStickerEntityView *view in _entitiesContainerView.subviews)
// {
// if (![view isKindOfClass:[TGPhotoStickerEntityView class]])
// continue;
//
// TGPhotoPaintStickerEntity *entity = view.entity;
// TGStickerMaskDescription *mask = [_stickersContext maskDescriptionForDocument:view.entity.document];
// int64_t maskDocumentId = [_stickersContext documentIdForDocument:entity.document];
//
// if ([TGPhotoMaskPosition anchorOfMask:mask] != anchor)
// continue;
//
// if ((documentId == maskDocumentId || self.faces.count > 1) && TGPaintDistance(entity.position, anchorPoint) < minDistance)
// return true;
// }
//
// return false;
//}
//
//- (NSArray *)faces
//{
// TGPhotoEditorController *editorController = (TGPhotoEditorController *)self.parentViewController;
// if ([editorController isKindOfClass:[TGPhotoEditorController class]])
// return editorController.faces;
// else
// return @[];
//}
//
//- (UIRectEdge)preferredScreenEdgesDeferringSystemGestures
//{
// return UIRectEdgeTop | UIRectEdgeBottom;
//}
//
//@end