mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00

git-subtree-dir: submodules/LegacyComponents git-subtree-mainline: 608630530451e02e5aec48389d144dbf7a3625b9 git-subtree-split: d5594346161c1b7f203d1e87068bbe77bcaac019
168 lines
6.5 KiB
Objective-C
168 lines
6.5 KiB
Objective-C
#import "TGPhotoEditorBlurView.h"
|
|
|
|
#import "LegacyComponentsInternal.h"
|
|
|
|
const CGFloat TGPhotoEditorBlurViewOverscreenSize = 3000;
|
|
|
|
@interface TGPhotoEditorBlurView ()
|
|
{
|
|
UIImageView *_maskView;
|
|
UIView *_leftView;
|
|
UIView *_topView;
|
|
UIView *_rightView;
|
|
UIView *_bottomView;
|
|
}
|
|
@end
|
|
|
|
@implementation TGPhotoEditorBlurView
|
|
|
|
- (instancetype)initWithType:(PGBlurToolType)type
|
|
{
|
|
self = [super initWithFrame:CGRectZero];
|
|
if (self != nil)
|
|
{
|
|
UIColor *overlayColor = UIColorRGBA(0xffffff, 0.75f);
|
|
UIColor *transparentColor = UIColorRGBA(0xffffff, 0.0f);
|
|
|
|
static UIImage *radialBlurImage = nil;
|
|
static UIImage *linearBlurImage = nil;
|
|
static dispatch_once_t radialBlurOnceToken;
|
|
static dispatch_once_t linearBlurOnceToken;
|
|
|
|
UIImage *blurImage = nil;
|
|
|
|
switch (type)
|
|
{
|
|
case PGBlurToolTypeRadial:
|
|
{
|
|
dispatch_once(&radialBlurOnceToken, ^
|
|
{
|
|
UIGraphicsBeginImageContextWithOptions(CGSizeMake(100.0f, 100.0f), false, 0.0f);
|
|
CGContextRef context = UIGraphicsGetCurrentContext();
|
|
|
|
CGColorRef colors[3] = {
|
|
CGColorRetain(transparentColor.CGColor),
|
|
CGColorRetain(overlayColor.CGColor)
|
|
};
|
|
|
|
CFArrayRef colorsArray = CFArrayCreate(kCFAllocatorDefault, (const void **)&colors, 2, NULL);
|
|
CGFloat locations[2] = {0.3f, 0.9f};
|
|
|
|
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
|
|
CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, colorsArray, (CGFloat const *)&locations);
|
|
|
|
CFRelease(colorsArray);
|
|
CFRelease(colors[0]);
|
|
CFRelease(colors[1]);
|
|
|
|
CGColorSpaceRelease(colorSpace);
|
|
|
|
CGContextDrawRadialGradient(context, gradient, CGPointMake(50.0f, 50.0f), 0, CGPointMake(50.0f, 50.0f), 50.0f, kCGGradientDrawsAfterEndLocation);
|
|
|
|
CFRelease(gradient);
|
|
|
|
radialBlurImage = UIGraphicsGetImageFromCurrentImageContext();
|
|
UIGraphicsEndImageContext();
|
|
});
|
|
|
|
blurImage = radialBlurImage;
|
|
}
|
|
break;
|
|
|
|
case PGBlurToolTypeLinear:
|
|
{
|
|
dispatch_once(&linearBlurOnceToken, ^
|
|
{
|
|
UIGraphicsBeginImageContextWithOptions(CGSizeMake(1.0f, 100.0f), false, 0.0f);
|
|
CGContextRef context = UIGraphicsGetCurrentContext();
|
|
|
|
CGColorRef colors[4] = {
|
|
CGColorRetain(overlayColor.CGColor),
|
|
CGColorRetain(transparentColor.CGColor),
|
|
CGColorRetain(transparentColor.CGColor),
|
|
CGColorRetain(overlayColor.CGColor)
|
|
};
|
|
|
|
CFArrayRef colorsArray = CFArrayCreate(kCFAllocatorDefault, (const void **)&colors, 4, NULL);
|
|
CGFloat locations[4] = {0.0f, 0.3f, 0.7f, 1.0f};
|
|
|
|
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
|
|
CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, colorsArray, (CGFloat const *)&locations);
|
|
|
|
CFRelease(colorsArray);
|
|
CFRelease(colors[0]);
|
|
CFRelease(colors[1]);
|
|
CFRelease(colors[2]);
|
|
CFRelease(colors[3]);
|
|
|
|
CGColorSpaceRelease(colorSpace);
|
|
|
|
CGContextDrawLinearGradient(context, gradient, CGPointMake(0.0f, 0.0f), CGPointMake(0.0f, 100.0f), 0);
|
|
|
|
CFRelease(gradient);
|
|
|
|
linearBlurImage = UIGraphicsGetImageFromCurrentImageContext();
|
|
UIGraphicsEndImageContext();
|
|
});
|
|
|
|
blurImage = linearBlurImage;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
_maskView = [[UIImageView alloc] initWithImage:blurImage];
|
|
[self addSubview:_maskView];
|
|
|
|
switch (type)
|
|
{
|
|
case PGBlurToolTypeRadial:
|
|
{
|
|
_leftView = [[UIView alloc] initWithFrame:CGRectZero];
|
|
_leftView.backgroundColor = overlayColor;
|
|
[self addSubview:_leftView];
|
|
|
|
_rightView = [[UIView alloc] initWithFrame:CGRectZero];
|
|
_rightView.backgroundColor = overlayColor;
|
|
[self addSubview:_rightView];
|
|
}
|
|
case PGBlurToolTypeLinear:
|
|
{
|
|
_topView = [[UIView alloc] initWithFrame:CGRectZero];
|
|
_topView.backgroundColor = overlayColor;
|
|
[self addSubview:_topView];
|
|
|
|
_bottomView = [[UIView alloc] initWithFrame:CGRectZero];
|
|
_bottomView.backgroundColor = overlayColor;
|
|
[self addSubview:_bottomView];
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (void)layoutSubviews
|
|
{
|
|
if (_leftView != nil && _rightView != nil)
|
|
{
|
|
_maskView.frame = self.bounds;
|
|
_topView.frame = CGRectMake(0, -TGPhotoEditorBlurViewOverscreenSize, _maskView.bounds.size.width, TGPhotoEditorBlurViewOverscreenSize);
|
|
_bottomView.frame = CGRectMake(0, _maskView.bounds.size.height, _maskView.bounds.size.width, TGPhotoEditorBlurViewOverscreenSize);
|
|
_leftView.frame = CGRectMake(-TGPhotoEditorBlurViewOverscreenSize, -TGPhotoEditorBlurViewOverscreenSize, TGPhotoEditorBlurViewOverscreenSize, _maskView.bounds.size.height + TGPhotoEditorBlurViewOverscreenSize * 2);
|
|
_rightView.frame = CGRectMake(_maskView.bounds.size.width, -TGPhotoEditorBlurViewOverscreenSize, TGPhotoEditorBlurViewOverscreenSize, _maskView.bounds.size.height + TGPhotoEditorBlurViewOverscreenSize * 2);
|
|
}
|
|
else
|
|
{
|
|
_maskView.frame = CGRectMake(-TGPhotoEditorBlurViewOverscreenSize, 0, self.bounds.size.width + TGPhotoEditorBlurViewOverscreenSize * 2, self.bounds.size.height);
|
|
_topView.frame = CGRectMake(_maskView.frame.origin.x, -TGPhotoEditorBlurViewOverscreenSize, _maskView.bounds.size.width, TGPhotoEditorBlurViewOverscreenSize);
|
|
_bottomView.frame = CGRectMake(_maskView.frame.origin.x, _maskView.bounds.size.height, _maskView.bounds.size.width, TGPhotoEditorBlurViewOverscreenSize);
|
|
}
|
|
}
|
|
|
|
@end
|