2
0

MemoryBuffer.pas 1.8 KB

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