fpvviewer: Minor improvements

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@4490 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
sekelsenmat
2016-02-06 09:17:42 +00:00
parent 9c8225cafe
commit 0cf154c322
2 changed files with 52 additions and 37 deletions

View File

@ -124,27 +124,27 @@ object frmFPVViewer: TfrmFPVViewer
ParentColor = False ParentColor = False
end end
object btnViewDXFTokens: TButton object btnViewDXFTokens: TButton
Left = 112 Left = 224
Height = 25 Height = 25
Top = 41 Top = 40
Width = 128 Width = 128
Caption = 'View DXF Tokens' Caption = 'View DXF Tokens'
OnClick = btnViewDXFTokensClick OnClick = btnViewDXFTokensClick
TabOrder = 3 TabOrder = 3
end end
object buttonRenderingTest: TButton object buttonAutoFitView: TButton
Left = 256 Left = 112
Height = 25 Height = 25
Top = 41 Top = 40
Width = 96 Width = 96
Caption = 'Render Test' Caption = 'Auto Fit View'
OnClick = buttonRenderingTestClick OnClick = buttonAutoFitViewClick
TabOrder = 4 TabOrder = 4
end end
object buttonConvertToSVG: TButton object buttonConvertToSVG: TButton
Left = 360 Left = 360
Height = 25 Height = 25
Top = 41 Top = 40
Width = 120 Width = 120
Caption = 'Convert to SVG' Caption = 'Convert to SVG'
OnClick = buttonConvertToSVGClick OnClick = buttonConvertToSVGClick

View File

@ -27,7 +27,7 @@ type
buttonPrint: TButton; buttonPrint: TButton;
buttonAdjust: TButton; buttonAdjust: TButton;
buttonViewDebugInfo: TButton; buttonViewDebugInfo: TButton;
buttonRenderingTest: TButton; buttonAutoFitView: TButton;
checkShowPage: TCheckBox; checkShowPage: TCheckBox;
checkForceWhiteBackground: TCheckBox; checkForceWhiteBackground: TCheckBox;
comboEncoding: TComboBox; comboEncoding: TComboBox;
@ -57,7 +57,7 @@ type
procedure buttonAdjustClick(Sender: TObject); procedure buttonAdjustClick(Sender: TObject);
procedure buttonAutoFitClick(Sender: TObject); procedure buttonAutoFitClick(Sender: TObject);
procedure buttonPrintClick(Sender: TObject); procedure buttonPrintClick(Sender: TObject);
procedure buttonRenderingTestClick(Sender: TObject); procedure buttonAutoFitViewClick(Sender: TObject);
procedure buttonViewDebugInfoClick(Sender: TObject); procedure buttonViewDebugInfoClick(Sender: TObject);
procedure FormCreate(Sender: TObject); procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject); procedure FormDestroy(Sender: TObject);
@ -75,6 +75,7 @@ type
procedure ViewerDebugOutCallback(AStr: string); procedure ViewerDebugOutCallback(AStr: string);
// //
procedure Render_PrepareFile(); procedure Render_PrepareFile();
procedure Render_Calc_Drawer_Size();
procedure Render_DoRender(ACanvasSizeX, ACanvasSizeY, procedure Render_DoRender(ACanvasSizeX, ACanvasSizeY,
ADrawerPosX, ADrawerPosY: Integer; AScale: Double); ADrawerPosX, ADrawerPosY: Integer; AScale: Double);
procedure Render_FreeFile(); procedure Render_FreeFile();
@ -93,46 +94,30 @@ implementation
{ TfrmFPVViewer } { TfrmFPVViewer }
procedure TfrmFPVViewer.btnVisualizeClick(Sender: TObject); procedure TfrmFPVViewer.btnVisualizeClick(Sender: TObject);
const
FPVVIEWER_MAX_IMAGE_SIZE = 1000;
FPVVIEWER_MIN_IMAGE_SIZE = 100;
var var
CanvasSize: TPoint;
lCurPage: TvVectorialPage;
lPage: TvPage; lPage: TvPage;
YAxisMultiplier: Double = -1; YAxisMultiplier: Double = -1;
lPageHeight: Integer;
begin begin
Render_PrepareFile(); Render_PrepareFile();
try try
// We need to be robust, because sometimes the document size won't be given Render_Calc_Drawer_Size();
// 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;
Drawer.Drawing.Width := CanvasSize.X;
Drawer.Drawing.Height := CanvasSize.Y;
Drawer.Drawing.Canvas.Brush.Color := clWhite; Drawer.Drawing.Canvas.Brush.Color := clWhite;
Drawer.Drawing.Canvas.Brush.Style := bsSolid; Drawer.Drawing.Canvas.Brush.Style := bsSolid;
Drawer.Drawing.Canvas.FillRect(0, 0, Drawer.Drawing.Width, Drawer.Drawing.Height); Drawer.Drawing.Canvas.FillRect(0, 0, Drawer.Drawing.Width, Drawer.Drawing.Height);
lPage := FVec.GetPage(0); lPage := FVec.GetPage(0);
if lPage = nil then if lPage = nil then
Exception.Create('The document has no pages'); Exception.Create('The document has no pages');
if lPage is TvTextPageSequence then YAxisMultiplier := 1.0; lPageHeight := Drawer.Height;
lPage.GetNaturalRenderPos(lPageHeight, YAxisMultiplier);
if checkForceWhiteBackground.Checked then lPage.BackgroundColor := colWhite; if checkForceWhiteBackground.Checked then lPage.BackgroundColor := colWhite;
if not checkForceWhiteBackground.Checked then if not checkForceWhiteBackground.Checked then
lPage.DrawBackground(Drawer.Drawing.Canvas); lPage.DrawBackground(Drawer.Drawing.Canvas);
lPage.Render( lPage.Render(
Drawer.Drawing.Canvas, Drawer.Drawing.Canvas,
Drawer.PosX, Drawer.PosX,
Drawer.Drawing.Height - Drawer.PosY, Drawer.Drawing.Height + Drawer.PosY,
spinScale.Value, spinScale.Value,
YAxisMultiplier * spinScale.Value); YAxisMultiplier * spinScale.Value);
if checkShowPage.Checked then if checkShowPage.Checked then
@ -348,10 +333,12 @@ var
begin begin
Render_PrepareFile(); Render_PrepareFile();
try try
Render_Calc_Drawer_Size();
lPage := FVec.GetPage(0); lPage := FVec.GetPage(0);
lPage.AutoFit(Drawer.Drawing.Canvas, lPage.AutoFit(Drawer.Drawing.Canvas, Drawer.Width, Drawer.Height,
Drawer.Width, Drawer.Height, Drawer.Drawing.Height, lDeltaX, lDeltaY, lZoom);
lDeltaX, lDeltaY, lZoom); if Sender <> nil then Drawer.Invalidate;
spinAdjustX.Value := lDeltaX; spinAdjustX.Value := lDeltaX;
spinAdjustY.Value := lDeltaY; spinAdjustY.Value := lDeltaY;
spinScale.Value := lZoom; spinScale.Value := lZoom;
@ -411,8 +398,12 @@ begin
printDialog.Free; printDialog.Free;
end; end;
procedure TfrmFPVViewer.buttonRenderingTestClick(Sender: TObject); procedure TfrmFPVViewer.buttonAutoFitViewClick(Sender: TObject);
var begin
buttonAutoFitClick(nil);
btnVisualizeClick(nil);
end;
{var
VecDoc: TvVectorialDocument; VecDoc: TvVectorialDocument;
Vec: TvVectorialPage; Vec: TvVectorialPage;
begin begin
@ -448,7 +439,7 @@ begin
finally finally
Vec.Free; Vec.Free;
end; end;
end; end;}
procedure TfrmFPVViewer.buttonViewDebugInfoClick(Sender: TObject); procedure TfrmFPVViewer.buttonViewDebugInfoClick(Sender: TObject);
begin begin
@ -569,6 +560,30 @@ begin
labelFileEncoding.Caption := 'File encoding: ' + FVec.Encoding; labelFileEncoding.Caption := 'File encoding: ' + FVec.Encoding;
end; end;
procedure TfrmFPVViewer.Render_Calc_Drawer_Size;
const
FPVVIEWER_MAX_IMAGE_SIZE = 1000;
FPVVIEWER_MIN_IMAGE_SIZE = 100;
var
CanvasSize: TPoint;
begin
// 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;
Drawer.Drawing.Width := CanvasSize.X;
Drawer.Drawing.Height := CanvasSize.Y;
end;
procedure TfrmFPVViewer.Render_DoRender(ACanvasSizeX, ACanvasSizeY, procedure TfrmFPVViewer.Render_DoRender(ACanvasSizeX, ACanvasSizeY,
ADrawerPosX, ADrawerPosY: Integer; AScale: Double); ADrawerPosX, ADrawerPosY: Integer; AScale: Double);
const const