Une ligne avec gradient de couleur
Chacha
Membre
Salut,
J'aimerais dessiner une ligne brisée (des segments qui se suivent), mais de telle sorte que la couleur de chaque segment soit différente. ça ne paraà®t pas bien difficile : plutôt que de créer un seul NSBezierPath, on en crée un par segment et basta.
Mais ça ne va pas ! En effet, j'ai des contraintes supplémentaires : en fait mes lignes sont épaisses, et c'est le niveau de transparence de chaque segment qui change; du coup, les sommets étant dessinés deux fois plus que les segments, ils apparaissent comme de gros ronds moches.
Alors si au lieu de faire une NSQuickDrawView je faisais une NSOpenGLView ? Ben oui, avec OpenGL, on peut facilement faire un glColor() pour chaque Vertex, et la transition en douceur est assurée...
Sauf que le problème, c'est que moi je voudrais dessiner par dessus une image, ou au moins que ma ligne brisée soit un masque que je puisse poser sur autre chose, donc dont le fond doit être transparent...
Tout serait plus simple si les NSBezierPath pouvaient, comme en OpenGL, permettre de changer les propriétés à chaque sommet. Mais je crois que non.
Quelle approche auriez-vous du problème ?
+
Chacha
[Fichier joint supprimé par l'administrateur]
J'aimerais dessiner une ligne brisée (des segments qui se suivent), mais de telle sorte que la couleur de chaque segment soit différente. ça ne paraà®t pas bien difficile : plutôt que de créer un seul NSBezierPath, on en crée un par segment et basta.
Mais ça ne va pas ! En effet, j'ai des contraintes supplémentaires : en fait mes lignes sont épaisses, et c'est le niveau de transparence de chaque segment qui change; du coup, les sommets étant dessinés deux fois plus que les segments, ils apparaissent comme de gros ronds moches.
Alors si au lieu de faire une NSQuickDrawView je faisais une NSOpenGLView ? Ben oui, avec OpenGL, on peut facilement faire un glColor() pour chaque Vertex, et la transition en douceur est assurée...
Sauf que le problème, c'est que moi je voudrais dessiner par dessus une image, ou au moins que ma ligne brisée soit un masque que je puisse poser sur autre chose, donc dont le fond doit être transparent...
Tout serait plus simple si les NSBezierPath pouvaient, comme en OpenGL, permettre de changer les propriétés à chaque sommet. Mais je crois que non.
Quelle approche auriez-vous du problème ?
+
Chacha
[Fichier joint supprimé par l'administrateur]
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Oui, ainsi que setDefaultLineCapStyle, mais ces deux paramètres servent à modifier l'apparence des jonctions du point de vue angulaire, pas du point de vue fusionnel (c'est pas très clair, dis comme ça, non ?)
Si la courbe ne doit pas être au final de forme quelconque (que ce soit droite ou courbe), une solution serait en fait de tracer dans une image (en noir uniquement), puis on se sert de cette image comme masque pour une autre image qui elle contient les dégradés requis. ça peut aller?
Si si, la forme est complètement quelconque...
A partir de
GLubyte *dataBytes;
Voici un exemple de code qui va te copier le bitmap d'une image .bmp dans dataBytes:
- (BOOL) loadBitmap:(NSString *)filename
{
BOOL success = FALSE;
NSBitmapImageRep *theImage;
int bitsPPixel, bytesPRow;
unsigned char *theImageData;
int rowNum, destRowNum;
theImage = [ NSBitmapImageRep imageRepWithContentsOfFile:filename ];
if( theImage != nil )
{
bitsPPixel = [ theImage bitsPerPixel ];
bytesPRow = [ theImage bytesPerRow ];
if( bitsPPixel == 24 ) // No alpha channel
dataFormat = GL_RGB;
else if( bitsPPixel == 32 ) // There is an alpha channel
dataFormat = GL_RGBA;
imageWidth = [ theImage pixelsWide ];
imageHeight = [ theImage pixelsHigh ];
free(dataBytes);
dataBytes = calloc( bytesPRow * imageHeight, 1 );
if( dataBytes != NULL )
{
success = TRUE;
theImageData = [ theImage bitmapData ];
//dataBytes = theImageData;
//Sans le traitement qui suit, l'image est renversée haut/bas
destRowNum = 0;
for( rowNum = imageHeight - 1; rowNum >= 0; rowNum--, destRowNum++ )
{
// Copy the entire row in one shot
memcpy( dataBytes + ( destRowNum * bytesPRow ),
theImageData + ( rowNum * bytesPRow ),
bytesPRow );
}
}
}
return success;
}
Ensuite il n'y a plus qu'à introduire dans le drawRect du NSView:
glDrawPixels(imageWidth, imageHeight, dataFormat, GL_UNSIGNED_BYTE, dataBytes);
Puis le code openGL pour dessiner ta courbe.
C'est comme ça que j'essairai de faire.
C'est une possibilité, mais en fait, le fond n'est pas une image fixe. En fait, j'aimerais pouvoir dessiner par dessus une vidéo ! C'est d'ailleurs pour ça que j'aimerais rester en Cocoa, sans trop faire d'OpenGl, ça devrait être plus simple pour l'interfaçage avec la video. Mon but est de créer un masque qui sera appliqué sur la vidéo en temps réel. Le problème étant en partie le fond transparent du masque, d'ailleurs.
Quand Tiger sera là , je regarderai CoreVideo, mais mon problème reste de créer ce fameux masque pour le moment.