将SVG命令转换为CoreGraphics

时间:2015-07-16 00:43:49

标签: objective-c macos cocoa svg

我正在查看从Illustrator保存的SVG文件。

我看到这一行

<ellipse transform="matrix(-0.8796 -0.4758 0.4758 -0.8796 674.7629 282.6046)" fill="#FFFFFF" stroke="#000000" stroke-miterlimit="10" cx="373.15" cy="55.9" rx="58.003" ry="55.9"/> 

我正在尝试使用CoreGraphics

绘制它
NSGraphicsContext * currentContext = [NSGraphicsContext currentContext];
CGContextRef      ctx     = (CGContextRef) [currentContext graphicsPort];

CGContextSetStrokeColorWithColor(ctx, [[NSColor blackColor] CGColor]);
CGContextSetLineWidth(ctx, 1.0);

CGRect ellipseRect = CGRectMake(373.15 - 58.003 ,55.9 + 55.9 ,58.003 * 2.0 , 55.9 *2.0);
CGContextMoveToPoint(ctx,ellipseRect.origin.x,self.bounds.size.height -ellipseRect.origin.y);
CGContextAddEllipseInRect(ctx, CGRectMake(ellipseRect.origin.x,self.bounds.size.height -ellipseRect.origin.y,ellipseRect.size.width,ellipseRect.size.height));
CGContextClosePath(ctx);
CGContextStrokePath(ctx);

CGContextDrawPath(ctx,kCGPathStroke);

这绘制了椭圆,但不是它在插图画中绘制的方式,因为我没有应用变换。

现在我正在尝试应用转换。所以我这样做

NSGraphicsContext * currentContext = [NSGraphicsContext currentContext];
CGContextRef      ctx     = (CGContextRef) [currentContext graphicsPort];

CGContextSetStrokeColorWithColor(ctx, [[NSColor blackColor] CGColor]);
CGContextSetLineWidth(ctx, 1.0);

CGRect ellipseRect = CGRectMake(373.15 - 58.003 ,55.9 + 55.9 ,58.003 * 2.0 , 55.9 *2.0);
CGAffineTransform  affineTransform = CGAffineTransformMake(-0.8796, -0.4758, 0.4758, -0.8796, 674.7629, 282.6046);
CGContextSaveGState(ctx);

CGFloat radians = atan2f(affineTransform.b, affineTransform.a);
CGFloat degrees = radians * (180 / M_PI);
CGContextRotateCTM(ctx, degrees);
CGContextTranslateCTM(ctx, 0-affineTransform.tx,0-affineTransform.ty);

CGContextMoveToPoint(ctx,ellipseRect.origin.x,self.bounds.size.height -ellipseRect.origin.y);
CGContextAddEllipseInRect(ctx, CGRectMake(ellipseRect.origin.x,self.bounds.size.height -ellipseRect.origin.y,ellipseRect.size.width,ellipseRect.size.height));

CGContextClosePath(ctx);

CGContextRestoreGState(ctx);

CGContextStrokePath(ctx);
CGContextDrawPath(ctx,kCGPathStroke);

这会旋转椭圆而不是正确的方式我没有真正改变任何人可以解释我如何应用转换矩阵?

我知道有一些SVG Rendering Librarys,但它不适用于我正在做的事情。

1 个答案:

答案 0 :(得分:0)

问题是我已经为windows编程太多年了,并且mac坐标系不同,所以通过添加这行代码就可以了。

CGContextScaleCTM(ctx, 1.0f * scaleX, -1.0f * scaleY);

比例值存在,因此您也可以缩放图形