Qt: fixed few memleaks in Qt library with our handling of QRegion. Each reference created by QPainter_clipRegion() must be destroyed.Small optimization in TQtWidgetSet.IntersectClipRect.

git-svn-id: trunk@31622 -
This commit is contained in:
zeljko 2011-07-09 17:26:23 +00:00
parent de79ddfe3f
commit da5f9a5670
2 changed files with 37 additions and 17 deletions

View File

@ -2977,9 +2977,14 @@ begin
{$ifdef VerboseQt}
Write('TQtDeviceContext.region() ');
{$endif}
if vRegion.Widget=nil then
if vRegion.Widget <> nil then
begin
QRegion_destroy(vRegion.Widget);
vRegion.Widget := nil;
end;
if vRegion.Widget = nil then
vRegion.Widget := QRegion_Create();
QPainter_clipRegion(Widget, vRegion.Widget);
Result := vRegion;
end;

View File

@ -2489,7 +2489,7 @@ end;
function TQtWidgetSet.GetClipRGN(DC : hDC; RGN : hRGN): Longint;
begin
{$ifdef VerboseQtWinAPI}
Write('Trace: [WinAPI GetClipRgn]',
Writeln('Trace: [WinAPI GetClipRgn]',
' DC: ', dbghex(DC),
' RGN: ', dbghex(Rgn));
if RGN<>0 then
@ -2501,13 +2501,21 @@ begin
Result := -1;
if not IsValidDC(DC) then
exit;
if rgn=0 then
if Rgn = 0 then
exit;
if not TQtDeviceContext(DC).getClipping then
Result := 0
else
begin
QPainter_ClipRegion(TQtDeviceContext(DC).Widget, TQtRegion(Rgn).Widget);
// if our TQtRegion contains widget then
// first destroy it because QPainter creates
// new reference.
if TQtRegion(Rgn).Widget <> nil then
begin
QRegion_destroy(TQtRegion(Rgn).Widget);
TQtRegion(Rgn).Widget := QRegion_create;
end;
QPainter_clipRegion(TQtDeviceContext(DC).Widget, TQtRegion(Rgn).Widget);
Result := 1;
end;
end;
@ -4419,26 +4427,33 @@ begin
if not IsValidDC(DC) then exit;
IntersectRgn := QRegion_create(Left, Top, Right - Left, Bottom - Top);
Rgn := QRegion_create;
try
if QtDC.getClipping then
begin
QPainter_clipRegion(QtDC.Widget, Rgn);
if QRegion_isEmpty(Rgn) then
QtDC.setClipRegion(IntersectRgn)
else
QtDC.setClipRegion(IntersectRgn, QtIntersectClip);
end
else
Rgn := QRegion_create;
try
QPainter_clipRegion(QtDC.Widget, Rgn);
if QRegion_isEmpty(Rgn) then
QtDC.setClipRegion(IntersectRgn)
else
QtDC.setClipRegion(IntersectRgn, QtIntersectClip);
QtDC.setClipping(True);
// recreate Rgn
QRegion_destroy(Rgn);
Rgn := QRegion_create;
QPainter_clipRegion(QtDC.Widget, Rgn);
Result := QtDC.GetRegionType(Rgn);
finally
QRegion_destroy(Rgn);
end;
end else
begin
QtDC.setClipRegion(InterSectRgn);
QPainter_clipRegion(QtDC.Widget, Rgn);
QtDC.setClipping(True);
Result := QtDC.GetRegionType(InterSectRgn);
end;
QtDC.setClipping(True);
Result := QtDC.GetRegionType(Rgn);
finally
QRegion_destroy(IntersectRgn);
QRegion_destroy(Rgn);
end;
end;