unit reportpolygon; {$mode objfpc}{$H+} {$DEFINE NATIVERENDERER} { $DEFINE EXPORTFPIMAGE} { $DEFINE EXPORTPDF} { $DEFINE EXPORTLCL} { $DEFINE EXPORTAGGPAS} { $DEFINE EXPORTFPGUI} interface uses Classes, fpReport, fpReportStreamer; Type { TReportPolygon } TReportPolygon = class(TFPReportElement) private FColor: TFPReportColor; FCorners: Cardinal; FLineWidth: Cardinal; FRotateAngle: Double; procedure SetCLineWidth(AValue: Cardinal); procedure SetCorners(AValue: Cardinal); Protected Procedure RecalcLayout; override; procedure DoWriteLocalProperties(AWriter: TFPReportStreamer; AOriginal: TFPReportElement = nil); override; public procedure ReadElement(AReader: TFPReportStreamer); override; Procedure Assign(Source: TPersistent); override; Published Property Corners : Cardinal Read FCorners Write SetCorners; Property LineWidth : Cardinal Read FLineWidth Write SetCLineWidth; Property Color : TFPReportColor Read FColor Write FColor; // In degrees Property RotateAngle : Double Read FRotateAngle Write FRotateAngle; end; implementation {$IF DEFINED(EXPORTFPGUI) or DEFINED(EXPORTAGGPAS)} {$DEFINE NEEDAGGPAS} {$ENDIF} uses {$IFDEF EXPORTPDF} fppdf, fpreportpdfexport, {$ENDIF} {$IFDEF EXPORTLCL} graphics, fpreportlclexport, {$ENDIF} {$IFDEF EXPORTFPIMAGE} fpreportfpimageexport, {$ENDIF} {$IFDEF EXPORTFPGUI} fpreport_export_fpgui, {$ENDIF} {$IFDEF NEEDAGGPAS} fpreportaggpasexport, agg_2D, {$ENDIF} sysutils, fpimage, fpcanvas, FPImgCanv; // Angle in degrees. {$IFDEF EXPORTLCL} Procedure LCLPaintPolygon(Canvas : TCanvas; ARect : Trect; ANumber : Integer; AStartAngle : Double; ALineWidth : Integer; AColor : TColor); Var CX,CY,R,I : Integer; P : Array of TPoint; A,Step : Double; AWidth,AHeight : Integer; begin AWidth:=ARect.Right-ARect.Left+1; AHeight:=ARect.Bottom-ARect.Top+1; Canvas.Pen.Color:=AColor; Canvas.Pen.style:=psSolid; Canvas.Pen.Width:=aLineWidth; if ANumber<3 then exit; CX:=ARect.Left+AWidth div 2; CY:=ARect.Top+AHeight div 2; if aWidthfpreport.clNone) then begin C.Brush.FPColor:=ColorToRGBTriple(AElement.Frame.BackgroundColor); C.Brush.Style:=bsSolid; C.FillRect(0,0,AImage.Width-1,AImage.Height-1); end; PaintPolygon(C,Point(0,0),AImage.Width,AImage.Height,P.Corners,P.RotateAngle,P.linewidth,ColorToRGBTriple(P.Color)); finally C.Free; end; end; {$IFDEF EXPORTFPIMAGE} Procedure RenderPolygonInFPImage(AOffset : TFPReportPoint; E: TFPReportElement; RE : TFPReportExporter; ADPI : Integer); Var PR : TFPReportExportFPImage; PG : TReportPolygon; R : TPoint; AWidth,AHeight : Integer; begin PR:=RE as TFPReportExportFPImage; PG:=E as TReportPolygon; R.X:=PR.mmToPixels(AOffset.Left+E.RTLayout.Left); R.Y:=PR.mmToPixels(AOffset.Top+E.RTLayout.Top); AWidth:=PR.mmToPixels(E.RTLayout.Width); AHeight:=PR.mmToPixels(E.RTLayout.Height); PaintPolygon(PR.Canvas,R,AWidth,AHeight, PG.Corners,PG.RotateAngle,PG.LineWidth,PR.ColorToRGBTriple(PG.Color)); end; {$ENDIF} { TReportPolygon } procedure TReportPolygon.SetCLineWidth(AValue: Cardinal); begin If AValue<1 then AValue:=1; if FLineWidth=AValue then Exit; FLineWidth:=AValue; end; procedure TReportPolygon.SetCorners(AValue: Cardinal); begin If AValue<3 then AValue:=3; if FCorners=AValue then Exit; FCorners:=AValue; end; procedure TReportPolygon.RecalcLayout; begin // Do nothing end; procedure TReportPolygon.DoWriteLocalProperties(AWriter: TFPReportStreamer; AOriginal: TFPReportElement); Var P : TReportPolygon; begin inherited DoWriteLocalProperties(AWriter, AOriginal); if AOriginal is TReportPolygon then begin P:=AOriginal as TReportPolygon; AWriter.WriteIntegerDiff('Color', Color, P.Color); AWriter.WriteIntegerDiff('Corners',Corners,P.Color); AWriter.WriteIntegerDiff('LineWidth',LineWidth,P.LineWidth); AWriter.WriteFloatDiff('RotateAngle',RotateAngle,P.RotateAngle); end else begin AWriter.WriteInteger('Color', Color); AWriter.WriteInteger('Corners',Corners); AWriter.WriteInteger('LineWidth',LineWidth); AWriter.WriteFloat('RotateAngle',RotateAngle); end; end; procedure TReportPolygon.ReadElement(AReader: TFPReportStreamer); begin inherited ReadElement(AReader); Color:= AReader.ReadInteger('Color', clBlack); Corners:=AReader.ReadInteger('Corners',3); LineWidth:=AReader.ReadInteger('LineWidth',1); RotateAngle:=AReader.ReadFloat('RotateAngle',0); end; procedure TReportPolygon.Assign(Source: TPersistent); Var P : TReportPolygon; begin if (Source is TReportPolygon) then begin P:=Source as TReportPolygon; Corners:=P.Corners; Color:=P.Color; LineWidth:=P.LineWidth; RotateAngle:=P.RotateAngle; end; inherited Assign(Source); end; {$IFDEF EXPORTFPGUI} Procedure AggPasPaintPolygon(Ex: TFPReportExportAggPas; ARect : TFPReportRect; ANumber : Integer; AStartAngle : Double; ALineWidth : Integer; AColor : TRGBTriple); Var C : TFPReportPoint; I : Integer; P : Array of TFPReportPoint; R,A,Step : Double; AWidth,AHeight : Double; begin ex.Agg.noFill; ex.Agg.lineColor(aColor.Red, aColor.Green, aColor.Blue); ex.Agg.lineWidth(aLineWidth); if ANumber<3 then exit; AWidth:=ARect.Width; AHeight:=ARect.Height; C.Left:=ARect.Left+AWidth / 2; C.Top:=ARect.Top+AHeight / 2; if aWidth