mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-09-05 10:00:40 +02:00
CairoCanvas: fix margins from Julio Jiménez Borreguero
git-svn-id: trunk@40646 -
This commit is contained in:
parent
65d6d21e1d
commit
63070f2a5e
@ -18,10 +18,13 @@ type
|
|||||||
|
|
||||||
TCairoPrinterCanvas = Class(TFilePrinterCanvas)
|
TCairoPrinterCanvas = Class(TFilePrinterCanvas)
|
||||||
private
|
private
|
||||||
|
FLazClipRect : TRect;
|
||||||
procedure SelectFontEx(AStyle: TFontStyles; const AName: string;
|
procedure SelectFontEx(AStyle: TFontStyles; const AName: string;
|
||||||
ASize: double);
|
ASize: double);
|
||||||
function SX(x: double): double;
|
function SX(x: double): double;
|
||||||
function SY(y: double): double;
|
function SY(y: double): double;
|
||||||
|
function SX2(x: double): double;
|
||||||
|
function SY2(y: double): double;
|
||||||
procedure SetSourceColor(Color: TColor);
|
procedure SetSourceColor(Color: TColor);
|
||||||
procedure SetPenProperties;
|
procedure SetPenProperties;
|
||||||
procedure SetBrushProperties;
|
procedure SetBrushProperties;
|
||||||
@ -41,6 +44,7 @@ type
|
|||||||
procedure CreateCairoHandle(BaseHandle: HDC); virtual;
|
procedure CreateCairoHandle(BaseHandle: HDC); virtual;
|
||||||
procedure DestroyCairoHandle; virtual;
|
procedure DestroyCairoHandle; virtual;
|
||||||
procedure SetHandle(NewHandle: HDC); override;
|
procedure SetHandle(NewHandle: HDC); override;
|
||||||
|
procedure BeginDoc; override;
|
||||||
procedure EndDoc; override;
|
procedure EndDoc; override;
|
||||||
procedure NewPage; override;
|
procedure NewPage; override;
|
||||||
procedure CreateBrush; override;
|
procedure CreateBrush; override;
|
||||||
@ -238,6 +242,13 @@ begin
|
|||||||
CreateCairoHandle(NewHandle);
|
CreateCairoHandle(NewHandle);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TCairoPrinterCanvas.BeginDoc;
|
||||||
|
begin
|
||||||
|
inherited BeginDoc;
|
||||||
|
if assigned(printer) then
|
||||||
|
FLazClipRect:=printer.PaperSize.PaperRect.WorkRect;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TCairoPrinterCanvas.EndDoc;
|
procedure TCairoPrinterCanvas.EndDoc;
|
||||||
begin
|
begin
|
||||||
inherited EndDoc;
|
inherited EndDoc;
|
||||||
@ -280,10 +291,20 @@ end;
|
|||||||
|
|
||||||
function TCairoPrinterCanvas.SX(x: double): double;
|
function TCairoPrinterCanvas.SX(x: double): double;
|
||||||
begin
|
begin
|
||||||
Result := ScaleX*x;
|
Result := ScaleX*(x+FLazClipRect.Left);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TCairoPrinterCanvas.SY(y: double): double;
|
function TCairoPrinterCanvas.SY(y: double): double;
|
||||||
|
begin
|
||||||
|
Result := ScaleY*(y+FLazClipRect.Top);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TCairoPrinterCanvas.SX2(x: double): double;
|
||||||
|
begin
|
||||||
|
Result := ScaleX*x;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TCairoPrinterCanvas.SY2(y: double): double;
|
||||||
begin
|
begin
|
||||||
Result := ScaleY*y;
|
Result := ScaleY*y;
|
||||||
end;
|
end;
|
||||||
@ -304,7 +325,7 @@ begin
|
|||||||
Changing;
|
Changing;
|
||||||
RequiredState([csHandleValid, csBrushValid, csPenValid]);
|
RequiredState([csHandleValid, csBrushValid, csPenValid]);
|
||||||
SetPenProperties;
|
SetPenProperties;
|
||||||
cairo_rectangle(cr, SX(X1), SY(Y1), SX(X2-X1), SY(Y2-Y1));
|
cairo_rectangle(cr, SX(X1), SY(Y1), SX2(X2-X1), SY2(Y2-Y1));
|
||||||
FillAndStroke;
|
FillAndStroke;
|
||||||
Changed;
|
Changed;
|
||||||
end;
|
end;
|
||||||
@ -314,7 +335,7 @@ procedure TCairoPrinterCanvas.FrameRect(const ARect: TRect);
|
|||||||
begin
|
begin
|
||||||
Changing;
|
Changing;
|
||||||
RequiredState([csHandleValid, csBrushValid]);
|
RequiredState([csHandleValid, csBrushValid]);
|
||||||
cairo_rectangle(cr, SX(ARect.Left), SY(ARect.Top), SX(ARect.Right-ARect.Left), SY(ARect.Bottom-ARect.Top));
|
cairo_rectangle(cr, SX(ARect.Left), SY(ARect.Top), SX2(ARect.Right-ARect.Left), SY2(ARect.Bottom-ARect.Top));
|
||||||
SetSourceColor(Brush.Color);
|
SetSourceColor(Brush.Color);
|
||||||
cairo_set_line_width(cr, 1);
|
cairo_set_line_width(cr, 1);
|
||||||
cairo_stroke(cr); //Don't touch
|
cairo_stroke(cr); //Don't touch
|
||||||
@ -325,7 +346,7 @@ procedure TCairoPrinterCanvas.Frame(const ARect: TRect);
|
|||||||
begin
|
begin
|
||||||
Changing;
|
Changing;
|
||||||
RequiredState([csHandleValid, csPenValid]);
|
RequiredState([csHandleValid, csPenValid]);
|
||||||
cairo_rectangle(cr, SX(ARect.Left), SY(ARect.Top), SX(ARect.Right-ARect.Left), SY(ARect.Bottom-ARect.Top));
|
cairo_rectangle(cr, SX(ARect.Left), SY(ARect.Top), SX2(ARect.Right-ARect.Left), SY2(ARect.Bottom-ARect.Top));
|
||||||
cairo_set_line_width(cr, 1);
|
cairo_set_line_width(cr, 1);
|
||||||
SetSourceColor(Pen.Color);
|
SetSourceColor(Pen.Color);
|
||||||
cairo_stroke(cr); //Don't touch
|
cairo_stroke(cr); //Don't touch
|
||||||
@ -340,7 +361,7 @@ begin
|
|||||||
cairo_save(cr);
|
cairo_save(cr);
|
||||||
try
|
try
|
||||||
cairo_translate(cr, SX(CX), SY(CY));
|
cairo_translate(cr, SX(CX), SY(CY));
|
||||||
cairo_scale(cr, SX(RX), SY(RY));
|
cairo_scale(cr, SX2(RX), SY2(RY));
|
||||||
if not Continuous then
|
if not Continuous then
|
||||||
cairo_move_to(cr, cos(Angle1), sin(Angle1)); //Move to arcs starting point
|
cairo_move_to(cr, cos(Angle1), sin(Angle1)); //Move to arcs starting point
|
||||||
if Clockwise then
|
if Clockwise then
|
||||||
@ -670,8 +691,8 @@ begin
|
|||||||
cairo_save(cr);
|
cairo_save(cr);
|
||||||
try
|
try
|
||||||
s := Text;
|
s := Text;
|
||||||
BoxWidth := SX(ARect.Right-ARect.Left);
|
BoxWidth := SX2(ARect.Right-ARect.Left);
|
||||||
BoxHeight := SY(ARect.Bottom-ARect.Top);
|
BoxHeight := SY2(ARect.Bottom-ARect.Top);
|
||||||
BoxLeft := SX(ARect.Left);
|
BoxLeft := SX(ARect.Left);
|
||||||
BoxTop := SY(ARect.Top);
|
BoxTop := SY(ARect.Top);
|
||||||
StartLeft := SX(X1);
|
StartLeft := SX(X1);
|
||||||
@ -896,7 +917,7 @@ begin
|
|||||||
cairo_translate(cr, SX(DestRect.Left), SY(DestRect.Top));
|
cairo_translate(cr, SX(DestRect.Left), SY(DestRect.Top));
|
||||||
SW := (DestRect.Right - DestRect.Left)/W;
|
SW := (DestRect.Right - DestRect.Left)/W;
|
||||||
SH := (DestRect.Bottom - DestRect.Top)/H;
|
SH := (DestRect.Bottom - DestRect.Top)/H;
|
||||||
cairo_scale(cr, SX(SW), SY(SH));
|
cairo_scale(cr, SX2(SW), SY2(SH));
|
||||||
cairo_set_source_surface(cr, sf, 0, 0);
|
cairo_set_source_surface(cr, sf, 0, 0);
|
||||||
cairo_paint(cr);
|
cairo_paint(cr);
|
||||||
cairo_surface_destroy(sf);
|
cairo_surface_destroy(sf);
|
||||||
@ -957,7 +978,7 @@ procedure TCairoPrinterCanvas.FillRect(const ARect: TRect);
|
|||||||
begin
|
begin
|
||||||
Changing;
|
Changing;
|
||||||
RequiredState([csHandleValid, csBrushValid]);
|
RequiredState([csHandleValid, csBrushValid]);
|
||||||
cairo_rectangle(cr, SX(ARect.Left), SY(ARect.Top), SX(ARect.Right-ARect.Left), SY(ARect.Bottom-ARect.Top));
|
cairo_rectangle(cr, SX(ARect.Left), SY(ARect.Top), SX2(ARect.Right-ARect.Left), SY2(ARect.Bottom-ARect.Top));
|
||||||
FillOnly;
|
FillOnly;
|
||||||
Changed;
|
Changed;
|
||||||
end;
|
end;
|
||||||
|
Loading…
Reference in New Issue
Block a user