public unsafe override bool write(laszip_point item) { enc.encodeSymbol(m_packet_index, item.wave_packet[0]); fixed(byte *pItem = item.wave_packet) { LASwavepacket13 *wave = (LASwavepacket13 *)(pItem + 1); // calculate the difference between the two offsets long curr_diff_64 = (long)(wave->offset - last_item.offset); int curr_diff_32 = (int)curr_diff_64; // if the current difference can be represented with 32 bits if (curr_diff_64 == (long)(curr_diff_32)) { if (curr_diff_32 == 0) // current difference is zero { enc.encodeSymbol(m_offset_diff[sym_last_offset_diff], 0); sym_last_offset_diff = 0; } else if (curr_diff_32 == (int)last_item.packet_size) // current difference is size of last packet { enc.encodeSymbol(m_offset_diff[sym_last_offset_diff], 1); sym_last_offset_diff = 1; } else // { enc.encodeSymbol(m_offset_diff[sym_last_offset_diff], 2); sym_last_offset_diff = 2; ic_offset_diff.compress(last_diff_32, curr_diff_32); last_diff_32 = curr_diff_32; } } else { enc.encodeSymbol(m_offset_diff[sym_last_offset_diff], 3); sym_last_offset_diff = 3; enc.writeInt64(wave->offset); } ic_packet_size.compress((int)last_item.packet_size, (int)wave->packet_size); ic_return_point.compress(last_item.return_point.i32, wave->return_point.i32); ic_xyz.compress(last_item.x.i32, wave->x.i32, 0); ic_xyz.compress(last_item.y.i32, wave->y.i32, 1); ic_xyz.compress(last_item.z.i32, wave->z.i32, 2); last_item = *wave; } return(true); }
public unsafe override void read(laszip_point item) { item.wave_packet[0] = (byte)(dec.decodeSymbol(m_packet_index)); fixed(byte *pItem = item.wave_packet) { LASwavepacket13 *wave = (LASwavepacket13 *)(pItem + 1); sym_last_offset_diff = dec.decodeSymbol(m_offset_diff[sym_last_offset_diff]); if (sym_last_offset_diff == 0) { wave->offset = last_item.offset; } else if (sym_last_offset_diff == 1) { wave->offset = last_item.offset + last_item.packet_size; } else if (sym_last_offset_diff == 2) { last_diff_32 = ic_offset_diff.decompress(last_diff_32); wave->offset = (ulong)((long)last_item.offset + last_diff_32); } else { wave->offset = dec.readInt64(); } wave->packet_size = (uint)ic_packet_size.decompress((int)last_item.packet_size); wave->return_point.i32 = ic_return_point.decompress(last_item.return_point.i32); wave->x.i32 = ic_xyz.decompress(last_item.x.i32, 0); wave->y.i32 = ic_xyz.decompress(last_item.y.i32, 1); wave->z.i32 = ic_xyz.decompress(last_item.z.i32, 2); last_item = *wave; } }