285 lines
9.7 KiB
PHP

procedure MyGetScanLine{$i lape.func}
begin
PBGRAPixel(Result^) := target.ScanLine[PInt32(Params^[0])^];
WillInvalidateBitmap(targetIndex);
end;
procedure MyGetBitmapWidth{$i lape.func}
begin
Int32(Result^) := target.Width;
end;
procedure MyGetBitmapHeight{$i lape.func}
begin
Int32(Result^) := target.Height;
end;
procedure MyPtInClipRect{$i lape.func}
begin
LongBool(Result^) := target.PtInClipRect(PInt32(Params^[0])^,PInt32(Params^[1])^);
end;
procedure MyPtInRectPointFirst{$i lape.func}
type PPoint = ^TPoint;
PRect = ^TRect;
begin
LongBool(Result^) := PtInRect(PPoint(Params^[0])^,PRect(Params^[1])^);
end;
procedure MyPtInRectPointLast{$i lape.func}
type PPoint = ^TPoint;
PRect = ^TRect;
begin
LongBool(Result^) := PtInRect(PPoint(Params^[1])^,PRect(Params^[0])^);
end;
procedure MyGetClipRect{$i lape.func}
begin
TRect(Result^) := target.ClipRect;
end;
procedure MySetClipRect{$i lape.proc}
type PRect = ^TRect;
begin
target.ClipRect := PRect(Params^[0])^;
end;
procedure MySetNoClip{$i lape.proc}
begin
target.NoClip;
end;
procedure MyBGRA3{$i lape.func}
begin
TBGRAPixel(Result^) := BGRA(PByte(Params^[0])^,PByte(Params^[1])^,PByte(Params^[2])^);
end;
procedure MyBGRA4{$i lape.func}
begin
TBGRAPixel(Result^) := BGRA(PByte(Params^[0])^,PByte(Params^[1])^,PByte(Params^[2])^,PByte(Params^[3])^);
end;
procedure MySetPixel{$i lape.proc}
begin
target.SetPixel(PInt32(Params^[0])^,PInt32(Params^[1])^,PBGRAPixel(Params^[2])^);
end;
procedure MyNormalPixel{$i lape.proc}
begin
target.DrawPixel(PInt32(Params^[0])^,PInt32(Params^[1])^,PBGRAPixel(Params^[2])^);
end;
procedure MyLinearPixel{$i lape.proc}
begin
target.FastBlendPixel(PInt32(Params^[0])^,PInt32(Params^[1])^,PBGRAPixel(Params^[2])^);
end;
procedure MyXorPixel{$i lape.proc}
begin
target.XorPixel(PInt32(Params^[0])^,PInt32(Params^[1])^,PBGRAPixel(Params^[2])^);
end;
procedure MyErasePixel{$i lape.proc}
begin
target.ErasePixel(PInt32(Params^[0])^,PInt32(Params^[1])^,PByte(Params^[2])^);
end;
procedure MyDrawPixel{$i lape.proc}
begin
case TDrawMode(PInt32(Params^[3])^) of
dmSet: target.SetPixel(PInt32(Params^[0])^,PInt32(Params^[1])^,PBGRAPixel(Params^[2])^);
dmSetExceptTransparent: if PBGRAPixel(Params^[2])^.alpha = 255 then target.SetPixel(PInt32(Params^[0])^,PInt32(Params^[1])^,PBGRAPixel(Params^[2])^);
dmLinearBlend: target.FastBlendPixel(PInt32(Params^[0])^,PInt32(Params^[1])^,PBGRAPixel(Params^[2])^);
dmDrawWithTransparency: target.DrawPixel(PInt32(Params^[0])^,PInt32(Params^[1])^,PBGRAPixel(Params^[2])^);
dmXor: target.XorPixel(PInt32(Params^[0])^,PInt32(Params^[1])^,PBGRAPixel(Params^[2])^);
end;
end;
procedure MyAlphaPixel{$i lape.proc}
begin
target.AlphaPixel(PInt32(Params^[0])^,PInt32(Params^[1])^,PByte(Params^[2])^);
end;
procedure MyGetPixel{$i lape.func}
begin
TBGRAPixel(Result^) := target.GetPixel(PInt32(Params^[0])^,PInt32(Params^[1])^);
end;
procedure MyGetPixelSingle{$i lape.func}
begin
TBGRAPixel(Result^) := target.GetPixel(PSingle(Params^[0])^,PSingle(Params^[1])^);
end;
procedure MyGetPixelSingleCycleX{$i lape.func}
begin
TBGRAPixel(Result^) := target.GetPixelCycle(PSingle(Params^[0])^,PSingle(Params^[1])^,rfLinear,true,false);
end;
procedure MyGetPixelSingleCycleY{$i lape.func}
begin
TBGRAPixel(Result^) := target.GetPixelCycle(PSingle(Params^[0])^,PSingle(Params^[1])^,rfLinear,false,true);
end;
procedure MyGetPixelSingleCycleXY{$i lape.func}
begin
TBGRAPixel(Result^) := target.GetPixelCycle(PSingle(Params^[0])^,PSingle(Params^[1])^,rfLinear,true,true);
end;
procedure MyFill{$i lape.proc}
begin
target.Fill(PBGRAPixel(Params^[0])^);
end;
procedure MyAlphaFill{$i lape.proc}
begin
target.AlphaFill(PByte(Params^[0])^);
end;
procedure MyPutImage{$i lape.proc}
begin
target.PutImage(PInt32(Params^[0])^,PInt32(Params^[1])^, GetBitmap(PInt32(Params^[2])^), TDrawMode(PInt32(Params^[3])^), PByte(Params^[4])^);
end;
procedure MyNewBitmap{$i lape.func}
var idx: integer;
bmp: TBGRABitmap;
begin
bmp := TBGRABitmap.Create(PInt32(Params^[0])^,PInt32(Params^[1])^);
idx := NewBitmapEntry;
Int32(result^) := idx;
bitmaps[idx].Bitmap := bmp;
bitmaps[idx].Registered := false;
end;
procedure MyNewBitmapFromColor{$i lape.func}
var idx: integer;
bmp: TBGRABitmap;
begin
bmp := TBGRABitmap.Create(PInt32(Params^[0])^,PInt32(Params^[1])^,PBGRAPixel(Params^[2])^);
idx := NewBitmapEntry;
Int32(result^) := idx;
bitmaps[idx].Bitmap := bmp;
bitmaps[idx].Registered := false;
end;
procedure MyNewBitmapFromFile{$i lape.func}
var idx: integer;
bmp: TBGRABitmap;
begin
bmp := TBGRABitmap.Create(PlpString(Params^[0])^,true);
idx := NewBitmapEntry;
Int32(result^) := idx;
bitmaps[idx].Bitmap := bmp;
bitmaps[idx].Registered := false;
end;
procedure MySelectedBitmap{$i lape.func}
begin
Int32(result^) := targetIndex;
end;
procedure MyFreeBitmap{$i lape.proc}
var idx: integer;
begin
idx := PInt32(Params^[0])^;
if idx = targetIndex then
raise exception.Create('You cannot free the active bitmap');
FreeBitmap(idx);
end;
procedure MyLockBitmap{$i lape.proc}
var idx: integer;
begin
idx := PInt32(Params^[0])^;
if (idx >= 0) and (idx < length(bitmaps)) then
inc(bitmaps[idx].LockedCount);
end;
procedure MyUnlockBitmap{$i lape.proc}
var idx: integer;
begin
idx := PInt32(Params^[0])^;
if (idx >= 0) and (idx < length(bitmaps)) then
begin
if bitmaps[idx].LockedCount <= 0 then
raise exception.Create('Bitmap is not locked');
dec(bitmaps[idx].LockedCount);
end;
end;
procedure MySelectBitmap{$i lape.proc}
var idx: integer;
begin
idx := PInt32(Params^[0])^;
SetTargetBitmap(idx);
end;
procedure MySetBitmapSize{$i lape.proc}
begin
if (targetIndex >= 0) and (targetIndex < length(bitmaps)) then
begin
if (bitmaps[targetIndex].LockedCount <> 0) then
raise exception.Create('Bitmap is locked');
target.SetSize(PInt32(Params^[0])^,PInt32(Params^[1])^);
end;
end;
procedure MyAssignBitmap{$i lape.proc}
begin
target.Assign(GetBitmap(PInt32(Params^[0])^));
end;
procedure MyDuplicateBitmap{$i lape.func}
var copy: TBGRABitmap;
srcIdx,idx: integer;
begin
srcIdx := PInt32(Params^[0])^;
copy := GetBitmap(srcIdx).Duplicate;
idx := NewBitmapEntry;
bitmaps[idx].Bitmap := copy;
bitmaps[idx].Invalidated := false;
bitmaps[idx].Registered := false;
Int32(result^) := idx;
end;
procedure RegisterBasicFunctions(Compiler: TLapeCompiler);
begin
Compiler.addGlobalFunc('function GetScanLine(y: Int32) : PBGRAPixel;', @MyGetScanline);
Compiler.addGlobalFunc('function BitmapWidth : Int32;', @MyGetBitmapWidth);
Compiler.addGlobalFunc('function BitmapHeight : Int32;', @MyGetBitmapHeight);
Compiler.addGlobalFunc('procedure FillBitmap(c: TBGRAPixel);', @MyFill);
Compiler.addGlobalFunc('procedure FillBitmapAlpha(alpha: byte);', @MyAlphaFill);
Compiler.addGlobalFunc('function BGRA(red,green,blue,alpha: byte): TBGRAPixel;', @MyBGRA4);
Compiler.addGlobalFunc('function BGRA(red,green,blue: byte): TBGRAPixel; overload;', @MyBGRA3);
Compiler.addGlobalFunc('function PtInClipRect(x, y: Int32): LongBool;', @MyPtInClipRect);
Compiler.addGlobalFunc('function GetClipRect: TRect;', @MyGetClipRect);
Compiler.addGlobalFunc('procedure SetClipRect(ARect: TRect);', @MySetClipRect);
Compiler.addGlobalFunc('function PtInRect(const APoint: TPoint; const ARect: TRect): LongBool;', @MyPtInRectPointFirst);
Compiler.addGlobalFunc('function PtInRect(const ARect: TRect; const APoint: TPoint): LongBool; overload;', @MyPtInRectPointLast);
Compiler.addGlobalFunc('procedure NoClip;', @MySetNoClip);
Compiler.addGlobalFunc('procedure SetPixel(x,y: Int32; c: TBGRAPixel);', @MySetPixel);
Compiler.addGlobalFunc('procedure NormalPixel(x,y: Int32; c: TBGRAPixel);', @MyNormalPixel);
Compiler.addGlobalFunc('procedure LinearPixel(x,y: Int32; c: TBGRAPixel);', @MyLinearPixel);
Compiler.addGlobalFunc('procedure XorPixel(x,y: Int32; c: TBGRAPixel);', @MyXorPixel);
Compiler.addGlobalFunc('procedure ErasePixel(x,y: Int32; alpha: byte);', @MyErasePixel);
Compiler.addGlobalFunc('procedure AlphaPixel(x,y: Int32; alpha: byte);', @MyAlphaPixel);
Compiler.addGlobalFunc('procedure _DrawPixel(x,y: Int32; c: TBGRAPixel; ADrawMode: Int32);', @MyDrawPixel);
Compiler.addGlobalFunc('function GetPixel(x,y: Int32): TBGRAPixel;', @MyGetPixel);
Compiler.addGlobalFunc('function GetPixel(x,y: single): TBGRAPixel; overload;', @MyGetPixelSingle);
Compiler.addGlobalFunc('function GetPixelCycle(x,y: single): TBGRAPixel; overload;', @MyGetPixelSingleCycleXY);
Compiler.addGlobalFunc('function GetPixelCycleX(x,y: single): TBGRAPixel; overload;', @MyGetPixelSingleCycleX);
Compiler.addGlobalFunc('function GetPixelCycleY(x,y: single): TBGRAPixel; overload;', @MyGetPixelSingleCycleY);
Compiler.addGlobalFunc('function CreateBitmap(width,height: Int32): TBGRABitmap;', @MyNewBitmap);
Compiler.addGlobalFunc('function CreateBitmap(width,height: Int32; c: TBGRAPixel): TBGRABitmap; overload;', @MyNewBitmapFromColor);
Compiler.addGlobalFunc('function CreateBitmap(filename: string): TBGRABitmap; overload;', @MyNewBitmapFromFile);
Compiler.addGlobalFunc('function SelectedBitmap: TBGRABitmap;', @MySelectedBitmap);
Compiler.addGlobalFunc('procedure TBGRABitmap.Free;', @MyFreeBitmap);
Compiler.addGlobalFunc('procedure TBGRABitmap.Select;', @MySelectBitmap);
Compiler.addGlobalFunc('procedure _PutImage(x,y: Int32; bmp: TBGRABitmap; ADrawMode: Int32; alpha: byte);', @MyPutImage);
Compiler.addGlobalFunc('procedure TBGRABitmap._Lock;', @MyLockBitmap);
Compiler.addGlobalFunc('procedure TBGRABitmap._Unlock;', @MyUnlockBitmap);
Compiler.addGlobalFunc('procedure AssignBitmap(bmp: TBGRABitmap);', @MyAssignBitmap);
Compiler.addGlobalFunc('procedure SetBitmapSize(width,height: integer);', @MySetBitmapSize);
Compiler.addGlobalFunc('function TBGRABitmap.Duplicate: TBGRABitmap;', @MyDuplicateBitmap);
end;