rendered paste bodyunit bmpBitmapRec;
interface
uses
SysUtils, /// not needed
Graphics,
bitmapUtils;
type
PBitmapDataRec = ^TBitmapDataRec;
TBitmapDataRec = record
width : Integer;
height : Integer;
bitdepth : Integer;
memorybase : Pointer;
rowoffset : Integer;
end;
function bmprec_make(src : TBitmap): PBitmapDataRec; overload;
procedure bmprec_make(src : TBitmap; datarec : PBitmapDataRec); overload;
procedure bmprec_dispose(datarec : PBitmapDataRec);
procedure bmprec_clear(datarec : PBitmapDataRec);
function bmprec_scanline(datarec : PBitmapDataRec; y : Integer): Pointer; overload;
function bmprec_scanline(datarec : PBitmapDataRec; x, y : Integer): Pointer; overload;
implementation
procedure bmprec_make(src : TBitmap; datarec : PBitmapDataRec); overload;
begin
datarec.width := src.Width;
datarec.height := src.Height;
datarec.bitdepth := bmpPixelFormatToBitDepth(src.PixelFormat);
if datarec.height = 0 then
begin
datarec.memorybase := nil;
datarec.rowoffset := 0
end
else
begin
datarec.memorybase := src.Scanline[0];
datarec.rowoffset := Integer(src.Scanline[1]) - Integer(src.Scanline[0]);
end;
end;
function bmprec_make(src : TBitmap): PBitmapDataRec; overload;
begin
GetMem(result, SizeOf(TBitmapDataRec));
bmprec_make(src, result);
end;
procedure bmprec_dispose(datarec : PBitmapDataRec);
begin
FreeMem(datarec, SizeOf(TBitmapDataRec));
end;
procedure bmprec_clear(datarec : PBitmapDataRec);
begin
FillChar(datarec^, SizeOf(TBitmapDataRec), 0);
end;
function bmprec_scanline(datarec : PBitmapDataRec; y : Integer): Pointer; overload;
begin
result := Pointer(Integer(datarec.memorybase) + y * datarec.rowoffset);
end;
function bmprec_scanline(datarec : PBitmapDataRec; x, y : Integer): Pointer; overload;
begin
result := Pointer(Integer(datarec.memorybase) + y * datarec.rowoffset + x * (datarec.bitdepth shr 3));
end;
end.