toBinary method
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();
}