GdipRotatePathGradientTransform()



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

[in] Pointeur sur un objet PathGradientBrush.

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 en forme de losange avec une couleur centrale bleue entièrement opaque (brush d'origine).
La brush est définie avec la fonction GdipCreatePathGradient().
La couleur des points du contour de la brush sont :
point 1 le rouge, point 2 le vert, point 3 le jaune et point 4 le blanc.
WrapMode #
WrapModeTile

Voici le rendu de la brush d'origine sur l'image (aucune transformation)


Premier exemple :

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

Code :
; Application de la rotation de 45 degrés
        GdipRotatePathGradientTransform(*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.
La brush occupe toujous le même rectangle ou elle est dessinée, mais son contour a été modifié suite à la rotation de 45 degrés.

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 horizontale par 2 des lignes avec la fonction GdipScalePathGradientTransform(), ce qui aura pour effet d''avoir 2 losanges au lieu d'un. 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 GdipRotatePathGradientTransform() 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 horizontale par deux.

Code :
; Application de la division horizontale
        GdipScalePathGradientTransform(*brush, 0.5, 1, #MatrixOrderAppend)

; Application de la rotation de 45 degrés
        GdipRotatePathGradientTransform(*brush, 45, #MatrixOrderAppend)

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

1ère phase, la division horizontale :

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 GdipScalePathGradientTransform().
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 une division horizontale par 2 des lignes avec la fonction GdipScalePathGradientTransform(), ce qui aura pour effet d''avoir 2 losanges au lieu d'un. 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 GdipRotatePathGradientTransform() 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 de la division horizontale
        GdipScalePathGradientTransform(*brush, 0.5, 1, #MatrixOrderAppend)

; Application de la rotation de 45 degrés
        GdipRotatePathGradientTransform(*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, division horizontale après la rotation :

Ces exemples sont extraits 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