diff --git a/applications/fpvviewer/fpvv_mainform.lfm b/applications/fpvviewer/fpvv_mainform.lfm index e817ed3fe..4823fe84f 100644 --- a/applications/fpvviewer/fpvv_mainform.lfm +++ b/applications/fpvviewer/fpvv_mainform.lfm @@ -82,7 +82,7 @@ object frmFPVViewer: TfrmFPVViewer TabOrder = 1 object editFileName: TFileNameEdit Left = 8 - Height = 22 + Height = 23 Top = 8 Width = 304 DialogOptions = [] @@ -104,7 +104,7 @@ object frmFPVViewer: TfrmFPVViewer end object spinScale: TFloatSpinEdit Left = 72 - Height = 16 + Height = 23 Top = 97 Width = 168 DecimalPlaces = 6 @@ -117,9 +117,9 @@ object frmFPVViewer: TfrmFPVViewer end object Label1: TLabel Left = 8 - Height = 16 + Height = 15 Top = 97 - Width = 55 + Width = 46 Caption = 'Scale by:' ParentColor = False end @@ -161,15 +161,15 @@ object frmFPVViewer: TfrmFPVViewer end object Label2: TLabel Left = 8 - Height = 16 + Height = 15 Top = 72 - Width = 88 + Width = 73 Caption = 'Y adjustment:' ParentColor = False end object spinAdjustY: TSpinEdit Left = 80 - Height = 16 + Height = 23 Top = 72 Width = 72 Increment = 100 @@ -180,7 +180,7 @@ object frmFPVViewer: TfrmFPVViewer end object spinAdjustX: TSpinEdit Left = 232 - Height = 16 + Height = 23 Top = 72 Width = 72 Increment = 50 @@ -191,9 +191,9 @@ object frmFPVViewer: TfrmFPVViewer end object Label3: TLabel Left = 160 - Height = 16 + Height = 15 Top = 72 - Width = 88 + Width = 73 Caption = 'X adjustment:' ParentColor = False end @@ -208,18 +208,18 @@ object frmFPVViewer: TfrmFPVViewer end object Label4: TLabel Left = 9 - Height = 16 + Height = 15 Top = 126 - Width = 153 + Width = 128 Caption = 'Force encoding on read:' ParentColor = False end object comboEncoding: TComboBox Left = 144 - Height = 20 + Height = 23 Top = 126 Width = 128 - ItemHeight = 0 + ItemHeight = 15 ItemIndex = 0 Items.Strings = ( 'Read from the file' @@ -255,17 +255,17 @@ object frmFPVViewer: TfrmFPVViewer end object labelFileEncoding: TLabel Left = 278 - Height = 16 + Height = 15 Top = 130 - Width = 88 + Width = 74 Caption = 'File encoding:' ParentColor = False end object checkForceWhiteBackground: TCheckBox Left = 9 - Height = 18 + Height = 19 Top = 152 - Width = 178 + Width = 153 Caption = 'Force white background?' TabOrder = 11 end @@ -278,5 +278,23 @@ object frmFPVViewer: TfrmFPVViewer OnClick = buttonViewDebugInfoClick TabOrder = 12 end + object buttonPrint: TButton + Left = 416 + Height = 25 + Top = 8 + Width = 59 + Caption = 'Print' + OnClick = buttonPrintClick + TabOrder = 13 + end + object buttonAdjust: TButton + Left = 344 + Height = 25 + Top = 8 + Width = 56 + Caption = 'Adjust' + OnClick = buttonAdjustClick + TabOrder = 14 + end end end diff --git a/applications/fpvviewer/fpvv_mainform.pas b/applications/fpvviewer/fpvv_mainform.pas index d9c6506c1..abccb82ad 100644 --- a/applications/fpvviewer/fpvv_mainform.pas +++ b/applications/fpvviewer/fpvv_mainform.pas @@ -7,7 +7,10 @@ interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, EditBtn, StdCtrls, Spin, ExtCtrls, ComCtrls, Grids, ColorBox, Math, - fpvv_drawer, fpimage, fpcanvas, coreconrec, fpvutils; + Printers, PrintersDlgs, LCLIntf, LCLType, + fpvv_drawer, fpimage, fpcanvas, coreconrec, fpvutils, + fpvectorial, lasvectorialreader, svgvectorialwriter, + dxfvectorialreader, epsvectorialreader, fpvtocanvas, dxftokentotree; type @@ -20,6 +23,8 @@ type btnVisualize: TButton; Button1: TButton; Button2: TButton; + buttonPrint: TButton; + buttonAdjust: TButton; buttonViewDebugInfo: TButton; buttonRenderingTest: TButton; checkForceWhiteBackground: TCheckBox; @@ -47,6 +52,8 @@ type procedure btnViewDXFTokensClick(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); + procedure buttonAdjustClick(Sender: TObject); + procedure buttonPrintClick(Sender: TObject); procedure buttonRenderingTestClick(Sender: TObject); procedure buttonViewDebugInfoClick(Sender: TObject); procedure FormCreate(Sender: TObject); @@ -55,6 +62,7 @@ type procedure spinAdjustYChange(Sender: TObject); procedure spinScaleChange(Sender: TObject); private + FVec: TvVectorialDocument; procedure MyContourLineDrawingProc(z,x1,y1,x2,y2: Double); function FPVDebugAddItemProc(AStr: string; AParent: Pointer): Pointer; procedure HandleDrawerMouseWheel(Sender: TObject; Shift: TShiftState; @@ -62,6 +70,11 @@ type procedure HandleDrawerPosChanged(Sender: TObject); procedure HandleDrawerRedraw(Sender: TObject); procedure ViewerDebugOutCallback(AStr: string); + // + procedure Render_PrepareFile(); + procedure Render_DoRender(ACanvasSizeX, ACanvasSizeY, + ADrawerPosX, ADrawerPosY: Integer; AScale: Double); + procedure Render_FreeFile(); public { public declarations } Drawer: TFPVVDrawer; @@ -72,12 +85,6 @@ var implementation -uses - fpvectorial, lasvectorialreader, svgvectorialwriter, - dxfvectorialreader, epsvectorialreader, - fpvtocanvas, - dxftokentotree; - {$R *.lfm} { TfrmFPVViewer } @@ -320,6 +327,72 @@ begin end; end; +procedure TfrmFPVViewer.buttonAdjustClick(Sender: TObject); +const + FPVVIEWER_MAX_IMAGE_SIZE = 1000; + FPVVIEWER_MIN_IMAGE_SIZE = 100; + FPVVIEWER_SPACE_FOR_NEGATIVE_COORDS = 100; +var + CanvasSize: TPoint; +begin + Render_PrepareFile(); + try + // We need to be robust, because sometimes the document size won't be given + // also give up drawing everything if we need more then 4MB of RAM for the image + // and also give some space in the image to allow for negative coordinates + if FVec.Width * spinScale.Value > FPVVIEWER_MAX_IMAGE_SIZE then CanvasSize.X := FPVVIEWER_MAX_IMAGE_SIZE + else if FVec.Width < FPVVIEWER_MIN_IMAGE_SIZE then CanvasSize.X := Drawer.Width + else CanvasSize.X := Round(FVec.Width * spinScale.Value); + if CanvasSize.X < Drawer.Width then CanvasSize.X := Drawer.Width; + + if FVec.Height * spinScale.Value > FPVVIEWER_MAX_IMAGE_SIZE then CanvasSize.Y := FPVVIEWER_MAX_IMAGE_SIZE + else if FVec.Height < FPVVIEWER_MIN_IMAGE_SIZE then CanvasSize.Y := Drawer.Height + else CanvasSize.Y := Round(FVec.Height * spinScale.Value); + if CanvasSize.Y < Drawer.Height then CanvasSize.Y := Drawer.Height; + + Render_DoRender(Drawer.Width, Drawer.Height, 4, 4, FVec.Width / Drawer.Width); + finally + Render_FreeFile(); + end; +end; + +procedure TfrmFPVViewer.buttonPrintClick(Sender: TObject); +var + printDialog: TPrintDialog; + ScaleX, ScaleY: Double; + lRectSrc, lRectDest: TRect; +begin + // Create a printer selection dialog + printDialog := TPrintDialog.Create(Self); + + // Set up print dialog options + printDialog.Options := []; + + // if the user has selected a printer (or default), then print! + if printDialog.Execute then + begin + // Generate the image + btnVisualizeClick(Sender); + + // Start printing + Printer.BeginDoc; + + // Draw the image + ScaleX := LCLIntf.GetDeviceCaps(Handle, logPixelsX) / PixelsPerInch; // Don't know why, but GetDeviceCaps is returning zero... + ScaleY := LCLIntf.GetDeviceCaps(Handle, logPixelsY) / PixelsPerInch; + lRectSrc := Bounds(0, 0, Drawer.Drawing.Width, Drawer.Drawing.Height); + lRectDest := Bounds(0, 0, Printer.PageWidth, Printer.PageHeight); + Printer.Canvas.StretchDraw( + lRectDest, + Drawer.Drawing); + + // Finish printing + Printer.EndDoc; + end; + + printDialog.Free; +end; + procedure TfrmFPVViewer.buttonRenderingTestClick(Sender: TObject); var VecDoc: TvVectorialDocument; @@ -448,5 +521,55 @@ begin memoDebug.Lines.Add(AStr); end; +procedure TfrmFPVViewer.Render_PrepareFile; +begin + // First check the in input + if editFileName.FileName = '' then Exit; // silent exit in this simple case + //if not CheckInput() then Exit; + + notebook.PageIndex := 0; + + FVec := TvVectorialDocument.Create; + + // If we desire, force a encoding for the read operation + if comboEncoding.ItemIndex > 0 then + FVec.ForcedEncodingOnRead := comboEncoding.Text + else FVec.ForcedEncodingOnRead := ''; + + FVec.ReadFromFile(editFileName.FileName); +end; + +procedure TfrmFPVViewer.Render_DoRender(ACanvasSizeX, ACanvasSizeY, + ADrawerPosX, ADrawerPosY: Integer; AScale: Double); +const + FPVVIEWER_MAX_IMAGE_SIZE = 1000; + FPVVIEWER_MIN_IMAGE_SIZE = 100; + FPVVIEWER_SPACE_FOR_NEGATIVE_COORDS = 100; +begin + // Show document properties + labelFileEncoding.Caption := 'File encoding: ' + FVec.Encoding; + + Drawer.Drawing.Width := ACanvasSizeX; + Drawer.Drawing.Height := ACanvasSizeY; + Drawer.Drawing.Canvas.Brush.Color := clWhite; + Drawer.Drawing.Canvas.Brush.Style := bsSolid; + Drawer.Drawing.Canvas.FillRect(0, 0, Drawer.Drawing.Width, Drawer.Drawing.Height); + if checkForceWhiteBackground.Checked then FVec.GetPageAsVectorial(0).BackgroundColor := colWhite; + if not checkForceWhiteBackground.Checked then + FVec.GetPageAsVectorial(0).DrawBackground(Drawer.Drawing.Canvas); + FVec.GetPageAsVectorial(0).Render( + Drawer.Drawing.Canvas, + FPVVIEWER_SPACE_FOR_NEGATIVE_COORDS + ADrawerPosX, + Drawer.Drawing.Height - FPVVIEWER_SPACE_FOR_NEGATIVE_COORDS + ADrawerPosY, + spinScale.Value, + -1 * spinScale.Value); + Drawer.Invalidate; +end; + +procedure TfrmFPVViewer.Render_FreeFile; +begin + FVec.Free; +end; + end. diff --git a/applications/fpvviewer/fpvviewer.lpi b/applications/fpvviewer/fpvviewer.lpi index 4df94b6f2..dda5c373d 100644 --- a/applications/fpvviewer/fpvviewer.lpi +++ b/applications/fpvviewer/fpvviewer.lpi @@ -61,11 +61,9 @@ + - - - @@ -77,17 +75,20 @@ - + - + - - + - + + + + + diff --git a/applications/fpvviewer/fpvviewer.lpr b/applications/fpvviewer/fpvviewer.lpr index 0c10e3ec1..db6c48dcb 100644 --- a/applications/fpvviewer/fpvviewer.lpr +++ b/applications/fpvviewer/fpvviewer.lpr @@ -7,7 +7,8 @@ uses cthreads, {$ENDIF}{$ENDIF} Interfaces, // this includes the LCL widgetset - Forms, fpvv_mainform, dxftokentotree, fpvv_drawer, fpvectorialpkg, CoreConRec; + Forms, fpvv_mainform, dxftokentotree, fpvv_drawer, fpvectorialpkg, + printer4lazarus, CoreConRec; {$R *.res}