Ignore:
Timestamp:
Jan 3, 2024, 3:05:32 PM (4 months ago)
Author:
chronos
Message:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Packages/DpiControls/Dpi.Common.pas

    r476 r514  
    55uses
    66  {$IFDEF WINDOWS}Windows,{$ENDIF}
    7   Classes, SysUtils, LCLType, Types, LCLIntf, Graphics, Dpi.Graphics;
     7  Classes, SysUtils, LCLType, Types, Math, LCLIntf, Graphics, Dpi.Graphics;
    88
    99const
     
    100100function ScaleToNative(Value: Integer): Integer;
    101101begin
    102   Result := Round(Value * ScreenInfo.Dpi / 96);
     102  Result := Ceil(Value * ScreenInfo.Dpi / 96);
    103103end;
    104104
     
    110110function ScaleFromNative(Value: Integer): Integer;
    111111begin
    112   Result := Round(Value * 96 / ScreenInfo.Dpi);
     112  Result := Floor(Value * 96 / ScreenInfo.Dpi);
    113113end;
    114114
     
    185185  DstWidth, DstHeight: Integer;
    186186  SrcWidth, SrcHeight: Integer;
     187  ReduceWidth, ReduceHeight: Integer;
    187188begin
    188189  {$IFDEF WINDOWS}
     
    193194  {$ELSE}
    194195
    195 
    196196  DstWidth := ScaleToNativeDist(X, Width);
    197197  DstHeight := ScaleToNativeDist(Y, Height);
    198198  SrcWidth := ScaleToNativeDist(XSrc, Width);
    199199  SrcHeight := ScaleToNativeDist(YSrc, Height);
     200  if (Frac(ScaleFloatToNative(XSrc)) > 0) or
     201    (Frac(ScaleFloatToNative(X)) > 0) then ReduceWidth := 1
     202    else ReduceWidth := 0;
     203  if (Frac(ScaleFloatToNative(YSrc)) > 0) or
     204    (Frac(ScaleFloatToNative(Y)) > 0) then ReduceHeight := 1
     205    else ReduceHeight := 0;
    200206  if (DstWidth = SrcWidth) and (DstHeight = SrcHeight) then begin
    201207    Result := LCLIntf.BitBlt(DestDC, ScaleToNative(X), ScaleToNative(Y),
     
    204210  end else begin
    205211    Result := LCLIntf.BitBlt(DestDC, ScaleToNative(X), ScaleToNative(Y),
    206       DstWidth, DstHeight, SrcDC,
     212      DstWidth - ReduceWidth, DstHeight - ReduceHeight, SrcDC,
    207213      ScaleToNative(XSrc), ScaleToNative(YSrc), Rop);
    208 {    Result := LCLIntfStretchBlt(DestDC, ScaleToNative(X), ScaleToNative(Y),
     214
     215    // Instead calling StretchBlt for entire region try to draw missing part with BitBlt
     216    if DstWidth > SrcWidth then begin
     217      LCLIntf.BitBlt(DestDC, ScaleToNative(X) + SrcWidth, ScaleToNative(Y),
     218        DstWidth - SrcWidth, DstHeight, SrcDC,
     219        ScaleToNative(XSrc) + SrcWidth - (DstWidth - SrcWidth), ScaleToNative(YSrc), Rop);
     220    end;
     221    if DstHeight > SrcHeight then begin
     222      LCLIntf.BitBlt(DestDC, ScaleToNative(X), ScaleToNative(Y) + SrcHeight,
     223        DstWidth, DstHeight - SrcHeight, SrcDC,
     224        ScaleToNative(XSrc), ScaleToNative(YSrc) + SrcHeight - (DstHeight - SrcHeight), Rop);
     225    end;
     226
     227  {  Result := LCLIntf.StretchBlt(DestDC, ScaleToNative(X), ScaleToNative(Y),
    209228      DstWidth, DstHeight, SrcDC,
    210229      ScaleToNative(XSrc), ScaleToNative(YSrc),
    211       SrcWidth, SrcHeight, Rop);
    212 }  end;
     230      SrcWidth, SrcHeight, Rop);}
     231  end;
    213232
    214233{  Result := LCLIntf.BitBlt(DestDC, ScaleToNative(X), ScaleToNative(Y),
Note: See TracChangeset for help on using the changeset viewer.