CGContextClip()使用反向路径

时间:2012-05-17 14:53:22

标签: macos cocoa quartz-graphics macos-carbon

我希望在我的CGContext上剪切绘图,但我需要它反过来,即我想使用CGContextAddRect()在我的剪切路径中添加几个矩形,剪切应该在我添加到剪切路径的所有矩形的方式不受任何绘图操作的影响。通常,它只是反过来,即绘图函数绘制到已添加到剪切路径的矩形,并使未添加到剪切路径的区域不受影响。所以我想我需要的只是一种在调用CGContextClip()之前反转剪切路径的方法。回到QuickDraw时代,可以通过使用区域轻松完成,然后为每个矩形调用XorRgn()。但是使用Quartz似乎更复杂。有没有人有一个简单的解决方案来实现这一点,还是我需要自己做所有这些路径反转计算?

2 个答案:

答案 0 :(得分:7)

您可以将整个边界添加为矩形,然后添加要从绘图中排除的矩形,并使用CGContextEOClip

示例:

- (void)drawRect:(NSRect)dirtyRect
    CGContextRef ctx = [[NSGraphicsContext currentContext] graphicsPort];
    //Fill the background with gray:
    CGContextSetRGBFillColor(ctx, 0.5, 0.5, 0.5, 1);
    CGContextFillRect(ctx, NSRectToCGRect(self.bounds));
    CGContextAddRect(ctx, NSRectToCGRect(self.bounds));
    //Add some rectangles:
    CGContextAddRect(ctx, CGRectMake(10, 10, 100, 100));
    CGContextAddRect(ctx, CGRectMake(120, 120, 50, 100));
    //Clip:
    CGContextEOClip(ctx);
    //Fill the entire bounds with red:
    CGContextSetRGBFillColor(ctx, 1.0, 0.0, 0.0, 1.0);
    CGContextFillRect(ctx, NSRectToCGRect(self.bounds));
}

如果在最后绘制图像而不是填充红色矩形,效果会更明显。

答案 1 :(得分:2)

一种方法是将剪切路径绘制到位图上下文,反转生成的位图,并通过调用CGContextClipToMask()将其用作原始图像上的蒙版。