diff --git a/lcl/lazcanvas.pas b/lcl/lazcanvas.pas index b43d437f8d..7379a4ec6c 100644 --- a/lcl/lazcanvas.pas +++ b/lcl/lazcanvas.pas @@ -78,7 +78,6 @@ type protected procedure SetColor (x,y:integer; const AValue:TFPColor); override; // Routines broken in FPC - function IsPointInPolygon(AX, AY: Integer; const APolygon: array of TPoint): Boolean; procedure DoPolygonFill (const points:array of TPoint); override; public constructor create (AnImage : TFPCustomImage); @@ -169,57 +168,6 @@ begin Clipping := OldClipping; end; -// The function will return True if the point x,y is inside the polygon, or -// False if it is not. -// -// Original C code: http://www.visibone.com/inpoly/inpoly.c.txt -// -// Translation from C by Felipe Monteiro de Carvalho -// -// License: Public Domain -function TLazCanvas.IsPointInPolygon(AX, AY: Integer; const APolygon: array of TPoint): Boolean; -var - xnew, ynew: Cardinal; - xold,yold: Cardinal; - x1,y1: Cardinal; - x2,y2: Cardinal; - i, npoints: Integer; - inside: Integer = 0; -begin - Result := False; - npoints := Length(APolygon); - if (npoints < 3) then Exit; - xold := APolygon[npoints-1].X; - yold := APolygon[npoints-1].Y; - for i := 0 to npoints - 1 do - begin - xnew := APolygon[i].X; - ynew := APolygon[i].Y; - if (xnew > xold) then - begin - x1:=xold; - x2:=xnew; - y1:=yold; - y2:=ynew; - end - else - begin - x1:=xnew; - x2:=xold; - y1:=ynew; - y2:=yold; - end; - if (((xnew < AX) = (AX <= xold)) // edge "open" at left end - and ((AY-y1)*(x2-x1) < (y2-y1)*(AX-x1))) then - begin - inside := not inside; - end; - xold:=xnew; - yold:=ynew; - end; - Result := inside <> 0; -end; - procedure TLazCanvas.DoPolygonFill(const points: array of TPoint); var lBoundingBox: TRect; diff --git a/lcl/lazregions.pas b/lcl/lazregions.pas index b703a96432..b865eaad6a 100644 --- a/lcl/lazregions.pas +++ b/lcl/lazregions.pas @@ -61,9 +61,61 @@ type function IsPointInRegion(AX, AY: Integer): TLazRegionWithChilds; virtual; end; +function IsPointInPolygon(AX, AY: Integer; const APolygon: array of TPoint): Boolean; implementation +// The function will return True if the point x,y is inside the polygon, or +// False if it is not. +// +// Original C code: http://www.visibone.com/inpoly/inpoly.c.txt +// +// Translation from C by Felipe Monteiro de Carvalho +// +// License: Public Domain +function IsPointInPolygon(AX, AY: Integer; const APolygon: array of TPoint): Boolean; +var + xnew, ynew: Cardinal; + xold,yold: Cardinal; + x1,y1: Cardinal; + x2,y2: Cardinal; + i, npoints: Integer; + inside: Integer = 0; +begin + Result := False; + npoints := Length(APolygon); + if (npoints < 3) then Exit; + xold := APolygon[npoints-1].X; + yold := APolygon[npoints-1].Y; + for i := 0 to npoints - 1 do + begin + xnew := APolygon[i].X; + ynew := APolygon[i].Y; + if (xnew > xold) then + begin + x1:=xold; + x2:=xnew; + y1:=yold; + y2:=ynew; + end + else + begin + x1:=xnew; + x2:=xold; + y1:=ynew; + y2:=yold; + end; + if (((xnew < AX) = (AX <= xold)) // edge "open" at left end + and ((AY-y1)*(x2-x1) < (y2-y1)*(AX-x1))) then + begin + inside := not inside; + end; + xold:=xnew; + yold:=ynew; + end; + Result := inside <> 0; +end; + { TLazRegionPart } function TLazRegionPart.IsPointInPart(AX, AY: Integer): Boolean;