Branch data Line data Source code
1 : : /* 2 : : =============================================================================== 3 : : 4 : : FILE: field_extrabytes.hpp 5 : : 6 : : CONTENTS: 7 : : 8 : : 9 : : PROGRAMMERS: 10 : : 11 : : martin.isenburg@rapidlasso.com - http://rapidlasso.com 12 : : uday.karan@gmail.com - Hobu, Inc. 13 : : andrew.bell.ia@gmail.com - Hobu Inc. 14 : : 15 : : COPYRIGHT: 16 : : 17 : : (c) 2007-2014, martin isenburg, rapidlasso - tools to catch reality 18 : : (c) 2014, Uday Verma, Hobu, Inc. 19 : : 20 : : This is free software; you can redistribute and/or modify it under the 21 : : terms of the GNU Lesser General Licence as published by the Free Software 22 : : Foundation. See the COPYING file for more information. 23 : : 24 : : This software is distributed WITHOUT ANY WARRANTY and without even the 25 : : implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 26 : : 27 : : CHANGE HISTORY: 28 : : 29 : : =============================================================================== 30 : : */ 31 : : 32 : : #ifndef __las_hpp__ 33 : : #error Cannot directly include this file, this is a part of las.hpp 34 : : #endif 35 : : 36 : : #include <deque> 37 : : 38 : : namespace laszip { 39 : : namespace formats { 40 : : 41 : : template<> 42 : 0 : struct field<las::extrabytes> { 43 : : typedef las::extrabytes type; 44 : : 45 : : size_t count_; 46 : : bool have_last_; 47 : : std::vector<uint8_t> lasts_; 48 : : std::vector<uint8_t> diffs_; 49 : : std::deque<models::arithmetic> models_; 50 : : 51 : 0 : field(size_t count) : 52 : 0 : count_(count), have_last_(false), lasts_(count), diffs_(count), 53 : 0 : models_(count, models::arithmetic(256)) 54 : 0 : {} 55 : : 56 : : template<typename TEncoder> 57 : : inline const char *compressWith(TEncoder& enc, const char *buf) 58 : : { 59 : : auto li = lasts_.begin(); 60 : : auto di = diffs_.begin(); 61 : : while (di != diffs_.end()) 62 : : { 63 : : *di = *buf - *li; 64 : : *li = *buf; 65 : : di++; buf++; li++; 66 : : } 67 : : 68 : : if (!have_last_) 69 : : { 70 : : enc.getOutStream().putBytes(lasts_.data(), count_); 71 : : have_last_ = true; 72 : : } 73 : : else 74 : : { 75 : : di = diffs_.begin(); 76 : : auto mi = models_.begin(); 77 : : while (di != diffs_.end()) 78 : : enc.encodeSymbol(*mi++, *di++); 79 : : } 80 : : return buf; 81 : : } 82 : : 83 : : template<typename TDecoder> 84 : 0 : inline char *decompressWith(TDecoder& dec, char *buf) 85 : : { 86 : 0 : if (!have_last_) 87 : : { 88 : 0 : dec.getInStream().getBytes((unsigned char *)buf, count_); 89 : 0 : std::copy(buf, buf + count_, lasts_.data()); 90 : 0 : have_last_ = true; 91 : 0 : return buf + count_; 92 : : } 93 : : // Use the diff vector for our current values. 94 : 0 : auto& curs = diffs_; 95 : 0 : auto ci = curs.begin(); 96 : 0 : auto li = lasts_.begin(); 97 : 0 : auto mi = models_.begin(); 98 : 0 : while (li != lasts_.end()) 99 : : { 100 : 0 : *ci = u8_fold(*li + dec.decodeSymbol(*mi)); 101 : 0 : *li = *buf = *ci; 102 : 0 : li++; buf++; ci++; mi++; 103 : : } 104 : 0 : return buf; 105 : 0 : } 106 : : }; 107 : : } 108 : : }