Vous n'avez pas besoin de dessiner pixel par pixel. Vous pouvez utiliser des dégradés radiaux:
CGPoint points[count];
/* set the points */
CGContextSaveGState(context);
CGContextBeginTransparencyLayer(context, NULL);
CGContextSetAlpha(context, 0.5);
CGContextSetBlendMode(context, kCGBlendModeXOR);
CGContextClipToRect(context, myFrame);
CGFloat radius = myFrame.size.height+myFrame.size.width;
CGColorSpaceRef colorSpace;
CFArrayRef colors;
const CGFloat * locations;
/* create the colors for the gradient */
for(NSUInteger i = 0;i<count;i++){
CGGradientRef gradient = CGGradientCreateWithColors(CGColorSpaceCreateDeviceGray(), colors, locations);
CGContextDrawRadialGradient(context, gradient, points[i], 0.0, points[i], radius, 0);
}
CGContextSetAlpha(context, 1.0);
CGContextEndTransparencyLayer(context);
CGContextRestoreGState(context);
La plupart du code est clair, mais voici quelques points:
kCGBlendMode
ajoute essentiellement la valeur de premier plan et si back- les deux ont la même alpha et alpha n'est pas 1.0. Vous pourriez également être en mesure d'utiliser kCGBlendModeColorBurn
sans avoir besoin de jouer avec la transparence. Vérifiez la référence.
radius
est assez grand pour couvrir toute la trame. Vous pouvez définir une valeur différente. Notez que les valeurs locations
doivent être comprises entre 0,0 et 1,0. Vous devez calibrer vos valeurs de couleur en fonction du radius
.