| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 | import Check from "../Core/Check.js";import defined from "../Core/defined.js";import defaultValue from "../Core/defaultValue.js";import DeveloperError from "../Core/DeveloperError.js";import RuntimeError from "../Core/RuntimeError.js";/** * An availability bitstream for use in an {@link ImplicitSubtree}. This handles * both Uint8Array bitstreams and constant values. * * @alias ImplicitAvailabilityBitstream * @constructor * * @param {Object} options An object with the following properties: * @param {Number} options.lengthBits The length of the bitstream in bits * @param {Boolean} [options.constant] A single boolean value indicating the value of all the bits in the bitstream if they are all the same * @param {Uint8Array} [options.bitstream] An array of bytes storing the bitstream in binary * @param {Number} [options.availableCount] A number indicating how many 1 bits are found in the bitstream * @param {Boolean} [options.computeAvailableCountEnabled=false] If true, and options.availableCount is undefined, the availableCount will be computed from the bitstream. * @private * @experimental This feature is using part of the 3D Tiles spec that is not final and is subject to change without Cesium's standard deprecation policy. */export default function ImplicitAvailabilityBitstream(options) {  const lengthBits = options.lengthBits;  let availableCount = options.availableCount;  //>>includeStart('debug', pragmas.debug);  Check.typeOf.number("options.lengthBits", lengthBits);  //>>includeEnd('debug');  const constant = options.constant;  const bitstream = options.bitstream;  if (defined(constant)) {    // if defined, constant must be 1 which means all tiles are available    availableCount = lengthBits;  } else {    const expectedLength = Math.ceil(lengthBits / 8);    if (bitstream.length !== expectedLength) {      throw new RuntimeError(        `Availability bitstream must be exactly ${expectedLength} bytes long to store ${lengthBits} bits. Actual bitstream was ${bitstream.length} bytes long.`      );    }    // Only compute the available count if requested, as this involves looping    // over the bitstream.    const computeAvailableCountEnabled = defaultValue(      options.computeAvailableCountEnabled,      false    );    if (!defined(availableCount) && computeAvailableCountEnabled) {      availableCount = count1Bits(bitstream, lengthBits);    }  }  this._lengthBits = lengthBits;  this._availableCount = availableCount;  this._constant = constant;  this._bitstream = bitstream;}/** * Count the number of bits with value 1 in the bitstream. This is used for * computing availableCount if not precomputed * * @param {Uint8Array} bitstream The bitstream typed array * @param {Number} lengthBits How many bits are in the bitstream * @private */function count1Bits(bitstream, lengthBits) {  let count = 0;  for (let i = 0; i < lengthBits; i++) {    const byteIndex = i >> 3;    const bitIndex = i % 8;    count += (bitstream[byteIndex] >> bitIndex) & 1;  }  return count;}Object.defineProperties(ImplicitAvailabilityBitstream.prototype, {  /**   * The length of the bitstream in bits.   *   * @memberof ImplicitAvailabilityBitstream.prototype   *   * @type {Number}   * @readonly   * @private   */  lengthBits: {    get: function () {      return this._lengthBits;    },  },  /**   * The number of bits in the bitstream with value <code>1</code>.   *   * @memberof ImplicitAvailabilityBitstream.prototype   *   * @type {Number}   * @readonly   * @private   */  availableCount: {    get: function () {      return this._availableCount;    },  },});/** * Get a bit from the availability bitstream as a Boolean. If the bitstream * is a constant, the constant value is returned instead. * * @param {Number} index The integer index of the bit. * @returns {Boolean} The value of the bit * @private */ImplicitAvailabilityBitstream.prototype.getBit = function (index) {  //>>includeStart('debug', pragmas.debug);  if (index < 0 || index >= this._lengthBits) {    throw new DeveloperError("Bit index out of bounds.");  }  //>>includeEnd('debug');  if (defined(this._constant)) {    return this._constant;  }  // byteIndex is floor(index / 8)  const byteIndex = index >> 3;  const bitIndex = index % 8;  return ((this._bitstream[byteIndex] >> bitIndex) & 1) === 1;};
 |