mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
nanosvg
This commit is contained in:
parent
9fb3dc730a
commit
ca338398f7
@ -3,8 +3,110 @@
|
||||
#import "SVGKit.h"
|
||||
#import "SVGKExporterUIImage.h"
|
||||
|
||||
#import "nanosvg.h"
|
||||
|
||||
UIImage * _Nullable drawSvgImage(NSData * _Nonnull data, CGSize size) {
|
||||
char *zeroTerminatedData = malloc(data.length + 1);
|
||||
[data getBytes:zeroTerminatedData length:data.length];
|
||||
zeroTerminatedData[data.length] = 0;
|
||||
|
||||
NSVGimage *image = nsvgParse(zeroTerminatedData, "px", 96);
|
||||
if (image == nil || image->width < 1.0f || image->height < 1.0f) {
|
||||
return nil;
|
||||
}
|
||||
|
||||
UIGraphicsBeginImageContextWithOptions(size, true, 1.0);
|
||||
CGContextRef context = UIGraphicsGetCurrentContext();
|
||||
CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor);
|
||||
CGContextFillRect(context, CGRectMake(0.0f, 0.0f, size.width, size.height));
|
||||
CGContextScaleCTM(context, size.width / image->width, size.height / image->height);
|
||||
|
||||
for (NSVGshape *shape = image->shapes; shape != NULL; shape = shape->next) {
|
||||
if (!(shape->flags & NSVG_FLAGS_VISIBLE)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (shape->fill.type != NSVG_PAINT_NONE) {
|
||||
CGContextSetFillColorWithColor(context, [[UIColor blackColor] colorWithAlphaComponent:shape->opacity].CGColor);
|
||||
|
||||
for (NSVGpath *path = shape->paths; path != NULL; path = path->next) {
|
||||
CGContextBeginPath(context);
|
||||
CGContextMoveToPoint(context, path->pts[0], path->pts[1]);
|
||||
for (int i = 0; i < path->npts - 1; i += 3) {
|
||||
float *p = &path->pts[i * 2];
|
||||
CGContextAddCurveToPoint(context, p[2], p[3], p[4], p[5], p[6], p[7]);
|
||||
//drawCubicBez(p[0],p[1], p[2],p[3], p[4],p[5], p[6],p[7]);
|
||||
}
|
||||
|
||||
switch (shape->fillRule) {
|
||||
case NSVG_FILLRULE_EVENODD:
|
||||
CGContextEOFillPath(context);
|
||||
break;
|
||||
default:
|
||||
CGContextFillPath(context);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (shape->stroke.type != NSVG_PAINT_NONE) {
|
||||
CGContextSetStrokeColorWithColor(context, [[UIColor blackColor] colorWithAlphaComponent:shape->opacity].CGColor);
|
||||
//CGContextSetMiterLimit(context, shape->miterLimit);
|
||||
|
||||
CGContextSetLineWidth(context, shape->strokeWidth);
|
||||
switch (shape->strokeLineCap) {
|
||||
case NSVG_CAP_BUTT:
|
||||
CGContextSetLineCap(context, kCGLineCapButt);
|
||||
break;
|
||||
case NSVG_CAP_ROUND:
|
||||
CGContextSetLineCap(context, kCGLineCapRound);
|
||||
break;
|
||||
case NSVG_CAP_SQUARE:
|
||||
CGContextSetLineCap(context, kCGLineCapSquare);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
switch (shape->strokeLineJoin) {
|
||||
case NSVG_JOIN_BEVEL:
|
||||
CGContextSetLineJoin(context, kCGLineJoinBevel);
|
||||
break;
|
||||
case NSVG_JOIN_MITER:
|
||||
CGContextSetLineCap(context, kCGLineJoinMiter);
|
||||
break;
|
||||
case NSVG_JOIN_ROUND:
|
||||
CGContextSetLineCap(context, kCGLineJoinRound);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
for (NSVGpath *path = shape->paths; path != NULL; path = path->next) {
|
||||
CGContextBeginPath(context);
|
||||
CGContextMoveToPoint(context, path->pts[0], path->pts[1]);
|
||||
for (int i = 0; i < path->npts - 1; i += 3) {
|
||||
float *p = &path->pts[i * 2];
|
||||
CGContextAddCurveToPoint(context, p[2], p[3], p[4], p[5], p[6], p[7]);
|
||||
//drawCubicBez(p[0],p[1], p[2],p[3], p[4],p[5], p[6],p[7]);
|
||||
}
|
||||
|
||||
if (path->closed) {
|
||||
CGContextClosePath(context);
|
||||
}
|
||||
CGContextStrokePath(context);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
UIImage *resultImage = UIGraphicsGetImageFromCurrentImageContext();
|
||||
UIGraphicsEndImageContext();
|
||||
|
||||
nsvgDelete(image);
|
||||
|
||||
return resultImage;
|
||||
}
|
||||
|
||||
UIImage * _Nullable drawSvgImage1(NSData * _Nonnull data, CGSize size) {
|
||||
NSDate *startTime = [NSDate date];
|
||||
|
||||
SVGKImage *image = [[SVGKImage alloc] initWithData:data];
|
||||
|
6
submodules/Svg/Sources/nanosvg.c
Executable file
6
submodules/Svg/Sources/nanosvg.c
Executable file
@ -0,0 +1,6 @@
|
||||
#include <float.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
#define NANOSVG_IMPLEMENTATION
|
||||
#include "nanosvg.h"
|
2959
submodules/Svg/Sources/nanosvg.h
Normal file
2959
submodules/Svg/Sources/nanosvg.h
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user