1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
|
Type
TRGbColor = Record
R : word;
G : word;
B : word;
end;
procedure Degrade(Canvas : Tcanvas;Arect : Trect;fromColor, toColor: TColor);
var
aBand : TRect; { Bande rectangulaire de couleur courante }
i, nbDgrad : integer; { Compteur pour parcourir la hauteur de la fiche }
RGB_Start : TRGbColor; { RGB de la couleur de départ }
RGB_Dif : TRGbColor; { RGB à ajouter à la couleur de départ pour atteindre la couleur de fin }
RGB_Cur : TRGbColor; { RGB de la couleur courante }
begin
// Calcul des valeurs RGB pour la couleur courante
RGB_Start.R := GetRValue(ColorToRGB(fromColor));
RGB_Start.G := GetGValue(ColorToRGB(fromColor));
RGB_Start.B := GetBValue(ColorToRGB(fromColor));
// Calcul des valeurs à ajouter pour atteindre la couleur de fin
RGB_Dif.R := GetRValue(ColorToRGB( toColor )) - RGB_Start.R ;
RGB_Dif.G := GetgValue(ColorToRGB( toColor )) - RGB_Start.G ;
RGB_Dif.B := GetbValue(ColorToRGB( toColor )) - RGB_Start.B ;
With Canvas do
begin
Pen.Style := psSolid;
Pen.Mode := pmCopy;
Pen.Width := 1;
nbDgrad := 255;
if ARect.Bottom - ARect.Top < 255 then
nbDgrad := ARect.Bottom - ARect.Top;
for i:= 0 to nbDgrad do // Degradé de um max. de 255 cores ...
begin
aBand.Left := ARect.Left;
aBand.Right := ARect.Right;
aBand.Top := ARect.Top + MulDiv(i , ARect.Bottom - ARect.Top, nbDgrad+1 );
aBand.Bottom := ARect.Top + MulDiv(i+1 , ARect.Bottom - ARect.Top, nbDgrad+1 );
// Calcul de la couleur courante
RGB_Cur.R := (RGB_Start.R + MulDiv( i, RGB_Dif.R, nbDgrad ));
RGB_Cur.G := (RGB_Start.G + MulDiv( i, RGB_Dif.G, nbDgrad ));
RGB_Cur.B := (RGB_Start.B + MulDiv( i, RGB_Dif.B, nbDgrad ));
Brush.color:=RGB(RGB_Cur.R,RGB_Cur.G, RGB_Cur.B);
FillRect(aBand);
end;
end;
end; |
Partager