Hi.
ich arbeite an einigen Komponenten. dazu benutze ich die Lib.
graphics32
nun habe ich einige probleme mit Gradient's, genauer gesagt Circular Gradient
der Gradient muss in ein bestimmten rammen Reinpassen etwa in einen Rectangle, RoundRect, Round
das mit Vertical/Horizontal Gradient funzt,..... nur der rest.
Delphi-Quellcode:
function MakeRectangle(const Rec: TFloatRect): TArrayOfFloatPoint;
var
FRec : TFloatRect;
begin
FRec.Left:= 0;
FRec.Top:= 0;
FRec.Right:= Rec.Right;
FRec.Bottom:= Rec.Bottom;
Result:= Rectangle(FRec);
end;
function MakeRoundRect(Radius : TFloat; Rec: TFloatRect): TArrayOfFloatPoint;
var
FRec : TFloatRect;
begin
FRec.Left:= 0;
FRec.Top:= 0;
FRec.Right:= Rec.Right;
FRec.Bottom:= Rec.Bottom;
Result:= RoundRect(FRec, Radius);
end;
procedure Gradient_Fill_Vertical(Buffer : TBitmap32; Rec: TRect; RoundRect, Mirror : Boolean;
ColorFrom, ColorTo, MirrorFrom, MirrorTo : TColor; MirrorFromPos, MirrorToPos : TFloat);
var
GradFiller : TLinearGradientPolygonFiller;
Polys: TArrayOfArrayOfFloatPoint;
OutlinePolygon: TArrayOfFloatPoint;
FloatRect : TFloatRect;
procedure AddPolygon(const Pts: TArrayOfFloatPoint);
begin
with TClipper.Create do
try
Add(Polys, ptSubject);
Add(Pts, ptClip);
Execute(ctUnion, Polys, pftNonZero);
finally
Free;
end;
end;
begin
FloatRect.Left:= Rec.Left;
FloatRect.Top:= Rec.Top;
FloatRect.Right:= Rec.Right;
FloatRect.Bottom:= Rec.Height;
if RoundRect then
OutlinePolygon:= MakeRoundRect(8.0, FloatRect)
else
OutlinePolygon:= MakeRectangle(FloatRect);
AddPolygon(OutlinePolygon);
GradFiller := TLinearGradientPolygonFiller.Create;
try
GradFiller.SetPoints(FloatPoint(0, FloatRect.Top), FloatPoint(0, FloatRect.Bottom));
if not Mirror then
begin
GradFiller.Gradient.StartColor := Color32(ColorFrom);
GradFiller.Gradient.EndColor := Color32(ColorTo);
end else
begin
GradFiller.Gradient.StartColor := Color32(ColorFrom);
GradFiller.Gradient.AddColorStop(MirrorFromPos, Color32(MirrorFrom));
GradFiller.Gradient.AddColorStop(MirrorToPos, Color32(MirrorTo));
GradFiller.Gradient.EndColor := Color32(ColorTo);
end;
PolyPolygonFS(Buffer, Polys, GradFiller, pfWinding);
finally
GradFiller.Free;
Setlength(Polys, 0);
end;
end;