run_length_stream.js 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. /**
  2. * @licstart The following is the entire license notice for the
  3. * Javascript code in this page
  4. *
  5. * Copyright 2021 Mozilla Foundation
  6. *
  7. * Licensed under the Apache License, Version 2.0 (the "License");
  8. * you may not use this file except in compliance with the License.
  9. * You may obtain a copy of the License at
  10. *
  11. * http://www.apache.org/licenses/LICENSE-2.0
  12. *
  13. * Unless required by applicable law or agreed to in writing, software
  14. * distributed under the License is distributed on an "AS IS" BASIS,
  15. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  16. * See the License for the specific language governing permissions and
  17. * limitations under the License.
  18. *
  19. * @licend The above is the entire license notice for the
  20. * Javascript code in this page
  21. */
  22. "use strict";
  23. Object.defineProperty(exports, "__esModule", {
  24. value: true
  25. });
  26. exports.RunLengthStream = void 0;
  27. var _decode_stream = require("./decode_stream.js");
  28. class RunLengthStream extends _decode_stream.DecodeStream {
  29. constructor(str, maybeLength) {
  30. super(maybeLength);
  31. this.str = str;
  32. this.dict = str.dict;
  33. }
  34. readBlock() {
  35. const repeatHeader = this.str.getBytes(2);
  36. if (!repeatHeader || repeatHeader.length < 2 || repeatHeader[0] === 128) {
  37. this.eof = true;
  38. return;
  39. }
  40. let buffer;
  41. let bufferLength = this.bufferLength;
  42. let n = repeatHeader[0];
  43. if (n < 128) {
  44. buffer = this.ensureBuffer(bufferLength + n + 1);
  45. buffer[bufferLength++] = repeatHeader[1];
  46. if (n > 0) {
  47. const source = this.str.getBytes(n);
  48. buffer.set(source, bufferLength);
  49. bufferLength += n;
  50. }
  51. } else {
  52. n = 257 - n;
  53. const b = repeatHeader[1];
  54. buffer = this.ensureBuffer(bufferLength + n + 1);
  55. for (let i = 0; i < n; i++) {
  56. buffer[bufferLength++] = b;
  57. }
  58. }
  59. this.bufferLength = bufferLength;
  60. }
  61. }
  62. exports.RunLengthStream = RunLengthStream;