Browse Source

* Use offscreencanvas to draw bitmap.

Michaël Van Canneyt 1 year ago
parent
commit
5e9e7db3cc
1 changed files with 21 additions and 4 deletions
  1. 21 4
      src/pas2js/fresnel.pas2js.wasmapi.pp

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

@@ -2,6 +2,8 @@
 {$h+}
 {$modeswitch externalclass}
 
+{$DEFINE IMAGE_USEOSC}
+
 unit fresnel.pas2js.wasmapi;
 
 interface
@@ -608,7 +610,12 @@ var
   V : TJSDataView;
   D : TJSUint8ClampedArray;
   ImgData : TJSImageData;
-  Canv : TJSCanvasRenderingContext2D;
+  Canv2,Canv : TJSCanvasRenderingContext2D;
+
+{$IFDEF IMAGE_USEOSC}
+  OSC : TJSHTMLOffscreenCanvasElement;
+  OSCImgBitmap : TJSImageBitmap;
+{$ENDIF}
 
 begin
   {$IFNDEF NOLOGAPICALLS}
@@ -623,13 +630,24 @@ begin
   V:=getModuleMemoryDataView;
   D:=TJSUint8ClampedArray.New(V.Buffer,aImageData,aImageWidth*aImageWidth*4);
   ImgData:=TJSImageData.new(D,aImageWidth,aImageWidth);
-  Window.createImageBitmap(ImgData)._then(
+{$IFDEF IMAGE_USEOSC}
+  OSC:=TJSHTMLOffscreenCanvasElement.New(aImageWidth,aImageHeight);
+  Canv2:=OSC.getContextAs2DContext('2d');
+  Canv2.clearRect(0,0,aImageWidth,aImageHeight);
+  Canv2.putImageData(ImgData,0,0);
+  OSCImgBitmap:=OSC.transferToImageBitmap;
+  Canv.drawImage(OSCImgBitmap ,aX,aY,aWidth,aHeight);
+  OSCImgBitmap.close();
+
+{$ELSE}
+Window.createImageBitmap(ImgData)._then(
     function (res : jsvalue) : JSValue
     var
       ImgBitmap : TJSImageBitmap absolute res;
     begin
       Canv.drawImage(ImgBitmap,aX,aY,aWidth,aHeight);
     end);
+{$ENDIF}
   Result:=ECANVAS_SUCCESS;
 end;
 
@@ -1165,7 +1183,7 @@ function TWasmFresnelApi.FillText(aID: TCanvasID; X: Longint; Y: Longint; aText:
 Var
   C : TJSCanvasRenderingContext2D;
   S : String;
-  M : TJSTextMetrics;
+
 begin
   S:=Env.GetUTF8StringFromMem(aText,aTextLen);
   {$IFNDEF NOLOGAPICALLS}
@@ -1179,7 +1197,6 @@ begin
   if Assigned(C) then
     begin
     S:=Env.GetUTF8StringFromMem(aText,aTextLen);
-//    M:=C.measureText(S);
     C.FillText(S,X,Y);
     Result:=ECANVAS_SUCCESS;
     end;