diff --git a/src/ol/parser/polyline.js b/src/ol/parser/polyline.js new file mode 100644 index 0000000000..ec1d564751 --- /dev/null +++ b/src/ol/parser/polyline.js @@ -0,0 +1,35 @@ +goog.provide('ol.parser.polyline'); + + +/** + * Encode one single signed integer and return an encoded string + * + * @param {number} num Signed integer that should be encoded. + * @return {string} The encoded string. + */ +ol.parser.polyline.encodeSignedInteger = function(num) { + var sgn_num = num << 1; + if (num < 0) + sgn_num = ~(sgn_num); + + return ol.parser.polyline.encodeUnsignedInteger(sgn_num); +}; + + +/** + * Encode one single unsigned integer and return an encoded string + * + * @param {number} num Unsigned integer that should be encoded. + * @return {string} The encoded string. + */ +ol.parser.polyline.encodeUnsignedInteger = function(num) { + var value, encodeString = ''; + while (num >= 0x20) { + value = (0x20 | (num & 0x1f)) + 63; + encodeString += (String.fromCharCode(value)); + num >>= 5; + } + value = num + 63; + encodeString += (String.fromCharCode(value)); + return encodeString; +}; diff --git a/test/spec/ol/parser/polyline.test.js b/test/spec/ol/parser/polyline.test.js new file mode 100644 index 0000000000..dc41a13052 --- /dev/null +++ b/test/spec/ol/parser/polyline.test.js @@ -0,0 +1,41 @@ +goog.provide('ol.test.parser.polyline'); + +describe('ol.parser.polyline', function() { + + describe('encodeSignedInteger', function() { + it('returns expected value', function() { + var encodeSignedInteger = ol.parser.polyline.encodeSignedInteger; + + expect(encodeSignedInteger(0)).toEqual('?'); + expect(encodeSignedInteger(-1)).toEqual('@'); + expect(encodeSignedInteger(1)).toEqual('A'); + expect(encodeSignedInteger(-2)).toEqual('B'); + expect(encodeSignedInteger(2)).toEqual('C'); + expect(encodeSignedInteger(15)).toEqual(']'); + expect(encodeSignedInteger(-16)).toEqual('^'); + + expect(encodeSignedInteger(16)).toEqual('_@'); + expect(encodeSignedInteger(16 * 32)).toEqual('__@'); + expect(encodeSignedInteger(16 * 32 * 32)).toEqual('___@'); + }); + }); + + describe('encodeUnsignedInteger', function() { + it('returns expected value', function() { + var encodeUnsignedInteger = ol.parser.polyline.encodeUnsignedInteger; + + expect(encodeUnsignedInteger(0)).toEqual('?'); + expect(encodeUnsignedInteger(1)).toEqual('@'); + expect(encodeUnsignedInteger(2)).toEqual('A'); + expect(encodeUnsignedInteger(30)).toEqual(']'); + expect(encodeUnsignedInteger(31)).toEqual('^'); + expect(encodeUnsignedInteger(32)).toEqual('_@'); + + expect(encodeUnsignedInteger(32 * 32)).toEqual('__@'); + expect(encodeUnsignedInteger(5 * 32 * 32)).toEqual('__D'); + expect(encodeUnsignedInteger(32 * 32 * 32)).toEqual('___@'); + }); + }); +}); + +goog.require('ol.parser.polyline');