IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Anti-aliasing côte à côte


Sujet :

Android

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2005
    Messages : 168
    Points : 85
    Points
    85
    Par défaut Anti-aliasing côte à côte
    Bonjour,

    assez étrangement je ne trouve rien sur le sujet. Je soupçonne chercher avec de mauvais termes. M'enfin bon, voilà mon problème :

    J'ai un canvas sur lequel je dessine des objets tangents avec l'anti-aliasing activé. Le problème est que lorsque mes formes son blanche et le font est noir, là où les formes rentrent en contact, il y a du gris et non du blanc comme souhaité.

    Ce problème a-t-il un nom ? Quelqu'un connait-il une solution à ce problème ? ... mise à part désactivé l'anti-aliasing. Bien qu'avec les dernières résolutions d'écrans cela pourrait passablement simplifier la chose.

    Merci bien

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Tu pourrais

    1) nous mettre une capture d'écran de ton problème
    2) nous montrer comment tu fais ton affichage.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2005
    Messages : 168
    Points : 85
    Points
    85
    Par défaut
    voilà pour l'image :



    le problème se situe au contact entre l'arc blanc et gris clair. Et pour ce qui est du code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    protected void onDraw(Canvas canvas) {
    	super.onDraw(canvas);
     
    	// ARC GRIS CLAIR
    	fillingPaint.setColor(Color.LTGRAY);
    	canvas.drawArc(rectangles[0], getStartAngle(x), getSweepAngle(y), true, fillingPaint);
    	canvas.drawArc(rectangles[0], getStartAngle(x), getSweepAngle(z), true, fillingPaint);
    	canvas.drawOval(rectangles[2], clearPaint);
     
    	// ARC BLANC
    	fillingPaint.setColor(Color.WHITE);
    	canvas.drawArc(rectangles[2], getStartAngle(X), getSweepAngle(Y), true, fillingPaint);
    	fillingPaint.setColor(getResources().getColor(android.R.color.holo_red_light));
    	canvas.drawArc(rectangles[2], getAngle(Z) - CURSOR_WIDTH, 2 * CURSOR_WIDTH, true, fillingPaint);
    	canvas.drawOval(rectangles[5], clearPaint);
     
    	[...]
    }

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Points : 968
    Points
    968
    Par défaut
    As-tu utilisé la méthode setAntiAlias(boolean) sur tes objets Paint ?

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2005
    Messages : 168
    Points : 85
    Points
    85
    Par défaut
    oui, j'ai les lignes suivant dans mon constructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    PorterDuffXfermode clearMode = new PorterDuffXfermode(Mode.CLEAR);
     
    clearPaint.setAntiAlias(true);
    clearPaint.setXfermode(clearMode);
     
    fillingPaint.setAntiAlias(true);
    fillingPaint.setStyle(Style.FILL);

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Je suppose que ton problème, c'est le gris foncé entre l'arc blanc et l'arc gris clair?

    Si oui, c'est parce que les deux formes ne se collent pas assez. L'idéal serait que la zone blanche déborde sous la zone grise pour éviter ce soucis. Par exemple en attribuant un contour à la forme.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2005
    Messages : 168
    Points : 85
    Points
    85
    Par défaut
    Oui c'est bien entre les deux arcs que le problème se situe. J'avais déjà pensé à se faire chevaucher ces deux surfaces et visiblement c'est la seule solution actuellement. Je vais donc aller dans cette direction bien que cette solution ne me satisfasse pas.

    J'ai quand même du mal à comprendre pourquoi l'antialiasing n'arrive pas à gérer cette situation. M'enfin ...

    Merci pour les réponses

  8. #8
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    facile, l'antialisassing, il vois une courbe à la fois.
    Mettons que pour la courbe 1, l'antialiasing considère qu'elle rempli le pixel X à 30%

    La valeur de X à l'arrivée est donc 30%Col1 + 70% Noir, ce qui est attendu
    Ensuite tu dessine la courbe 2, donc l'aliasing, si elles sont bien collées, considère qu'elle remplis le pixel X à 70%

    La valeur de X à l'arrivée est donc 70%Col2 + 30% (30%Col1 + 70% Noir) =

    70% col2 + 9% Col1 + 21% Noir

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2005
    Messages : 168
    Points : 85
    Points
    85
    Par défaut
    C'est bien ce que je pensais malheureusement. La composition n'est pas calculé comme je le souhaiterais : [Sa + Da, Sc * Sa + Dc * Da] ... qui ne fait pas partie des équations de Porter Duff, sauf erreur de ma part. La solution : étendre Xfermode ... mais comment ? Quelqu'un sait comment étendre cette classe ?

    Pour ce que j'ai compris de mes recherches pour le moment c'est que ça utilise du C++. Ces fichiers en l'occurrence. Par contre je n'ai pas encore trouvé où sont définies les équations de Porter Duff.

    Si des personnes ont des infos à ce sujet, je suis plus que preneur.

  10. #10
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Citation Envoyé par Gébix Voir le message
    Par contre je n'ai pas encore trouvé où sont définies les équations de Porter Duff.
    à priori je dirais dans SkXfermode.cpp
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2005
    Messages : 168
    Points : 85
    Points
    85
    Par défaut
    En effet merci Joël.

    Bon, j'ai regardé les sources java et C++ mais je n'arrive pas à comprendre comment ça fonctionne. Il y a notamment ça :

    Xfermode is the base class for objects that are called to implement custom "transfer-modes" in the drawing pipeline. The static function Create(Modes) can be called to return an instance of any of the predefined subclasses as specified in the Modes enum. When an Xfermode is assigned to an Paint, then objects drawn with that paint have the xfermode applied.
    Je ne comprends pas à quoi réfère la méthode Create(Modes) qui n'est pas présent dans les sous class. À prioris, d'après le texte ci-dessus, il y a moyen d'étendre Xfermode mais c'est loin d'être clair pour moi aux vues du code source. Je ne comprends pas quelles méthodes je dois réécrire notamment et pourquoi les équations de Porter Duff sont dans .SkXfermode.cpp et pas dans SkPorterDuff.cpp ou SkPorterDuffXfermode.cpp qui lui n'existe pas.

    Bref, je suis à court d'idées. Des suggestions ?

  12. #12
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    à mon avis tu t'engages sur une mauvaise voie (pour résoudre ton problème d'antialias).

    Le xfermode est la fonction qui permet de gérer la composition (comme l'alpha ou le xor). Tu peux définir ta propre fonction de composition, en créant ta propre classe, en t'inspirant du code du moteur skia, mais à mon avis ça n'a rien à voir avec l'antialiassage qui doit être fait par le gpu je pense.

    Le problème est que le mode de dessin est du type "bitmap" : à chaque fois qu'on envoie un ordre graphique (comme "remplir un ovale" par exemple), on modifie un raster bitmap (un tableau de bytes en gros). L'antialiasing se fait donc à chaque application, donc lorsque tu dessines ton premier arc, il y'a antialiasing avec le fond et cet arc, puis quand tu dessines un second arc adjacent au premier, l'antialiasing s'applique avec des pixels qui sont déjà traités lors du premier et donc forcément tu as un effet cumulatif. Changer la façon de traiter l'antialiasing ne changera rien (il faudrait qu'on soit capable de traiter globalement le dessin de toutes les formes en un seul coup). C'est bien plus simple de faire du chevauchement.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2005
    Messages : 168
    Points : 85
    Points
    85
    Par défaut
    Changer la façon de traiter l'antialiasing ne changera rien (il faudrait qu'on soit capable de traiter globalement le dessin de toutes les formes en un seul coup)
    Je ne suis pas d'accord sur ce point. En fait, je pensais passer par un bitmap intermédiaire, ce qui rend la créations d'un Xfermode utile étant donné qu'il n'est pas possible de passer par du vectoriel ... enfin je crois, il faut que je vérifie ça demain.

    En partant d'un bitmap transparent, la fonction de transfert [Sa + Da, Sc * Sa + Dc * Da] permet d'obtenir un résultat correct pour les pixels antialiasées. Par contre, sans modification, elle ne gère pas correctement les recouvrements, mais j'en aurais pas dans mon cas.

    Il faut que je cherche encore une fois demain de la doc sur l'extension de Xfermode. Si quelqu'un sais comment faire ou a de la doc je suis preneur car d'après mes recherches de l'autre jour il n'y a pas de tutos traitant du sujet.

Discussions similaires

  1. [DirectX9] Anti-aliasing + gestion caméra
    Par SteelBox dans le forum DirectX
    Réponses: 6
    Dernier message: 21/07/2005, 01h56
  2. Anti aliasing qui ne fonctionne pas
    Par Deus Ex Makina dans le forum OpenGL
    Réponses: 3
    Dernier message: 27/04/2005, 10h57
  3. Filtres Anti-aliasing et TBitmap
    Par Sub0 dans le forum Langage
    Réponses: 24
    Dernier message: 15/04/2005, 22h12
  4. filtre anti-aliasing
    Par MO GV dans le forum MFC
    Réponses: 14
    Dernier message: 04/03/2005, 20h21
  5. Anti-aliasing
    Par Cazman dans le forum OpenGL
    Réponses: 16
    Dernier message: 27/04/2004, 09h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo