2010-10-04 13 views
0

J'écris quelques lignes de code pour se familiariser avec les bases de Quartz 2d. J'essaye de dessiner et d'image puis de l'effacer dans le mode de fusion kCGBlendModeClear. Voici le code de mon code UIView de sous-classe, dont la couleur arrière-plan est à l'orange par IB:kCGBlendModeClear ne s'efface pas, pourquoi?

- (void)drawRect:(CGRect)rect { 

    UIImage *brush = [UIImage imageNamed:@"brush.png"] ; 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 

    CGContextSetBlendMode(ctx,kCGBlendModeNormal); 
    CGContextDrawImage(ctx, CGRectMake(100, 100, 26, 25), [brush CGImage]); 

    CGContextSetBlendMode(ctx, kCGBlendModeClear); 

    CGContextSetFillColorWithColor(ctx, [UIColor clearColor].CGColor); 

    CGContextFillEllipseInRect(ctx, CGRectMake(110, 110, 5, 5)); // HERE! 
} 

lecture de la documentation et this question Je pensais que la ligne marquée ICI produirait un trou dans l'image que j'avais déjà dessiné. Au lieu de cela, il crée un cercle noir (devrait être orange). Pour déboguer, j'ai essayé d'ajouter ma vue personnalisée à une vue orange. Cette fois, ma vue personnalisée a un fond noir. Le trou de la ligne ICI est correct, mais je me demande pourquoi la couleur noire de la vue. Encore plus bizarre, si je fais myView.backgroundColor, je peux définir une couleur d'arrière-plan (cela ne devrait-il pas être annulé par mon implémentation de drawRect?). Il me manque clairement quelques notions de base sur Quartz, quelqu'un peut-il m'aider?

Davide

Répondre

1

Couple de choses. Tout d'abord, les modes de fusion Porter-Duff fonctionnent uniquement dans des contextes basés sur des images bitmap. (à savoir, les contextes créés par CGBitmapContextCreate)

deuxième, kCGBlendModeClear est défini comme R = 0 - il ne vérifie même pas pixels src ou dst. Donc, même s'il n'est pas garanti de fonctionner ici, il semble que cela fonctionne correctement.

(voir CGContext.h pour une meilleure explication que les docs donnent.)

+0

deux subquestion: 1) vous voyez kCGBlendModeClea comme un moyen viable pour mettre en œuvre un outil de caoutchouc? 2) Pourriez-vous m'en dire plus sur R? – nutsmuggler

+1

1) Non. 'R = 0' est assez inutile, vous ne pouvez même pas définir la couleur claire. 2) Les modes de fusion peuvent être exprimés en termes de R, S et D, où S est le pixel source, D est le pixel de destination et R est le pixel résultant. Cela vous donne un raccourci pratique pour décrire les modes de mélange, par exemple, 'R = S + D * (1 - Sa)' pour la source-over ('kCGBlendModeNormal') Il est assez bien expliqué dans les commentaires commençant par CGContext.h: 84 –

+0

Merci! J'avais deviné que ModeCLear n'était pas la réponse, mais c'est sympa d'avoir une confirmation. – nutsmuggler

1

Pour kCGBlendModeClear travailler la vue ne doit pas être opaque et ne doit pas avoir un jeu de couleurs d'arrière-plan.

En outre, la ligne suivante est inutile, car kCGBlendModeClear ne se soucie pas de la couleur de remplissage:

CGContextSetFillColorWithColor(ctx, [UIColor clearColor].CGColor);