2020-02-22 15:38:54 +04:00

114 lines
3.0 KiB
Objective-C

#import "TGPaintNeonBrush.h"
#import "LegacyComponentsInternal.h"
const CGFloat TGPaintNeonBrushSolidFraction = 0.41f;
const CGFloat TGPaintNeonBrushBorderFraction = 0.036f;
@implementation TGPaintNeonBrush
- (CGFloat)spacing
{
return 0.07f;
}
- (CGFloat)alpha
{
return 0.7f;
}
- (CGFloat)angle
{
return 0.0f;
}
- (CGFloat)scale
{
return 1.45f;
}
- (bool)lightSaber
{
return true;
}
- (CGImageRef)generateNeonStampForSize:(CGSize)size
{
CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
CGContextRef ctx = CGBitmapContextCreate(NULL, (NSInteger)size.width, (NSInteger)size.height, 8, (NSInteger)size.width * 4, colorspace, kCGImageAlphaPremultipliedLast);
CGPoint center = CGPointMake(size.width / 2, size.height / 2);
NSArray *redColors = @
[
(__bridge id)UIColorRGB(0x440000).CGColor,
(__bridge id)UIColorRGB(0x440000).CGColor,
(__bridge id)[UIColor blackColor].CGColor
];
const CGFloat redLocations[] = { 0.0f, 0.54f, 1.0f };
CGGradientRef gradientRef = CGGradientCreateWithColors(colorspace, (__bridge CFArrayRef)redColors, redLocations);
CGFloat redMaxRadius = size.width / 2;
CGGradientDrawingOptions options = kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation;
CGContextDrawRadialGradient(ctx, gradientRef, center, 0, center, redMaxRadius, options);
CGGradientRelease(gradientRef);
CGContextSetBlendMode(ctx, kCGBlendModeScreen);
CGFloat border = floor(size.width / 2 * TGPaintNeonBrushBorderFraction);
CGFloat blueRadius = floor(size.width / 2 * TGPaintNeonBrushSolidFraction - border);
CGContextSetFillColorWithColor(ctx, [UIColor blueColor].CGColor);
CGContextAddEllipseInRect(ctx, CGRectMake(size.width / 2.0f - blueRadius, size.height / 2.0f - blueRadius, blueRadius * 2, blueRadius * 2));
CGContextFillPath(ctx);
CGFloat greenRadius = blueRadius + border + 1;
CGContextSetLineWidth(ctx, border * 3);
CGContextSetStrokeColorWithColor(ctx, [UIColor greenColor].CGColor);
CGContextAddEllipseInRect(ctx, CGRectMake(size.width / 2.0f - greenRadius, size.height / 2.0f - greenRadius, greenRadius * 2, greenRadius * 2));
CGContextStrokePath(ctx);
CGImageRef image = CGBitmapContextCreateImage(ctx);
CGContextRelease(ctx);
CGColorSpaceRelease(colorspace);
return image;
}
- (CGImageRef)stampRef
{
static CGImageRef image = NULL;
if (image == NULL)
{
image = [self generateNeonStampForSize:TGPaintBrushTextureSize];
}
return image;
}
- (CGImageRef)previewStampRef
{
if (_previewStampRef == NULL)
{
_previewStampRef = [self generateNeonStampForSize:TGPaintBrushPreviewTextureSize];
}
return _previewStampRef;
}
static UIImage *neonBrushPreviewImage = nil;
- (UIImage *)previewImage
{
return neonBrushPreviewImage;
}
- (void)setPreviewImage:(UIImage *)previewImage
{
neonBrushPreviewImage = previewImage;
}
@end