Qt5: fixed slowness with TQtPrinter under MSWindows

(cherry picked from commit 09a4c2fbd4)
This commit is contained in:
zeljan1 2021-11-10 12:59:21 +01:00 committed by Maxim Ganetsky
parent 18931fadc2
commit 0068f0ee45

View File

@ -13,6 +13,13 @@
Uses InterfaceBase, LCLIntf; Uses InterfaceBase, LCLIntf;
{.$DEFINE UsePrinterSupportedPapers} {.$DEFINE UsePrinterSupportedPapers}
{$IFDEF MSWINDOWS}
{$DEFINE QTPAPERSONDEMAND}
{$ENDIF}
{$IF DEFINED(QTPAPERSONDEMAND) AND DEFINED(UsePrinterSupportedPapers)}
{$UNDEF UsePrinterSupportedPapers}
{$ENDIF}
const const
DEFAULT_PAPER_NAME = 'A4'; DEFAULT_PAPER_NAME = 'A4';
@ -182,18 +189,32 @@ var
//CustomPageSize should be automatically set by setting different paper size //CustomPageSize should be automatically set by setting different paper size
//than known paper size. Qt4 asserts when CustomPageSize is directly setted up. //than known paper size. Qt4 asserts when CustomPageSize is directly setted up.
{$IFNDEF QTPAPERSONDEMAND}
{$IFDEF LCLQt} {$IFDEF LCLQt}
if (pgSize > 30) then if pgSize < 30 then
{$ENDIF} {$ENDIF}
QtDefaultPrinter.PageSize := PgSize; QtDefaultPrinter.PageSize := PgSize;
{$ENDIF}
FPapers[i].PageSize := PgSize; FPapers[i].PageSize := PgSize;
{$IFDEF QTPAPERSONDEMAND}
FPapers[i].PageRect := Rect(0, 0, 0, 0);
FPapers[i].PaperRect := Rect(0, 0, 0, 0);
// imediatelly fill current papersize
if QtDefaultPrinter.PageSize = FPapers[i].PageSize then
begin
{$ENDIF}
FPapers[i].PageRect := QtDefaultPrinter.PageRect; FPapers[i].PageRect := QtDefaultPrinter.PageRect;
FPapers[i].PaperRect := QtDefaultPrinter.PaperRect; FPapers[i].PaperRect := QtDefaultPrinter.PaperRect;
{$IFDEF QTPAPERSONDEMAND}
end;
{$ENDIF}
if PaperName=DEFAULT_PAPER_NAME then if PaperName=DEFAULT_PAPER_NAME then
FDefaultPaperIndex := i; FDefaultPaperIndex := i;
if pgSize=30 then if pgSize=30 then
customPaperAdded := true; customPaperAdded := true;
//DebugLn('Cached: %20s PaperRect=%s PageRect=%s',[PaperName, dbgs(FPapers[i].PaperRect), dbgs(FPapers[i].PageRect)]); // DebugLn('Cached: %20s PaperRect=%s PageRect=%s pgSize %d',[PaperName, dbgs(FPapers[i].PaperRect), dbgs(FPapers[i].PageRect), pgSize]);
end; end;
procedure AddAll; procedure AddAll;
@ -207,6 +228,7 @@ var
oldPageSize := QtDefaultPrinter.PageSize; oldPageSize := QtDefaultPrinter.PageSize;
for i:=QPagedPaintDeviceA4 to QPagedPaintDeviceCustom do for i:=QPagedPaintDeviceA4 to QPagedPaintDeviceCustom do
Add(ArrPapers[i], i); Add(ArrPapers[i], i);
if oldPageSize <> QtDefaultPrinter.PageSize then
QtDefaultPrinter.PageSize := oldPageSize; QtDefaultPrinter.PageSize := oldPageSize;
{$ELSE} {$ELSE}
for i:=QPrinterA4 to QPrinterCustom do for i:=QPrinterA4 to QPrinterCustom do
@ -486,6 +508,13 @@ begin
if i >= 0 then if i >= 0 then
begin begin
QtDefaultPrinter.PageSize := FPapers[i].PageSize; QtDefaultPrinter.PageSize := FPapers[i].PageSize;
{$IFDEF QTPAPERSONDEMAND}
if FPapers[i].PaperRect = Rect(0, 0, 0, 0) then
begin
FPapers[i].PageRect := QtDefaultPrinter.PageRect;
FPapers[i].PaperRect := QtDefaultPrinter.PaperRect;
end;
{$ENDIF}
DoSetOrientation(O); DoSetOrientation(O);
end else end else
raise Exception.Create('TQtPrinters: Paper '+AName+' not supported.'); raise Exception.Create('TQtPrinters: Paper '+AName+' not supported.');
@ -495,6 +524,9 @@ function TQtPrinters.DoGetPaperRect(aName: string; var aPaperRc: TPaperRect
): Integer; ): Integer;
var var
i: Integer; i: Integer;
{$IFDEF QTPAPERSONDEMAND}
APageSize: {$IFDEF LCLQt}QPrinterPageSize{$ELSE}QPagedPaintDevicePageSize{$ENDIF};
{$ENDIF}
begin begin
DoInitializeCachePapers; DoInitializeCachePapers;
{$IFDEF VERBOSE_QT_PRINTING} {$IFDEF VERBOSE_QT_PRINTING}
@ -507,7 +539,17 @@ begin
begin begin
{When we set QPrinter into FullPage, rect is not same {When we set QPrinter into FullPage, rect is not same
on all platforms, this is fixed with qt-4.4} on all platforms, this is fixed with qt-4.4}
if Orientation in [poPortrait, poReversePortrait] then begin {$IFDEF QTPAPERSONDEMAND}
APageSize := QtDefaultPrinter.PageSize;
if (PaperRect = Rect(0, 0, 0, 0)) then
begin
QtDefaultPrinter.PageSize := PageSize;
PageRect := QtDefaultPrinter.PageRect;
PaperRect := QtDefaultPrinter.PaperRect;
end;
{$ENDIF}
if Orientation in [poPortrait, poReversePortrait] then
begin
APaperRC.WorkRect := PageRect; APaperRC.WorkRect := PageRect;
APaperRC.PhysicalRect := PaperRect; APaperRC.PhysicalRect := PaperRect;
end else begin end else begin
@ -516,6 +558,10 @@ begin
APaperRC.PhysicalRect := APaperRC.PhysicalRect :=
Rect(PaperRect.Top, PaperRect.Left, PaperRect.Bottom, PaperRect.Right); Rect(PaperRect.Top, PaperRect.Left, PaperRect.Bottom, PaperRect.Right);
end; end;
{$IFDEF QTPAPERSONDEMAND}
if APageSize <> QtDefaultPrinter.PageSize then
QtDefaultPrinter.PageSize := APageSize;
{$ENDIF}
Result := 1; Result := 1;
end; end;
end; end;
@ -523,6 +569,7 @@ end;
function TQtPrinters.DoSetPrinter(aName: string): Integer; function TQtPrinters.DoSetPrinter(aName: string): Integer;
var var
StrList: TStringList; StrList: TStringList;
i: integer;
begin begin
DoInitializeCachePapers; DoInitializeCachePapers;
{$IFDEF VERBOSE_QT_PRINTING} {$IFDEF VERBOSE_QT_PRINTING}
@ -540,6 +587,22 @@ begin
if not QtDefaultPrinter.PrinterActive then if not QtDefaultPrinter.PrinterActive then
begin begin
QtDefaultPrinter.PrinterName := UTF8Decode(aName); QtDefaultPrinter.PrinterName := UTF8Decode(aName);
{$IFDEF QTPAPERSONDEMAND}
for i := 0 to High(FPapers) do
begin
if FPapers[i].PageSize = QtDefaultPrinter.PageSize then
begin
if FPapers[i].PaperRect = Rect(0, 0, 0, 0) then
begin
FPapers[i].PageRect := QtDefaultPrinter.PageRect;
FPapers[i].PaperRect := QtDefaultPrinter.PaperRect;
end;
break;
end;
end;
{$ENDIF}
{$ifdef UsePrinterSupportedPapers} {$ifdef UsePrinterSupportedPapers}
CachePapers(true); CachePapers(true);
{$endif} {$endif}