|
@@ -104,6 +104,7 @@ Type
|
|
|
function FillText(aID : TCanvasID;X : Longint;Y : Longint; aText : TWasmPointer; aTextLen : Longint ): TCanvasError;
|
|
|
function GetCanvasSizes(aID: TCanvasID; aWidth, aHeight: TWasmPointer): TCanvasError;
|
|
|
function SetFillStyle(aID: TCanvasID; aRed,aGreen,aBlue,aAlpha: TCanvasColorComponent): TCanvasError;
|
|
|
+ function ClearCanvas(aID: TCanvasID; aRed,aGreen,aBlue,aAlpha: TCanvasColorComponent): TCanvasError;
|
|
|
function SetLinearGradientFillStyle(aID: TCanvasID; aStartX,aStartY,aEndX,aEndY : Longint; aColorPointCount : longint; aColorPoints : TWasmPointer) : TCanvasError;
|
|
|
function SetImageFillStyle(aID: TCanvasID; Flags : Longint; aImageWidth,aImageHeight: Longint; aImageData: TWasmPointer) : TCanvasError;
|
|
|
function SetLineCap(aID: TCanvasID; aCap: TCanvasLinecap): TCanvasError;
|
|
@@ -116,13 +117,12 @@ Type
|
|
|
function SetFont(aID : TCanvasID; aFontName : TWasmPointer; aFontNameLen : integer) : TCanvasError;
|
|
|
function MeasureText(aID : TCanvasID; aText : TWasmPointer; aTextLen : integer; aWidth,aHeight : Longint) : TCanvasError;
|
|
|
function SetTextShadowParams (aID : TCanvasID; aOffsetX,aOffsetY,aRadius : Longint; aRed,aGreen,aBlue,aAlpha : TCanvasColorComponent): TCanvasError;
|
|
|
-
|
|
|
+ function DrawPath(aID : TCanvasID; aFlags : Longint; aPathCount : longint; aPath : TWasmPointer) : TCanvasError;
|
|
|
+ function PointInPath(aID : TCanvasID; aX : Longint; aY : Longint; aPointCount : Integer; aPointData : TWasmPointer; aRes : TWasmPointer): TCanvasError;
|
|
|
+ function SetTransform(aID : TCanvasID; Flags : Longint; m11,m12,m21,m22,m31,m32 : Longint) : TCanvasError;
|
|
|
// Timer
|
|
|
function AllocateTimer(ainterval : longint; userdata: TWasmPointer) : TTimerID;
|
|
|
procedure DeallocateTimer(timerid: TTimerID);
|
|
|
-{ function __fresnel_timer_allocate(ainterval : longint; userdata: pointer) : TTimerID; external 'fresnel_api' name 'timer_allocate';
|
|
|
- procedure __fresnel_timer_deallocate(timerid: TTimerID); external 'fresnel_api' name 'timer_deallocate';
|
|
|
-}
|
|
|
// Events
|
|
|
function GetEvent(aID: TWasmPointer; aMsg: TWasmPointer; Data : TWasmPointer): TCanvasError;
|
|
|
function GetEventCount(aCount: TWasmPointer): TCanvasError;
|
|
@@ -488,7 +488,10 @@ begin
|
|
|
aObject['canvas_measure_text']:=@MeasureText;
|
|
|
aObject['canvas_set_textshadow_params']:=@SetTextShadowParams;
|
|
|
aObject['canvas_roundrect']:=@RoundRect;
|
|
|
-
|
|
|
+ aObject['canvas_draw_path']:=@DrawPath;
|
|
|
+ aObject['canvas_point_in_path']:=@PointInPath;
|
|
|
+ aObject['canvas_set_transform']:=@SetTransForm;
|
|
|
+ aObject['canvas_clear']:=@ClearCanvas;
|
|
|
// Timer
|
|
|
aObject['timer_allocate']:=@AllocateTimer;
|
|
|
aObject['timer_deallocate']:=@DeAllocateTimer;
|
|
@@ -509,14 +512,24 @@ end;
|
|
|
|
|
|
function TWasmFresnelApi.GetCanvasSizes(aID: TCanvasID; aWidth, aHeight: TWasmPointer): TCanvasError;
|
|
|
|
|
|
+var
|
|
|
+ Ref: TCanvasReference;
|
|
|
+ v : TJSDataView;
|
|
|
+
|
|
|
begin
|
|
|
{$IFNDEF NOLOGAPICALLS}
|
|
|
If LogAPICalls then
|
|
|
begin
|
|
|
- LogCall('Canvas.FillText(%d,%d,%d)',[aID,aWidth,aHeight]);
|
|
|
+ LogCall('Canvas.GetCanvasSizes(%d,[%x],[%x])',[aID,aWidth,aHeight]);
|
|
|
end;
|
|
|
{$ENDIF}
|
|
|
- LogCall('Canvas.GetCanvasSizes not implemented');
|
|
|
+ Ref:=GetCanvasRef(aID);
|
|
|
+ if Not Assigned(Ref) then
|
|
|
+ Exit(ECANVAS_NOCANVAS);
|
|
|
+ v:=getModuleMemoryDataView;
|
|
|
+ v.setint32(aWidth,Ref.canvas.width,env.IsLittleEndian);
|
|
|
+ v.setint32(aHeight,Ref.canvas.height,env.IsLittleEndian);
|
|
|
+ Result:=ECANVAS_SUCCESS;
|
|
|
end;
|
|
|
|
|
|
function TWasmFresnelApi.SetFillStyle(aID: TCanvasID; aRed, aGreen, aBlue, aAlpha: TCanvasColorComponent): TCanvasError;
|
|
@@ -541,6 +554,30 @@ begin
|
|
|
Exit(ECANVAS_SUCCESS);
|
|
|
end;
|
|
|
|
|
|
+function TWasmFresnelApi.ClearCanvas(aID: TCanvasID; aRed, aGreen, aBlue,
|
|
|
+ aAlpha: TCanvasColorComponent): TCanvasError;
|
|
|
+
|
|
|
+var
|
|
|
+ Ref : TCanvasReference;
|
|
|
+ S : String;
|
|
|
+
|
|
|
+begin
|
|
|
+ {$IFNDEF NOLOGAPICALLS}
|
|
|
+ If LogAPICalls then
|
|
|
+ begin
|
|
|
+ LogCall('Canvas.SetFillStyle(%d,%d,%d,%d,%d)',[aID,aRed,aGreen,aBlue,aAlpha]);
|
|
|
+ end;
|
|
|
+ {$ENDIF}
|
|
|
+ Ref:=GetCanvasRef(aID);
|
|
|
+ if Not Assigned(ref) then
|
|
|
+ Exit(ECANVAS_NOCANVAS);
|
|
|
+ S:=TFresnelHelper.FresnelColorToHTMLColor(aRed,aGreen,aBlue,aAlpha);
|
|
|
+ // Writeln('Fill: ',S);
|
|
|
+ Ref.canvascontext.fillStyle:=S;
|
|
|
+ Ref.canvascontext.FillRect(0,0,Ref.canvas.width,Ref.canvas.height);
|
|
|
+ Exit(ECANVAS_SUCCESS);
|
|
|
+end;
|
|
|
+
|
|
|
function TWasmFresnelApi.SetLinearGradientFillStyle(aID: TCanvasID; aStartX, aStartY, aEndX, aEndY: Longint;
|
|
|
aColorPointCount: longint; aColorPoints: TWasmPointer): TCanvasError;
|
|
|
|
|
@@ -710,15 +747,6 @@ begin
|
|
|
Exit(ECANVAS_NOCANVAS);
|
|
|
Canv.font:=S;
|
|
|
Result:=ECANVAS_SUCCESS;
|
|
|
-(*
|
|
|
-function __fresnel_canvas_measure_text(
|
|
|
- aID : TCanvasID;
|
|
|
- aText : PByte;
|
|
|
- aTextLen : Longint;
|
|
|
- aWidth : PLongint;
|
|
|
- aHeight : PLongint
|
|
|
- ): TCanvasError; external 'fresnel_api' name 'canvas_measure_text';
|
|
|
-*)
|
|
|
end;
|
|
|
|
|
|
function TWasmFresnelApi.MeasureText(aID: TCanvasID; aText: TWasmPointer; aTextLen: integer; aWidth, aHeight: Longint
|
|
@@ -780,6 +808,185 @@ begin
|
|
|
Result:=ECANVAS_SUCCESS;
|
|
|
end;
|
|
|
|
|
|
+function TWasmFresnelApi.DrawPath(aID: TCanvasID; aFlags: Longint;
|
|
|
+ aPathCount: longint; aPath: TWasmPointer): TCanvasError;
|
|
|
+var
|
|
|
+ Canv:TJSCanvasRenderingContext2D;
|
|
|
+ P2D : TJSPath2D;
|
|
|
+ aType,X,Y,X1,Y1,X2,Y2,X3,Y3,I : Integer;
|
|
|
+ V : TJSDataView;
|
|
|
+ P : TWasmPointer;
|
|
|
+ WasClosed : Boolean;
|
|
|
+
|
|
|
+ Procedure GetTriple;
|
|
|
+
|
|
|
+ begin
|
|
|
+ aType:=V.getInt32(P,env.IsLittleEndian);
|
|
|
+ Inc(P);
|
|
|
+ X:=V.getInt32(P,env.IsLittleEndian);
|
|
|
+ inc(P);
|
|
|
+ Y:=V.getInt32(P,env.IsLittleEndian);
|
|
|
+ inc(P);
|
|
|
+ end;
|
|
|
+
|
|
|
+begin
|
|
|
+ {$IFNDEF NOLOGAPICALLS}
|
|
|
+ If LogAPICalls then
|
|
|
+ begin
|
|
|
+ LogCall('Canvas.DrawPath(%d,%d,%d,[%x])',[aID,aFlags,aPathCount,aPath]);
|
|
|
+ end;
|
|
|
+ {$ENDIF}
|
|
|
+ WasClosed:=False;
|
|
|
+ Canv:=GetCanvas(aID);
|
|
|
+ if Not Assigned(Canv) then
|
|
|
+ Exit(ECANVAS_NOCANVAS);
|
|
|
+ if aPathCount=0 then
|
|
|
+ Exit(ECANVAS_INVALIDPATH);
|
|
|
+ V:=getModuleMemoryDataView;
|
|
|
+ P:=aPath;
|
|
|
+ P2D:=TJSPath2D.New;
|
|
|
+ For I:=1 to aPathCount-1 do
|
|
|
+ begin
|
|
|
+ GetTriple;
|
|
|
+ WasClosed:=aType<>DRAWPATH_TYPECLOSE;
|
|
|
+ Case aType of
|
|
|
+ DRAWPATH_TYPEMOVETO : P2D.MoveTo(X,Y);
|
|
|
+ DRAWPATH_TYPELINETO : P2D.LineTo(X,Y);
|
|
|
+ DRAWPATH_TYPECURVETO :
|
|
|
+ begin
|
|
|
+ X1:=X;
|
|
|
+ Y1:=Y;
|
|
|
+ GetTriple;
|
|
|
+ if aType<>DRAWPATH_TYPECURVETO then
|
|
|
+ begin
|
|
|
+ Writeln('Invalid path data 2, expected CURVETO (',DRAWPATH_TYPECURVETO,'), got: ',aType);
|
|
|
+ exit;
|
|
|
+ end;
|
|
|
+ X2:=X;
|
|
|
+ Y2:=Y;
|
|
|
+ GetTriple;
|
|
|
+ if aType<>DRAWPATH_TYPECURVETO then
|
|
|
+ begin
|
|
|
+ Writeln('Invalid path data 3, expected CURVETO (',DRAWPATH_TYPECURVETO,'), got: ',aType);
|
|
|
+ exit;
|
|
|
+ end;
|
|
|
+ X3:=X;
|
|
|
+ Y3:=Y;
|
|
|
+ P2D.bezierCurveTo(X1,Y1,X2,Y2,X3,Y3);
|
|
|
+ end;
|
|
|
+ DRAWPATH_TYPECLOSE :
|
|
|
+ P2D.ClosePath;
|
|
|
+ end;
|
|
|
+ end;
|
|
|
+ if not WasClosed and ((aFlags and DRAWPATH_CLOSEPATH)<>0) then
|
|
|
+ P2D.closePath;
|
|
|
+ if (aFlags and DRAWPATH_FILLPATH)<>0 then
|
|
|
+ Canv.Fill(P2D);
|
|
|
+ if (aFlags and DRAWPATH_STROKEPATH)<>0 then
|
|
|
+ Canv.Stroke(P2D);
|
|
|
+ Result:=ECANVAS_SUCCESS;
|
|
|
+end;
|
|
|
+
|
|
|
+function TWasmFresnelApi.PointInPath(aID: TCanvasID; aX: Longint; aY: Longint;
|
|
|
+ aPointCount: Integer; aPointData: TWasmPointer; aRes: TWasmPointer): TCanvasError;
|
|
|
+var
|
|
|
+ Canv:TJSCanvasRenderingContext2D;
|
|
|
+ P2D : TJSPath2D;
|
|
|
+ aType,X,Y,X1,Y1,X2,Y2,X3,Y3,I : Integer;
|
|
|
+ V : TJSDataView;
|
|
|
+ P : TWasmPointer;
|
|
|
+ WasClosed : Boolean;
|
|
|
+ Res : Boolean;
|
|
|
+
|
|
|
+ Procedure GetTriple;
|
|
|
+
|
|
|
+ begin
|
|
|
+ aType:=V.getInt32(P,env.IsLittleEndian);
|
|
|
+ Inc(P);
|
|
|
+ X:=V.getInt32(P,env.IsLittleEndian);
|
|
|
+ inc(P);
|
|
|
+ Y:=V.getInt32(P,env.IsLittleEndian);
|
|
|
+ inc(P);
|
|
|
+ end;
|
|
|
+
|
|
|
+begin
|
|
|
+ {$IFNDEF NOLOGAPICALLS}
|
|
|
+ If LogAPICalls then
|
|
|
+ begin
|
|
|
+ LogCall('Canvas.PointInPath(%d,(%d,%d),%d,[%x],[%x])',[aID,aX,aY,aPointCount,aPointData,aRes]);
|
|
|
+ end;
|
|
|
+ {$ENDIF}
|
|
|
+ WasClosed:=False;
|
|
|
+ Canv:=GetCanvas(aID);
|
|
|
+ if Not Assigned(Canv) then
|
|
|
+ Exit(ECANVAS_NOCANVAS);
|
|
|
+ if aPointCount=0 then
|
|
|
+ Exit(ECANVAS_INVALIDPATH);
|
|
|
+ V:=getModuleMemoryDataView;
|
|
|
+ P:=aPointData;
|
|
|
+ P2D:=TJSPath2D.New;
|
|
|
+ For I:=1 to aPointCount-1 do
|
|
|
+ begin
|
|
|
+ GetTriple;
|
|
|
+ WasClosed:=aType<>DRAWPATH_TYPECLOSE;
|
|
|
+ Case aType of
|
|
|
+ DRAWPATH_TYPEMOVETO : P2D.MoveTo(X,Y);
|
|
|
+ DRAWPATH_TYPELINETO : P2D.LineTo(X,Y);
|
|
|
+ DRAWPATH_TYPECURVETO :
|
|
|
+ begin
|
|
|
+ X1:=X;
|
|
|
+ Y1:=Y;
|
|
|
+ GetTriple;
|
|
|
+ if aType<>DRAWPATH_TYPECURVETO then
|
|
|
+ begin
|
|
|
+ Writeln('Invalid path data 2, expected CURVETO (',DRAWPATH_TYPECURVETO,'), got: ',aType);
|
|
|
+ exit(ECANVAS_INVALIDPATH);
|
|
|
+ end;
|
|
|
+ X2:=X;
|
|
|
+ Y2:=Y;
|
|
|
+ GetTriple;
|
|
|
+ if aType<>DRAWPATH_TYPECURVETO then
|
|
|
+ begin
|
|
|
+ Writeln('Invalid path data 3, expected CURVETO (',DRAWPATH_TYPECURVETO,'), got: ',aType);
|
|
|
+ exit(ECANVAS_INVALIDPATH);
|
|
|
+ end;
|
|
|
+ X3:=X;
|
|
|
+ Y3:=Y;
|
|
|
+ P2D.bezierCurveTo(X1,Y1,X2,Y2,X3,Y3);
|
|
|
+ end;
|
|
|
+ DRAWPATH_TYPECLOSE :
|
|
|
+ P2D.ClosePath;
|
|
|
+ end;
|
|
|
+ end;
|
|
|
+ if not WasClosed then
|
|
|
+ P2D.closePath;
|
|
|
+ Res:=Canv.isPointInPath(P2D,aX,aY);
|
|
|
+ v.setInt8(aRes,Ord(Res));
|
|
|
+ Result:=ECANVAS_SUCCESS;
|
|
|
+end;
|
|
|
+
|
|
|
+function TWasmFresnelApi.SetTransform(aID: TCanvasID; Flags: Longint; m11, m12,
|
|
|
+ m21, m22, m31, m32: Longint): TCanvasError;
|
|
|
+
|
|
|
+var
|
|
|
+ Canv:TJSCanvasRenderingContext2D;
|
|
|
+
|
|
|
+begin
|
|
|
+ {$IFNDEF NOLOGAPICALLS}
|
|
|
+ If LogAPICalls then
|
|
|
+ begin
|
|
|
+ LogCall('Canvas.SetTransform(%d,%d,%d,%d,%d,%d,%d,%d)',[aID,Flags,m11,m12,m21,m22,m31,m32]);
|
|
|
+ end;
|
|
|
+ {$ENDIF}
|
|
|
+ Canv:=GetCanvas(aID);
|
|
|
+ if Not Assigned(Canv) then
|
|
|
+ Exit(ECANVAS_NOCANVAS);
|
|
|
+ if (Flags and TRANSFORM_RESET)<>0 then
|
|
|
+ canv.setTransform(FresnelUnScale(m11),FresnelUnScale(m12),FresnelUnScale(m21),FresnelUnScale(m22),FresnelUnScale(m31),FresnelUnScale(m32))
|
|
|
+ else
|
|
|
+ canv.transform(FresnelUnScale(m11),FresnelUnScale(m12),FresnelUnScale(m21),FresnelUnScale(m22),FresnelUnScale(m31),FresnelUnScale(m32));
|
|
|
+end;
|
|
|
+
|
|
|
function TWasmFresnelApi.AllocateTimer(ainterval: longint; userdata: TWasmPointer): TTimerID;
|
|
|
|
|
|
var
|
|
@@ -1138,7 +1345,9 @@ begin
|
|
|
end;
|
|
|
end;
|
|
|
|
|
|
-function TWasmFresnelApi.Arc(aID : TCanvasID;X : Longint;Y : Longint;RadiusX,RadiusY : Longint;StartAngle : Longint;EndAngle : Longint; Rotate : Longint; Flags : Longint): TCanvasError;
|
|
|
+function TWasmFresnelApi.arc(aID: TCanvasID; X: Longint; Y: Longint; RadiusX,
|
|
|
+ RadiusY: Longint; StartAngle: Longint; EndAngle: Longint; Rotate: Longint;
|
|
|
+ Flags: Longint): TCanvasError;
|
|
|
|
|
|
Var
|
|
|
C : TJSCanvasRenderingContext2D;
|