4 septembre 2001

Appendice F : Les obligations d'une implémentation


Contenu

Cet appendice est normatif.

F.1 Introduction

Ce qui suit sont des remarques sur les obligations d'implémentation correspondant aux diverses fonctionnalités du langage SVG.


F.2 Le traitement des erreurs

Il existe divers scénarios selon lesquels un fragment de document SVG se trouve techniquement en erreur :

Un document peut basculer d'un état en erreur vers un état de non-erreur au cours du temps. Par exemple, des modifications du document, à partir du DOM de SVG ou d'une animation, peuvent entraîner la mise en erreur comme, plus tard, entraîner la sortie de l'état d'erreur du document.

Le traitement suivant interviendra quand un document sera dans un état d'erreur :

À cause de situations selon lesquelles les modifications par un bloc de script sont susceptibles de provoquer l'entrée ou la sortie d'erreur d'un fragment de document SVG donné, le traitement de l'erreur n'interviendra qu'au moment où la présentation du document (par exemple, le rendu sur l'appareil d'affichage) est rafraîchie. En particulier, le traitement de l'erreur sera désactivé toutes les fois où le rafraîchissement aura été suspendu via des appels DOM à la méthode suspendRedraw().

F.3 Le contrôle de version

L'agent utilisateur doit vérifier la référence vers l'identifiant PUBLIC dans la déclaration du <!DOCTYPE> ou la référence de l'espace de nommage dans l'attribut xmlns sur l'élément 'svg', pour s'assurer que le document donné (ou le fragment de document) identifie une version du langage SVG que l'agent utilisateur SVG reconnaît. Si l'information de version est manquante ou si celle-ci désigne une version du langage SVG que l'agent utilisateur ne gère pas, alors l'agent utilisateur n'est pas obligé de rendre ce document ou fragment. Notamment, il n'est pas requis que l'agent utilisateur essaye de rendre les versions ultérieures du langage SVG. Si l'environnement de l'utilisateur offre une telle option, l'agent utilisateur devrait signaler, sinon faire remarquer, à l'utilisateur que la version du fichier n'est pas reconnue et suggérer une autre option de traitement (par exemple, l'installation d'une version mise à jour de l'agent utilisateur), si une telle option existe.

Un agent utilisateur SVG qui reconnaît la recommandation SVG devrait signaler, sinon faire remarquer, à l'utilisateur toutes les fois où il rencontre un document SVG (ou fragment de document) dont la déclaration de <!DOCTYPE>, ou l'attribut xmlns relatif, correspond à une version de travail de la spécification SVG. Tous les contenus basés sur des brouillons de cette spécification devraient être mis à jour vers la recommandation SVG.


F.4 Le rattachement de valeurs à une plage de valeurs restreinte

Certaines valeurs numériques d'attribut ou de propriété sont restreintes entre des limites, comme les valeurs de composante de couleur. Quand des valeurs hors-limite sont fournies, l'agent utilisateur devra différer toute vérification d'erreur après l'instant de présentation, étant donné que les actions composées peuvent produire des valeurs intermédiaires hors-limite alors que les valeurs finales sont dans ces limites.

Les valeurs de couleur n'entraîne pas d'erreur quand elles sont hors-limite, même si les calculs finaux produisent des valeurs de couleur qui le soient à l'instant de présentation. On recommande que les agents utilisateurs ramènent les valeurs de couleur à la valeur de couleur la plus proche (éventuellement par simple rognage) que le système peut traiter, aussi tard que possible (par exemple, à l'instant de présentation), bien qu'il soit acceptable que les agents utilisateurs ramènent ces valeus de couleur dès l'interprétation. Ainsi, les limites de l'implémentation peuvent empêcher un comportement cohérent entre différents systèmes quand on utilise des valeurs de couleur hors-limite.

Les valeurs d'opacité hors-limite n'entraîne pas d'erreur et elles devraient être ramenées dans une plage de 0 à 1 au moment de leur traitement (par exemple, à l'instant de présentation ou quand cela est nécessaire pour effectuer des calculs intermédiaires d'effets de filtre).

F.5 Remarques sur l'implémentation de l'élément 'path'

Un agent utilisateur SVG conforme doit implémenter le rendu d'un tracé comme suit :


F.6 Remarques sur l'implémentation des arcs elliptiques


F.6.1 La syntaxe de l'arc elliptique

Un arc elliptique est une commande de tracé particulière. Comme telle, il est décrit par les paramètres suivants, dans l'ordre :

Les valeurs (x1, y1) sont les coordonnées absolues du point courant sur le tracé, obtenus à partir des deux derniers paramètres de la commande de tracé précédente.

Les valeurs rX et rY sont les rayons de l'ellipse (appelés également demi-petit-axe et demi-grand-axe).

La valeur lettre psiest l'angle entre l'axe-x du système de coordonnées courant et l'axe-x de l'ellipse.

La valeur fA est le drapeau d'arc large, qui est de 0 si on choisit une ouverture de l'arc inférieure ou égale à 180 degrés ou de 1 si on choisit une ouverture de l'arc supérieure à 180 degrés.

La valeur fS est le drapeau de balayage, qui est de 0 si la ligne joignant le centre à l'arc décrit un angle de balayage décroissant ou de 1 si elle décrit un angle de balayage croissant.

Les valeurs (x2, y2) sont les coordonnées absolues du point final de l'arc.

On se référera à cette paramétrisation d'arc elliptique comme à une paramétrisation de point final. Un des avantages de la paramétrisation de point final est qu'elle permet une syntaxe de tracé cohérente dans laquelle toutes les commandes de tracés aboutissent aux coordonnées du nouveau « point courant ». Les remarques suivantes donnent les règles et les formules destinées à aider les implémenteurs pour une paramétrisation de point final.


F.6.2 Les paramètres hors-limite

Des valeurs numériques arbitraires sont permises pour tous les paramètres d'un arc elliptique, mais quand ces valeurs sont invalides ou hors-limite, l'implémentation doit les interpréter comme suit :

Si les points finaux (x1, y1) et (x2, y2) sont identiques, alors ceci revient à omettre entièrement le segment d'arc elliptique.

Si rX = 0 ou rY = 0 alors cet arc est traité comme un segment de droite (une commande "lineto") entre les points finaux.

Si rX ou rY ont des signes négatifs, on n'en tient pas compte ; leur valeur absolue est utilisée à la place.

Si rX, rY et lettre psi sont tels qu'il n'y ait aucune solution (en gros, l'ellipse n'est pas assez grande pour aller de (x1, y1) à (x2, y2)), alors l'ellipse est agrandie proportionnellement jusqu'à ce qu'il y ait exactement une solution (jusqu'à ce qu'elle soit juste assez grande).

On prend lettre psi égale à mod 360 degrés.

Toute valeur non nulle pour les drapeaux fA ou fS est considérée être 1.

Ce traitement indulgent, cependant cohérent, des valeurs hors-limite assure que :


F.6.3 Les paramétrisations alternatives

On peut décrire un point arbitraire (x, y) sur l'arc elliptique par l'équation de matrice bi-dimensionnelle :

équation F.6.3.1 (F.6.3.1)

(cX, cY) étant les coordonnées du centre de l'ellipse.

rX et rY étant les rayons de l'ellipse (appelés également demi-petit-axe et demi-grand-axe).

lettre psiest l'angle à partir de l'axe-x du système de coordonnées courant vers l'axe-x de l'ellipse.

lettre theta s'étend de :

     theta1 qui est l'angle de départ de l'arc elliptique, avant les opérations d'étirement et de rotation.

     theta2 qui est l'angle d'arrivée de l'arc elliptique, avant les opération d'étirement et de rotation.

     delta-theta qui est la différence entre ces deux angles.

Si on assimile une ellipse à un cercle qui a été étiré puis tourné, alors :

     theta1 , theta1 et delta-theta

sont, respectivement, l'angle de départ, l'angle de fin et l'angle de balayage de l'arc avant les opérations d'étirement et de rotation. Ceci conduit à une paramétrisation alternative, commune dans les API graphiques, à laquelle on se référera comme à une paramétrisation de centre. Dans les sections suivantes, on donne les formules de corrélation dans les deux sens, entre paramétrisation de centre et paramétrisation de point final.


F.6.4 Conversion entre la paramétrisation de centre vers celle de point final

Soit :

       cx   cy   rx   rx   psi   theta1   delta-theta  

il s'agit de trouver :
 
      x1   y1   x2   y2   fa   fs  

Voici les formules :

Équation F.6.4.1 (F.6.4.1)
Équation F.6.4.2 (F.6.4.2)
Équation F.6.4.3 (F.6.4.3)
Équation F.6.4.4 (F.6.4.4)

F.6.5 Conversion entre la paramétrisation de point final vers celle de centre

Soit :

       x1   y1   x2   y2   fa   fs  

il s'agit de trouver :
 
      cx   cy   rx   rx   psi   theta1   delta-theta  

Les équations se simplifient quand on effectue une translation qui place l'origine au milieu de la droite joignant (x1, y1) à (x2, y2), suivie d'une rotation qui aligne les axes de coordonnées sur les axes de l'ellipse. Toutes les coordonnées transformées seront écrites avec des premiers. Elles sont calculées comme valeurs intermédiaires au cours du cheminement pour trouver les variables de paramétrisation de centre requises. Cette procédure consiste des étapes suivantes :

Étape 1 : Calculer (x1', y1') en fonction de la formule

Équation F.6.5.1 (F.6.5.1)

Étape 2 : Calculer (cX ', cY ') en fonction de la formule

Équation F.6.5.2 (F.6.5.2)


dans laquelle on choisit le signe « +, » si fa   non égal   fs  

ou le signe « - », si fa   égal   fs  



Étape 3 : Calculer (cX, cY) à partir de (cX ', cY ')

Équation F.6.5.3 (F.6.5.3)


Étape 4 : Calculer

theta1 et delta-theta

En général, l'angle entre les deux vecteurs (uX, uY) et (vX, vY) peut se calculer par :

Équation F.6.5.4 (F.6.5.4)

dans laquelle, le signe « ± » apparaissant ici est celui de uX vY - uY vX



On peut utiliser cette fonction angulaire pour exprimer

theta1 et delta-theta   comme ceci:
Équation F.6.5.5 (F.6.5.5)
Équation F.6.5.6 (F.6.5.6)


dans laquelle theta1 est fixe dans la plage -360° < delta-theta < 360° tel que :
     if fségal 0, then delta-theta < 0,
     else if fségal 1, then delta-theta > 0.
En d'autres termes, si fS = 0 et le côté droit de (F.6.5.6) est > 0, alors soustraire 360°, alors que si fS = 1 et le côté droit de (F.6.5.6) est < 0, alors ajouter 360°.  Dans tous les autres cas laisser comme c'est.

F.6.6 La correction des rayons hors-limite

Cette section formalise les ajustements des rayons rX et rY hors-limite, mentionnés dans F.6.2. L'algorithmique pour ces ajustements consiste des étapes suivantes :

Étape 1 : S'assurer que les rayons ne soient pas nuls

Si rX = 0 ou rY = 0, alors traiter ceci comme une droite entre (x1, y1) de (x2, y2) et s'arrêter.  Otherwise,

Étape 2 : S'assurer que les rayons soient positifs

Prendre la valeur absolue de rX et de rY :

Équation F.6.6.1 (F.6.6.1)

Étape 3 : S'assurer que les rayons soient suffisamment grands

En utilisant les valeurs de coordonnées primaires de l'équation (F.6.5.1), calculer

Équation F.6.6.2 (F.6.6.2)

Si le résultat de l'équation ci-dessus est inférieur ou égal à 1, alors aucun changement plus avant n'est nécessaire pour rX et rY.  Si le résultat de l'équation est supérieur à 1, alors effectuer les remplacements

Équation F.6.6.3 (F.6.6.3)

Étape 4 : Continuer les calculs

Poursuivre avec les calculs d'arc elliptique restants, comme ceux de la section F.6.5. Remarque : une conséquence des corrections de rayons dans cette section, l'équation (F.6.5.2) pour le centre de l'ellipse a toujours au moins une solution (i.e. le radicande n'est jamais négatif). Au cas où les rayons étaient agrandis proportionnellement en utilisant l'équation (F.6.6.3), le radicande de (F.6.5.2) est zéro et il y a exactement une solution pour le centre de l'ellipse.


F.7 Remarques sur l'implémentation de la sélection de texte

Les remarques d'implémentation suivantes décrivent l'algorithme pour déterminer quels caractères sont sélectionnés lors d'une opération de sélection de texte.

Quand l'opération de sélection de texte intervient (par exemple, pendant que l'utilisateur effectue un cliquer-glisser avec la souris pour identifier la sélection), l'agent utilisateur détermine une position de début de sélection et une position de fin de sélection, chacune d'elles représentant un emplacement dans la chaîne textuelle entre deux caractères. Une fois déterminées les positions de début et de fin de sélection, l'agent utilisateur effectue une sélection des caractères adéquats, dans laquelle la sélection de texte résultante consiste :

Pour les systèmes avec un dispositif de pointage, pour définir la position de début de sélection, l'agent utilisateur SVG détermine quelle limite, entre les caractères correspondant aux glyphes rendus, est la cible idéale (par exemple, le plus proche), en fonction de la position courante du pointeur au moment de l'événement initian l'opération de sélection (par exemple, l'événement bouton de la souris appuyé). Ensuite, l'agent utilisateur attend l'achèment de l'opération de sélection (par exemple, le glisser de la souris, suivi finalement du relâchement du bouton de la souris). À la fin de l'opération de sélection, l'agent utilisateur détermine quelle limite entre caractères est la cible idéale (par exemple, le plus proche) pour la position de fin de sélection.

Si aucun ré-ordonnancement de caractères n'est survenu, en raison de la bi-directionnalité, alors la sélection consiste de tous les caractères entre la position de début de sélection et la position de fin de sélection. Par exemple, si un élément 'text' contient la chaîne "abcdef" et si les positions de début et de fin de sélection sont respectivement 0 et 3 (en posant que le côté gauche du "a" est la position 0), alors la sélection consistera de "abc".

Quand l'agent utilisateur implémente la sélection de texte bi-directionnel et quand la sélection commence (ou finit) entre deux caractères qui ne sont pas contigus en ordre logique, alors il peut y avoir plusieurs combinaisons potentielles de caractères que l'on pourrait considérer comme faisant partie de la sélection. Les algorithmes, pour évaluer les combinaisons des options de sélection potentielles, devront choisir l'option de sélection qui correspond au plus près avec l'ordre de rendu visuel de la chaîne textuelle.

Quand plusieurs caractères correspondent, de manière inséparable, à un jeu donné d'un ou plusieurs glyphes, l'agent utilisateur peut soit désactiver le début de sélection au milieu du jeu de glyphe, soit essayer d'allouer des portions de l'aire, occupée par le jeu de glyphes, aux caractères qui correspondent au glyphe.

Pour les systèmes qui gèrent un dispositif de pointage, comme une souris, l'agent utilisateur est tenu de fournir un mécanisme pour la sélection de texte, même si des gestionnaires d'événement ou des liens sont associés au texte en question, qui seraient susceptibles de bloquer la sélection du texte en raison de règles de préséance pour le traitement des événements (voir la section Les événements de pointeur). Une piste pour l'implémentation : pour les plateformes gèrant un dispositif de pointage, comme une souris, l'agent utilisateur peut attribuer une petite zone en surplus autour des cellulles de caractère pour initier l'opération de sélection de texte sans initier les gestionnaires d'événement ou les liens.


F.8 Remarques sur l'implémentation de l'impression

Pour les agents utilisateurs qui gèrent à la fois l'effet de zoom sur un dispositif d'affichage et l'impression, on recommande que l'option d'impression produise par défaut une sortie imprimée qui réflète la vue courante d'affichage du fragment de document SVG courant (en supposant qu'il n'y ait pas de style propre au média), qui prenne en compte tout effet de zoom ou de panoramique effectué par l'utilisateur, l'état de l'animation courante et toute modification du document due au DOM ou à un script. Ainsi, si l'utilisateur zoome sur une aire particulière d'une carte sur le dispositif d'affichage puis demande une copie sur papier, cette copie devrait montrer la même vue de la carte que celle qui apparaît sur le dispositif d'affichage. Si l'utilisateur interrompt une animation et l'imprime, la copie papier devrait montrer le même graphique que l'image arrètée sur le dispositif d'affichage. Si un script a ajouté ou retiré des éléments du document, alors la copie papier devrait reproduire les mêmes changements reflétés sur l'écran.

Quans un document SVG est rendu sur un appareil seulement statique, comme une imprimante qui ne gère ni les animations SVG ni les scripts et autres facilités, alors l'agent utilisateur ignorera tout élément d'animation et de script dans le document et rendra les éléments graphiques restants en fonction des règles de cette spécification.