Ignore:
Timestamp:
Apr 17, 2019, 12:58:41 AM (5 years ago)
Author:
chronos
Message:
  • Modified: Propagate project build mode options to used packages.
  • Added: Check memory leaks using heaptrc.
  • Modified: Update BGRABitmap package.
Location:
GraphicTest
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • GraphicTest

    • Property svn:ignore
      •  

        old new  
        88GraphicTest.lps
        99GraphicTest.dbg
         10heaptrclog.trc
  • GraphicTest/Packages/bgrabitmap/bgragtkbitmap.pas

    r494 r521  
    3838    FPixBuf: Pointer;
    3939    procedure DrawTransparent(ACanvas: TCanvas; Rect: TRect);
    40     procedure DrawOpaque(ACanvas: TCanvas; Rect: TRect);
     40    procedure DrawOpaque(ACanvas: TCanvas; ARect: TRect; ASourceRect: TRect);
     41    procedure DrawOpaque(ACanvas: TCanvas; ARect: TRect);
    4142  protected
    4243    procedure ReallocData; override;
     
    4647      AData: Pointer; ALineOrder: TRawImageLineOrder; AWidth, AHeight: integer);
    4748      override;
     49    procedure DrawPart(ARect: TRect; ACanvas: TCanvas; x, y: integer; Opaque: boolean); override;
    4850    procedure Draw(ACanvas: TCanvas; x, y: integer; Opaque: boolean = True); override;
    4951    procedure Draw(ACanvas: TCanvas; Rect: TRect; Opaque: boolean = True); override;
    50     procedure DataDrawOpaque(ACanvas: TCanvas; Rect: TRect; AData: Pointer;
    51       ALineOrder: TRawImageLineOrder; AWidth, AHeight: integer); override;
     52    procedure DataDrawOpaque(ACanvas: TCanvas; ARect: TRect; AData: Pointer;
     53      ALineOrder: TRawImageLineOrder; AWidth, AHeight: integer); overload; override;
     54    procedure DataDrawOpaque(ACanvas: TCanvas; ARect: TRect; ADataFirstRow: Pointer;
     55      ARowStride: integer; AWidth, AHeight: integer); overload;
    5256    procedure GetImageFromCanvas(CanvasSource: TCanvas; x, y: integer); override;
    5357  end;
     
    5559implementation
    5660
    57 uses BGRABitmapTypes, BGRADefaultBitmap, LCLType,
     61uses BGRABitmapTypes, BGRADefaultBitmap, BGRAFilterScanner, LCLType,
    5862  LCLIntf, IntfGraphics,
    5963  {$IFDEF LCLgtk2}
     
    6468  {$ENDIF}
    6569  FPImage, Dialogs;
    66 
    67 {$IFDEF LCLgtk2}
    68 type TGtkDeviceContext = TGtk2DeviceContext;
    69 {$ENDIF}
    7070
    7171procedure TBGRAGtkBitmap.ReallocData;
     
    116116  end;
    117117
     118  LoadFromBitmapIfNeeded;
     119
    118120  If not TBGRAPixel_RGBAOrder then SwapRedBlue;
    119121 
     
    130132end;
    131133
    132 procedure TBGRAGtkBitmap.DrawOpaque(ACanvas: TCanvas; Rect: TRect);
    133 begin
    134   DataDrawOpaque(ACanvas,Rect,Data,LineOrder,Width,Height);
     134procedure TBGRAGtkBitmap.DrawOpaque(ACanvas: TCanvas; ARect: TRect;
     135  ASourceRect: TRect);
     136begin
     137  DataDrawOpaque(ACanvas,ARect,Data,LineOrder,Width,Height);
     138end;
     139
     140procedure TBGRAGtkBitmap.DrawOpaque(ACanvas: TCanvas; ARect: TRect);
     141begin
     142  DrawOpaque(ACanvas, ARect, rect(0,0,Width,Height));
    135143end;
    136144
     
    166174end;
    167175
     176procedure TBGRAGtkBitmap.DrawPart(ARect: TRect; ACanvas: TCanvas; x,
     177  y: integer; Opaque: boolean);
     178var
     179  rowStride,w,h: Integer;
     180begin
     181  if Opaque then
     182  begin
     183    if LineOrder = riloTopToBottom then
     184      rowStride := Width*sizeof(TBGRAPixel)
     185    else
     186      rowStride := -Width*sizeof(TBGRAPixel);
     187    w:= ARect.Right-ARect.Left;
     188    h:= ARect.Bottom-ARect.Top;
     189    DataDrawOpaque(ACanvas, rect(x,y,x+w,y+h), Scanline[ARect.Top]+ARect.Left, rowStride, w,h);
     190  end
     191  else
     192    inherited DrawPart(ARect, ACanvas, x, y, Opaque);
     193end;
     194
    168195procedure TBGRAGtkBitmap.Draw(ACanvas: TCanvas; x, y: integer; Opaque: boolean);
    169196begin
     
    186213end;
    187214
    188 procedure TBGRAGtkBitmap.DataDrawOpaque(ACanvas: TCanvas; Rect: TRect;
     215procedure TBGRAGtkBitmap.DataDrawOpaque(ACanvas: TCanvas; ARect: TRect;
    189216  AData: Pointer; ALineOrder: TRawImageLineOrder; AWidth, AHeight: integer);
    190 var ptr: TBGRAPtrBitmap;
     217var
     218  rowStride: Integer;
     219  firstRow: Pointer;
     220begin
     221  if ALineOrder = riloTopToBottom then
     222  begin
     223    rowStride := AWidth*sizeof(TBGRAPixel);
     224    firstRow := AData;
     225  end
     226  else
     227  begin
     228    rowStride := -AWidth*sizeof(TBGRAPixel);
     229    firstRow := PBGRAPixel(AData) + (AWidth*(AHeight-1));
     230  end;
     231
     232  DataDrawOpaque(ACanvas, ARect, firstRow, rowStride, AWidth, AHeight);
     233end;
     234
     235procedure TBGRAGtkBitmap.DataDrawOpaque(ACanvas: TCanvas; ARect: TRect;
     236  ADataFirstRow: Pointer; ARowStride: integer; AWidth, AHeight: integer);
     237
     238  procedure DataSwapRedBlue;
     239  var
     240    y: Integer;
     241    p: PByte;
     242  begin
     243    p := PByte(ADataFirstRow);
     244    for y := 0 to AHeight-1 do
     245    begin
     246      TBGRAFilterScannerSwapRedBlue.ComputeFilterAt(PBGRAPixel(p),PBGRAPixel(p),AWidth,False);
     247      inc(p, ARowStride);
     248    end;
     249  end;
     250
     251  procedure DrawStretched;
     252  var
     253    dataStart: Pointer;
     254    ptr: TBGRAPtrBitmap;
    191255    stretched: TBGRACustomBitmap;
    192     temp: integer;
    193     pos: TPoint;
    194     dest: HDC;
    195 begin
    196   if (AHeight = 0) or (AWidth = 0) or (Rect.Left = Rect.Right) or
    197     (Rect.Top = Rect.Bottom) then
    198     exit;
    199 
    200   if Rect.Right < Rect.Left then
    201   begin
    202     temp := Rect.Left;
    203     Rect.Left := Rect.Right;
    204     Rect.Right := temp;
    205   end;
    206 
    207   if Rect.Bottom < Rect.Top then
    208   begin
    209     temp := Rect.Top;
    210     Rect.Top := Rect.Bottom;
    211     Rect.Bottom := temp;
    212   end;
    213 
    214   if (AWidth <> Rect.Right-Rect.Left) or (AHeight <> Rect.Bottom-Rect.Top) then
    215   begin
    216     ptr := TBGRAPtrBitmap.Create(AWidth,AHeight,AData);
    217     ptr.LineOrder := ALineOrder;
    218     stretched := ptr.Resample(Rect.Right-Rect.Left,Rect.Bottom-Rect.Top);
     256  begin
     257    if ARowStride < 0 then
     258      dataStart := PByte(ADataFirstRow) + ARowStride*(Height-1)
     259    else
     260      dataStart := ADataFirstRow;
     261
     262    if ARowStride <> abs(AWidth*sizeof(TBGRAPixel)) then
     263      raise exception.Create('DataDrawOpaque not supported when using custom row stride and resample');
     264
     265    ptr := TBGRAPtrBitmap.Create(AWidth,AHeight,dataStart);
     266    if ARowStride < 0 then
     267      ptr.LineOrder := riloBottomToTop
     268    else
     269      ptr.LineOrder := riloTopToBottom;
     270    stretched := ptr.Resample(ARect.Right-ARect.Left,ARect.Bottom-ARect.Top);
    219271    ptr.free;
    220     DataDrawOpaque(ACanvas,Rect,AData,stretched.LineOrder,stretched.Width,stretched.Height);
     272    DataDrawOpaque(ACanvas,ARect,stretched.Data,stretched.LineOrder,stretched.Width,stretched.Height);
    221273    stretched.Free;
    222     exit;
    223   end;
    224 
    225   dest := ACanvas.Handle;
    226   pos := rect.TopLeft;
    227   LPtoDP(dest, pos, 1);
    228   If ALineOrder = riloBottomToTop then VerticalFlip;
    229   If not TBGRAPixel_RGBAOrder then SwapRedBlue;
    230   gdk_draw_rgb_32_image(TGtkDeviceContext(dest).Drawable,
    231     TGtkDeviceContext(Dest).GC, pos.x,pos.y,
    232     AWidth,AHeight, GDK_RGB_DITHER_NORMAL,
    233     AData, AWidth*sizeof(TBGRAPixel));
    234   If not TBGRAPixel_RGBAOrder then SwapRedBlue;
    235   If ALineOrder = riloBottomToTop then VerticalFlip;
     274  end;
     275
     276var
     277  temp: integer;
     278  pos: TPoint;
     279  dest: HDC;
     280
     281begin
     282  if (AHeight = 0) or (AWidth = 0) or (ARect.Left = ARect.Right) or
     283    (ARect.Top = ARect.Bottom) then exit;
     284
     285  if ARect.Right < ARect.Left then
     286  begin
     287    temp := ARect.Left;
     288    ARect.Left := ARect.Right;
     289    ARect.Right := temp;
     290  end;
     291
     292  if ARect.Bottom < ARect.Top then
     293  begin
     294    temp := ARect.Top;
     295    ARect.Top := ARect.Bottom;
     296    ARect.Bottom := temp;
     297  end;
     298
     299  if (AWidth <> ARect.Right-ARect.Left) or (AHeight <> ARect.Bottom-ARect.Top) then
     300    DrawStretched
     301  else
     302  begin
     303    dest := ACanvas.Handle;
     304    pos := ARect.TopLeft;
     305    LPtoDP(dest, pos, 1);
     306    if not TBGRAPixel_RGBAOrder then DataSwapRedBlue;
     307    gdk_draw_rgb_32_image(TGtkDeviceContext(dest).Drawable,
     308      TGtkDeviceContext(Dest).GC, pos.x,pos.y,
     309      AWidth,AHeight, GDK_RGB_DITHER_NORMAL,
     310      ADataFirstRow, ARowStride);
     311    if not TBGRAPixel_RGBAOrder then DataSwapRedBlue;
     312    ACanvas.Changed;
     313  end;
    236314end;
    237315
Note: See TracChangeset for help on using the changeset viewer.