[Liblas-commits] laszip: compress/decompress scan angle as U8 avoids danger

liblas-commits at liblas.org liblas-commits at liblas.org
Mon Jan 31 14:16:06 EST 2011


details:   http://hg.liblas.orglaszip/rev/272e64fc7bea
changeset: 170:272e64fc7bea
user:      isenburg
date:      Mon Jan 31 11:15:44 2011 -0800
description:
compress/decompress scan angle as U8 avoids danger

diffstat:

 src/lasreaditemcompressed_v1.cpp  |  1124 +++++++++++++++---------------
 src/laswriteitemcompressed_v1.cpp |  1312 ++++++++++++++++++------------------
 2 files changed, 1214 insertions(+), 1222 deletions(-)

diffs (truncated from 2475 to 300 lines):

diff -r 70c18563cbe5 -r 272e64fc7bea src/lasreaditemcompressed_v1.cpp
--- a/src/lasreaditemcompressed_v1.cpp	Mon Jan 31 10:17:43 2011 -0800
+++ b/src/lasreaditemcompressed_v1.cpp	Mon Jan 31 11:15:44 2011 -0800
@@ -7,20 +7,20 @@
   
     see corresponding header file
   
-  PROGRAMMERS:
-
-    martin.isenburg at gmail.com
-
-  COPYRIGHT:
-
-    (c) 2011, Martin Isenburg, LASSO - tools to catch reality
-
-    This is free software; you can redistribute and/or modify it under the
-    terms of the GNU Lesser General Licence as published by the Free Software
-    Foundation. See the COPYING file for more information.
-
-    This software is distributed WITHOUT ANY WARRANTY and without even the
-    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+  PROGRAMMERS:
+
+    martin.isenburg at gmail.com
+
+  COPYRIGHT:
+
+    (c) 2011, Martin Isenburg, LASSO - tools to catch reality
+
+    This is free software; you can redistribute and/or modify it under the
+    terms of the GNU Lesser General Licence as published by the Free Software
+    Foundation. See the COPYING file for more information.
+
+    This software is distributed WITHOUT ANY WARRANTY and without even the
+    implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
   
   CHANGE HISTORY:
   
@@ -30,559 +30,555 @@
 */
 
 #include "lasreaditemcompressed_v1.hpp"
-
-#include <assert.h>
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-/*
-===============================================================================
-                       LASreadItemCompressed_POINT10_v1
-===============================================================================
-*/
-
-struct LASpoint10
-{
-  I32 x;
-  I32 y;
-  I32 z;
-  U16 intensity;
-  U8 return_number : 3;
-  U8 number_of_returns_of_given_pulse : 3;
-  U8 scan_direction_flag : 1;
-  U8 edge_of_flight_line : 1;
-  U8 classification;
-  I8 scan_angle_rank;
-  U8 user_data;
-  U16 point_source_ID;
-};
+
+#include <assert.h>
+#include <string.h>
+#include <stdio.h>
+
+/*
+===============================================================================
+                       LASreadItemCompressed_POINT10_v1
+===============================================================================
+*/
+
+struct LASpoint10
+{
+  I32 x;
+  I32 y;
+  I32 z;
+  U16 intensity;
+  U8 return_number : 3;
+  U8 number_of_returns_of_given_pulse : 3;
+  U8 scan_direction_flag : 1;
+  U8 edge_of_flight_line : 1;
+  U8 classification;
+  I8 scan_angle_rank;
+  U8 user_data;
+  U16 point_source_ID;
+};
 
 LASreadItemCompressed_POINT10_v1::LASreadItemCompressed_POINT10_v1(EntropyDecoder* dec)
 {
-  U32 i;
-
-  /* set decoder */
-  assert(dec);
-  this->dec = dec;
-
-  /* create models and integer compressors */
-  ic_dx = new IntegerCompressor(dec, 32);  // 32 bits, 1 context
-	ic_dy = new IntegerCompressor(dec, 32, 20); // 32 bits, 20 contexts
-	ic_z = new IntegerCompressor(dec, 32, 20);  // 32 bits, 20 contexts
-	ic_intensity = new IntegerCompressor(dec, 16);
-	ic_scan_angle_rank = new IntegerCompressor(dec, 8, 2);
-	ic_point_source_ID = new IntegerCompressor(dec, 16);
-	m_changed_values = dec->createSymbolModel(64);
-  for (i = 0; i < 256; i++)
-  {
-    m_bit_byte[i] = 0;
-    m_classification[i] = 0;
-    m_user_data[i] = 0;
-  }
+  U32 i;
+
+  /* set decoder */
+  assert(dec);
+  this->dec = dec;
+
+  /* create models and integer compressors */
+  ic_dx = new IntegerCompressor(dec, 32);  // 32 bits, 1 context
+	ic_dy = new IntegerCompressor(dec, 32, 20); // 32 bits, 20 contexts
+	ic_z = new IntegerCompressor(dec, 32, 20);  // 32 bits, 20 contexts
+	ic_intensity = new IntegerCompressor(dec, 16);
+	ic_scan_angle_rank = new IntegerCompressor(dec, 8, 2);
+	ic_point_source_ID = new IntegerCompressor(dec, 16);
+	m_changed_values = dec->createSymbolModel(64);
+  for (i = 0; i < 256; i++)
+  {
+    m_bit_byte[i] = 0;
+    m_classification[i] = 0;
+    m_user_data[i] = 0;
+  }
 }
-
-LASreadItemCompressed_POINT10_v1::~LASreadItemCompressed_POINT10_v1()
-{
-  U32 i;
-
-  delete ic_dx;
-  delete ic_dy;
-  delete ic_z;
-  delete ic_intensity;
-  delete ic_scan_angle_rank;
-  delete ic_point_source_ID;
-  dec->destroySymbolModel(m_changed_values);
-  for (i = 0; i < 256; i++)
-  {
-    if (m_bit_byte[i]) dec->destroySymbolModel(m_bit_byte[i]);
-    if (m_classification[i]) dec->destroySymbolModel(m_classification[i]);
-    if (m_user_data[i]) dec->destroySymbolModel(m_user_data[i]);
-  }
-}
+
+LASreadItemCompressed_POINT10_v1::~LASreadItemCompressed_POINT10_v1()
+{
+  U32 i;
+
+  delete ic_dx;
+  delete ic_dy;
+  delete ic_z;
+  delete ic_intensity;
+  delete ic_scan_angle_rank;
+  delete ic_point_source_ID;
+  dec->destroySymbolModel(m_changed_values);
+  for (i = 0; i < 256; i++)
+  {
+    if (m_bit_byte[i]) dec->destroySymbolModel(m_bit_byte[i]);
+    if (m_classification[i]) dec->destroySymbolModel(m_classification[i]);
+    if (m_user_data[i]) dec->destroySymbolModel(m_user_data[i]);
+  }
+}
 
 BOOL LASreadItemCompressed_POINT10_v1::init(const U8* item)
-{
-  U32 i;
-
-  /* init state */
-	last_x_diff[0] = last_x_diff[1] = last_x_diff[2] = 0;
-	last_y_diff[0] = last_y_diff[1] = last_y_diff[2] = 0;
-  last_incr = 0;
-
-  /* init models and integer compressors */
-  ic_dx->initDecompressor();
-  ic_dy->initDecompressor();
-  ic_z->initDecompressor();
-  ic_intensity->initDecompressor();
-  ic_scan_angle_rank->initDecompressor();
-  ic_point_source_ID->initDecompressor();
-  dec->initSymbolModel(m_changed_values);
-  for (i = 0; i < 256; i++)
-  {
-    if (m_bit_byte[i]) dec->initSymbolModel(m_bit_byte[i]);
-    if (m_classification[i]) dec->initSymbolModel(m_classification[i]);
-    if (m_user_data[i]) dec->initSymbolModel(m_user_data[i]);
-  }
-
-  /* init last item */
-  memcpy(last_item, item, 20);
-
-  return TRUE;
-}
-
-inline BOOL LASreadItemCompressed_POINT10_v1::read(U8* item)
-{
-  // find median difference for x and y from 3 preceding differences
-  I32 median_x;
-  if (last_x_diff[0] < last_x_diff[1])
-  {
-    if (last_x_diff[1] < last_x_diff[2])
-      median_x = last_x_diff[1];
-    else if (last_x_diff[0] < last_x_diff[2])
-      median_x = last_x_diff[2];
-    else
-      median_x = last_x_diff[0];
-  }
-  else
-  {
-    if (last_x_diff[0] < last_x_diff[2])
-      median_x = last_x_diff[0];
-    else if (last_x_diff[1] < last_x_diff[2])
-      median_x = last_x_diff[2];
-    else
-      median_x = last_x_diff[1];
-  }
-
-  I32 median_y;
-  if (last_y_diff[0] < last_y_diff[1])
-  {
-    if (last_y_diff[1] < last_y_diff[2])
-      median_y = last_y_diff[1];
-    else if (last_y_diff[0] < last_y_diff[2])
-      median_y = last_y_diff[2];
-    else
-      median_y = last_y_diff[0];
-  }
-  else
-  {
-    if (last_y_diff[0] < last_y_diff[2])
-      median_y = last_y_diff[0];
-    else if (last_y_diff[1] < last_y_diff[2])
-      median_y = last_y_diff[2];
-    else
-      median_y = last_y_diff[1];
-  }
-
-  // copy point from last point
-  memcpy(item, last_item, 20);
-
-  // decompress x y z coordinates
-  I32 x_diff = ic_dx->decompress(median_x);
-  ((LASpoint10*)item)->x += x_diff;
-  // we use the number k of bits corrector bits to switch contexts
-  U32 k_bits = ic_dx->getK();
-  I32 y_diff = ic_dy->decompress(median_y, (k_bits < 19 ? k_bits : 19));
-  ((LASpoint10*)item)->y += y_diff;
-  k_bits = (k_bits + ic_dy->getK())/2;
-  ((LASpoint10*)item)->z = ic_z->decompress(((LASpoint10*)last_item)->z, (k_bits < 19 ? k_bits : 19));
-
-	// decompress which other values have changed
-	I32 changed_values = dec->decodeSymbol(m_changed_values);
-
-  if (changed_values)
-  {
-		// decompress the intensity if it has changed
-		if (changed_values & 32)
-		{
-			((LASpoint10*)item)->intensity = ic_intensity->decompress(((LASpoint10*)last_item)->intensity);
-		}
-
-		// decompress the edge_of_flight_line, scan_direction_flag, ... if it has changed
-		if (changed_values & 16)
-		{
-      if (m_bit_byte[last_item[14]] == 0)
-      {
-        m_bit_byte[last_item[14]] = dec->createSymbolModel(256);
-        dec->initSymbolModel(m_bit_byte[last_item[14]]);
-      }
-			item[14] = dec->decodeSymbol(m_bit_byte[last_item[14]]);
-		}
-
-		// decompress the classification ... if it has changed
-		if (changed_values & 8)
-		{
-      if (m_classification[last_item[15]] == 0)
-      {
-        m_classification[last_item[15]] = dec->createSymbolModel(256);
-        dec->initSymbolModel(m_classification[last_item[15]]);
-      }
-			item[15] = dec->decodeSymbol(m_classification[last_item[15]]);
-		}
-		
-		// decompress the scan_angle_rank ... if it has changed
-		if (changed_values & 4)
-		{


More information about the Liblas-commits mailing list