From da5f9a56703b405d9f37231104d3f33d4a89029d Mon Sep 17 00:00:00 2001 From: zeljko Date: Sat, 9 Jul 2011 17:26:23 +0000 Subject: [PATCH] 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 - --- lcl/interfaces/qt/qtobjects.pas | 9 +++++-- lcl/interfaces/qt/qtwinapi.inc | 45 ++++++++++++++++++++++----------- 2 files changed, 37 insertions(+), 17 deletions(-) diff --git a/lcl/interfaces/qt/qtobjects.pas b/lcl/interfaces/qt/qtobjects.pas index 9c6d4779b2..ff7bf8a128 100644 --- a/lcl/interfaces/qt/qtobjects.pas +++ b/lcl/interfaces/qt/qtobjects.pas @@ -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; diff --git a/lcl/interfaces/qt/qtwinapi.inc b/lcl/interfaces/qt/qtwinapi.inc index 494c108b20..ab9f7eeb6b 100644 --- a/lcl/interfaces/qt/qtwinapi.inc +++ b/lcl/interfaces/qt/qtwinapi.inc @@ -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;