Pixelisation sur TextField

10:37 modifié dans API AppKit #1
Salut à  tous,

Je suis face à  un véritable problème. Dès lors que j'active le rendu CoreAnim sur un label field, le texte se pixellise !

Le label aura beau être dans une fenêtre toute bête, rien n'y fait...

Ci-joint 2 screenshot

Réponses

  • Philippe49Philippe49 Membre
    10:37 modifié #2
    Dans IB  ou dans l'application ?


    Pour reprsenter du text avec CoreAnimation, tu as CATextLayer
  • AliGatorAliGator Membre, Modérateur
    10:37 modifié #3
    Tu aurais quand même pu détailler un peu les remarques qu'on a levé hier soir, Louka...
    Il est explicitement dit dans la doc Apple (et on le retrouve au gré du net) que lorsque ton texte est rendu dans un backing buffer comme c'est le cas pour CoreAnim, il n'y a pas d'antialiasing ni de rendu sub-pixel. Et qu'apparament il faut activer le dessin du background sur ton Layer pour avoir du rendu subpixel. Qu'as-tu essayé de ce côté ?
  • 10:37 modifié #4
    dans 1227782275:

    Tu aurais quand même pu détailler un peu les remarques qu'on a levé hier soir, Louka...
    Il est explicitement dit dans la doc Apple (et on le retrouve au gré du net) que lorsque ton texte est rendu dans un backing buffer comme c'est le cas pour CoreAnim, il n'y a pas d'antialiasing ni de rendu sub-pixel. Et qu'apparament il faut activer le dessin du background sur ton Layer pour avoir du rendu subpixel. Qu'as-tu essayé de ce côté ?


    Et si mon background c'est un dégradé ?
    Nan sérieusement, cette méthode me parait bizarre quand même.. Et puis j'ai tenté plein de trucs de ce genre, en vain.

    Dsl pour ne pas avoir précisé, j'étais bien crevé :D

    Donc en fait moi je passe par IB, je cherche pas plus loin j'ai toujours trouvé ça pratique mais là  je suis dans un cas où la pixelisation me gêne énormément. Autant sur du gros texte c'est pas gênant, mais sur du 11pts ça devient super crade.

    Donc pour répondre à  ta question Philippe, je n'ai créé aucun CATextLayer, rien côté code. J'ai simplement activé le rendu CA sur mon textField dans Interface Builder car je voulais lui mettre l'ombre. Ombre que j'ai très vite retiré en voyant l'effet produit sur du 11pts ...


    Déjà  si je peux corriger ça lorsque ça apparait tout bêtement dans une simple Window avec l'activation du rendu CA depuis l'inspecteur IB, ça serait bien.
    Quitte à  faire une sous-classe, je m'en fiche, ça fera une sous classe générale. Mais je veux pas devoir dessiner le texte alors qu'on peut passer bêtement par IB.

    Merci de vos réponses  ;)

  • Philippe49Philippe49 Membre
    novembre 2008 modifié #5
    Je n'avais pas rencontré ce problème avec un CATextLayer (lien). mais bon je ne suis pas allé très loin.
    Si une sous-classe a été faite pour représenter du texte, il y a surement une bonne raison, et tu as peut-être mis le doigt dessus ...

  • AliGatorAliGator Membre, Modérateur
    10:37 modifié #6
    ben justement :
    1) Tu ne peux pas le faire directement dans IB
    2) Essaye d'abord comme c'est conseillé un peu partout, avec un fond uni genre blanc et avec drawBackground retournant YES (nécessite du sous-classage) avant de voir avec ton dégradé. Comme avec un fond (peut-être rajouter isOpaque à  YES) au moment du rendu il n'y a plus de composition avec couche alpha à  effectuer, on peut s'autoriser à  faire de l'antialiasing et à  traiter le texte au niveau subpixel. De toute façon vu ce qui est dit dans le Doc et vu aussi ce qu'on trouve comme réponses sur le net, ça vaut le coup d'essayer en sous-classant et imposant un fond !
    3) Je ne suis pas sûr que CATextLayer résolve le problème :
    Note: CATextLayer disabled sub-pixel antialiasing when rendering text. Text can only be drawn using sub-pixel antialiasing when it is composited into an existing opaque background at the same time that it's rasterized. There is no way to draw subpixel-antialiased text by itself, whether into an image or a layer, separately in advance of having the background pixels to weave the text pixels into. Setting the opacity property of the layer to YES does not change the rendering mode.

    4) Essaye aussi d'arrondir les coordonnées de la position de ton CALayer pour avoir moins de risque de tomber sur des subpixels au moment du rendu, quoique de toute façon si ta taille de fonte est trop petit ça sera inévitable...
  • 10:37 modifié #7
    Heu finalement j'ai résolu le problème... comme le texte devait de toute façon changer de couleur en fonction de son arrière plan, j'ai simplement programmé un attributedString pour mon textField.


Connectez-vous ou Inscrivez-vous pour répondre.