toBinary method

Uint8List toBinary()

Implementation

Uint8List toBinary() {
  final int markerCoordsLength = marker.coords.length;

  // Calculate total bytes required
  int totalBytes = 0;
  totalBytes += 4; // Number of coordinates
  totalBytes += markerCoordsLength *
      16; // 8 bytes for each double (latitude, longitude)

  int nameLength = 0;
  if (marker.name != null) {
    final Uint8List nameBytes = utf8.encode(marker.name!);
    nameLength = nameBytes.length;
    totalBytes += 4; // Length of the name string
    totalBytes += nameLength; // Name string bytes
  } else {
    totalBytes += 4; // Length of the name string (0)
  }

  totalBytes += 8; // polylineInnerSize
  totalBytes += 8; // polylineOuterSize
  totalBytes += 8; // labelTextSize
  totalBytes += 8; // imageSize
  totalBytes += 4; // labelingMode
  if (kIsWeb) {
    totalBytes += 4;
    totalBytes += 4;
  } else {
    totalBytes += 8; // _imagePointer (assuming 64-bit pointer)
    totalBytes += 8; // _hashValue
  }
  totalBytes += 4; // _imagePointerSize

  // Adding 4 bytes for each color (RGBA)
  totalBytes += 4 *
      4; // polylineInnerColor, polylineOuterColor, polygonFillColor, labelTextColor

  final ByteData buffer = ByteData(totalBytes);
  int offset = 0;

  // Serialize MarkerJson
  buffer.setInt32(offset, markerCoordsLength, Endian.little);
  offset += 4;

  for (final Coordinates coord in marker.coords) {
    buffer.setFloat64(offset, coord.latitude, Endian.little);
    offset += 8;
    buffer.setFloat64(offset, coord.longitude, Endian.little);
    offset += 8;
  }

  // Serialize the name string
  buffer.setInt32(offset, nameLength, Endian.little);
  offset += 4;

  if (nameLength > 0) {
    final Uint8List nameBytes = utf8.encode(marker.name!);
    buffer.buffer.asUint8List().setAll(offset, nameBytes);
    offset += nameLength;
  }

  // Serialize MarkerRenderSettings
  buffer.setFloat64(offset, settings.polylineInnerSize, Endian.little);
  offset += 8;

  buffer.setFloat64(offset, settings.polylineOuterSize, Endian.little);
  offset += 8;

  buffer.setFloat64(offset, settings.labelTextSize, Endian.little);
  offset += 8;

  buffer.setFloat64(offset, settings.imageSize, Endian.little);
  offset += 8;

  buffer.setInt32(offset, settings.packedLabelingMode, Endian.little);
  offset += 4;
  if (!kIsWeb) {
    buffer.setInt64(offset, settings.imagePointer ?? 0, Endian.little);
    offset += 8;
  } else {
    buffer.setInt32(offset, settings.imagePointer ?? 0, Endian.little);
    offset += 4;
  }
  buffer.setInt32(offset, settings.imagePointerSize ?? 0, Endian.little);
  offset += 4;
  if (!kIsWeb) {
    buffer.setInt64(offset, settings.hashCode, Endian.little);
    offset += 8;
  } else {
    buffer.setInt32(offset, settings.hashCode, Endian.little);
    offset += 4;
  }

  // Serialize Colors
  buffer.setUint8(offset++, (settings.polylineInnerColor.r * 255).toInt());
  buffer.setUint8(offset++, (settings.polylineInnerColor.g * 255).toInt());
  buffer.setUint8(offset++, (settings.polylineInnerColor.b * 255).toInt());
  buffer.setUint8(offset++, (settings.polylineInnerColor.a * 255).toInt());

  buffer.setUint8(offset++, (settings.polylineOuterColor.r * 255).toInt());
  buffer.setUint8(offset++, (settings.polylineOuterColor.g * 255).toInt());
  buffer.setUint8(offset++, (settings.polylineOuterColor.b * 255).toInt());
  buffer.setUint8(offset++, (settings.polylineOuterColor.a * 255).toInt());

  buffer.setUint8(offset++, (settings.polygonFillColor.r * 255).toInt());
  buffer.setUint8(offset++, (settings.polygonFillColor.g * 255).toInt());
  buffer.setUint8(offset++, (settings.polygonFillColor.b * 255).toInt());
  buffer.setUint8(offset++, (settings.polygonFillColor.a * 255).toInt());

  buffer.setUint8(offset++, (settings.labelTextColor.r * 255).toInt());
  buffer.setUint8(offset++, (settings.labelTextColor.g * 255).toInt());
  buffer.setUint8(offset++, (settings.labelTextColor.b * 255).toInt());
  buffer.setUint8(offset++, (settings.labelTextColor.a * 255).toInt());

  return buffer.buffer.asUint8List();
}