diff --git a/lcl/interfaces/gtk2/gtk2winapi.inc b/lcl/interfaces/gtk2/gtk2winapi.inc index 977b225057..47bb71d9e1 100644 --- a/lcl/interfaces/gtk2/gtk2winapi.inc +++ b/lcl/interfaces/gtk2/gtk2winapi.inc @@ -3823,6 +3823,7 @@ var Foreground, BackgroundColor: PGDKColor; CurDx: PInteger; CurStr: PChar; + R: TRect; procedure DoTextOut(X,Y : Integer; Str: Pchar; CurCount: Integer); var @@ -3854,12 +3855,14 @@ begin if DevCtx.GC <> nil then; // create GC - if ((Options and (ETO_OPAQUE+ETO_CLIPPED)) <> 0) - and (Rect=nil) - then begin - DebugLn('WARNING: [TGtk2WidgetSet.ExtTextOut] Rect=nil'); - Result := False; - exit; + if ((Options and (ETO_OPAQUE+ETO_CLIPPED)) <> 0) and + (Rect=nil) then + begin + R := RectFromGdkRect(DevCtx.ClipRect); + OffsetRect(R, -R.Left, -R.Top); + OffsetRect(R, X, Y); + DrawText(DC, Str, Count, R, DT_SINGLELINE or DT_CALCRECT); + Rect := @R; end; BackgroundColor := nil; @@ -3868,12 +3871,12 @@ begin DCOrigin := DevCtx.Offset; - if (Options and ETO_CLIPPED) <> 0 - then begin + if (Options and ETO_CLIPPED) <> 0 then + begin X := Rect^.Left; Y := Rect^.Top; IntersectClipRect(DC, Rect^.Left, Rect^.Top, - Rect^.Right, Rect^.Bottom); + Rect^.Right, Rect^.Bottom); end; if DevCtx.HasTransf then diff --git a/lcl/interfaces/qt/qtwinapi.inc b/lcl/interfaces/qt/qtwinapi.inc index 2b0421d4ce..28e8f6082d 100644 --- a/lcl/interfaces/qt/qtwinapi.inc +++ b/lcl/interfaces/qt/qtwinapi.inc @@ -2181,6 +2181,7 @@ var WideStr: WideString; QtDC: TQtDeviceContext absolute DC; B: Boolean; + R, R1: TRect; begin {$ifdef VerboseQtWinAPI} WriteLn('[WinAPI ExtTextOut]'); @@ -2188,13 +2189,21 @@ begin Result := False; - if ((Options and (ETO_OPAQUE + ETO_CLIPPED)) <> 0) and (Rect = nil) then - exit; - if not IsValidDC(DC) then Exit; - if ((Options and ETO_OPAQUE) <> 0) then - QtDC.fillRect(Rect^.Left, Rect^.Top, Rect^.Right - Rect^.Left, Rect^.Bottom - Rect^.Top); + if ((Options and (ETO_OPAQUE + ETO_CLIPPED)) <> 0) and (Rect = nil) then + begin + if Count >= 0 then + WideStr := GetUtf8String(Copy(Str, 1, Count)) + else + WideStr := GetUtf8String(Str); + + R := QtDC.getClipRegion.getBoundingRect; + QtDC.font.Metrics.boundingRect(@R1, @R, 0, @WideStr); + Rect := @R1; + end else + if ((Options and ETO_OPAQUE) <> 0) and (Rect <> nil) then + QtDC.fillRect(Rect^.Left, Rect^.Top, Rect^.Right - Rect^.Left, Rect^.Bottom - Rect^.Top); if Str <> nil then begin