Przeglądaj źródła

* Arc extesions, use FresnelUnscale function

Michaël Van Canneyt 1 rok temu
rodzic
commit
4872820952
1 zmienionych plików z 21 dodań i 20 usunięć
  1. 21 20
      src/pas2js/fresnel.pas2js.wasmapi.pp

+ 21 - 20
src/pas2js/fresnel.pas2js.wasmapi.pp

@@ -95,7 +95,7 @@ Type
     function lineto(aID : TCanvasID;X : Longint; Y : Longint ):  TCanvasError; 
     function stroke(aID : TCanvasID): TCanvasError; 
     function beginpath(aID : TCanvasID):  TCanvasError; 
-    function arc(aID : TCanvasID;X : Longint;Y : Longint;Radius : Longint;StartAngle : Double;EndAngle : Double):  TCanvasError; 
+    function arc(aID : TCanvasID;X : Longint;Y : Longint;RadiusX,RadiusY : Longint;StartAngle : Longint;EndAngle : Longint; Rotate : Longint; Flags : Longint):  TCanvasError;
     function fillrect(aID : TCanvasID;  X : Longint; Y : Longint;  Width : Longint; Height : Longint): TCanvasError; 
     function strokerect(aID : TCanvasID;X : Longint;Y : Longint; Width : Longint; Height : Longint ):  TCanvasError; 
     function clearrect(aID : TCanvasID;X : Longint;Y : Longint;Width : Longint; Height : Longint ):  TCanvasError;
@@ -143,12 +143,6 @@ Implementation
 
 uses sysutils;
 
-Function UnScale(aLen : Longint) : Double;
-
-begin
-  Result:=aLen/100;
-end;
-
 { ---------------------------------------------------------------------
   FresnelHelper
   ---------------------------------------------------------------------}
@@ -781,7 +775,7 @@ begin
     Exit(ECANVAS_NOCANVAS);
   Canv.shadowOffsetX:=aOffsetX;
   Canv.shadowOffsetY:=aOffsetY;
-  Canv.shadowBlur:=UnScale(aRadius);
+  Canv.shadowBlur:=FresnelUnScale(aRadius);
   Canv.shadowColor:=TFresnelHelper.FresnelColorToHTMLColor(aRed,aGreen,aBlue,aAlpha);
   Result:=ECANVAS_SUCCESS;
 end;
@@ -833,13 +827,13 @@ begin
   {$IFNDEF NOLOGAPICALLS}
   If LogAPICalls then
     begin
-    LogCall('Canvas.SetLineWidth(%d,%g)',[aID,Unscale(aWidth)]);
+    LogCall('Canvas.SetLineWidth(%d,%g)',[aID,FresnelUnscale(aWidth)]);
     end;
   {$ENDIF}
   Canv:=GetCanvas(aID);
   if Not Assigned(Canv) then
     Exit(ECANVAS_NOCANVAS);
-  Canv.LineWidth:=UnScale(aWidth);
+  Canv.LineWidth:=FresnelUnScale(aWidth);
   Result:=ECANVAS_SUCCESS;
 end;
 
@@ -901,7 +895,7 @@ begin
   Canv:=GetCanvas(aID);
   if Not Assigned(Canv) then
     Exit(ECANVAS_NOCANVAS);
-  Canv.miterLimit:=Unscale(aWidth);
+  Canv.miterLimit:=FresnelUnscale(aWidth);
   Result:=ECANVAS_SUCCESS;
   LogCall('Canvas.SetLineMiterLimit not implemented');
 end;
@@ -920,7 +914,7 @@ begin
   {$IFNDEF NOLOGAPICALLS}
   If LogAPICalls then
     begin
-    LogCall('Canvas.SetLineDash(%d,%g,%d,[%x])',[aID,Unscale(aOffset),aPatternCount,aPattern]);
+    LogCall('Canvas.SetLineDash(%d,%g,%d,[%x])',[aID,FresnelUnscale(aOffset),aPatternCount,aPattern]);
     end;
   {$ENDIF}
   Canv:=GetCanvas(aID);
@@ -933,11 +927,11 @@ begin
     P:=aPattern;
     for I:=0 to APatternCount-1 do
       begin
-      Dashes.Push(UnScale(v.Getint32(P,env.IsLittleEndian)));
+      Dashes.Push(FresnelUnScale(v.Getint32(P,env.IsLittleEndian)));
       Inc(P,4);
       end;
     end;
-  Canv.lineDashOffset:=Unscale(aOffset);
+  Canv.lineDashOffset:=FresnelUnscale(aOffset);
   Canv.setLineDash(Dashes);
 end;
 
@@ -1144,7 +1138,7 @@ begin
     end;
 end;
 
-function TWasmFresnelApi.arc(aID : TCanvasID;X : Longint;Y : Longint;Radius : Longint;StartAngle : Double;EndAngle : Double):  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;
@@ -1152,13 +1146,20 @@ Var
 begin
   {$IFNDEF NOLOGAPICALLS}
   If LogAPICalls then
-    LogCall('Canvas.Arc(%d,%d,%d,%d,%f,%f)',[aID,X,Y,Radius,StartAngle,EndAngle]);
+    LogCall('Canvas.Arc(%d,%d,%d,%d,%d,%f,%f)',[aID,X,Y,RadiusX,RadiusY,FresnelUnscale(StartAngle),FresnelUnscale(EndAngle)]);
   {$ENDIF}
   Result:=ECANVAS_NOCANVAS;
   C:=GetCanvas(aID);
   if Assigned(C) then
     begin
-    C.arc(X,y,radius,Startangle,EndAngle);
+    C.beginPath;
+    if RadiusX=RadiusY then
+      C.Arc(X,y,RadiusX,FresnelUnscale(Startangle),FresnelUnscale(EndAngle))
+    else
+      C.Ellipse(X,y,RadiusX,RadiusY,FresnelUnScale(Rotate),FresnelUnscale(Startangle),FresnelUnscale(EndAngle));
+    if ((Flags and ARC_FILL)<>0) then
+      C.fill();
+    C.stroke();
     Result:=ECANVAS_SUCCESS;
     end;
 end;
@@ -1224,13 +1225,13 @@ function TWasmFresnelApi.RoundRect(aID: TCanvasID; Flags: Longint; Data: TWasmPo
 Var
   C : TJSCanvasRenderingContext2D;
   V : TJSDataView;
-  X,Y,W,H : Double;
+  X,Y,W,H : TFresnelFloat;
   Radii : TJSArray;
   Fill : Boolean;
 
-  function GetElement(aOffset : Longint) : Double;
+  function GetElement(aOffset : Longint) : TFresnelFloat;
   begin
-    Result:=UnScale(V.getInt32(Data+(aOffset*4),Env.IsLittleEndian));
+    Result:=FresnelUnScale(V.getInt32(Data+(aOffset*4),Env.IsLittleEndian));
   end;
 
   Procedure AddRadius(aRX,aRY : Double);