mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-17 17:29:21 +02:00
fpvectorial: Adds support for guessing the document size and zoom level
git-svn-id: trunk@18250 -
This commit is contained in:
parent
8673b93ed5
commit
02d1a26d92
@ -2035,6 +2035,10 @@ begin
|
|||||||
|
|
||||||
// Make sure we have at least one path
|
// Make sure we have at least one path
|
||||||
AData.EndPath();
|
AData.EndPath();
|
||||||
|
|
||||||
|
// PostScript has no document size information, so lets calculate it ourselves
|
||||||
|
AData.GuessDocumentSize();
|
||||||
|
AData.GuessGoodZoomLevel()
|
||||||
end;
|
end;
|
||||||
|
|
||||||
initialization
|
initialization
|
||||||
|
@ -146,6 +146,8 @@ type
|
|||||||
they might contain.
|
they might contain.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{ TvEntity }
|
||||||
|
|
||||||
TvEntity = class
|
TvEntity = class
|
||||||
public
|
public
|
||||||
{@@ The global Pen for the entire entity. In the case of paths, individual
|
{@@ The global Pen for the entire entity. In the case of paths, individual
|
||||||
@ -155,6 +157,8 @@ type
|
|||||||
elements might be able to override this setting. }
|
elements might be able to override this setting. }
|
||||||
Brush: TvBrush;
|
Brush: TvBrush;
|
||||||
constructor Create; virtual;
|
constructor Create; virtual;
|
||||||
|
procedure CalculateBoundingBox(var ALeft, ATop, ARight, ABottom: Double); virtual;
|
||||||
|
procedure ExpandBoundingBox(var ALeft, ATop, ARight, ABottom: Double);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
TvClipMode = (vcmNonzeroWindingRule, vcmEvenOddRule);
|
TvClipMode = (vcmNonzeroWindingRule, vcmEvenOddRule);
|
||||||
@ -169,6 +173,7 @@ type
|
|||||||
procedure Assign(ASource: TPath);
|
procedure Assign(ASource: TPath);
|
||||||
procedure PrepareForSequentialReading;
|
procedure PrepareForSequentialReading;
|
||||||
function Next(): TPathSegment;
|
function Next(): TPathSegment;
|
||||||
|
procedure CalculateBoundingBox(var ALeft, ATop, ARight, ABottom: Double); override;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{@@
|
{@@
|
||||||
@ -265,8 +270,10 @@ type
|
|||||||
public
|
public
|
||||||
Width, Height: Double; // in millimeters
|
Width, Height: Double; // in millimeters
|
||||||
Name: string;
|
Name: string;
|
||||||
|
// User-Interface information
|
||||||
|
ZoomLevel: Double; // 1 = 100%
|
||||||
{ Base methods }
|
{ Base methods }
|
||||||
constructor Create;
|
constructor Create; virtual;
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
procedure Assign(ASource: TvVectorialDocument);
|
procedure Assign(ASource: TvVectorialDocument);
|
||||||
procedure AssignTo(ADest: TvVectorialDocument);
|
procedure AssignTo(ADest: TvVectorialDocument);
|
||||||
@ -280,13 +287,15 @@ type
|
|||||||
procedure ReadFromStrings(AStrings: TStrings; AFormat: TvVectorialFormat);
|
procedure ReadFromStrings(AStrings: TStrings; AFormat: TvVectorialFormat);
|
||||||
class function GetFormatFromExtension(AFileName: string): TvVectorialFormat;
|
class function GetFormatFromExtension(AFileName: string): TvVectorialFormat;
|
||||||
function GetDetailedFileFormat(): string;
|
function GetDetailedFileFormat(): string;
|
||||||
|
procedure GuessDocumentSize();
|
||||||
|
procedure GuessGoodZoomLevel(AScreenSize: Integer = 500);
|
||||||
{ Data reading methods }
|
{ Data reading methods }
|
||||||
function GetPath(ANum: Cardinal): TPath;
|
function GetPath(ANum: Cardinal): TPath;
|
||||||
function GetPathCount: Integer;
|
function GetPathCount: Integer;
|
||||||
function GetEntity(ANum: Cardinal): TvEntity;
|
function GetEntity(ANum: Cardinal): TvEntity;
|
||||||
function GetEntitiesCount: Integer;
|
function GetEntitiesCount: Integer;
|
||||||
{ Data removing methods }
|
{ Data removing methods }
|
||||||
procedure Clear;
|
procedure Clear; virtual;
|
||||||
{ Data writing methods }
|
{ Data writing methods }
|
||||||
procedure AddEntity(AEntity: TvEntity);
|
procedure AddEntity(AEntity: TvEntity);
|
||||||
procedure AddPathCopyMem(APath: TPath);
|
procedure AddPathCopyMem(APath: TPath);
|
||||||
@ -477,6 +486,25 @@ begin
|
|||||||
Brush.Color := colBlue;
|
Brush.Color := colBlue;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TvEntity.CalculateBoundingBox(var ALeft, ATop, ARight, ABottom: Double);
|
||||||
|
begin
|
||||||
|
ALeft := 0;
|
||||||
|
ATop := 0;
|
||||||
|
ARight := 0;
|
||||||
|
ABottom := 0;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TvEntity.ExpandBoundingBox(var ALeft, ATop, ARight, ABottom: Double);
|
||||||
|
var
|
||||||
|
lLeft, lTop, lRight, lBottom: Double;
|
||||||
|
begin
|
||||||
|
CalculateBoundingBox(lLeft, lTop, lRight, lBottom);
|
||||||
|
if lLeft < ALeft then ALeft := lLeft;
|
||||||
|
if lTop < ATop then ATop := lTop;
|
||||||
|
if lRight > ARight then ARight := lRight;
|
||||||
|
if lBottom > ABottom then ABottom := lBottom;
|
||||||
|
end;
|
||||||
|
|
||||||
{ TvEllipse }
|
{ TvEllipse }
|
||||||
|
|
||||||
procedure TvEllipse.CalculateBoundingRectangle;
|
procedure TvEllipse.CalculateBoundingRectangle;
|
||||||
@ -1073,6 +1101,32 @@ begin
|
|||||||
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TvVectorialDocument.GuessDocumentSize();
|
||||||
|
var
|
||||||
|
i: Integer;
|
||||||
|
lEntity: TvEntity;
|
||||||
|
lLeft, lTop, lRight, lBottom: Double;
|
||||||
|
begin
|
||||||
|
lLeft := 0;
|
||||||
|
lTop := 0;
|
||||||
|
lRight := 0;
|
||||||
|
lBottom := 0;
|
||||||
|
|
||||||
|
for i := 0 to GetEntitiesCount() - 1 do
|
||||||
|
begin
|
||||||
|
lEntity := GetEntity(I);
|
||||||
|
lEntity.ExpandBoundingBox(lLeft, lTop, lRight, lBottom);
|
||||||
|
end;
|
||||||
|
|
||||||
|
Width := lRight - lLeft;
|
||||||
|
Height := lBottom - lTop;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TvVectorialDocument.GuessGoodZoomLevel(AScreenSize: Integer);
|
||||||
|
begin
|
||||||
|
ZoomLevel := AScreenSize / Height;
|
||||||
|
end;
|
||||||
|
|
||||||
function TvVectorialDocument.GetPath(ANum: Cardinal): TPath;
|
function TvVectorialDocument.GetPath(ANum: Cardinal): TPath;
|
||||||
var
|
var
|
||||||
i: Integer;
|
i: Integer;
|
||||||
@ -1257,6 +1311,42 @@ begin
|
|||||||
CurPoint := Result;
|
CurPoint := Result;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TPath.CalculateBoundingBox(var ALeft, ATop, ARight, ABottom: Double);
|
||||||
|
var
|
||||||
|
lSegment: TPathSegment;
|
||||||
|
l2DSegment: T2DSegment;
|
||||||
|
lFirstValue: Boolean = True;
|
||||||
|
begin
|
||||||
|
inherited CalculateBoundingBox(ALeft, ATop, ARight, ABottom);
|
||||||
|
|
||||||
|
PrepareForSequentialReading();
|
||||||
|
lSegment := Next();
|
||||||
|
while lSegment <> nil do
|
||||||
|
begin
|
||||||
|
if lSegment is T2DSegment then
|
||||||
|
begin
|
||||||
|
l2DSegment := T2DSegment(lSegment);
|
||||||
|
if lFirstValue then
|
||||||
|
begin
|
||||||
|
ALeft := l2DSegment.X;
|
||||||
|
ATop := l2DSegment.Y;
|
||||||
|
ARight := l2DSegment.X;
|
||||||
|
ABottom := l2DSegment.Y;
|
||||||
|
lFirstValue := False;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
if l2DSegment.X < ALeft then ALeft := l2DSegment.X;
|
||||||
|
if l2DSegment.Y < ATop then ATop := l2DSegment.Y;
|
||||||
|
if l2DSegment.X > ARight then ARight := l2DSegment.X;
|
||||||
|
if l2DSegment.Y > ABottom then ABottom := l2DSegment.Y;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
lSegment := Next();
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
finalization
|
finalization
|
||||||
|
|
||||||
SetLength(GvVectorialFormats, 0);
|
SetLength(GvVectorialFormats, 0);
|
||||||
|
Loading…
Reference in New Issue
Block a user