You've already forked lazarus-ccr
126 lines
3.1 KiB
ObjectPascal
126 lines
3.1 KiB
ObjectPascal
![]() |
unit FastBitmap;
|
||
|
|
||
|
{$mode objfpc}{$H+}
|
||
|
|
||
|
interface
|
||
|
|
||
|
uses
|
||
|
Classes;
|
||
|
|
||
|
type
|
||
|
|
||
|
TFastBitmapPixel = integer;
|
||
|
(*TFastBitmapPixel = record
|
||
|
Blue: Byte;
|
||
|
Green: Byte;
|
||
|
Red: Byte;
|
||
|
end;*)
|
||
|
PFastBitmapPixel = ^TFastBitmapPixel;
|
||
|
|
||
|
TFastBitmapPixelComponents = packed record
|
||
|
B, G, R, A: byte;
|
||
|
end;
|
||
|
|
||
|
const
|
||
|
FastPixelSize = SizeOf(TFastBitmapPixel);
|
||
|
|
||
|
type
|
||
|
{ TFastBitmap }
|
||
|
|
||
|
TFastBitmap = class
|
||
|
private
|
||
|
FPixelsData: PByte;
|
||
|
FSize: TPoint;
|
||
|
function GetPixel(X, Y: integer): TFastBitmapPixel; inline;
|
||
|
procedure SetPixel(X, Y: integer; const AValue: TFastBitmapPixel); inline;
|
||
|
procedure SetSize(const AValue: TPoint);
|
||
|
public
|
||
|
constructor Create;
|
||
|
destructor Destroy; override;
|
||
|
procedure RandomImage;
|
||
|
property Size: TPoint read FSize write SetSize;
|
||
|
property Pixels[X, Y: integer]: TFastBitmapPixel read GetPixel write SetPixel;
|
||
|
property PixelsData: PByte read FPixelsData;
|
||
|
end;
|
||
|
|
||
|
function RGBA(red, green, blue, alpha: byte): integer;
|
||
|
function SwapBRComponent(Value: integer): integer; inline;
|
||
|
function NoSwapBRComponent(Value: integer): integer; inline;
|
||
|
|
||
|
implementation
|
||
|
|
||
|
function RGBA(red, green, blue, alpha: byte): integer;
|
||
|
var
|
||
|
tmp: TFastBitmapPixelComponents;
|
||
|
begin
|
||
|
tmp.R := red;
|
||
|
tmp.G := green;
|
||
|
tmp.B := blue;
|
||
|
tmp.A := alpha;
|
||
|
Result := TFastBitmapPixel(tmp);
|
||
|
end;
|
||
|
|
||
|
function SwapBRComponent(Value: integer): integer;
|
||
|
begin
|
||
|
// Result := (Value and $00ff00) or ((Value shr 16) and $ff) or ((Value and $ff) shl 16);
|
||
|
Result := Value;
|
||
|
TFastBitmapPixelComponents(Result).R := TFastBitmapPixelComponents(Value).B;
|
||
|
TFastBitmapPixelComponents(Result).B := TFastBitmapPixelComponents(Value).R;
|
||
|
end;
|
||
|
|
||
|
function NoSwapBRComponent(Value: integer): integer;
|
||
|
begin
|
||
|
// Result := (Value and $00ff00) or ((Value shr 16) and $ff) or ((Value and $ff) shl 16);
|
||
|
Result := Value;
|
||
|
TFastBitmapPixelComponents(Result).B := TFastBitmapPixelComponents(Value).B;
|
||
|
TFastBitmapPixelComponents(Result).R := TFastBitmapPixelComponents(Value).R;
|
||
|
end;
|
||
|
|
||
|
{ TFastBitmap }
|
||
|
|
||
|
function TFastBitmap.GetPixel(X, Y: integer): TFastBitmapPixel;
|
||
|
begin
|
||
|
Result := PFastBitmapPixel(FPixelsData + (Y * FSize.X + X) * FastPixelSize)^;
|
||
|
end;
|
||
|
|
||
|
procedure TFastBitmap.SetPixel(X, Y: integer; const AValue: TFastBitmapPixel);
|
||
|
begin
|
||
|
PFastBitmapPixel(FPixelsData + (Y * FSize.X + X) * FastPixelSize)^ := AValue;
|
||
|
end;
|
||
|
|
||
|
procedure TFastBitmap.SetSize(const AValue: TPoint);
|
||
|
begin
|
||
|
if (FSize.X = AValue.X) and (FSize.Y = AValue.X) then
|
||
|
Exit;
|
||
|
FSize := AValue;
|
||
|
FPixelsData := ReAllocMem(FPixelsData, FSize.X * FSize.Y * FastPixelSize);
|
||
|
end;
|
||
|
|
||
|
constructor TFastBitmap.Create;
|
||
|
begin
|
||
|
Size := Point(0, 0);
|
||
|
end;
|
||
|
|
||
|
destructor TFastBitmap.Destroy;
|
||
|
begin
|
||
|
FreeMem(FPixelsData);
|
||
|
inherited Destroy;
|
||
|
end;
|
||
|
|
||
|
procedure TFastBitmap.RandomImage;
|
||
|
var
|
||
|
I, X, Y: integer;
|
||
|
begin
|
||
|
for I := 0 to 2 do
|
||
|
for Y := 0 to (Size.Y div 2) - 1 do
|
||
|
for X := 0 to (Size.X div 3) - 1 do
|
||
|
Pixels[X + (I * (Size.X div 3)), Y] := 255 shl (I * 8);
|
||
|
|
||
|
for Y := (Size.Y div 2) to Size.Y - 1 do
|
||
|
for X := 0 to Size.X - 1 do
|
||
|
Pixels[X, Y] := Random(256) or (Random(256) shl 16) or (Random(256) shl 8);
|
||
|
end;
|
||
|
|
||
|
|
||
|
end.
|