Une ligne avec gradient de couleur

ChachaChacha Membre
avril 2005 modifié dans API AppKit #1
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]

Réponses

  • 20:48 modifié #2
    Bête question, tu as essayé de jouer avec +setDefaultLineJoinStyle: ?
  • ChachaChacha Membre
    20:48 modifié #3
    dans 1114459270:

    Bête question, tu as essayé de jouer avec +setDefaultLineJoinStyle: ?

    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 ?)
  • fouffouf Membre
    20:48 modifié #4
    Je pense que la meilleure chose que tu aies à  faire, c'est de zyeuter le code de SeaShore (seashore.sourceforge.net) et en particulier dans l'outil pinceau. En effet, il ya une option qui permet de faire un dégradé comme tu veux. Par contre, je te souhaite bonne chance. :o
  • 20:48 modifié #5

    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?
  • ChachaChacha Membre
    20:48 modifié #6
    dans 1114471347:


    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...
  • WIMPWIMP Membre
    20:48 modifié #7
    Tu pourrais charger une image sous openGL, puis dessiner par dessus en openGL:
    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.
  • ChachaChacha Membre
    20:48 modifié #8
    dans 1114518427:

    Tu pourrais charger une image sous openGL, puis dessiner par dessus en openGL:

    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.
Connectez-vous ou Inscrivez-vous pour répondre.