GdipRotateLineTransform()



Syntaxe
Resultat.i = GdipRotateLineTransform(*brush, angle.f, order.i)

Paramètres

*brush

[in] Pointeur sur un objet LinearGradientBrush.

angle.f

[in] Rotation en degrés. La rotation se fait dans le sens des aiguilles d'une montre si angle.f est positif, sinon dans le sens contraire.

order.i

[in] Élément de l'énumération MatrixOrder qui indique l'ordre de la multiplication des matrices. MatrixOrderPrepend indique que la multiplication se fait de gauche à droite et MatrixOrderAppend indique que la multiplication se fait de droite à gauche. La valeur par défaut est MatrixOrderPrepend. Ces valeurs déterminent l'ordre d'application des transformations tel que défini par l'énumération MatrixOrder.

Description

Cette fonction met à jour la matrice de transformation courante de la brush avec le résultat du produit de la matrice courante et de la matrice de rotation dont les valeurs sont contenues dans les paramètres angle.f et order.l.
En conséquence, le dégradé subit une rotation angulaire selon la valeur passée par angle.f en suivant l'ordre définit par order.l.
Voici 3 exemples de fonctionnement extrait du deuxième fichier d'exemple :
On défini une image de 200 x 200 et une brush de 50 x 50 (brush d'origine).
La brush est définie avec la fonction  GdipCreateLineBrushFromRect()
La première couleur est le blanc et la couleur d'arrivée le bleu.
Mode
#LinearGradientModeHorizontal
WrapMode
#WrapModeTile
Il y aura répétition du motif 4 fois.
Voici le rendu de la brush sur l'image (aucune rotation)


Premier exemple :

On va appliquer à cette brush, une rotation de 45 degrés.
Code :
; Application de la rotation de 45 degrés
        GdipRotateLineTransform(*brush3, #Angle, #MatrixOrderPrepend)
Voici le rendu de la brush sur l'image
Le 3ème paramètre (order) de la fonction GdipRotateLineTransform() qui vaut #MatrixOrderPrepend n'a pas d'influence sur la rotation ; s'il valait #MatrixOrderAppend, cela ne changerait pas non plus le dégradé car il n'y a pas de modification précédente sur la brush à l'aide d'une des fonctions disponibles. Ce paramètre n'a une influence que si la brush a déjà subi une modification.
Par contre, en faisant des essais avec une brush ayant le mode #LinearGradientModeVertical, il y a une différence de rendu après la rotation si order.l vaut #MatrixOrderPrepend ou #MatrixOrderAppend. C'est du à une transformation interne de la brush pour obtenir le mode vertical à partir du mode horizontal.


Deuxième exemple :

On va appliquer à la brush d'origine (qui n'a subie aucune modification) les 2 modifications suivantes et dans cet ordre :
D'abord un doublement horizontal des lignes avec la fonction GdipScaleLineTransform(), ce qui aura pour effet de n'avoir plus que 2 répétitions du motif au lieu de 4. Le paramètre order.l pour cette fonction vaut #MatrixOrderAppend, ce qui signifie que cette opération sera appliquée après une modification précédente de la brush si elle existe, mais il n'y a pas d'opération précédente, le paramètre n'a pas d'influence.
Ensuite, on applique une rotation de 45 degrés, le 3ème paramètre (order.l) de
GdipRotateLineTransform() vaut #MatrixOrderAppend, ce qui veut dire que cette opération est appliquée après la précédente opération si elle existe, et c'est le cas puisqu'il s'agit du doublement horizontal.

Code :
; Application du doublement horizontal
        GdipScaleLineTransform(*brush, 2, 1, #MatrixOrderAppend)
; Application de la rotation de 45 degrés
        GdipRotateLineTransform(*brush, 45, #MatrixOrderAppend)
Voici le rendu de la brush sur l'image, les 2 phases sont décomposées mais le doublement horizontal avant rotation est invisible, seul le résultat final est vraiment affiché.
1ère phase, doublement horizontal :
Chaque point de la brush est dupliqué en x (on ajoute le même point en x en décalant le reste de l'image jusqu'à ce que la zone d'affichage soit remplie).
2ème phase, rotation de 45 degrés (rendu final):



Troisième exemple :

Cet exemple est proche de l'exemple 2 mais avec un paramètre qui change pour la fonction GdipRotateLineTransform().
Le paramètre order qui vaut
#MatrixOrderPrepend au lieu de #MatrixOrderAppend pour le deuxième exemple.
On va appliquer à la brush d'origine (qui n'a subie aucune modification) les 2 modifications suivantes et dans cet ordre :
D'abord un doublement horizontal des lignes avec la fonction GdipScaleLineTransform(), ce qui aura pour effet de n'avoir plus que 2 répétitions du motif au lieu de 4. Le paramètre order.l pour cette fonction vaut #MatrixOrderAppend, ce qui signifie que cette opération sera appliquée après une modification précédente de la brush si elle existe, mais il n'y a pas d'opération précédente, le paramètre n'a pas d'influence.
Ensuite, on applique une rotation de 45 degrés, le 3 paramètre (order.l) de
GdipRotateLineTransform() vaut #MatrixOrderPrepend, ce qui veut dire que cette opération est appliquée avant la précédente opération si elle existe et c'est le cas puisqu'il s'agit du doublement horizontal.

Code :
; Application du doublement horizontal
        GdipScaleLineTransform(*brush, 2, 1, #MatrixOrderAppend)
; Application de la rotation de 45 degrés
        GdipRotateLineTransform(*brush, 45, #MatrixOrderPrepend)
Voici le rendu de la brush sur l'image, les 2 phases sont décomposées.
La rotation a lieu avant le doublement horizontal mais cette rotation sur la brush d'origine est invisible, seul le résultat final est vraiment affiché.
1ère phase, rotation de 45 degrés de la brush d'origine :
2ème phase, doublement horizontal après la rotation :
Chaque ligne de la brush est dupliqué en x (on ajoute la même ligne en x en décalant le reste de l'image jusqu'à ce que la zone d'affichage soit remplie).
On voit tout de suite l'importance du paramètre order. Cet exemple est extrait du second fichier d'exemples.

Résultat de la fonction

Si la fonction réussit, elle retourne #Ok qui est une constante de l'énumération status.
Si la fonction échoue, elle retourne une des autres valeurs de l'énumération status.

PB - OS

PureBasic v4.30 bêta 4 (Windows - x86)
Testé avec Windows Vista édition familiale Premium