This repository has been archived on 2024-02-26. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
MyPresenter1.0/bgrabitmap/bgraqtbitmap.pas
2015-02-08 16:52:18 -08:00

170 lines
5.5 KiB
ObjectPascal

{
/**************************************************************************\
bgraqtbitmap.pas
-----------------
This unit should NOT be added to the 'uses' clause.
It contains patches for Qt.
****************************************************************************
* *
* This file is part of BGRABitmap library which is distributed under the *
* modified LGPL. *
* *
* See the file COPYING.modifiedLGPL.txt, included in this distribution, *
* for details about the copyright. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
* *
****************************************************************************
}
unit BGRAQtBitmap;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, BGRADefaultBitmap, Graphics,
GraphType;
type
{ TBGRAQtBitmap }
TBGRAQtBitmap = class(TBGRADefaultBitmap)
private
procedure SlowDrawTransparent(ABitmap: TBGRADefaultBitmap;
ACanvas: TCanvas; ARect: TRect);
public
procedure DataDrawTransparent(ACanvas: TCanvas; Rect: TRect;
AData: Pointer; ALineOrder: TRawImageLineOrder; AWidth, AHeight: integer);
override;
procedure Draw(ACanvas: TCanvas; x, y: integer; Opaque: boolean = True); override;
procedure Draw(ACanvas: TCanvas; Rect: TRect; Opaque: boolean = True); override;
procedure DataDrawOpaque(ACanvas: TCanvas; Rect: TRect; AData: Pointer;
ALineOrder: TRawImageLineOrder; AWidth, AHeight: integer);
override;
procedure GetImageFromCanvas(CanvasSource: TCanvas; x, y: integer); override;
end;
implementation
uses BGRABitmapTypes, LCLType,
LCLIntf, IntfGraphics,
qtobjects, qt4,
FPImage;
procedure TBGRAQtBitmap.SlowDrawTransparent(ABitmap: TBGRADefaultBitmap;
ACanvas: TCanvas; ARect: TRect);
begin
ACanvas.StretchDraw(ARect, ABitmap.Bitmap);
end;
procedure TBGRAQtBitmap.DataDrawTransparent(ACanvas: TCanvas; Rect: TRect;
AData: Pointer; ALineOrder: TRawImageLineOrder; AWidth, AHeight: integer);
var
Temp: TBGRAPtrBitmap;
begin
Temp := TBGRAPtrBitmap.Create(AWidth, AHeight, AData);
Temp.LineOrder := ALineOrder;
SlowDrawTransparent(Temp, ACanvas, Rect);
Temp.Free;
end;
procedure TBGRAQtBitmap.Draw(ACanvas: TCanvas; x, y: integer; Opaque: boolean);
begin
if self = nil then
exit;
if Opaque then
DataDrawOpaque(ACanvas, Rect(X, Y, X + Width, Y + Height), Data, FLineOrder,
FWidth, FHeight)
else
SlowDrawTransparent(Self, ACanvas, Rect(X, Y, X + Width, Y + Height));
end;
procedure TBGRAQtBitmap.Draw(ACanvas: TCanvas; Rect: TRect; Opaque: boolean);
begin
if self = nil then
exit;
if Opaque then
DataDrawOpaque(ACanvas, Rect, Data, FLineOrder, FWidth, FHeight)
else
SlowDrawTransparent(Self, ACanvas, Rect);
end;
procedure TBGRAQtBitmap.DataDrawOpaque(ACanvas: TCanvas; Rect: TRect;
AData: Pointer; ALineOrder: TRawImageLineOrder; AWidth, AHeight: integer);
var
Temp: TBitmap;
RawImage: TRawImage;
BitmapHandle, MaskHandle: HBitmap;
CreateSuccess: boolean;
begin
if (AHeight = 0) or (AWidth = 0) then
exit;
RawImage.Init;
RawImage.Description.Init_BPP32_B8G8R8_BIO_TTB(AWidth, AHeight);
RawImage.Description.LineOrder := ALineOrder;
RawImage.Description.LineEnd := rileDWordBoundary;
RawImage.Data := PByte(AData);
RawImage.DataSize := AWidth * AHeight * Sizeof(TBGRAPixel);
CreateSuccess := RawImage_CreateBitmaps(RawImage, BitmapHandle, MaskHandle, False);
if not CreateSuccess then
raise FPImageException.Create('Failed to create bitmap handle');
Temp := TBitmap.Create;
Temp.Handle := BitmapHandle;
Temp.MaskHandle := MaskHandle;
ACanvas.StretchDraw(Rect, Temp);
Temp.Free;
end;
procedure TBGRAQtBitmap.GetImageFromCanvas(CanvasSource: TCanvas; x, y: integer);
var
bmp: TBitmap;
Ofs: TPoint;
SrcX, SrcY: integer;
dcSource, dcDest: TQtDeviceContext;
B: Boolean;
begin
DiscardBitmapChange;
bmp := TBitmap.Create;
bmp.PixelFormat := pf24bit;
bmp.Width := Width;
bmp.Height := Height;
dcDest := TQtDeviceContext(bmp.Canvas.handle);
dcSource := TQtDeviceContext(CanvasSource.Handle);
LCLIntf.GetWindowOrgEx(CanvasSource.Handle, @Ofs);
SrcX := x + Ofs.X;
SrcY := y + Ofs.Y;
{$warning QT: recheck this}
if (dcSource.vImage <> nil) and (dcSource.vImage.Handle <> nil) then
begin
// we must stop painting on device
B := QPainter_isActive(dcDest.Widget);
if B then
QPainter_end(dcDest.Widget);
TQtImage(bmp.Handle).CopyFrom(dcSource.vImage.Handle,
SrcX, SrcY, Width, Height);
if B then
QPainter_begin(dcDest.Widget, TQtImage(bmp.Handle).Handle);
end;
(*
gdk_window_copy_area(dcDest.Drawable, dcDest.GC, 0, 0, dcSource.Drawable,
SrcX, SrcY, Width, Height);
*)
LoadFromRawImage(bmp.RawImage, 255, True);
bmp.Free;
InvalidateBitmap;
end;
end.