From e802cc3d56c1fce811ba604f196e3c841b55df25 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Sat, 9 Mar 2013 22:40:07 +0100 Subject: [PATCH] polyline: Added decodeSigned/UnsignedInteger() functions --- src/ol/parser/polyline.js | 33 ++++++++++++++++++++++++++ test/spec/ol/parser/polyline.test.js | 35 ++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) diff --git a/src/ol/parser/polyline.js b/src/ol/parser/polyline.js index ec1d564751..03ce9077c3 100644 --- a/src/ol/parser/polyline.js +++ b/src/ol/parser/polyline.js @@ -16,6 +16,18 @@ ol.parser.polyline.encodeSignedInteger = function(num) { }; +/** + * Decode one single signed integer from an encoded string + * + * @param {string} encoded An encoded string. + * @return {number} The decoded signed integer. + */ +ol.parser.polyline.decodeSignedInteger = function(encoded) { + var result = ol.parser.polyline.decodeUnsignedInteger(encoded); + return ((result & 1) ? ~(result >> 1) : (result >> 1)); +}; + + /** * Encode one single unsigned integer and return an encoded string * @@ -33,3 +45,24 @@ ol.parser.polyline.encodeUnsignedInteger = function(num) { encodeString += (String.fromCharCode(value)); return encodeString; }; + + +/** + * Decode one single unsigned integer from an encoded string + * + * @param {string} encoded An encoded string. + * @return {number} The decoded unsigned integer. + */ +ol.parser.polyline.decodeUnsignedInteger = function(encoded) { + var result = 0; + var shift = 0; + + var b, i = 0; + do { + b = encoded.charCodeAt(i++) - 63; + result |= (b & 0x1f) << shift; + shift += 5; + } while (b >= 0x20); + + return result; +}; diff --git a/test/spec/ol/parser/polyline.test.js b/test/spec/ol/parser/polyline.test.js index dc41a13052..2b96b75373 100644 --- a/test/spec/ol/parser/polyline.test.js +++ b/test/spec/ol/parser/polyline.test.js @@ -20,6 +20,24 @@ describe('ol.parser.polyline', function() { }); }); + describe('decodeSignedInteger', function() { + it('returns expected value', function() { + var decodeSignedInteger = ol.parser.polyline.decodeSignedInteger; + + expect(decodeSignedInteger('?')).toEqual(0); + expect(decodeSignedInteger('@')).toEqual(-1); + expect(decodeSignedInteger('A')).toEqual(1); + expect(decodeSignedInteger('B')).toEqual(-2); + expect(decodeSignedInteger('C')).toEqual(2); + expect(decodeSignedInteger(']')).toEqual(15); + expect(decodeSignedInteger('^')).toEqual(-16); + + expect(decodeSignedInteger('_@')).toEqual(16); + expect(decodeSignedInteger('__@')).toEqual(16 * 32); + expect(decodeSignedInteger('___@')).toEqual(16 * 32 * 32); + }); + }); + describe('encodeUnsignedInteger', function() { it('returns expected value', function() { var encodeUnsignedInteger = ol.parser.polyline.encodeUnsignedInteger; @@ -36,6 +54,23 @@ describe('ol.parser.polyline', function() { expect(encodeUnsignedInteger(32 * 32 * 32)).toEqual('___@'); }); }); + + describe('decodeUnsignedInteger', function() { + it('returns expected value', function() { + var decodeUnsignedInteger = ol.parser.polyline.decodeUnsignedInteger; + + expect(decodeUnsignedInteger('?')).toEqual(0); + expect(decodeUnsignedInteger('@')).toEqual(1); + expect(decodeUnsignedInteger('A')).toEqual(2); + expect(decodeUnsignedInteger(']')).toEqual(30); + expect(decodeUnsignedInteger('^')).toEqual(31); + expect(decodeUnsignedInteger('_@')).toEqual(32); + + expect(decodeUnsignedInteger('__@')).toEqual(32 * 32); + expect(decodeUnsignedInteger('__D')).toEqual(5 * 32 * 32); + expect(decodeUnsignedInteger('___@')).toEqual(32 * 32 * 32); + }); + }); }); goog.require('ol.parser.polyline');