📄 gr32.pas
字号:
const Info: Cardinal) of object;
TCustomResampler = class;
TBitmap32 = class(TCustomMap)
private
FBits: PColor32Array;
FCanvas: TCanvas;
FClipRect: TRect;
FFixedClipRect: TFixedRect;
F256ClipRect: TRect;
FClipping: Boolean;
FDrawMode: TDrawMode;
FCombineMode: TCombineMode;
FWrapMode: TWrapMode;
FFont: TFont;
FHandle: HBITMAP;
FHDC: HDC;
{$IFDEF CLX}
FPixmap: QPixmapH;
FPainterCount: Integer;
FPixmapActive: Boolean;
FPixmapChanged: Boolean;
{$ELSE}
FBitmapInfo: TBitmapInfo;
{$ENDIF}
FMasterAlpha: Cardinal;
FOuterColor: TColor32;
FPenColor: TColor32;
FStippleCounter: Single;
FStipplePattern: TArrayOfColor32;
FStippleStep: Single;
{$IFDEF DEPRECATEDMODE}
FStretchFilter: TStretchFilter;
{$ENDIF}
FOnHandleChanged: TNotifyEvent;
FOnPixelCombine: TPixelCombineEvent;
FOnAreaChanged: TAreaChangedEvent;
FOldOnAreaChanged: TAreaChangedEvent;
FMeasuringMode: Boolean;
FResampler: TCustomResampler;
procedure FontChanged(Sender: TObject);
procedure CanvasChanged(Sender: TObject);
function GetCanvas: TCanvas;
function GetPixelR(X, Y: Single): TColor32;
function GetPixelPtr(X, Y: Integer): PColor32;
function GetScanLine(Y: Integer): PColor32Array;
{$IFDEF CLX}
function GetBits: PColor32Array;
function GetPixmap: QPixmapH;
function GetPainter: QPainterH;
function GetImage: QImageH;
{$ENDIF}
procedure SetCombineMode(const Value: TCombineMode);
procedure SetDrawMode(Value: TDrawMode);
procedure SetWrapMode(Value: TWrapMode);
procedure SetFont(Value: TFont);
procedure SetMasterAlpha(Value: Cardinal);
{$IFDEF DEPRECATEDMODE}
procedure SetStretchFilter(Value: TStretchFilter);
{$ENDIF}
procedure TextScaleDown(const B, B2: TBitmap32; const N: Integer;
const Color: TColor32); {$IFDEF USEINLINING} inline; {$ENDIF}
procedure TextBlueToAlpha(const B: TBitmap32; const Color: TColor32); {$IFDEF USEINLINING} inline; {$ENDIF}
procedure SetClipRect(const Value: TRect);
procedure SetResampler(Resampler: TCustomResampler);
function GetResamplerClassName: string;
procedure SetResamplerClassName(Value: string);
protected
FontHandle: HFont;
RasterX, RasterY: Integer;
RasterXF, RasterYF: TFixed;
procedure AssignTo(Dst: TPersistent); override;
procedure ChangeSize(var Width, Height: Integer; NewWidth, NewHeight: Integer); override;
procedure CopyMapTo(Dst: TBitmap32); virtual;
procedure CopyPropertiesTo(Dst: TBitmap32); virtual;
procedure HandleChanged; virtual;
function Equal(B: TBitmap32): Boolean;
procedure SET_T256(X, Y: Integer; C: TColor32);
procedure SET_TS256(X, Y: Integer; C: TColor32);
function GET_T256(X, Y: Integer): TColor32;
function GET_TS256(X, Y: Integer): TColor32;
procedure ReadData(Stream: TStream); virtual;
procedure WriteData(Stream: TStream); virtual;
procedure DefineProperties(Filer: TFiler); override;
function GetPixel(X, Y: Integer): TColor32;
function GetPixelS(X, Y: Integer): TColor32;
function GetPixelW(X, Y: Integer): TColor32;
function GetPixelF(X, Y: Single): TColor32;
function GetPixelFS(X, Y: Single): TColor32;
function GetPixelFW(X, Y: Single): TColor32;
function GetPixelX(X, Y: TFixed): TColor32;
function GetPixelXS(X, Y: TFixed): TColor32;
function GetPixelXW(X, Y: TFixed): TColor32;
function GetPixelB(X, Y: Integer): TColor32;
procedure SetPixel(X, Y: Integer; Value: TColor32);
procedure SetPixelS(X, Y: Integer; Value: TColor32);
procedure SetPixelW(X, Y: Integer; Value: TColor32);
procedure SetPixelF(X, Y: Single; Value: TColor32);
procedure SetPixelFS(X, Y: Single; Value: TColor32);
procedure SetPixelFW(X, Y: Single; Value: TColor32);
procedure SetPixelX(X, Y: TFixed; Value: TColor32);
procedure SetPixelXS(X, Y: TFixed; Value: TColor32);
procedure SetPixelXW(X, Y: TFixed; Value: TColor32);
{$IFDEF CLX}
procedure PixmapNeeded;
procedure ImageNeeded;
procedure CheckPixmap;
procedure StartPainter;
procedure StopPainter;
{$ENDIF}
public
constructor Create; override;
destructor Destroy; override;
procedure Assign(Source: TPersistent); override;
function BoundsRect: TRect;
function Empty: Boolean; override;
procedure Clear; overload;
procedure Clear(FillColor: TColor32); overload;
procedure Delete; override;
procedure BeginMeasuring(const Callback: TAreaChangedEvent);
procedure EndMeasuring;
procedure PropertyChanged;
procedure Changed; overload; override;
procedure Changed(const Area: TRect; const Info: Cardinal = AREAINFO_RECT); reintroduce; overload; virtual;
procedure LoadFromStream(Stream: TStream);
procedure SaveToStream(Stream: TStream);
procedure LoadFromFile(const FileName: string);
procedure SaveToFile(const FileName: string);
procedure LoadFromResourceID(Instance: THandle; ResID: Integer);
procedure LoadFromResourceName(Instance: THandle; const ResName: string);
procedure ResetAlpha; overload;
procedure ResetAlpha(const AlphaValue: Byte); overload;
procedure Draw(DstX, DstY: Integer; Src: TBitmap32); overload;
procedure Draw(DstX, DstY: Integer; const SrcRect: TRect; Src: TBitmap32); overload;
procedure Draw(const DstRect, SrcRect: TRect; Src: TBitmap32); overload;
{$IFDEF CLX}
procedure Draw(const DstRect, SrcRect: TRect; SrcPixmap: QPixmapH); overload;
{$ELSE}
{$IFDEF BCB}
procedure Draw(const DstRect, SrcRect: TRect; hSrc: Cardinal); overload;
{$ELSE}
procedure Draw(const DstRect, SrcRect: TRect; hSrc: HDC); overload;
{$ENDIF}
{$ENDIF}
procedure SetPixelT(X, Y: Integer; Value: TColor32); overload;
procedure SetPixelT(var Ptr: PColor32; Value: TColor32); overload;
procedure SetPixelTS(X, Y: Integer; Value: TColor32);
procedure DrawTo(Dst: TBitmap32); overload;
procedure DrawTo(Dst: TBitmap32; DstX, DstY: Integer; const SrcRect: TRect); overload;
procedure DrawTo(Dst: TBitmap32; DstX, DstY: Integer); overload;
procedure DrawTo(Dst: TBitmap32; const DstRect: TRect); overload;
procedure DrawTo(Dst: TBitmap32; const DstRect, SrcRect: TRect); overload;
{$IFDEF BCB}
procedure DrawTo(hDst: Cardinal; DstX, DstY: Integer); overload;
procedure DrawTo(hDst: Cardinal; const DstRect, SrcRect: TRect); overload;
procedure TileTo(hDst: Cardinal; const DstRect, SrcRect: TRect);
{$ELSE}
procedure DrawTo(hDst: HDC; DstX, DstY: Integer); overload;
procedure DrawTo(hDst: HDC; const DstRect, SrcRect: TRect); overload;
procedure TileTo(hDst: HDC; const DstRect, SrcRect: TRect);
{$ENDIF}
procedure SetStipple(NewStipple: TArrayOfColor32); overload;
procedure SetStipple(NewStipple: array of TColor32); overload;
procedure AdvanceStippleCounter(LengthPixels: Single);
function GetStippleColor: TColor32;
procedure HorzLine(X1, Y, X2: Integer; Value: TColor32);
procedure HorzLineS(X1, Y, X2: Integer; Value: TColor32);
procedure HorzLineT(X1, Y, X2: Integer; Value: TColor32);
procedure HorzLineTS(X1, Y, X2: Integer; Value: TColor32);
procedure HorzLineTSP(X1, Y, X2: Integer);
procedure VertLine(X, Y1, Y2: Integer; Value: TColor32);
procedure VertLineS(X, Y1, Y2: Integer; Value: TColor32);
procedure VertLineT(X, Y1, Y2: Integer; Value: TColor32);
procedure VertLineTS(X, Y1, Y2: Integer; Value: TColor32);
procedure VertLineTSP(X, Y1, Y2: Integer);
procedure Line(X1, Y1, X2, Y2: Integer; Value: TColor32; L: Boolean = False);
procedure LineS(X1, Y1, X2, Y2: Integer; Value: TColor32; L: Boolean = False);
procedure LineT(X1, Y1, X2, Y2: Integer; Value: TColor32; L: Boolean = False);
procedure LineTS(X1, Y1, X2, Y2: Integer; Value: TColor32; L: Boolean = False);
procedure LineA(X1, Y1, X2, Y2: Integer; Value: TColor32; L: Boolean = False);
procedure LineAS(X1, Y1, X2, Y2: Integer; Value: TColor32; L: Boolean = False);
procedure LineX(X1, Y1, X2, Y2: TFixed; Value: TColor32; L: Boolean = False); overload;
procedure LineF(X1, Y1, X2, Y2: Single; Value: TColor32; L: Boolean = False); overload;
procedure LineXS(X1, Y1, X2, Y2: TFixed; Value: TColor32; L: Boolean = False); overload;
procedure LineFS(X1, Y1, X2, Y2: Single; Value: TColor32; L: Boolean = False); overload;
procedure LineXP(X1, Y1, X2, Y2: TFixed; L: Boolean = False); overload;
procedure LineFP(X1, Y1, X2, Y2: Single; L: Boolean = False); overload;
procedure LineXSP(X1, Y1, X2, Y2: TFixed; L: Boolean = False); overload;
procedure LineFSP(X1, Y1, X2, Y2: Single; L: Boolean = False); overload;
property PenColor: TColor32 read FPenColor write FPenColor;
procedure MoveTo(X, Y: Integer);
procedure LineToS(X, Y: Integer; L: Boolean=False); //SAARIXX
procedure LineToTS(X, Y: Integer; L: Boolean=False); //SAARIXX
procedure LineToAS(X, Y: Integer; L: Boolean=False); //SAARIXX
procedure MoveToX(X, Y: TFixed);
procedure MoveToF(X, Y: Single);
procedure LineToXS(X, Y: TFixed; L:Boolean=False); //SAARIXX
procedure LineToFS(X, Y: Single; L: Boolean=False); //SAARIXX
procedure LineToXSP(X, Y: TFixed; L:Boolean=False); //SAARIXX
procedure LineToFSP(X, Y: Single; L: Boolean=False); //SAARIXX
procedure FillRect(X1, Y1, X2, Y2: Integer; Value: TColor32);
procedure FillRectS(X1, Y1, X2, Y2: Integer; Value: TColor32); overload;
procedure FillRectT(X1, Y1, X2, Y2: Integer; Value: TColor32);
procedure FillRectTS(X1, Y1, X2, Y2: Integer; Value: TColor32); overload;
procedure FillRectS(const ARect: TRect; Value: TColor32); overload;
procedure FillRectTS(const ARect: TRect; Value: TColor32); overload;
procedure FrameRectS(X1, Y1, X2, Y2: Integer; Value: TColor32); overload;
procedure FrameRectTS(X1, Y1, X2, Y2: Integer; Value: TColor32); overload;
procedure FrameRectTSP(X1, Y1, X2, Y2: Integer);
procedure FrameRectS(const ARect: TRect; Value: TColor32); overload;
procedure FrameRectTS(const ARect: TRect; Value: TColor32); overload;
procedure RaiseRectTS(X1, Y1, X2, Y2: Integer; Contrast: Integer); overload;
procedure RaiseRectTS(const ARect: TRect; Contrast: Integer); overload;
procedure UpdateFont;
{$IFDEF CLX}
procedure Textout(X, Y: Integer; const Text: Widestring); overload;
procedure Textout(X, Y: Integer; const ClipRect: TRect; const Text: Widestring); overload;
procedure Textout(DstRect: TRect; const Flags: Cardinal; const Text: Widestring); overload;
function TextExtent(const Text: Widestring): TSize;
function TextHeight(const Text: Widestring): Integer;
function TextWidth(const Text: Widestring): Integer;
procedure RenderText(X, Y: Integer; const Text: Widestring; AALevel: Integer; Color: TColor32);
{$ELSE}
procedure Textout(X, Y: Integer; const Text: String); overload;
procedure Textout(X, Y: Integer; const ClipRect: TRect; const Text: String); overload;
procedure Textout(DstRect: TRect; const Flags: Cardinal; const Text: String); overload;
function TextExtent(const Text: String): TSize;
function TextHeight(const Text: String): Integer;
function TextWidth(const Text: String): Integer;
procedure RenderText(X, Y: Integer; const Text: String; AALevel: Integer; Color: TColor32);
{$ENDIF}
procedure TextoutW(X, Y: Integer; const Text: Widestring); overload;
procedure TextoutW(X, Y: Integer; const ClipRect: TRect; const Text: Widestring); overload;
procedure TextoutW(DstRect: TRect; const Flags: Cardinal; const Text: Widestring); overload;
function TextExtentW(const Text: Widestring): TSize;
function TextHeightW(const Text: Widestring): Integer;
function TextWidthW(const Text: Widestring): Integer;
procedure RenderTextW(X, Y: Integer; const Text: Widestring; AALevel: Integer; Color: TColor32);
procedure Roll(Dx, Dy: Integer; FillBack: Boolean; FillColor: TColor32);
procedure FlipHorz(Dst: TBitmap32 = nil);
procedure FlipVert(Dst: TBitmap32 = nil);
procedure Rotate90(Dst: TBitmap32 = nil);
procedure Rotate180(Dst: TBitmap32 = nil);
procedure Rotate270(Dst: TBitmap32 = nil);
procedure ResetClipRect;
property Canvas: TCanvas read GetCanvas;
function CanvasAllocated: Boolean;
procedure DeleteCanvas;
property Pixel[X, Y: Integer]: TColor32 read GetPixel write SetPixel; default;
property PixelS[X, Y: Integer]: TColor32 read GetPixelS write SetPixelS;
property PixelW[X, Y: Integer]: TColor32 read GetPixelW write SetPixelW;
property PixelX[X, Y: TFixed]: TColor32 read GetPixelX write SetPixelX;
property PixelXS[X, Y: TFixed]: TColor32 read GetPixelXS write SetPixelXS;
property PixelXW[X, Y: TFixed]: TColor32 read GetPixelXW write SetPixelXW;
property PixelF[X, Y: Single]: TColor32 read GetPixelF write SetPixelF;
property PixelFS[X, Y: Single]: TColor32 read GetPixelFS write SetPixelFS;
property PixelFW[X, Y: Single]: TColor32 read GetPixelFW write SetPixelFW;
property PixelR[X, Y: Single]: TColor32 read GetPixelR;
{$IFDEF CLX}
property Pixmap: QPixmapH read GetPixmap;
property Image: QImageH read GetImage;
property Bits: PColor32Array read GetBits;
property Handle: QPainterH read GetPainter;
property PixmapChanged: Boolean read FPixmapChanged write FPixmapChanged;
{$ELSE}
property BitmapHandle: HBITMAP read FHandle;
property BitmapInfo: TBitmapInfo read FBitmapInfo;
property Bits: PColor32Array read FBits;
property Handle: HDC read FHDC;
{$ENDIF}
property ClipRect: TRect read FClipRect write SetClipRect;
property Clipping: Boolean read FClipping;
property Font: TFont read FFont write SetFont;
property PixelPtr[X, Y: Integer]: PColor32 read GetPixelPtr;
property ScanLine[Y: Integer]: PColor32Array read GetScanLine;
property StippleCounter: Single read FStippleCounter write FStippleCounter;
property StippleStep: Single read FStippleStep write FStippleStep;
property MeasuringMode: Boolean read FMeasuringMode;
published
property DrawMode: TDrawMode read FDrawMode write SetDrawMode default dmOpaque;
property CombineMode: TCombineMode read FCombineMode write SetCombineMode default cmBlend;
property WrapMode: TWrapMode read FWrapMode write SetWrapMode default wmClamp;
property MasterAlpha: Cardinal read FMasterAlpha write SetMasterAlpha default $FF;
property OuterColor: TColor32 read FOuterColor write FOuterColor default 0;
{$IFDEF DEPRECATEDMODE}
property StretchFilter: TStretchFilter read FStretchFilter write SetStretchFilter default sfNearest;
{$ENDIF}
property ResamplerClassName: string read GetResamplerClassName write SetResamplerClassName;
property Resampler: TCustomResampler read FResampler write SetResampler;
property OnChange;
property OnHandleChanged: TNotifyEvent read FOnHandleChanged write FOnHandleChanged;
property OnPixelCombine: TPixelCombineEvent read FOnPixelCombine write FOnPixelCombine;
property OnAreaChanged: TAreaChangedEvent read FOnAreaChanged write FOnAreaChanged;
property OnResize;
end;
{$IFDEF CLX}
TBitmap32Canvas = class(TCanvas)
private
FBitmap: TBitmap32;
protected
procedure BeginPainting; override;
procedure CreateHandle; override;
public
constructor Create(Bitmap: TBitmap32);
end;
{$ENDIF}
{ TCustomSampler }
TCustomSampler = class(TNotifiablePersistent)
public
function GetSampleInt(X, Y: Integer): TColor32; virtual;
function GetSampleFixed(X, Y: TFixed): TColor32; virtual;
function GetSampleFloat(X, Y: TFloat): TColor32; virtual;
procedure PrepareSampling; virtual;
procedure FinalizeSampling; virtual;
function HasBounds: Boolean; virtual;
function GetSampleBounds: TRect; virtual;
end;
{ TCustomResampler }
TCustomResampler = class(TCustomSampler)
protected
function GetWidth: TFloat; virtual; abstract;
procedure Resample(
Dst: TBitmap32; DstRect: TRect; DstClip: TRect;
Src: TBitmap32; SrcRect: TRect;
CombineOp: TDrawMode; CombineCallBack: TPixelCombineEvent); virtual; abstract;
public
property Width: TFloat read GetWidth;
end;
TCustomResamplerClass = class of TCustomResampler;
implementation
uses
GR32_Blend, GR32_Transforms, GR32_Filters, GR32_LowLevel, GR32_Math, Math,
GR32_System, GR32_Resamplers,
{$IFDEF CLX}
QClipbrd,
{$ELSE}
Clipbrd,
{$ENDIF}
GR32_DrawingEx;
var
{$IFDEF CLX}
StockFont: TFont;
{$ELSE}
StockFont: HFONT;
{$ENDIF}
StockBitmap: TBitmap;
type
TGraphicAccess = class(TGraphic);
const
ZERO_RECT: TRect = (Left: 0; Top: 0; Right: 0; Bottom: 0);
{$IFDEF CLX}
function StretchPixmap(DestPainter: QPainterH; DestX, DestY, DestWidth, DestHeight,
SrcX, SrcY, SrcWidth, SrcHeight: Integer; SrcPixmap: QPixmapH): Integer;
var
NewMatrix: QWMatrixH;
begin
QPainter_saveWorldMatrix(DestPainter);
try
NewMatrix:= QWMatrix_create(DestWidth / SrcWidth, 0, 0, DestHeight / SrcHeight, DestX, DestY);
try
QPainter_setWorldMatrix(DestPainter, NewMatrix, True);
QPainter_drawPixmap(DestPainter, 0, 0, SrcPixmap, SrcX, SrcY, SrcWidth, SrcHeight);
finally
QWMatrix_destroy(NewMatrix);
end;
finally
QPainter_restoreWorldMatrix(DestPainter);
end;
Result := 0;
end;
{$ENDIF}
{ Color construction and conversion functions }
function Color32(WinColor: TColor): TColor32; overload;
{$IFDEF WIN_COLOR_FIX}
var
I: Longword;
{$ENDIF}
begin
{$IFDEF CLX}
WinColor := ColorToRGB(WinColor);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -