diff --git a/OtherLanguages/js/LercDecode.min.js b/OtherLanguages/js/LercDecode.min.js new file mode 100644 index 0000000..fee4d54 --- /dev/null +++ b/OtherLanguages/js/LercDecode.min.js @@ -0,0 +1,3 @@ +/* Copyright 2015 Esri. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 @preserve */ +(function(){var LercDecode=function(){var CntZImage={};CntZImage.defaultNoDataValue=-3.4027999387901484e38;CntZImage.decode=function(input,options){options=options||{};var skipMask=options.encodedMaskData||options.encodedMaskData===null;var parsedData=parse(input,options.inputOffset||0,skipMask);var noDataValue=options.noDataValue!==null?options.noDataValue:CntZImage.defaultNoDataValue;var uncompressedData=uncompressPixelValues(parsedData,options.pixelType||Float32Array,options.encodedMaskData,noDataValue,options.returnMask);var result={width:parsedData.width,height:parsedData.height,pixelData:uncompressedData.resultPixels,minValue:uncompressedData.minValue,maxValue:parsedData.pixels.maxValue,noDataValue:noDataValue};if(uncompressedData.resultMask){result.maskData=uncompressedData.resultMask}if(options.returnEncodedMask&&parsedData.mask){result.encodedMaskData=parsedData.mask.bitset?parsedData.mask.bitset:null}if(options.returnFileInfo){result.fileInfo=formatFileInfo(parsedData);if(options.computeUsedBitDepths){result.fileInfo.bitDepths=computeUsedBitDepths(parsedData)}}return result};var uncompressPixelValues=function(data,TypedArrayClass,maskBitset,noDataValue,storeDecodedMask){var blockIdx=0;var numX=data.pixels.numBlocksX;var numY=data.pixels.numBlocksY;var blockWidth=Math.floor(data.width/numX);var blockHeight=Math.floor(data.height/numY);var scale=2*data.maxZError;var minValue=Number.MAX_VALUE,currentValue;maskBitset=maskBitset||(data.mask?data.mask.bitset:null);var resultPixels,resultMask;resultPixels=new TypedArrayClass(data.width*data.height);if(storeDecodedMask&&maskBitset){resultMask=new Uint8Array(data.width*data.height)}var blockDataBuffer=new Float32Array(blockWidth*blockHeight);var xx,yy;for(var y=0;y<=numY;y++){var thisBlockHeight=y!==numY?blockHeight:data.height%numY;if(thisBlockHeight===0){continue}for(var x=0;x<=numX;x++){var thisBlockWidth=x!==numX?blockWidth:data.width%numX;if(thisBlockWidth===0){continue}var outPtr=y*data.width*blockHeight+x*blockWidth;var outStride=data.width-thisBlockWidth;var block=data.pixels.blocks[blockIdx];var blockData,blockPtr,constValue;if(block.encoding<2){if(block.encoding===0){blockData=block.rawData}else{unstuff(block.stuffedData,block.bitsPerPixel,block.numValidPixels,block.offset,scale,blockDataBuffer,data.pixels.maxValue);blockData=blockDataBuffer}blockPtr=0}else if(block.encoding===2){constValue=0}else{constValue=block.offset}var maskByte;if(maskBitset){for(yy=0;yy>3];maskByte<<=outPtr&7}for(xx=0;xx>3]}if(maskByte&128){if(resultMask){resultMask[outPtr]=1}currentValue=block.encoding<2?blockData[blockPtr++]:constValue;minValue=minValue>currentValue?currentValue:minValue;resultPixels[outPtr++]=currentValue}else{if(resultMask){resultMask[outPtr]=0}resultPixels[outPtr++]=noDataValue}maskByte<<=1}outPtr+=outStride}}else{if(block.encoding<2){for(yy=0;yycurrentValue?currentValue:minValue;resultPixels[outPtr++]=currentValue}outPtr+=outStride}}else{minValue=minValue>constValue?constValue:minValue;for(yy=0;yy0){var bitset=new Uint8Array(Math.ceil(data.width*data.height/8));view=new DataView(input,fp,data.mask.numBytes);var cnt=view.getInt16(0,true);var ip=2,op=0;do{if(cnt>0){while(cnt--){bitset[op++]=view.getUint8(ip++)}}else{var val=view.getUint8(ip++);cnt=-cnt;while(cnt--){bitset[op++]=val}}cnt=view.getInt16(ip,true);ip+=2}while(ip0?1:0);var actualNumBlocksY=numBlocksY+(data.height%numBlocksY>0?1:0);data.pixels.blocks=new Array(actualNumBlocksX*actualNumBlocksY);var blockI=0;for(var blockY=0;blockY3){throw"Invalid block encoding ("+block.encoding+")"}if(block.encoding===2){fp++;continue}if(headerByte!==0&&headerByte!==2){headerByte>>=6;block.offsetType=headerByte;if(headerByte===2){block.offset=view.getInt8(1);size++}else if(headerByte===1){block.offset=view.getInt16(1,true);size+=2}else if(headerByte===0){block.offset=view.getFloat32(1,true);size+=4}else{throw"Invalid block offset type"}if(block.encoding===1){headerByte=view.getUint8(size);size++;block.bitsPerPixel=headerByte&63;headerByte>>=6;block.numValidPixelsType=headerByte;if(headerByte===2){block.numValidPixels=view.getUint8(size);size++}else if(headerByte===1){block.numValidPixels=view.getUint16(size,true);size+=2}else if(headerByte===0){block.numValidPixels=view.getUint32(size,true);size+=4}else{throw"Invalid valid pixel count type"}}}fp+=size;if(block.encoding===3){continue}var arrayBuf,store8;if(block.encoding===0){var numPixels=(data.pixels.numBytes-1)/4;if(numPixels!==Math.floor(numPixels)){throw"uncompressed block has invalid length"}arrayBuf=new ArrayBuffer(numPixels*4);store8=new Uint8Array(arrayBuf);store8.set(new Uint8Array(input,fp,numPixels*4));var rawData=new Float32Array(arrayBuf);block.rawData=rawData;fp+=numPixels*4}else if(block.encoding===1){var dataBytes=Math.ceil(block.numValidPixels*block.bitsPerPixel/8);var dataWords=Math.ceil(dataBytes/4);arrayBuf=new ArrayBuffer(dataWords*4);store8=new Uint8Array(arrayBuf);store8.set(new Uint8Array(input,fp,dataBytes));block.stuffedData=new Uint32Array(arrayBuf);fp+=dataBytes}}}data.eofOffset=fp;return data};var unstuff=function(src,bitsPerPixel,numPixels,offset,scale,dest,maxValue){var bitMask=(1<=bitsPerPixel){n=buffer>>>bitsLeft-bitsPerPixel&bitMask;bitsLeft-=bitsPerPixel}else{var missingBits=bitsPerPixel-bitsLeft;n=(buffer&bitMask)<>>bitsLeft}dest[o]=n=bitsPerPixel){n=buffer>>>bitsLeft-bitsPerPixel&bitMask;bitsLeft-=bitsPerPixel}else{missingBits=bitsPerPixel-bitsLeft;n=(buffer&bitMask)<>>bitsLeft}dest[o]=lutArr[n]}}else{nmax=Math.ceil((maxValue-offset)/scale);for(o=0;o=bitsPerPixel){n=buffer>>>bitsLeft-bitsPerPixel&bitMask;bitsLeft-=bitsPerPixel}else{missingBits=bitsPerPixel-bitsLeft;n=(buffer&bitMask)<>>bitsLeft}dest[o]=n=bitsPerPixel){n=buffer>>>bitsLeft-bitsPerPixel&bitMask;bitsLeft-=bitsPerPixel}else{missingBits=bitsPerPixel-bitsLeft;n=(buffer&bitMask)<>>bitsLeft}dest[o]=n=bitsPerPixel){n=buffer>>>bitPos&bitMask;bitsLeft-=bitsPerPixel;bitPos+=bitsPerPixel}else{missingBits=bitsPerPixel-bitsLeft;n=buffer>>>bitPos&bitMask;buffer=src[i++];bitsLeft=32-missingBits;n|=(buffer&(1<=bitsPerPixel){n=buffer>>>bitPos&bitMask;bitsLeft-=bitsPerPixel;bitPos+=bitsPerPixel}else{missingBits=bitsPerPixel-bitsLeft;n=buffer>>>bitPos&bitMask;buffer=src[i++];bitsLeft=32-missingBits;n|=(buffer&(1<=bitsPerPixel){n=buffer>>>bitPos&bitMask;bitsLeft-=bitsPerPixel;bitPos+=bitsPerPixel}else{missingBits=bitsPerPixel-bitsLeft;n=buffer>>>bitPos&bitMask;buffer=src[i++];bitsLeft=32-missingBits;n|=(buffer&(1<=bitsPerPixel){n=buffer>>>bitsLeft-bitsPerPixel&bitMask;bitsLeft-=bitsPerPixel}else{missingBits=bitsPerPixel-bitsLeft;n=(buffer&bitMask)<>>bitsLeft}dest[o]=n}return dest},originalUnstuff2:function(src,dest,bitsPerPixel,numPixels){var bitMask=(1<=bitsPerPixel){n=buffer>>>bitPos&bitMask;bitsLeft-=bitsPerPixel;bitPos+=bitsPerPixel}else{missingBits=bitsPerPixel-bitsLeft;n=buffer>>>bitPos&bitMask;buffer=src[i++];bitsLeft=32-missingBits;n|=(buffer&(1<=359?359:words;words-=tlen;do{sum1+=input[i++]<<8;sum2+=sum1+=input[i++]}while(--tlen);sum1=(sum1&65535)+(sum1>>>16);sum2=(sum2&65535)+(sum2>>>16)}if(len&1){sum2+=sum1+=input[i]<<8}sum1=(sum1&65535)+(sum1>>>16);sum2=(sum2&65535)+(sum2>>>16);return(sum2<<16|sum1)>>>0},readHeaderInfo:function(input,data){var ptr=data.ptr;var fileIdView=new Uint8Array(input,ptr,6);var headerInfo={};headerInfo.fileIdentifierString=String.fromCharCode.apply(null,fileIdView);if(headerInfo.fileIdentifierString.lastIndexOf("Lerc2",0)!==0){throw"Unexpected file identifier string (expect Lerc2 ): "+headerInfo.fileIdentifierString}ptr+=6;var view=new DataView(input,ptr,52);headerInfo.fileVersion=view.getInt32(0,true);ptr+=4;if(headerInfo.fileVersion>=3){headerInfo.checksum=view.getUint32(4,true);ptr+=4}view=new DataView(input,ptr,48);headerInfo.height=view.getUint32(0,true);headerInfo.width=view.getUint32(4,true);headerInfo.numValidPixel=view.getUint32(8,true);headerInfo.microBlockSize=view.getInt32(12,true);headerInfo.blobSize=view.getInt32(16,true);headerInfo.imageType=view.getInt32(20,true);headerInfo.maxZError=view.getFloat64(24,true);headerInfo.zMin=view.getFloat64(32,true);headerInfo.zMax=view.getFloat64(40,true);ptr+=48;data.headerInfo=headerInfo;data.ptr=ptr;var checksum;if(headerInfo.fileVersion>=3){checksum=this.computeChecksumFletcher32(new Uint8Array(input,ptr-48,headerInfo.blobSize-14));if(checksum!==headerInfo.checksum){throw"Checksum failed."}}return true},readMask:function(input,data){var ptr=data.ptr;var headerInfo=data.headerInfo;var numPixels=headerInfo.width*headerInfo.height;var numValidPixel=headerInfo.numValidPixel;var view=new DataView(input,ptr,4);var mask={};mask.numBytes=view.getUint32(0,true);ptr+=4;if((0===numValidPixel||numPixels===numValidPixel)&&0!==mask.numBytes){throw"invalid mask"}var bitset,resultMask;if(numValidPixel===0){bitset=new Uint8Array(Math.ceil(numPixels/8));mask.bitset=bitset;resultMask=new Uint8Array(numPixels);data.pixels.resultMask=resultMask;ptr+=mask.numBytes}else if(mask.numBytes>0){bitset=new Uint8Array(Math.ceil(numPixels/8));view=new DataView(input,ptr,mask.numBytes);var cnt=view.getInt16(0,true);var ip=2,op=0,val=0;do{if(cnt>0){while(cnt--){bitset[op++]=view.getUint8(ip++)}}else{val=view.getUint8(ip++);cnt=-cnt;while(cnt--){bitset[op++]=val}}cnt=view.getInt16(ip,true);ip+=2}while(ip>3];mb<<=k&7}else{mb=bitset[k>>3]}if(mb&128){resultMask[k]=1}}data.pixels.resultMask=resultMask;mask.bitset=bitset;ptr+=mask.numBytes}data.ptr=ptr;data.mask=mask;return true},readDataOneSweep:function(input,data,OutPixelTypeArray){var ptr=data.ptr;var headerInfo=data.headerInfo;var numPixels=headerInfo.width*headerInfo.height;var imageType=headerInfo.imageType;var numBytes=headerInfo.numValidPixel*Lerc2Helpers.getDateTypeSize(imageType);var rawData;if(OutPixelTypeArray===Uint8Array){rawData=new Uint8Array(input,ptr,numBytes)}else{var arrayBuf=new ArrayBuffer(numBytes);var store8=new Uint8Array(arrayBuf);store8.set(new Uint8Array(input,ptr,numBytes));rawData=new OutPixelTypeArray(arrayBuf)}if(rawData.length===numPixels){data.pixels.resultPixels=rawData}else{data.pixels.resultPixels=new OutPixelTypeArray(numPixels);var z=0,k=0;for(k=0;k=i1){return false}var blockDataBuffer=new Uint32Array(i1-i0);Lerc2Helpers.decodeBits(input,data,blockDataBuffer);var codeTable=[];var i,j,k,len;for(i=i0;i0){codeTable[j].second=word<>>32-len;if(32-bitPos>=len){bitPos+=len;if(bitPos===32){bitPos=0;srcPtr++;word=stuffedData[srcPtr]}}else{bitPos+=len-32;srcPtr++;word=stuffedData[srcPtr];codeTable[j].second|=word>>>32-bitPos}}}var offset=data.headerInfo.imageType===0?128:0;var height=data.headerInfo.height;var width=data.headerInfo.width;var numBitsLUT=0,numBitsLUTQick=0;var tree=new TreeNode;for(i=0;i=BITS_MAX){numBitsLUTQick=BITS_MAX}else{numBitsLUTQick=numBitsLUT}if(numBitsLUT>=30){console.log("WARning, large NUM LUT BITS IS "+numBitsLUT)}var decodeLut=[],entry,code,numEntries,jj,currentBit,node;for(i=i0;i0){entry=[len,j];if(len<=numBitsLUTQick){code=codeTable[j].second<=0;jj--){currentBit=code>>>jj&1;if(currentBit){if(!node.right){node.right=new TreeNode}node=node.right}else{if(!node.left){node.left=new TreeNode}node=node.left}if(jj===0&&!node.val){node.val=entry[1]}}}}}var val,delta,mask=data.pixels.resultMask,valTmp,valTmpQuick,prevVal=0,ii=0;if(bitPos>0){srcPtr++;bitPos=0}word=stuffedData[srcPtr];var resultPixels=new OutPixelTypeArray(numPixels);if(data.headerInfo.numValidPixel===width*height){for(k=0,i=0;i>>32-numBitsLUTQick;valTmpQuick=valTmp;if(32-bitPos>>64-bitPos-numBitsLUTQick;valTmpQuick=valTmp}if(decodeLut[valTmpQuick]){val=decodeLut[valTmpQuick][1];bitPos+=decodeLut[valTmpQuick][0]}else{valTmp=word<>>32-numBitsLUT;valTmpQuick=valTmp;if(32-bitPos>>64-bitPos-numBitsLUT;valTmpQuick=valTmp}node=tree;for(ii=0;ii>>numBitsLUT-ii-1&1;node=currentBit?node.right:node.left;if(!(node.left||node.right)){val=node.val;bitPos=bitPos+ii+1;break}}}if(bitPos>=32){bitPos-=32;srcPtr++;word=stuffedData[srcPtr]}delta=val-offset;if(j>0){delta+=prevVal}else if(i>0){delta+=resultPixels[k-width]}else{delta+=prevVal}delta&=255;resultPixels[k]=delta;prevVal=delta}}}else{for(k=0,i=0;i>>32-numBitsLUTQick;valTmpQuick=valTmp;if(32-bitPos>>64-bitPos-numBitsLUTQick;valTmpQuick=valTmp}if(decodeLut[valTmpQuick]){val=decodeLut[valTmpQuick][1];bitPos+=decodeLut[valTmpQuick][0]}else{valTmp=word<>>32-numBitsLUT;valTmpQuick=valTmp;if(32-bitPos>>64-bitPos-numBitsLUT;valTmpQuick=valTmp}node=tree;for(ii=0;ii>>numBitsLUT-ii-1&1;node=currentBit?node.right:node.left;if(!(node.left||node.right)){val=node.val;bitPos=bitPos+ii+1;break}}}if(bitPos>=32){bitPos-=32;srcPtr++;word=stuffedData[srcPtr]}delta=val-offset;if(j>0&&mask[k-1]){delta+=prevVal}else if(i>0&&mask[k-width]){delta+=resultPixels[k-width]}else{delta+=prevVal}delta&=255;resultPixels[k]=delta;prevVal=delta}}}}data.pixels.resultPixels=resultPixels;data.ptr=data.ptr+(srcPtr+1)*4+(bitPos>0?4:0)},decodeBits:function(input,data,blockDataBuffer,offset){{var fileVersion=data.headerInfo.fileVersion;var blockPtr=0;var view=new DataView(input,data.ptr,5);var headerByte=view.getUint8(0);blockPtr++;var bits67=headerByte>>6;var n=bits67===0?4:3-bits67;var doLut=(headerByte&32)>0?true:false;var numBits=headerByte&31;var numElements=0;if(n===1){numElements=view.getUint8(blockPtr);blockPtr++}else if(n===2){numElements=view.getUint16(blockPtr,true);blockPtr+=2}else if(n===4){numElements=view.getUint32(blockPtr,true);blockPtr+=4}else{throw"Invalid valid pixel count type"}var scale=2*data.headerInfo.maxZError;var stuffedData,arrayBuf,store8,dataBytes,dataWords;var lutArr,lutData,lutBytes,lutBitsPerElement,bitsPerPixel;if(doLut){data.counter.lut++;lutBytes=view.getUint8(blockPtr);lutBitsPerElement=numBits;blockPtr++;dataBytes=Math.ceil((lutBytes-1)*numBits/8);dataWords=Math.ceil(dataBytes/4);arrayBuf=new ArrayBuffer(dataWords*4);store8=new Uint8Array(arrayBuf);data.ptr+=blockPtr;store8.set(new Uint8Array(input,data.ptr,dataBytes));lutData=new Uint32Array(arrayBuf);data.ptr+=dataBytes;bitsPerPixel=0;while(lutBytes-1>>>bitsPerPixel){bitsPerPixel++}dataBytes=Math.ceil(numElements*bitsPerPixel/8);dataWords=Math.ceil(dataBytes/4);arrayBuf=new ArrayBuffer(dataWords*4);store8=new Uint8Array(arrayBuf);store8.set(new Uint8Array(input,data.ptr,dataBytes));stuffedData=new Uint32Array(arrayBuf);data.ptr+=dataBytes;if(fileVersion>=3){lutArr=BitStuffer.unstuffLUT2(lutData,numBits,lutBytes-1,offset,scale,data.headerInfo.zMax)}else{lutArr=BitStuffer.unstuffLUT(lutData,numBits,lutBytes-1,offset,scale,data.headerInfo.zMax)}if(fileVersion>=3){BitStuffer.unstuff2(stuffedData,blockDataBuffer,bitsPerPixel,numElements,lutArr)}else{BitStuffer.unstuff(stuffedData,blockDataBuffer,bitsPerPixel,numElements,lutArr)}}else{data.counter.bitstuffer++;bitsPerPixel=numBits;data.ptr+=blockPtr;if(bitsPerPixel>0){dataBytes=Math.ceil(numElements*bitsPerPixel/8);dataWords=Math.ceil(dataBytes/4);arrayBuf=new ArrayBuffer(dataWords*4);store8=new Uint8Array(arrayBuf);store8.set(new Uint8Array(input,data.ptr,dataBytes));stuffedData=new Uint32Array(arrayBuf);data.ptr+=dataBytes;if(fileVersion>=3){if(offset===undefined||offset===null){BitStuffer.originalUnstuff2(stuffedData,blockDataBuffer,bitsPerPixel,numElements)}else{BitStuffer.unstuff2(stuffedData,blockDataBuffer,bitsPerPixel,numElements,false,offset,scale,data.headerInfo.zMax)}}else{if(offset===undefined||offset===null){BitStuffer.originalUnstuff(stuffedData,blockDataBuffer,bitsPerPixel,numElements)}else{BitStuffer.unstuff(stuffedData,blockDataBuffer,bitsPerPixel,numElements,false,offset,scale,data.headerInfo.zMax)}}}}}},readTiles:function(input,data,OutPixelTypeArray){var headerInfo=data.headerInfo;var width=headerInfo.width;var height=headerInfo.height;var microBlockSize=headerInfo.microBlockSize;var imageType=headerInfo.imageType;var numBlocksX=Math.ceil(width/microBlockSize);var numBlocksY=Math.ceil(height/microBlockSize);data.pixels.numBlocksY=numBlocksY;data.pixels.numBlocksX=numBlocksX;data.pixels.ptr=0;var row=0,col=0,blockY=0,blockX=0,thisBlockHeight=0,thisBlockWidth=0,bytesLeft=0,headerByte=0,bits67=0,testCode=0,outPtr=0,outStride=0,numBytes=0,bytesleft=0,z=0,blockPtr=0;var view,block,arrayBuf,store8,rawData;var blockEncoding;var blockDataBuffer=new OutPixelTypeArray(microBlockSize*microBlockSize);var lastBlockHeight=height%microBlockSize||microBlockSize;var lastBlockWidth=width%microBlockSize||microBlockSize;var offsetType,offset;for(blockY=0;blockY>6&255;testCode=headerByte>>2&15;if(testCode!==(blockX*microBlockSize>>3&15)){throw"integrity issue"}blockEncoding=headerByte&3;if(blockEncoding>3){data.ptr+=blockPtr;throw"Invalid block encoding ("+blockEncoding+")"}else if(blockEncoding===2){data.counter.constant++;data.ptr+=blockPtr;continue}else if(blockEncoding===0){data.counter.uncompressed++;data.ptr+=blockPtr;numBytes=thisBlockHeight*thisBlockWidth*Lerc2Helpers.getDateTypeSize(imageType);bytesleft=input.byteLength-data.ptr;numBytes=numBytes=-128&&val<=127;break;case 1:isValid=val>=0&&val<=255;break;case 2:isValid=val>=-32768&&val<=32767;break;case 3:isValid=val>=0&&val<=65536;break;case 4:isValid=val>=-2147483648&&val<=2147483647;break;case 5:isValid=val>=0&&val<=4294967296;break;case 6:isValid=val>=-3.4027999387901484e38&&val<=3.4027999387901484e38;break;case 7:isValid=val>=5e-324&&val<=1.7976931348623157e308;break;default:isValid=false}return isValid},getDateTypeSize:function(t){var s=0;switch(t){case 0:case 1:s=1;break;case 2:case 3:s=2;break;case 4:case 5:case 6:s=4;break;case 7:s=8;break;default:s=t}return s},getDataTypeUsed:function(dt,tc){var t=dt;switch(dt){case 2:case 4:t=dt-tc;break;case 3:case 5:t=dt-2*tc;break;case 6:if(0===tc){t=dt}else if(1===tc){t=2}else{t=1}break;case 7:if(0===tc){t=dt}else{t=dt-2*tc+1}break;default:t=dt;break}return t},getOnePixel:function(block,blockPtr,offsetType,view){var temp=0;switch(offsetType){case 0:temp=view.getInt8(blockPtr);break;case 1:temp=view.getUint8(blockPtr);break;case 2:temp=view.getInt16(blockPtr,true);break;case 3:temp=view.getUint16(blockPtr,true);break;case 4:temp=view.getInt32(blockPtr,true);break;case 5:temp=view.getUInt32(blockPtr,true);break;case 6:temp=view.getFloat32(blockPtr,true);break;case 7:temp=view.getFloat64(blockPtr,true);break;default:throw"the decoder does not understand this pixel type"}return temp}};var TreeNode=function(val,left,right){this.val=val;this.left=left;this.right=right};var Lerc2Decode={decode:function(input,options){options=options||{};var skipMask=options.maskData||options.maskData===null;var noDataValue=options.noDataValue;var i=0,data={};data.ptr=options.inputOffset||0;data.pixels={};if(!Lerc2Helpers.readHeaderInfo(input,data)){return}var headerInfo=data.headerInfo;var OutPixelTypeArray=Lerc2Helpers.getDataTypeArray(headerInfo.imageType);if(skipMask){data.pixels.resultMask=options.maskData;data.ptr+=4}else{if(!Lerc2Helpers.readMask(input,data)){return}}var numPixels=headerInfo.width*headerInfo.height;data.pixels.resultPixels=new OutPixelTypeArray(numPixels);data.counter={onesweep:0,uncompressed:0,lut:0,bitstuffer:0,constant:0,constantoffset:0};if(headerInfo.numValidPixel!==0){if(headerInfo.zMax===headerInfo.zMin){Lerc2Helpers.constructConstantSurface(data)}else{var view=new DataView(input,data.ptr,2);var bReadDataOneSweep=view.getUint8(0,true);data.ptr++;if(bReadDataOneSweep){Lerc2Helpers.readDataOneSweep(input,data,OutPixelTypeArray)}else{if(headerInfo.fileVersion>1&&headerInfo.imageType<=1&&Math.abs(headerInfo.maxZError-.5)<1e-5){var bReadHuffman=view.getUint8(1,true);data.ptr++;if(bReadHuffman){Lerc2Helpers.readHuffman(input,data,OutPixelTypeArray)}else{Lerc2Helpers.readTiles(input,data,OutPixelTypeArray); +}}else{Lerc2Helpers.readTiles(input,data,OutPixelTypeArray)}}}}data.eofOffset=data.ptr;var diff;if(options.inputOffset){diff=data.headerInfo.blobSize+options.inputOffset-data.ptr;if(Math.abs(diff)>=1){data.eofOffset=options.inputOffset+data.headerInfo.blobSize}}else{diff=data.headerInfo.blobSize-data.ptr;if(Math.abs(diff)>=1){data.eofOffset=data.headerInfo.blobSize}}var result={width:headerInfo.width,height:headerInfo.height,pixelData:data.pixels.resultPixels,minValue:headerInfo.zMin,maxValue:headerInfo.zMax,maskData:data.pixels.resultMask};if(data.pixels.resultMask&&Lerc2Helpers.isValidPixelValue(headerInfo.imageType,noDataValue)){var mask=data.pixels.resultMask;for(i=0;i