Я бы использовал прозрачный композитный слой с kCGBlendModeDestinationOut
(Da * (1 - Sa), Dc * (1 - Sa)
.) Что-то вроде этого:
CGPathRef pathToErase = ...; // The path you want erased
// could also be an image or (nearly) anything else
// that can be drawn in a bitmap context
CGContextSetBlendMode(ctx, kCGBlendModeDestinationOut);
CGContextBeginTransparencyLayer(ctx, NULL);
{
CGContextSetGrayFillColor(ctx, 0.0, 1.0); // solid black
CGContextAddPath(ctx, pathToErase);
CGContextFillPath(ctx);
// the above two lines could instead be CGContextDrawImage()
// or whatever else you're using to clear
}
CGContextEndTransparencyLayer(ctx);
Обратите внимание, что вы также должны сохранить и восстановить gstate (CGContextSaveGState()
/ CGContextRestoreGState()
) до / после слоя прозрачности, чтобы гарантировать, что режим наложения и любые другие изменения gstate не сохраняются.
Примечание: Это компилируется мозгом, и возможно, что слои прозрачности неиграть хорошо со всеми режимами наложения.Если это так, попробуйте нарисовать путь / изображение во втором растровом контексте, а затем нарисовать содержимое этого контекста в вышеуказанном режиме наложения.
Вы также можете поэкспериментировать с другими режимами наложения для получения различных эффектов.