Aller au contenu

Java2D

Un article de Wikipédia, l'encyclopédie libre.

Java2D est une bibliothĂšque graphique de bas niveau pour Java, faisant partie Ă  la fois de JFC et de Java Media. Cette bibliothĂšque est le fruit d’une collaboration entre Sun Microsystems et Adobe Systems pour pallier les manques et dĂ©ficiences de l'AWT. Tant la pile d’exĂ©cution de Java2D que ses commandes offrent d’ailleurs une grande similaritĂ© avec le langage de rendu PostScript.

Java2D permet de tracer toutes sortes de figures gĂ©omĂ©triques en 2 dimensions. En effet chaque opĂ©ration Java2D peut se rĂ©sumer en un remplissage d'une forme avec une peinture suivi de sa composition sur l’écran (voir le chapitre Destination).

Concepts de base

[modifier | modifier le code]

Ces objets sont les composants de base de presque toutes les opérations Java2D.

Formes (Shape)

[modifier | modifier le code]

Une forme en Java2D peut ĂȘtre interprĂ©tĂ©e comme Ă©tant une frontiĂšre infiniment fine dĂ©finissant un dehors et un dedans. Les pixels dans la forme sont affectĂ©s par les opĂ©rations de rendu alors que ceux situĂ©s Ă  l'extĂ©rieur ne le sont pas.

Remplir un segment infiniment fin donnerait un rĂ©sultat oĂč aucun pixel n'est modifiĂ© Ă©tant donnĂ© que l'on peut considĂ©rer qu'une telle forme ne contient aucun pixel. De ce fait, un rectangle de faible Ă©paisseur doit ĂȘtre utilisĂ© pour que la forme puisse contenir des pixels.

Peinture (Paint)

[modifier | modifier le code]

Une peinture gĂ©nĂšre les couleurs qui doivent ĂȘtre utilisĂ©es pour chaque pixel lors des opĂ©rations de remplissage (ou fill). La peinture la plus simple est dĂ©finie par la classe java.awt.Color, qui gĂ©nĂšre la mĂȘme couleur pour tous les pixels. Des peintures plus complexes peuvent produire des gradients, des images ou n'importe quelle autre combinaison de couleurs. Remplir une forme circulaire en utilisant la couleur opaque jaune produira un cercle opaque jaune ; tandis que le fait de remplir cette mĂȘme forme avec peinture gĂ©nĂ©rant une image produira un dĂ©coupage circulaire de cette mĂȘme image.

Compositions (Composites)

[modifier | modifier le code]

Pour chaque opĂ©ration de dessin, on peut identifier une source (les pixels qui sont produits par la peinture) et une destination (les pixels dĂ©jĂ  prĂ©sents sur l’écran). En temps normal les pixels sources recouvrent tout simplement les pixels destination ; cependant certaines composites permettent de changer ce comportement.

Une composite, Ă©tant donnĂ© les pixels sources et destination, produit un rĂ©sultat qui sera contenu sur l’écran. La composite la plus couramment utilisĂ©e est dĂ©finie par la classe java.awt.AlphaComposite, qui permet de traiter le dessin de pixels partiellement transparents, ce qui permet de voir les pixels de la destination plus ou moins Ă  travers les pixels sources. Cette composite implĂ©mente les rĂšgles de Porter et Duff.

Remplissage (Filling)

[modifier | modifier le code]

Pour remplir une forme, la premiĂšre Ă©tape est d'identifier quels pixels sont Ă  l'intĂ©rieur de cette forme. Ces pixels seront ceux affectĂ©s par l'opĂ©ration de remplissage. Les pixels qui sont partiellement Ă  l’extĂ©rieur ou partiellement Ă  l’intĂ©rieur seront Ă©galement affectĂ©s selon que l’anticrĂ©nelage est activĂ© ou pas.

La peinture doit alors gĂ©nĂ©rer la couleur de chacun des pixels devant ĂȘtre peints. Dans le cas courant de l’utilisation d’une couleur opaque, chaque pixel sera mis Ă  la mĂȘme couleur.

La composition prend alors les pixels gĂ©nĂ©rĂ©s par la peinture et les combine avec ceux dĂ©jĂ  prĂ©sents sur l’écran pour crĂ©er le rĂ©sultat final.

Objets avancés

[modifier | modifier le code]

Ces objets ainsi que leur comportement peuvent ĂȘtre dĂ©composĂ©s en objets simples comme ceux dĂ©crits dans le paragraphe prĂ©cĂ©dents.

Transformations (Transform)

[modifier | modifier le code]

Chaque opĂ©ration Java2D peut ĂȘtre l’objet d’une transformation, faisant que les formes peuvent ĂȘtre translatĂ©es, tournĂ©es, inclinĂ©es voir agrandies ou rĂ©trĂ©cies au moment de leur rendu. La transformation la plus courante est la transformation identitaire ou identitĂ© qui ne fait rien.

Effectuer un remplissage avec une transformation peut ĂȘtre simplement vu comme la crĂ©ation d’une nouvelle forme transformĂ©e et le remplissage de cette mĂȘme forme.

Tracé (Stroke)

[modifier | modifier le code]

En plus des opĂ©rations de remplissage, Java2D permet de faire des opĂ©rations de tracĂ©. Alors que le remplissage dessine l’intĂ©rieur d’une forme, le tracĂ© en dessine le contour. Ce contour peut simplement apparaitre comme une ligne fine voire sous des formes plus complexes telles qu’une succession de tirets de bouts arrondis.

L’objet responsable de la crĂ©ation de la bordure est un trait ou Stroke. À partir d'une forme source donnĂ©e, le trait produira une nouvelle forme reprĂ©sentant le contour de la premiĂšre. Par exemple une ligne infiniment fine peut donner comme contour un rectangle d’une Ă©paisseur de un pixel.

Un tracĂ© peut donc ĂȘtre dĂ©crit comme la crĂ©ation d’une nouvelle forme suivie de son remplissage.

Techniquement parlant, la seule chose dont on requiert d’un tracĂ©, c’est d’accepter une forme en entrĂ©e et d’en produire une autre en retour. L’implĂ©mentation d’un trait fournie avec Java2D (java.awt.BasicStroke) suit la rĂšgle prĂ©cĂ©demment dĂ©crite ; cependant un trait personnalisĂ© pourrait, en thĂ©orie, produire n’importe quel type de forme suivant les besoins.

Optimisations

[modifier | modifier le code]

Conceptuellement, dessiner un segment noir en Java2D reviendrai Ă  crĂ©er un segment, le transformer suivant la transformation courante, gĂ©nĂ©rer son tracĂ© ce qui a pour effet de crĂ©er un rectangle de fine Ă©paisseur, identifier sur cette forme les pixels affectĂ©s par le remplissage puis les gĂ©nĂ©rer avec la couleur java.awt.Color.BLACK et enfin composer le rĂ©sultat sur l’écran.

Cependant effectuer toute cette sĂ©quence d'Ă©tapes pour chaque opĂ©ration de dessin est totalement inefficace. Java2D se permet donc d’optimiser certaines opĂ©rations basiques de dessin de maniĂšre Ă  sauter ou Ă©viter certaines Ă©tapes. Si le dessin utilise une couleur opaque, il n’est pas alors nĂ©cessaire de crĂ©er une liste complĂšte des couleurs Ă  produire. De mĂȘme si une composite sans support de la transparence est utilisĂ©e, demander le calcul du rĂ©sultat de cette composition est futile et serait une dĂ©pense inutile de temps processeur.

Java 2D fait donc dans tous les cas la somme minimale de travail nécessaire pour aboutir à un résultat similaire à un traitement complet.

Destination

[modifier | modifier le code]

Pour simplifier l’exposĂ©, cet article a prĂ©sumĂ© que le rendu Ă©tait destinĂ© Ă  ĂȘtre produit sur un Ă©cran. Cependant la surface de rendu finale peut ĂȘtre de toute autre nature comme, par exemple, une imprimante, une image en mĂ©moire ou mĂȘme n’importe quel objet qui accepterait des commandes Java2D et les traduirait en commandes pour gĂ©nĂ©rer un format quelconque d'image vectorielle.

Liens externes

[modifier | modifier le code]