Changeset 521 for GraphicTest/Packages/bgrabitmap/bgragtkbitmap.pas
- Timestamp:
- Apr 17, 2019, 12:58:41 AM (5 years ago)
- Location:
- GraphicTest
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
GraphicTest
- Property svn:ignore
-
old new 8 8 GraphicTest.lps 9 9 GraphicTest.dbg 10 heaptrclog.trc
-
- Property svn:ignore
-
GraphicTest/Packages/bgrabitmap/bgragtkbitmap.pas
r494 r521 38 38 FPixBuf: Pointer; 39 39 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); 41 42 protected 42 43 procedure ReallocData; override; … … 46 47 AData: Pointer; ALineOrder: TRawImageLineOrder; AWidth, AHeight: integer); 47 48 override; 49 procedure DrawPart(ARect: TRect; ACanvas: TCanvas; x, y: integer; Opaque: boolean); override; 48 50 procedure Draw(ACanvas: TCanvas; x, y: integer; Opaque: boolean = True); override; 49 51 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; 52 56 procedure GetImageFromCanvas(CanvasSource: TCanvas; x, y: integer); override; 53 57 end; … … 55 59 implementation 56 60 57 uses BGRABitmapTypes, BGRADefaultBitmap, LCLType,61 uses BGRABitmapTypes, BGRADefaultBitmap, BGRAFilterScanner, LCLType, 58 62 LCLIntf, IntfGraphics, 59 63 {$IFDEF LCLgtk2} … … 64 68 {$ENDIF} 65 69 FPImage, Dialogs; 66 67 {$IFDEF LCLgtk2}68 type TGtkDeviceContext = TGtk2DeviceContext;69 {$ENDIF}70 70 71 71 procedure TBGRAGtkBitmap.ReallocData; … … 116 116 end; 117 117 118 LoadFromBitmapIfNeeded; 119 118 120 If not TBGRAPixel_RGBAOrder then SwapRedBlue; 119 121 … … 130 132 end; 131 133 132 procedure TBGRAGtkBitmap.DrawOpaque(ACanvas: TCanvas; Rect: TRect); 133 begin 134 DataDrawOpaque(ACanvas,Rect,Data,LineOrder,Width,Height); 134 procedure TBGRAGtkBitmap.DrawOpaque(ACanvas: TCanvas; ARect: TRect; 135 ASourceRect: TRect); 136 begin 137 DataDrawOpaque(ACanvas,ARect,Data,LineOrder,Width,Height); 138 end; 139 140 procedure TBGRAGtkBitmap.DrawOpaque(ACanvas: TCanvas; ARect: TRect); 141 begin 142 DrawOpaque(ACanvas, ARect, rect(0,0,Width,Height)); 135 143 end; 136 144 … … 166 174 end; 167 175 176 procedure TBGRAGtkBitmap.DrawPart(ARect: TRect; ACanvas: TCanvas; x, 177 y: integer; Opaque: boolean); 178 var 179 rowStride,w,h: Integer; 180 begin 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); 193 end; 194 168 195 procedure TBGRAGtkBitmap.Draw(ACanvas: TCanvas; x, y: integer; Opaque: boolean); 169 196 begin … … 186 213 end; 187 214 188 procedure TBGRAGtkBitmap.DataDrawOpaque(ACanvas: TCanvas; Rect: TRect;215 procedure TBGRAGtkBitmap.DataDrawOpaque(ACanvas: TCanvas; ARect: TRect; 189 216 AData: Pointer; ALineOrder: TRawImageLineOrder; AWidth, AHeight: integer); 190 var ptr: TBGRAPtrBitmap; 217 var 218 rowStride: Integer; 219 firstRow: Pointer; 220 begin 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); 233 end; 234 235 procedure 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; 191 255 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); 219 271 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); 221 273 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 276 var 277 temp: integer; 278 pos: TPoint; 279 dest: HDC; 280 281 begin 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; 236 314 end; 237 315
Note:
See TracChangeset
for help on using the changeset viewer.