Dégradé polaire dans Cairo

    No Comments

     

    Un article rapide sur une solution (simple) implémentée pour répondre à un (petit) problème que j’ai rencontré en contribuant sur un projet open-source absolument fabuleux : Darktable

    Si vous aimez la photo et que vous ne connaissez pas ce logiciel, allez vite y faire un tour, vous ne serez pas déçu ! C’est un peu comme “Adobe LightRoom”, mais gratuit, open-source, et avec encore plus de fonctionnalités !

     

    Cairo, programmer un dessin

     

    Cairo est une librairie bien connue de tous les adeptes de Linux. Elle offre des primitives de programmation permettant de créer des dessins à partir de formes de base (ligne, carré, ellipse, etc…). Ces dessins pourront être exportés sous forme de fichier, ou utilisés dans un programme pour décorer des boutons par exemple.

     

    C’est précisément le cas d’utilisation que j’ai eu, je voulais dessiner avec Cairo quelque chose qui ressemble à l’image ci-après afin de décorer un bouton que j’ajoutais dans Darktable.

     

    image

    Mes compétences dans GIMP sont ébouriffantes non ?

     

    Problème : les dégradés existent bien dans Cairo, mais ils sont soit linéaires (d’un bord à l’autre d’une forme), soit radiaux (du centre vers l’extrémité d’une forme). J’ai donc du improviser une petite solution “maison”.

     

    Un dégradé c’est pas si compliqué

     

    Quand on y réfléchit, un dégradé c’est quoi ?

     

    Un changement progressif de la couleur en suivant une direction. 👏🏼

     

    Donc si je décompose mon arc de cercle en petits morceaux…

     

    En modifiant la couleur petit à petit à chaque arc…

     

    Et que je réassemble le tout à la fin…

     

     

    Bon, pas de quoi se prendre pour Neo dans la matrice non plus hein…

     

    Code

     

    Je mets à disposition ici le code que j’ai écrit pour résoudre ce petit problème (en attendant que j’installe un plugin wordpress de visualisation de code).

    Bout de code qui m’a permis de réaliser les boutons encadrés en rouge dans l’interface de Darktable.

     

     

    Vu que je suis sympa j’ai même documenté…

     

    Amélioration réalisable à peu de frais, le faire pour de la couleur !

     

    Pour les flemmards, le code est aussi dispo ci-après 😉

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    void cairo_gradient_arc(cairo_t *cr, double lw, int nb_steps, double x_center, double y_center, double radius,
    double angle_from, double angle_to, double color_from, double color_to)
    {
    cairo_set_line_width(cr, lw);

    double *portions = malloc((1 + nb_steps) * sizeof(double));

    // note: cairo angles seems to be shifted by M_PI relatively to the unit circle
    angle_from = angle_from + M_PI;
    angle_to = angle_to + M_PI;
    double step = (angle_to - angle_from) / nb_steps;
    for(int i = 0; i < nb_steps; i++) portions[i] = angle_from + i * step;
    portions[nb_steps] = angle_to;

    for(int i = 0; i < nb_steps; i++)
    {
    double color = color_from + i * (color_to - color_from) / nb_steps;
    cairo_set_source_rgb(cr, color, color, color);
    cairo_arc(cr, x_center, y_center, radius, portions[i], portions[i + 1]);
    cairo_stroke(cr);
    }
    free(portions);
    }
    Categories: Programmation Tags: Étiquettes : , , ,