From cbdaf1035dfcf8b9a6a7ef3cc8857b70e4fce2ff Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Sun, 10 Mar 2013 19:05:14 +0100 Subject: [PATCH] polyline: Added encode/decodeSignedIntegers() functions --- src/ol/parser/polyline.js | 44 ++++++++++++++++++++++++++++ test/spec/ol/parser/polyline.test.js | 22 ++++++++++++++ 2 files changed, 66 insertions(+) diff --git a/src/ol/parser/polyline.js b/src/ol/parser/polyline.js index 96178f82f4..ad49f2d2d8 100644 --- a/src/ol/parser/polyline.js +++ b/src/ol/parser/polyline.js @@ -72,6 +72,50 @@ ol.parser.polyline.decodeFlatCoordinates = function(encoded, opt_dimension) { }; +/** + * Encode a list of signed integers and return an encoded string + * + * Attention: This function will modify the passed array! + * + * @param {Array.} numbers A list of signed integers. + * @return {string} The encoded string. + */ +ol.parser.polyline.encodeSignedIntegers = function(numbers) { + var numbersLength = numbers.length; + for (var i = 0; i < numbersLength; ++i) { + var num = numbers[i]; + + var signedNum = num << 1; + if (num < 0) { + signedNum = ~(signedNum); + } + + numbers[i] = signedNum; + } + + return ol.parser.polyline.encodeUnsignedIntegers(numbers); +}; + + +/** + * Decode a list of signed integers from an encoded string + * + * @param {string} encoded An encoded string. + * @return {Array.} A list of signed integers. + */ +ol.parser.polyline.decodeSignedIntegers = function(encoded) { + var numbers = ol.parser.polyline.decodeUnsignedIntegers(encoded); + + var numbersLength = numbers.length; + for (var i = 0; i < numbersLength; ++i) { + var num = numbers[i]; + numbers[i] = (num & 1) ? ~(num >> 1) : (num >> 1); + } + + return numbers; +}; + + /** * Encode a list of unsigned integers and return an encoded string * diff --git a/test/spec/ol/parser/polyline.test.js b/test/spec/ol/parser/polyline.test.js index cab296a184..1e3540c1c3 100644 --- a/test/spec/ol/parser/polyline.test.js +++ b/test/spec/ol/parser/polyline.test.js @@ -27,6 +27,28 @@ describe('ol.parser.polyline', function() { }); + var signedIntegers = [0, 15, -1, -16, 16, 1]; + var encodedSignedIntegers = '?]@^_@A'; + + describe('encodeSignedIntegers', function() { + it('returns expected value', function() { + var encodeSignedIntegers = ol.parser.polyline.encodeSignedIntegers; + + expect(encodeSignedIntegers( + signedIntegers.slice())).toEqual(encodedSignedIntegers); + }); + }); + + describe('decodeSignedIntegers', function() { + it('returns expected value', function() { + var decodeSignedIntegers = ol.parser.polyline.decodeSignedIntegers; + + expect(decodeSignedIntegers( + encodedSignedIntegers)).toEqual(signedIntegers); + }); + }); + + var unsignedIntegers = [0, 30, 1, 31, 32, 2, 174]; var encodedUnsignedIntegers = '?]@^_@AmD';