wacanvas.pp 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. {$mode objfpc}
  2. {$h+}
  3. unit wacanvas;
  4. interface
  5. uses js, web, webassembly, wasienv;
  6. Const
  7. ECANVAS_SUCCESS = 0;
  8. ECANVAS_NOCANVAS = 1;
  9. ECANVAS_UNSPECIFIED = -1;
  10. Type
  11. TCanvasError = Longint;
  12. TCanvasID = Longint;
  13. { TWACanvas }
  14. TWACanvas = class(TImportExtension)
  15. Private
  16. FCanvases : TJSObject;
  17. FCurrentID : Integer;
  18. FCanvasParent : TJSHTMLELement;
  19. Protected
  20. function GetCanvas(aID : TCanvasID) : TJSCanvasRenderingContext2D;
  21. function allocate(SizeX : Longint; SizeY : Longint; aID: Longint): TCanvasError;
  22. function moveto(aID : TCanvasID; X : Longint;Y : Longint): TCanvasError;
  23. function lineto(aID : TCanvasID;X : Longint; Y : Longint ): TCanvasError;
  24. function stroke(aID : TCanvasID): TCanvasError;
  25. function beginpath(aID : TCanvasID): TCanvasError;
  26. function arc(aID : TCanvasID;X : Longint;Y : Longint;Radius : Longint;StartAngle : Double;EndAngle : Double): TCanvasError;
  27. function fillrect(aID : TCanvasID; X : Longint; Y : Longint; Width : Longint; Height : Longint): TCanvasError;
  28. function strokerect(aID : TCanvasID;X : Longint;Y : Longint; Width : Longint; Height : Longint ): TCanvasError;
  29. function clearrect(aID : TCanvasID;X : Longint;Y : Longint;Width : Longint; Height : Longint ): TCanvasError;
  30. function StrokeText(aID : TCanvasID;X : Longint;Y : Longint; aText : Longint; aTextLen : Longint ): TCanvasError;
  31. function FillText(aID : TCanvasID;X : Longint;Y : Longint; aText : Longint; aTextLen : Longint ): TCanvasError;
  32. Public
  33. Constructor Create(aEnv : TPas2JSWASIEnvironment); override;
  34. Procedure FillImportObject(aObject : TJSObject); override;
  35. Function ImportName : String; override;
  36. Property CanvasParent : TJSHTMLELement Read FCanvasParent Write FCanvasParent;
  37. end;
  38. Implementation
  39. uses sysutils;
  40. constructor TWACanvas.Create(aEnv: TPas2JSWASIEnvironment);
  41. begin
  42. Inherited Create(aEnv);
  43. FCanvases:=TJSObject.New();
  44. end;
  45. function TWACanvas.ImportName: String;
  46. begin
  47. Result:='web_canvas';
  48. end;
  49. function TWACanvas.GetCanvas(aID : TCanvasID) : TJSCanvasRenderingContext2D;
  50. Var
  51. JS : JSValue;
  52. begin
  53. JS:=FCanvases[IntTostr(AID)];
  54. if IsObject(JS) then
  55. Result:=TJSCanvasRenderingContext2D(JS)
  56. else
  57. Result:=Nil;
  58. end;
  59. procedure TWACanvas.FillImportObject(aObject: TJSObject);
  60. begin
  61. aObject['allocate']:=@allocate;
  62. aObject['moveto']:=@moveto;
  63. aObject['lineto']:=@LineTo;
  64. aObject['stroke']:=@stroke;
  65. aObject['beginpath']:=@beginpath;
  66. aObject['arc']:=@arc;
  67. aObject['fillrect']:=@fillrect;
  68. aObject['strokerect']:=@strokerect;
  69. aObject['clearrect']:=@clearrect;
  70. aObject['stroketext']:=@StrokeText;
  71. aObject['filltext']:=@FillText;
  72. end;
  73. function TWACanvas.allocate(SizeX : Longint; SizeY : Longint; aID: Longint): TCanvasError;
  74. Var
  75. C : TJSElement;
  76. V : TJSDataView;
  77. begin
  78. C:=window.document.createElement('CANVAS');
  79. CanvasParent.AppendChild(C);
  80. Inc(FCurrentID);
  81. V:=getModuleMemoryDataView;
  82. FCanvases[IntToStr(FCurrentID)]:=TJSHTMLCanvasElement(c).getcontext('2d');
  83. v.setUint32(aID, FCurrentID, env.IsLittleEndian);
  84. Result:=ECANVAS_SUCCESS;
  85. end;
  86. function TWACanvas.moveto(aID : TCanvasID; X : Longint;Y : Longint): TCanvasError;
  87. Var
  88. C : TJSCanvasRenderingContext2D;
  89. begin
  90. Result:=ECANVAS_NOCANVAS;
  91. C:=GetCanvas(aID);
  92. if Assigned(C) then
  93. begin
  94. C.moveto(X,Y);
  95. Result:=ECANVAS_SUCCESS;
  96. end;
  97. end;
  98. function TWACanvas.lineto(aID : TCanvasID;X : Longint; Y : Longint ): TCanvasError;
  99. Var
  100. C : TJSCanvasRenderingContext2D;
  101. begin
  102. Result:=ECANVAS_NOCANVAS;
  103. C:=GetCanvas(aID);
  104. if Assigned(C) then
  105. begin
  106. C.lineto(X,Y);
  107. Result:=ECANVAS_SUCCESS;
  108. end;
  109. end;
  110. function TWACanvas.stroke(aID : TCanvasID): TCanvasError;
  111. Var
  112. C : TJSCanvasRenderingContext2D;
  113. begin
  114. Result:=ECANVAS_NOCANVAS;
  115. C:=GetCanvas(aID);
  116. if Assigned(C) then
  117. begin
  118. C.Stroke;
  119. Result:=ECANVAS_SUCCESS;
  120. end;
  121. end;
  122. function TWACanvas.beginpath(aID : TCanvasID): TCanvasError;
  123. Var
  124. C : TJSCanvasRenderingContext2D;
  125. begin
  126. Result:=ECANVAS_NOCANVAS;
  127. C:=GetCanvas(aID);
  128. if Assigned(C) then
  129. begin
  130. C.beginPath;
  131. Result:=ECANVAS_SUCCESS;
  132. end;
  133. end;
  134. function TWACanvas.arc(aID : TCanvasID;X : Longint;Y : Longint;Radius : Longint;StartAngle : Double;EndAngle : Double): TCanvasError;
  135. Var
  136. C : TJSCanvasRenderingContext2D;
  137. begin
  138. Result:=ECANVAS_NOCANVAS;
  139. C:=GetCanvas(aID);
  140. if Assigned(C) then
  141. begin
  142. C.arc(X,y,radius,Startangle,EndAngle);
  143. Result:=ECANVAS_SUCCESS;
  144. end;
  145. end;
  146. function TWACanvas.fillrect(aID : TCanvasID; X : Longint; Y : Longint; Width : Longint; Height : Longint): TCanvasError;
  147. Var
  148. C : TJSCanvasRenderingContext2D;
  149. begin
  150. Result:=ECANVAS_NOCANVAS;
  151. C:=GetCanvas(aID);
  152. if Assigned(C) then
  153. begin
  154. C.FillRect(X,y,width,Height);
  155. Result:=ECANVAS_SUCCESS;
  156. end;
  157. end;
  158. function TWACanvas.strokerect(aID : TCanvasID;X : Longint;Y : Longint; Width : Longint; Height : Longint ): TCanvasError;
  159. Var
  160. C : TJSCanvasRenderingContext2D;
  161. begin
  162. Result:=ECANVAS_NOCANVAS;
  163. C:=GetCanvas(aID);
  164. if Assigned(C) then
  165. begin
  166. C.StrokeRect(X,Y,Width,Height);
  167. Result:=ECANVAS_SUCCESS;
  168. end;
  169. end;
  170. function TWACanvas.clearrect(aID : TCanvasID;X : Longint;Y : Longint;Width : Longint; Height : Longint ): TCanvasError;
  171. Var
  172. C : TJSCanvasRenderingContext2D;
  173. begin
  174. Result:=ECANVAS_NOCANVAS;
  175. C:=GetCanvas(aID);
  176. if Assigned(C) then
  177. begin
  178. C.ClearRect(X,Y,Width,Height);
  179. Result:=ECANVAS_SUCCESS;
  180. end;
  181. end;
  182. function TWACanvas.StrokeText(aID: TCanvasID; X: Longint; Y: Longint;
  183. aText: Longint; aTextLen: Longint): TCanvasError;
  184. Var
  185. C : TJSCanvasRenderingContext2D;
  186. S : String;
  187. begin
  188. Result:=ECANVAS_NOCANVAS;
  189. C:=GetCanvas(aID);
  190. if Assigned(C) then
  191. begin
  192. S:=Env.GetUTF8StringFromMem(aText,aTextLen);
  193. C.StrokeText(S,X,Y);
  194. Result:=ECANVAS_SUCCESS;
  195. end;
  196. end;
  197. function TWACanvas.FillText(aID: TCanvasID; X: Longint; Y: Longint;
  198. aText: Longint; aTextLen: Longint): TCanvasError;
  199. Var
  200. C : TJSCanvasRenderingContext2D;
  201. S : String;
  202. begin
  203. Result:=ECANVAS_NOCANVAS;
  204. C:=GetCanvas(aID);
  205. if Assigned(C) then
  206. begin
  207. S:=Env.GetUTF8StringFromMem(aText,aTextLen);
  208. C.FillText(S,X,Y);
  209. Result:=ECANVAS_SUCCESS;
  210. end;
  211. end;
  212. end.