Browse Source

* Corrections in arc, add linedash and scale/unscale functions

Michaël Van Canneyt 1 year ago
parent
commit
9bf42a1040
2 changed files with 88 additions and 39 deletions
  1. 21 3
      src/wasm/fresnel.wasm.api.pp
  2. 67 36
      src/wasm/fresnel.wasm.shared.pp

+ 21 - 3
src/wasm/fresnel.wasm.api.pp

@@ -75,9 +75,12 @@ function __fresnel_canvas_arc(
   aID : TCanvasID;
   X : Longint;
   Y : Longint;
-  Radius : Longint;
-  StartAngle : Double;
-  EndAngle : Double
+  RadiusX : Longint;
+  RadiusY : Longint;
+  StartAngle : longint;
+  EndAngle : longint;
+  Rotate : longint;
+  Flags : Longint
 ):  TCanvasError; external 'fresnel_api' name 'canvas_arc';
 
 
@@ -163,6 +166,13 @@ function __fresnel_canvas_set_linemiterlimit(
   aWidth : TCanvasLineMiterLimit
 ):  TCanvasError; external 'fresnel_api' name 'canvas_set_linemiterlimit';
 
+
+function __fresnel_canvas_set_linedash(  aID : TCanvasID;
+  aOffset : Longint;
+  aPatternCount : longint;
+  aPattern : PLineDashPatternData
+):  TCanvasError; external 'fresnel_api' name 'canvas_set_linedash';
+
 function __fresnel_canvas_set_font(
   aID : TCanvasID;
   aFontName : PByte;
@@ -250,8 +260,16 @@ function __fresnel_timer_tick(timerid: TTimerID; userdata : pointer) : boolean;
 procedure __fresnel_log(Const Msg : string);
 procedure __fresnel_log(Const Fmt : string; args : Array of const);
 
+function __fresnel_scale(len : single) : longint;
+
 implementation
 
+function __fresnel_scale(len : single) : longint;
+
+begin
+  Result:=Round(len*FresnelScaleFactor);
+end;
+
 procedure __fresnel_tick (aCurrent,aPrevious : double);
 
 begin

+ 67 - 36
src/wasm/fresnel.wasm.shared.pp

@@ -30,8 +30,14 @@ uses
 
 const
   CanvasMsgSize = 4;
+  FresnelScaleFactor = 100;
 
 Type
+  {$IFNDEF PAS2JS}
+  TFresnelFloat = single;
+  {$ELSE}
+  TFresnelFloat = double;
+  {$ENDIF}
 
   TCanvasError = longint;
   TCanvasID = longint;
@@ -45,6 +51,9 @@ Type
   TCanvasMessageID = longint;
   TCanvasMessageParam = longint;
   TCanvasMessageData = Array[0..CanvasMsgSize-1] of TCanvasMessageParam;
+  TLineDashPattern = longint; // Scaled 100
+  TLineDashPatternData = Array of TLineDashPattern;
+
   {$IFDEF PAS2JS}
   UTF8String = String;
   {$ENDIF}
@@ -74,6 +83,7 @@ Type
   PCanvasMessageData = ^TCanvasMessageData;
   PCanvasRoundRectData = ^TCanvasRoundRectData;
   PGradientColorPoints = ^TGradientColorPoint;
+  PLineDashPatternData = ^TLineDashPattern;
   {$ENDIF}
 
 Const
@@ -111,48 +121,69 @@ Const
   WASMSG_MOUSESTATE_STATE  = 2;
   WASMSG_MOUSESTATE_BUTTON = 3;
 
- Const
-   WASMSG_NONE        = 0;
-   WASMSG_MOVE        = 1; // Params[0]= X, [1]=Y, [2]=State
-   WASMSG_MOUSEDOWN   = 2; // Params[0]= X, [1]=Y, [2]=State
-   WASMSG_MOUSEUP     = 3; // Params[0]= X, [1]=Y, [2]=State
-   WASMSG_MOUSESCROLL = 4; // Params[0]= X, [1]=Y, [2]=State
-   WASMSG_CLICK       = 5; // Params[0]= X, [1]=Y, [2]=State
-   WASMSG_WHEELY      = 6; // Params[0]= X, [1]=Y, [2]=State [3]=Distance
-   WASMSG_DBLCLICK    = 7;
-   WASMSG_ENTER       = 8;
-   WASMSG_LEAVE       = 9;
-   WASMSG_KEY      = 10;
-
-   // Roundrect flags
-   ROUNDRECT_FLAG_FILL         = 1;
-
-   // Indexes for roundrect data array.
-
-   ROUNDRECT_BOXTOPLEFTX       = 0;
-   ROUNDRECT_BOXTOPLEFTY       = 1;
-   ROUNDRECT_BOXBOTTOMRIGHTX   = 2;
-   ROUNDRECT_BOXBOTTOMRIGHTY   = 3;
-   ROUNDRECT_RADIITOPLEFTX     = 4;
-   ROUNDRECT_RADIITOPLEFTY     = 5;
-   ROUNDRECT_RADIITOPRIGHTX    = 6;
-   ROUNDRECT_RADIITOPRIGHTY    = 7;
-   ROUNDRECT_RADIIBOTTOMLEFTX  = 8;
-   ROUNDRECT_RADIIBOTTOMLEFTY  = 9;
-   ROUNDRECT_RADIIBOTTOMRIGHTX = 10;
-   ROUNDRECT_RADIIBOTTOMRIGHTY = 11;
-
-   // Flags for SetImageFillStyle
-   IMAGEFILLSTYLE_NOREPEAT  = 0;
-   IMAGEFILLSTYLE_REPEAT    = 1;
-   IMAGEFILLSTYLE_REPEATX   = 2;
-   IMAGEFILLSTYLE_REPEATY   = 3;
+Const
+  WASMSG_NONE        = 0;
+  WASMSG_MOVE        = 1; // Params[0]= X, [1]=Y, [2]=State
+  WASMSG_MOUSEDOWN   = 2; // Params[0]= X, [1]=Y, [2]=State
+  WASMSG_MOUSEUP     = 3; // Params[0]= X, [1]=Y, [2]=State
+  WASMSG_MOUSESCROLL = 4; // Params[0]= X, [1]=Y, [2]=State
+  WASMSG_CLICK       = 5; // Params[0]= X, [1]=Y, [2]=State
+  WASMSG_WHEELY      = 6; // Params[0]= X, [1]=Y, [2]=State [3]=Distance
+  WASMSG_DBLCLICK    = 7;
+  WASMSG_ENTER       = 8;
+  WASMSG_LEAVE       = 9;
+  WASMSG_KEY      = 10;
+
+  // Roundrect flags
+  ROUNDRECT_FLAG_FILL         = 1;
+
+  // Indexes for roundrect data array.
+
+  ROUNDRECT_BOXTOPLEFTX       = 0;
+  ROUNDRECT_BOXTOPLEFTY       = 1;
+  ROUNDRECT_BOXBOTTOMRIGHTX   = 2;
+  ROUNDRECT_BOXBOTTOMRIGHTY   = 3;
+  ROUNDRECT_RADIITOPLEFTX     = 4;
+  ROUNDRECT_RADIITOPLEFTY     = 5;
+  ROUNDRECT_RADIITOPRIGHTX    = 6;
+  ROUNDRECT_RADIITOPRIGHTY    = 7;
+  ROUNDRECT_RADIIBOTTOMLEFTX  = 8;
+  ROUNDRECT_RADIIBOTTOMLEFTY  = 9;
+  ROUNDRECT_RADIIBOTTOMRIGHTX = 10;
+  ROUNDRECT_RADIIBOTTOMRIGHTY = 11;
+
+  // Flags for SetImageFillStyle
+  IMAGEFILLSTYLE_NOREPEAT  = 0;
+  IMAGEFILLSTYLE_REPEAT    = 1;
+  IMAGEFILLSTYLE_REPEATX   = 2;
+  IMAGEFILLSTYLE_REPEATY   = 3;
+
+  // Flags for Arc
+  ARC_FILL   = 1;
+  ARC_ROTATE = 2;
 
 Function LineCapToString(aCap: TCanvasLineCap) : String;
 Function LineJoinToString(aJoin: TCanvasLineJoin) : String;
 
+Function FresnelUnScale(aLen : Longint) : TFresnelFloat;
+Function FresnelScale(aLen : TFresnelFloat) : Longint;
+
+
 implementation
 
+Function FresnelUnScale(aLen : Longint) : TFresnelFloat;
+
+begin
+  Result:=aLen/FresnelScaleFactor;
+end;
+
+Function FresnelScale(aLen : TFresnelFloat) : Longint;
+
+begin
+  Result:=Round(aLen*FresnelScaleFactor);
+end;
+
+
 function LineCapToString(aCap: TCanvasLineCap): String;
 
 begin