MemoryBuffer.pas 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. {$mode objfpc}
  2. unit MemoryBuffer;
  3. interface
  4. uses
  5. JS;
  6. type
  7. TMBFloat32 = double;
  8. TMemoryBuffer = class
  9. private
  10. byteBuffer: TJSUint8Array;
  11. public
  12. constructor Create (size: integer);
  13. { UInt8 }
  14. procedure AddBytes (count: integer; data: array of byte);
  15. { Float32 }
  16. procedure AddFloats (count: integer; data: array of TMBFloat32);
  17. procedure AddFloat (data: TMBFloat32);
  18. { UInt16 }
  19. procedure AddWords(count: integer; data: array of word);
  20. property GetBytes: TJSUint8Array read byteBuffer;
  21. private
  22. byteOffset: integer;
  23. floatBuffer: TJSFloat32Array;
  24. wordBuffer: TJSUInt16Array;
  25. end;
  26. implementation
  27. constructor TMemoryBuffer.Create (size: integer);
  28. begin
  29. byteBuffer := TJSUint8Array.New(size);
  30. end;
  31. procedure TMemoryBuffer.AddBytes (count: integer; data: array of byte);
  32. begin
  33. //writeln('AddBytes: @', byteOffset, ' -> ', data);
  34. byteBuffer._set(data, byteOffset);
  35. byteOffset := byteOffset + (count * 1);
  36. end;
  37. procedure TMemoryBuffer.AddFloat (data: TMBFloat32);
  38. begin
  39. AddFloats(1, [data]);
  40. end;
  41. procedure TMemoryBuffer.AddFloats (count: integer; data: array of TMBFloat32);
  42. const
  43. kElementSize = 4;
  44. var
  45. floatOffset: integer;
  46. begin
  47. floatOffset := byteOffset div kElementSize;
  48. //writeln('AddFloats: @', byteOffset, '/', floatOffset, ' -> ', data);
  49. if floatBuffer = nil then
  50. floatBuffer := TJSFloat32Array.New(byteBuffer.buffer, 0, byteBuffer.byteLength div kElementSize);
  51. floatBuffer._set(data, floatOffset);
  52. byteOffset := byteOffset + (count * kElementSize);
  53. end;
  54. procedure TMemoryBuffer.AddWords(count: integer; data: array of word);
  55. const
  56. kElementSize = 2;
  57. var
  58. wordOffset: integer;
  59. begin
  60. wordOffset := byteOffset div kElementSize;
  61. if wordBuffer = nil then
  62. wordBuffer := TJSUInt16Array.New(byteBuffer.buffer, 0, byteBuffer.byteLength div kElementSize);
  63. wordBuffer._set(data, wordOffset);
  64. byteOffset := byteOffset + (count * kElementSize);
  65. end;
  66. end.