From 7a9b188e2c7cc7b4f83f1ceb8ca41426ee78f453 Mon Sep 17 00:00:00 2001 From: paul Date: Tue, 1 Mar 2011 07:37:42 +0000 Subject: [PATCH] lcl, win32, wince, qt, gtk2, carbon: implement OffsetRGN winapi compatible function git-svn-id: trunk@29697 - --- lcl/include/intfbasewinapi.inc | 23 +++++++++++++--------- lcl/include/winapi.inc | 5 +++++ lcl/include/winapih.inc | 1 + lcl/interfaces/carbon/carbongdiobjects.pp | 7 +++++++ lcl/interfaces/carbon/carbonwinapi.inc | 8 ++++++++ lcl/interfaces/carbon/carbonwinapih.inc | 2 ++ lcl/interfaces/gtk2/gtk2winapi.inc | 12 ++++++++++++ lcl/interfaces/gtk2/gtk2winapih.inc | 2 ++ lcl/interfaces/qt/qtwinapi.inc | 24 +++++++++++++++++++++++ lcl/interfaces/qt/qtwinapih.inc | 2 ++ lcl/interfaces/win32/win32winapi.inc | 5 +++++ lcl/interfaces/win32/win32winapih.inc | 2 ++ lcl/interfaces/wince/wincewinapi.inc | 5 +++++ lcl/interfaces/wince/wincewinapih.inc | 2 ++ 14 files changed, 91 insertions(+), 9 deletions(-) diff --git a/lcl/include/intfbasewinapi.inc b/lcl/include/intfbasewinapi.inc index 12b9d92b64..899a85daf8 100644 --- a/lcl/include/intfbasewinapi.inc +++ b/lcl/include/intfbasewinapi.inc @@ -178,7 +178,7 @@ end; function TWidgetSet.CreatePolygonRgn(Points: PPoint; NumPts: Integer; FillMode: integer): HRGN; -Begin +begin Result := 0; end; @@ -334,7 +334,7 @@ begin end; function TWidgetSet.DrawEdge(DC: HDC; var Rect: TRect; edge: Cardinal; grfFlags: Cardinal): Boolean; -Begin +begin Result := False; end; @@ -765,7 +765,7 @@ begin end; function TWidgetSet.EndPaint(Handle : hwnd; var PS : TPaintStruct): Integer; -Begin +begin Result:=1; end; @@ -1297,11 +1297,16 @@ begin Result := False; end; +function TWidgetSet.OffsetRgn(RGN: HRGN; nXOffset, nYOffset: Integer): Integer; +begin + Result := Error; +end; + function TWidgetSet.PeekMessage(var lpMsg : TMsg; Handle : HWND; wMsgFilterMin, wMsgFilterMax,wRemoveMsg : UINT): Boolean; -Begin +begin Result := False; -End; +end; function TWidgetSet.Pie(DC: HDC; x1, y1, x2, y2, sx, sy, ex, ey: Integer): Boolean; @@ -1317,7 +1322,7 @@ function TWidgetSet.PolyBezier(DC: HDC; Points: PPoint; NumPts: Integer; var APoints : PPoint; ACount : Longint; -Begin +begin APoints := nil; ACount := 0; PolyBezier2Polyline(Points,NumPts,APoints,ACount,Continuous); @@ -1402,7 +1407,7 @@ begin end; function TWidgetSet.ReleaseCapture : Boolean; -Begin +begin Result := True; end; @@ -1596,7 +1601,7 @@ end; function TWidgetSet.SetProp(Handle: hwnd; Str : PChar; Data : Pointer) : Boolean; -Begin +begin Result := True; end; @@ -1657,7 +1662,7 @@ end; function TWidgetSet.SetWindowOrgEx(dc : hdc; NewX, NewY : Integer; OldPoint: PPoint) : Boolean; -Begin +begin Result := False; end; diff --git a/lcl/include/winapi.inc b/lcl/include/winapi.inc index c4dd92e0ee..54f3eac9d3 100644 --- a/lcl/include/winapi.inc +++ b/lcl/include/winapi.inc @@ -702,6 +702,11 @@ begin Result := WidgetSet.MoveToEx(DC, X, Y, OldPoint); end; +function OffsetRgn(RGN: HRGN; nXOffset, nYOffset: Integer): Integer; +begin + Result := WidgetSet.OffsetRgn(RGN, nXOffset, nYOffset); +end; + function PeekMessage(var lpMsg : TMsg; Handle : HWND; wMsgFilterMin, wMsgFilterMax,wRemoveMsg : UINT): Boolean; begin diff --git a/lcl/include/winapih.inc b/lcl/include/winapih.inc index 5b9f06c4d1..11d6b62435 100644 --- a/lcl/include/winapih.inc +++ b/lcl/include/winapih.inc @@ -203,6 +203,7 @@ function MonitorFromWindow(hWnd: HWND; dwFlags: DWord): HMONITOR; {$IFDEF IF_BAS function MoveToEx(DC: HDC; X, Y: Integer; OldPoint: PPoint): Boolean; {$IFDEF IF_BASE_MEMBER}virtual;{$ENDIF} //function OffsetRect --> independent +function OffsetRgn(RGN: HRGN; nXOffset, nYOffset: Integer): Integer; {$IFDEF IF_BASE_MEMBER}virtual;{$ENDIF} function PeekMessage(var lpMsg : TMsg; Handle : HWND; wMsgFilterMin, wMsgFilterMax,wRemoveMsg : UINT): Boolean; {$IFDEF IF_BASE_MEMBER}virtual;{$ENDIF} function Pie(DC: HDC; x1, y1, x2, y2, sx, sy, ex, ey: Integer): Boolean; {$IFDEF IF_BASE_MEMBER}virtual;{$ENDIF} diff --git a/lcl/interfaces/carbon/carbongdiobjects.pp b/lcl/interfaces/carbon/carbongdiobjects.pp index beaaf4a7a3..7266fc76c5 100644 --- a/lcl/interfaces/carbon/carbongdiobjects.pp +++ b/lcl/interfaces/carbon/carbongdiobjects.pp @@ -74,6 +74,7 @@ type function ContainsPoint(const P: TPoint): Boolean; procedure SetShape(AShape: HIShapeRef); function CombineWith(ARegion: TCarbonRegion; CombineMode: Integer): Integer; + procedure Offset(dx, dy: Integer); public property Shape: HIShapeRef read FShape write SetShape; end; @@ -839,6 +840,12 @@ begin end; end; +procedure TCarbonRegion.Offset(dx, dy: Integer); +begin + HIShapeOffset(FShape, dx, dy); +end; + + { TCarbonTextLayout } procedure TCarbonTextLayout.Release; diff --git a/lcl/interfaces/carbon/carbonwinapi.inc b/lcl/interfaces/carbon/carbonwinapi.inc index f4ad598cec..d75d692e05 100644 --- a/lcl/interfaces/carbon/carbonwinapi.inc +++ b/lcl/interfaces/carbon/carbonwinapi.inc @@ -2554,6 +2554,14 @@ begin Result := inherited MoveWindowOrgEx(DC, dX, dY); end; +function TCarbonWidgetSet.OffsetRgn(RGN: HRGN; nXOffset, nYOffset: Integer): Integer; +begin + if not (TObject(RGN) is TCarbonRegion) then + Exit(ERROR); + TCarbonRegion(RGN).Offset(nXOffset, nYOffset); + Result := TCarbonRegion(RGN).GetType; +end; + function TCarbonWidgetSet.PeekMessage(var lpMsg: TMsg; Handle: HWND; wMsgFilterMin, wMsgFilterMax, wRemoveMsg: UINT): Boolean; begin diff --git a/lcl/interfaces/carbon/carbonwinapih.inc b/lcl/interfaces/carbon/carbonwinapih.inc index 956f5c3728..eb35764b23 100644 --- a/lcl/interfaces/carbon/carbonwinapih.inc +++ b/lcl/interfaces/carbon/carbonwinapih.inc @@ -159,6 +159,8 @@ function MessageBox(hWnd: HWND; lpText, lpCaption: PChar; uType: Cardinal): inte function MoveToEx(DC: HDC; X, Y: Integer; OldPoint: PPoint): Boolean; override; function MoveWindowOrgEx(DC: HDC; dX, dY: Integer): Boolean; override; +function OffsetRgn(RGN: HRGN; nXOffset, nYOffset: Integer): Integer; override; + function PeekMessage(var lpMsg : TMsg; Handle : HWND; wMsgFilterMin, wMsgFilterMax,wRemoveMsg : UINT): Boolean; override; function PolyBezier(DC: HDC; Points: PPoint; NumPts: Integer; Filled, Continuous: boolean): boolean; override; function Polygon(DC: HDC; Points: PPoint; NumPts: Integer; Winding: boolean): boolean; override; diff --git a/lcl/interfaces/gtk2/gtk2winapi.inc b/lcl/interfaces/gtk2/gtk2winapi.inc index ae5604f21c..7fa44906d2 100644 --- a/lcl/interfaces/gtk2/gtk2winapi.inc +++ b/lcl/interfaces/gtk2/gtk2winapi.inc @@ -6507,6 +6507,18 @@ begin end; end; +function TGtk2WidgetSet.OffsetRgn(RGN: HRGN; nXOffset, nYOffset: Integer): Integer; +var + GdkRGN: PGDKRegion; +begin + if not IsValidGDIObject(RGN) then + Exit(Error); + + GdkRGN := PGdiObject(RGN)^.GDIRegionObject; + gdk_region_offset(GdkRGN, nXOffset, nYOffset); + Result := RegionType(GdkRGN); +end; + {------------------------------------------------------------------------------ Function: PeekMessage diff --git a/lcl/interfaces/gtk2/gtk2winapih.inc b/lcl/interfaces/gtk2/gtk2winapih.inc index 8fd25eccd9..fa6ade2772 100644 --- a/lcl/interfaces/gtk2/gtk2winapih.inc +++ b/lcl/interfaces/gtk2/gtk2winapih.inc @@ -171,6 +171,8 @@ function MessageBox(hWnd: HWND; lpText, lpCaption: PChar; uType: Cardinal): inte function MoveToEx(DC: HDC; X, Y: Integer; OldPoint: PPoint): Boolean; override; function MoveWindowOrgEx(DC: HDC; dX, dY: Integer): Boolean; override; +function OffsetRgn(RGN: HRGN; nXOffset, nYOffset: Integer): Integer; override; + function PeekMessage(var lpMsg : TMsg; Handle : HWND; wMsgFilterMin, wMsgFilterMax,wRemoveMsg : UINT): Boolean; override; function PolyBezier(DC: HDC; Points: PPoint; NumPts: Integer; Filled, Continuous: boolean): boolean; override; function Polygon(DC: HDC; Points: PPoint; NumPts: Integer; Winding: boolean): boolean; override; diff --git a/lcl/interfaces/qt/qtwinapi.inc b/lcl/interfaces/qt/qtwinapi.inc index b17af37f4a..cb325e97db 100644 --- a/lcl/interfaces/qt/qtwinapi.inc +++ b/lcl/interfaces/qt/qtwinapi.inc @@ -4256,6 +4256,30 @@ begin Result := True; end; +function TQtWidgetSet.OffsetRgn(RGN: HRGN; nXOffset, nYOffset: Integer): Integer; +var + QtRgn: QRegionH; +begin + Result := ERROR; + + if not IsValidGDIObject(RGN) then + Exit + else + QtRgn := TQtRegion(RGN).Widget; + + QRegion_translate(QtRgn, nXOffset, nYOffset); + + if QRegion_isEmpty(QtRgn) then + Result := NULLREGION + else + begin + if TQtRegion(RGN).IsPolyRegion or (TQtRegion(RGN).numRects > 0) then + Result := COMPLEXREGION + else + Result := SIMPLEREGION; + end; +end; + function TQtWidgetSet.PeekMessage(var lpMsg : TMsg; Handle : HWND; wMsgFilterMin, wMsgFilterMax,wRemoveMsg : UINT): Boolean; begin Result := False; diff --git a/lcl/interfaces/qt/qtwinapih.inc b/lcl/interfaces/qt/qtwinapih.inc index e15efe5fbe..94691289c4 100644 --- a/lcl/interfaces/qt/qtwinapih.inc +++ b/lcl/interfaces/qt/qtwinapih.inc @@ -159,6 +159,8 @@ function LPtoDP(DC: HDC; var Points; Count: Integer): BOOL; override; function MessageBox(hWnd: HWND; lpText, lpCaption: PChar; uType: Cardinal): integer; override; function MoveToEx(DC: HDC; X, Y: Integer; OldPoint: PPoint): Boolean; override; +function OffsetRgn(RGN: HRGN; nXOffset, nYOffset: Integer): Integer; override; + function PeekMessage(var lpMsg : TMsg; Handle : HWND; wMsgFilterMin, wMsgFilterMax,wRemoveMsg : UINT): Boolean; override; function PolyBezier(DC: HDC; Points: PPoint; NumPts: Integer; Filled, Continuous: boolean): boolean; override; function Polygon(DC: HDC; Points: PPoint; NumPts: Integer; Winding: boolean): boolean; override; diff --git a/lcl/interfaces/win32/win32winapi.inc b/lcl/interfaces/win32/win32winapi.inc index d3bd8057b1..15721dfb11 100644 --- a/lcl/interfaces/win32/win32winapi.inc +++ b/lcl/interfaces/win32/win32winapi.inc @@ -2560,6 +2560,11 @@ begin Assert(False, Format('Trace:< [TWin32WidgetSet.MoveToEx] DC:0x%x, X:%d, Y:%d', [DC, X, Y])); end; +function TWin32WidgetSet.OffsetRgn(RGN: HRGN; nXOffset, nYOffset: Integer): Integer; +begin + Result := Windows.OffsetRgn(RGN, nXOffset, nYOffset); +end; + {------------------------------------------------------------------------------ Method: PeekMessage diff --git a/lcl/interfaces/win32/win32winapih.inc b/lcl/interfaces/win32/win32winapih.inc index aaba1e391f..7c93b6e31e 100644 --- a/lcl/interfaces/win32/win32winapih.inc +++ b/lcl/interfaces/win32/win32winapih.inc @@ -160,6 +160,8 @@ function MonitorFromRect(lprcScreenCoords: PRect; dwFlags: DWord): HMONITOR; ove function MonitorFromWindow(hWnd: HWND; dwFlags: DWord): HMONITOR; override; function MoveToEx(DC: HDC; X, Y: Integer; OldPoint: PPoint): Boolean; override; +function OffsetRgn(RGN: HRGN; nXOffset, nYOffset: Integer): Integer; override; + function PeekMessage(Var LPMsg: TMsg; Handle: HWND; WMsgFilterMin, WMsgFilterMax, WRemoveMsg: UINT): Boolean; override; function Pie(DC: HDC; EllipseX1,EllipseY1,EllipseX2,EllipseY2, StartX,StartY,EndX,EndY: Integer): Boolean; override; diff --git a/lcl/interfaces/wince/wincewinapi.inc b/lcl/interfaces/wince/wincewinapi.inc index 640071e72a..daee32b37b 100644 --- a/lcl/interfaces/wince/wincewinapi.inc +++ b/lcl/interfaces/wince/wincewinapi.inc @@ -2435,6 +2435,11 @@ begin Assert(False, Format('Trace:< [TWinCEWidgetSet.MoveToEx] DC:0x%x, X:%d, Y:%d', [DC, X, Y])); end; +function TWinCEWidgetSet.OffsetRgn(RGN: HRGN; nXOffset, nYOffset: Integer): Integer; +begin + Result := Windows.OffsetRgn(RGN, nXOffset, nYOffset); +end; + {function TWinCEWidgetSet.PolyBezier(DC: HDC; Points: PPoint; NumPts: Integer; Filled, Continuous: boolean): boolean; begin diff --git a/lcl/interfaces/wince/wincewinapih.inc b/lcl/interfaces/wince/wincewinapih.inc index 452a735ab4..cc3d16bd0f 100644 --- a/lcl/interfaces/wince/wincewinapih.inc +++ b/lcl/interfaces/wince/wincewinapih.inc @@ -171,6 +171,8 @@ function MonitorFromRect(lprcScreenCoords: PRect; dwFlags: DWord): HMONITOR; ove function MonitorFromWindow(hWnd: HWND; dwFlags: DWord): HMONITOR; override; function MoveToEx(DC: HDC; X, Y: Integer; OldPoint: PPoint): Boolean; override; +function OffsetRgn(RGN: HRGN; nXOffset, nYOffset: Integer): Integer; override; + function PeekMessage(var lpMsg : TMsg; Handle : HWND; wMsgFilterMin, wMsgFilterMax,wRemoveMsg : UINT): Boolean; override; //function PolyBezier(DC: HDC; Points: PPoint; NumPts: Integer; Filled, Continuous: boolean): boolean; override; function Polygon(DC: HDC; Points: PPoint; NumPts: Integer; Winding: boolean): boolean; override;