GdipRotateTextureTransform()



Syntaxe
Resultat.i = GdipRotateTextureTransform(*brush, angle.f, order.i)
Paramètres
*brush

[in] Pointeur sur un objet TextureBrush.

angle.f

[in] Rotation en degrés. La rotation se fait dans le sens des aiguilles d'une montre si l'angle 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é subi une rotation angulaire selon la valeur passée par angle.f en suivant l'ordre définit par order.l.

La rotation se fait dans le sens trigonométrique si l'angle est négatif, sinon la rotation se fait fait dans le sens contraire.

Voici 2 exemples de fonctionnement extraits du fichier d'exemple :

On défini une image TextureBrush basée sur une image de 130 x 130 (brush d'origine).
La brush est définie avec la fonction GdipCreateTexture()
WrapMode #
WrapModeTile
La brush est affichée sur une surface de 130 x 130

Voici le rendu de la brush d'origine


Premier exemple :

On va appliquer à cette brush, une rotation de 25 degrés.

Code :
; Application de la rotation de 25 degrés
        GdipRotateTextureTransform(*brush, 25, #MatrixOrderAppend)

Voici le rendu de la brush

Le 3ème paramètre (order) de la fonction GdipRotateTextureTransform() qui vaut #MatrixOrderAppend n'a pas d'influence sur la rotation ; s'il valait #MatrixOrderPrepend, 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.

 

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 une division par 4 des lignes suivant l'axe x avec la fonction GdipMultiplyTextureTransform() et d'une matrice de transformation, ce qui aura pour effet d'avoir 4 répétitions du motif en largeur. 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 25 degrés, le 3ème paramètre (order.l) de GdipRotateTextureTransform() 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 de la division par 4 selon l'axe x.

Code :
; Application de la division par 4 de l'axe x
        GdipMultiplyTextureTransform(*brush, *matrix, #MatrixOrderAppend)

; Application de la rotation de 25 degrés
        GdipRotateTextureTransform(*brush, 25, #MatrixOrderAppend)

Voici le rendu de la brush sur l'image, les 2 phases sont décomposées mais la division de l'axe x avant rotation est invisible, seul le résultat final est vraiment affiché.

1ère phase, division par 4 des lignes de l'axe x :


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 GdipRotateTextureTransform().
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 subi aucune modification) les 2 modifications suivantes et dans cet ordre :

D'abord une division par 4 des lignes suivant l'axe x avec la fonction GdipMultiplyTextureTransform() et d'une matrice de transformation, ce qui aura pour effet d'avoir 4 répétitions du motif en largeur. 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 25 degrés, le 3 paramètre (order.l) de GdipRotateTextureTransform() 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 de la division horizontale.

Code :
; Application du doublement horizontal
        GdipMultiplyTextureTransform(*brush, *matrix, #MatrixOrderAppend)

; Application de la rotation de 45 degrés
        GdipRotateLineTransform(*brush, 25, #MatrixOrderPrepend)

Voici le rendu de la brush sur l'image, les 2 phases sont décomposées.
La rotation a lieu avant le division par 4 de l'axe x mais cette rotation sur la brush d'origine est invisible, seul le résultat final est vraiment affiché.

1ère phase, rotation de 25 degrés de la brush d'origine :

2ème phase, division par 4 des lignes de l'axe x :

On voit tout de suite l'importance du paramètre order. Cet exemple est extrait du fichier d'exemple.

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