RGBMLoader.js 29 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415
  1. ( function () {
  2. class RGBMLoader extends THREE.DataTextureLoader {
  3. constructor( manager ) {
  4. super( manager );
  5. this.type = THREE.HalfFloatType;
  6. this.maxRange = 7; // more information about this property at https://iwasbeingirony.blogspot.com/2010/06/difference-between-rgbm-and-rgbd.html
  7. }
  8. setDataType( value ) {
  9. this.type = value;
  10. return this;
  11. }
  12. setMaxRange( value ) {
  13. this.maxRange = value;
  14. return this;
  15. }
  16. loadCubemap( urls, onLoad, onProgress, onError ) {
  17. const texture = new THREE.CubeTexture();
  18. let loaded = 0;
  19. const scope = this;
  20. function loadTexture( i ) {
  21. scope.load( urls[ i ], function ( image ) {
  22. texture.images[ i ] = image;
  23. loaded ++;
  24. if ( loaded === 6 ) {
  25. texture.needsUpdate = true;
  26. if ( onLoad ) onLoad( texture );
  27. }
  28. }, undefined, onError );
  29. }
  30. for ( let i = 0; i < urls.length; ++ i ) {
  31. loadTexture( i );
  32. }
  33. texture.type = this.type;
  34. texture.format = THREE.RGBAFormat;
  35. texture.minFilter = THREE.LinearFilter;
  36. texture.generateMipmaps = false;
  37. return texture;
  38. }
  39. parse( buffer ) {
  40. const img = UPNG.decode( buffer );
  41. const rgba = UPNG.toRGBA8( img )[ 0 ];
  42. const data = new Uint8Array( rgba );
  43. const size = img.width * img.height * 4;
  44. const output = this.type === THREE.HalfFloatType ? new Uint16Array( size ) : new Float32Array( size ); // decode RGBM
  45. for ( let i = 0; i < data.length; i += 4 ) {
  46. const r = data[ i + 0 ] / 255;
  47. const g = data[ i + 1 ] / 255;
  48. const b = data[ i + 2 ] / 255;
  49. const a = data[ i + 3 ] / 255;
  50. if ( this.type === THREE.HalfFloatType ) {
  51. output[ i + 0 ] = THREE.DataUtils.toHalfFloat( Math.min( r * a * this.maxRange, 65504 ) );
  52. output[ i + 1 ] = THREE.DataUtils.toHalfFloat( Math.min( g * a * this.maxRange, 65504 ) );
  53. output[ i + 2 ] = THREE.DataUtils.toHalfFloat( Math.min( b * a * this.maxRange, 65504 ) );
  54. output[ i + 3 ] = THREE.DataUtils.toHalfFloat( 1 );
  55. } else {
  56. output[ i + 0 ] = r * a * this.maxRange;
  57. output[ i + 1 ] = g * a * this.maxRange;
  58. output[ i + 2 ] = b * a * this.maxRange;
  59. output[ i + 3 ] = 1;
  60. }
  61. }
  62. return {
  63. width: img.width,
  64. height: img.height,
  65. data: output,
  66. format: THREE.RGBAFormat,
  67. type: this.type,
  68. flipY: true
  69. };
  70. }
  71. } // from https://github.com/photopea/UPNG.js (MIT License)
  72. var UPNG = {};
  73. UPNG.toRGBA8 = function ( out ) {
  74. var w = out.width,
  75. h = out.height;
  76. if ( out.tabs.acTL == null ) return [ UPNG.toRGBA8.decodeImage( out.data, w, h, out ).buffer ];
  77. var frms = [];
  78. if ( out.frames[ 0 ].data == null ) out.frames[ 0 ].data = out.data;
  79. var len = w * h * 4,
  80. img = new Uint8Array( len ),
  81. empty = new Uint8Array( len ),
  82. prev = new Uint8Array( len );
  83. for ( var i = 0; i < out.frames.length; i ++ ) {
  84. var frm = out.frames[ i ];
  85. var fx = frm.rect.x,
  86. fy = frm.rect.y,
  87. fw = frm.rect.width,
  88. fh = frm.rect.height;
  89. var fdata = UPNG.toRGBA8.decodeImage( frm.data, fw, fh, out );
  90. if ( i != 0 ) for ( var j = 0; j < len; j ++ ) prev[ j ] = img[ j ];
  91. if ( frm.blend == 0 ) UPNG._copyTile( fdata, fw, fh, img, w, h, fx, fy, 0 ); else if ( frm.blend == 1 ) UPNG._copyTile( fdata, fw, fh, img, w, h, fx, fy, 1 );
  92. frms.push( img.buffer.slice( 0 ) );
  93. if ( frm.dispose == 1 ) UPNG._copyTile( empty, fw, fh, img, w, h, fx, fy, 0 ); else if ( frm.dispose == 2 ) for ( var j = 0; j < len; j ++ ) img[ j ] = prev[ j ];
  94. }
  95. return frms;
  96. };
  97. UPNG.toRGBA8.decodeImage = function ( data, w, h, out ) {
  98. var area = w * h,
  99. bpp = UPNG.decode._getBPP( out );
  100. var bpl = Math.ceil( w * bpp / 8 ); // bytes per line
  101. var bf = new Uint8Array( area * 4 ),
  102. bf32 = new Uint32Array( bf.buffer );
  103. var ctype = out.ctype,
  104. depth = out.depth;
  105. var rs = UPNG._bin.readUshort;
  106. if ( ctype == 6 ) {
  107. // RGB + alpha
  108. var qarea = area << 2;
  109. if ( depth == 8 ) for ( var i = 0; i < qarea; i += 4 ) {
  110. bf[ i ] = data[ i ];
  111. bf[ i + 1 ] = data[ i + 1 ];
  112. bf[ i + 2 ] = data[ i + 2 ];
  113. bf[ i + 3 ] = data[ i + 3 ];
  114. }
  115. if ( depth == 16 ) for ( var i = 0; i < qarea; i ++ ) {
  116. bf[ i ] = data[ i << 1 ];
  117. }
  118. } else if ( ctype == 2 ) {
  119. // RGB
  120. var ts = out.tabs[ 'tRNS' ];
  121. if ( ts == null ) {
  122. if ( depth == 8 ) for ( var i = 0; i < area; i ++ ) {
  123. var ti = i * 3;
  124. bf32[ i ] = 255 << 24 | data[ ti + 2 ] << 16 | data[ ti + 1 ] << 8 | data[ ti ];
  125. }
  126. if ( depth == 16 ) for ( var i = 0; i < area; i ++ ) {
  127. var ti = i * 6;
  128. bf32[ i ] = 255 << 24 | data[ ti + 4 ] << 16 | data[ ti + 2 ] << 8 | data[ ti ];
  129. }
  130. } else {
  131. var tr = ts[ 0 ],
  132. tg = ts[ 1 ],
  133. tb = ts[ 2 ];
  134. if ( depth == 8 ) for ( var i = 0; i < area; i ++ ) {
  135. var qi = i << 2,
  136. ti = i * 3;
  137. bf32[ i ] = 255 << 24 | data[ ti + 2 ] << 16 | data[ ti + 1 ] << 8 | data[ ti ];
  138. if ( data[ ti ] == tr && data[ ti + 1 ] == tg && data[ ti + 2 ] == tb ) bf[ qi + 3 ] = 0;
  139. }
  140. if ( depth == 16 ) for ( var i = 0; i < area; i ++ ) {
  141. var qi = i << 2,
  142. ti = i * 6;
  143. bf32[ i ] = 255 << 24 | data[ ti + 4 ] << 16 | data[ ti + 2 ] << 8 | data[ ti ];
  144. if ( rs( data, ti ) == tr && rs( data, ti + 2 ) == tg && rs( data, ti + 4 ) == tb ) bf[ qi + 3 ] = 0;
  145. }
  146. }
  147. } else if ( ctype == 3 ) {
  148. // palette
  149. var p = out.tabs[ 'PLTE' ],
  150. ap = out.tabs[ 'tRNS' ],
  151. tl = ap ? ap.length : 0; //console.log(p, ap);
  152. if ( depth == 1 ) for ( var y = 0; y < h; y ++ ) {
  153. var s0 = y * bpl,
  154. t0 = y * w;
  155. for ( var i = 0; i < w; i ++ ) {
  156. var qi = t0 + i << 2,
  157. j = data[ s0 + ( i >> 3 ) ] >> 7 - ( ( i & 7 ) << 0 ) & 1,
  158. cj = 3 * j;
  159. bf[ qi ] = p[ cj ];
  160. bf[ qi + 1 ] = p[ cj + 1 ];
  161. bf[ qi + 2 ] = p[ cj + 2 ];
  162. bf[ qi + 3 ] = j < tl ? ap[ j ] : 255;
  163. }
  164. }
  165. if ( depth == 2 ) for ( var y = 0; y < h; y ++ ) {
  166. var s0 = y * bpl,
  167. t0 = y * w;
  168. for ( var i = 0; i < w; i ++ ) {
  169. var qi = t0 + i << 2,
  170. j = data[ s0 + ( i >> 2 ) ] >> 6 - ( ( i & 3 ) << 1 ) & 3,
  171. cj = 3 * j;
  172. bf[ qi ] = p[ cj ];
  173. bf[ qi + 1 ] = p[ cj + 1 ];
  174. bf[ qi + 2 ] = p[ cj + 2 ];
  175. bf[ qi + 3 ] = j < tl ? ap[ j ] : 255;
  176. }
  177. }
  178. if ( depth == 4 ) for ( var y = 0; y < h; y ++ ) {
  179. var s0 = y * bpl,
  180. t0 = y * w;
  181. for ( var i = 0; i < w; i ++ ) {
  182. var qi = t0 + i << 2,
  183. j = data[ s0 + ( i >> 1 ) ] >> 4 - ( ( i & 1 ) << 2 ) & 15,
  184. cj = 3 * j;
  185. bf[ qi ] = p[ cj ];
  186. bf[ qi + 1 ] = p[ cj + 1 ];
  187. bf[ qi + 2 ] = p[ cj + 2 ];
  188. bf[ qi + 3 ] = j < tl ? ap[ j ] : 255;
  189. }
  190. }
  191. if ( depth == 8 ) for ( var i = 0; i < area; i ++ ) {
  192. var qi = i << 2,
  193. j = data[ i ],
  194. cj = 3 * j;
  195. bf[ qi ] = p[ cj ];
  196. bf[ qi + 1 ] = p[ cj + 1 ];
  197. bf[ qi + 2 ] = p[ cj + 2 ];
  198. bf[ qi + 3 ] = j < tl ? ap[ j ] : 255;
  199. }
  200. } else if ( ctype == 4 ) {
  201. // gray + alpha
  202. if ( depth == 8 ) for ( var i = 0; i < area; i ++ ) {
  203. var qi = i << 2,
  204. di = i << 1,
  205. gr = data[ di ];
  206. bf[ qi ] = gr;
  207. bf[ qi + 1 ] = gr;
  208. bf[ qi + 2 ] = gr;
  209. bf[ qi + 3 ] = data[ di + 1 ];
  210. }
  211. if ( depth == 16 ) for ( var i = 0; i < area; i ++ ) {
  212. var qi = i << 2,
  213. di = i << 2,
  214. gr = data[ di ];
  215. bf[ qi ] = gr;
  216. bf[ qi + 1 ] = gr;
  217. bf[ qi + 2 ] = gr;
  218. bf[ qi + 3 ] = data[ di + 2 ];
  219. }
  220. } else if ( ctype == 0 ) {
  221. // gray
  222. var tr = out.tabs[ 'tRNS' ] ? out.tabs[ 'tRNS' ] : - 1;
  223. for ( var y = 0; y < h; y ++ ) {
  224. var off = y * bpl,
  225. to = y * w;
  226. if ( depth == 1 ) for ( var x = 0; x < w; x ++ ) {
  227. var gr = 255 * ( data[ off + ( x >>> 3 ) ] >>> 7 - ( x & 7 ) & 1 ),
  228. al = gr == tr * 255 ? 0 : 255;
  229. bf32[ to + x ] = al << 24 | gr << 16 | gr << 8 | gr;
  230. } else if ( depth == 2 ) for ( var x = 0; x < w; x ++ ) {
  231. var gr = 85 * ( data[ off + ( x >>> 2 ) ] >>> 6 - ( ( x & 3 ) << 1 ) & 3 ),
  232. al = gr == tr * 85 ? 0 : 255;
  233. bf32[ to + x ] = al << 24 | gr << 16 | gr << 8 | gr;
  234. } else if ( depth == 4 ) for ( var x = 0; x < w; x ++ ) {
  235. var gr = 17 * ( data[ off + ( x >>> 1 ) ] >>> 4 - ( ( x & 1 ) << 2 ) & 15 ),
  236. al = gr == tr * 17 ? 0 : 255;
  237. bf32[ to + x ] = al << 24 | gr << 16 | gr << 8 | gr;
  238. } else if ( depth == 8 ) for ( var x = 0; x < w; x ++ ) {
  239. var gr = data[ off + x ],
  240. al = gr == tr ? 0 : 255;
  241. bf32[ to + x ] = al << 24 | gr << 16 | gr << 8 | gr;
  242. } else if ( depth == 16 ) for ( var x = 0; x < w; x ++ ) {
  243. var gr = data[ off + ( x << 1 ) ],
  244. al = rs( data, off + ( x << 1 ) ) == tr ? 0 : 255;
  245. bf32[ to + x ] = al << 24 | gr << 16 | gr << 8 | gr;
  246. }
  247. }
  248. } //console.log(Date.now()-time);
  249. return bf;
  250. };
  251. UPNG.decode = function ( buff ) {
  252. var data = new Uint8Array( buff ),
  253. offset = 8,
  254. bin = UPNG._bin,
  255. rUs = bin.readUshort,
  256. rUi = bin.readUint;
  257. var out = {
  258. tabs: {},
  259. frames: []
  260. };
  261. var dd = new Uint8Array( data.length ),
  262. doff = 0; // put all IDAT data into it
  263. var fd,
  264. foff = 0; // frames
  265. var text, keyw, bfr;
  266. var mgck = [ 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a ];
  267. for ( var i = 0; i < 8; i ++ ) if ( data[ i ] != mgck[ i ] ) throw new Error( 'The input is not a PNG file!' );
  268. while ( offset < data.length ) {
  269. var len = bin.readUint( data, offset );
  270. offset += 4;
  271. var type = bin.readASCII( data, offset, 4 );
  272. offset += 4; //console.log(type,len);
  273. if ( type == 'IHDR' ) {
  274. UPNG.decode._IHDR( data, offset, out );
  275. } else if ( type == 'CgBI' ) {
  276. out.tabs[ type ] = data.slice( offset, offset + 4 );
  277. } else if ( type == 'IDAT' ) {
  278. for ( var i = 0; i < len; i ++ ) dd[ doff + i ] = data[ offset + i ];
  279. doff += len;
  280. } else if ( type == 'acTL' ) {
  281. out.tabs[ type ] = {
  282. num_frames: rUi( data, offset ),
  283. num_plays: rUi( data, offset + 4 )
  284. };
  285. fd = new Uint8Array( data.length );
  286. } else if ( type == 'fcTL' ) {
  287. if ( foff != 0 ) {
  288. var fr = out.frames[ out.frames.length - 1 ];
  289. fr.data = UPNG.decode._decompress( out, fd.slice( 0, foff ), fr.rect.width, fr.rect.height );
  290. foff = 0;
  291. }
  292. var rct = {
  293. x: rUi( data, offset + 12 ),
  294. y: rUi( data, offset + 16 ),
  295. width: rUi( data, offset + 4 ),
  296. height: rUi( data, offset + 8 )
  297. };
  298. var del = rUs( data, offset + 22 );
  299. del = rUs( data, offset + 20 ) / ( del == 0 ? 100 : del );
  300. var frm = {
  301. rect: rct,
  302. delay: Math.round( del * 1000 ),
  303. dispose: data[ offset + 24 ],
  304. blend: data[ offset + 25 ]
  305. }; //console.log(frm);
  306. out.frames.push( frm );
  307. } else if ( type == 'fdAT' ) {
  308. for ( var i = 0; i < len - 4; i ++ ) fd[ foff + i ] = data[ offset + i + 4 ];
  309. foff += len - 4;
  310. } else if ( type == 'pHYs' ) {
  311. out.tabs[ type ] = [ bin.readUint( data, offset ), bin.readUint( data, offset + 4 ), data[ offset + 8 ] ];
  312. } else if ( type == 'cHRM' ) {
  313. out.tabs[ type ] = [];
  314. for ( var i = 0; i < 8; i ++ ) out.tabs[ type ].push( bin.readUint( data, offset + i * 4 ) );
  315. } else if ( type == 'tEXt' || type == 'zTXt' ) {
  316. if ( out.tabs[ type ] == null ) out.tabs[ type ] = {};
  317. var nz = bin.nextZero( data, offset );
  318. keyw = bin.readASCII( data, offset, nz - offset );
  319. var tl = offset + len - nz - 1;
  320. if ( type == 'tEXt' ) text = bin.readASCII( data, nz + 1, tl ); else {
  321. bfr = UPNG.decode._inflate( data.slice( nz + 2, nz + 2 + tl ) );
  322. text = bin.readUTF8( bfr, 0, bfr.length );
  323. }
  324. out.tabs[ type ][ keyw ] = text;
  325. } else if ( type == 'iTXt' ) {
  326. if ( out.tabs[ type ] == null ) out.tabs[ type ] = {};
  327. var nz = 0,
  328. off = offset;
  329. nz = bin.nextZero( data, off );
  330. keyw = bin.readASCII( data, off, nz - off );
  331. off = nz + 1;
  332. var cflag = data[ off ];
  333. off += 2;
  334. nz = bin.nextZero( data, off );
  335. bin.readASCII( data, off, nz - off );
  336. off = nz + 1;
  337. nz = bin.nextZero( data, off );
  338. bin.readUTF8( data, off, nz - off );
  339. off = nz + 1;
  340. var tl = len - ( off - offset );
  341. if ( cflag == 0 ) text = bin.readUTF8( data, off, tl ); else {
  342. bfr = UPNG.decode._inflate( data.slice( off, off + tl ) );
  343. text = bin.readUTF8( bfr, 0, bfr.length );
  344. }
  345. out.tabs[ type ][ keyw ] = text;
  346. } else if ( type == 'PLTE' ) {
  347. out.tabs[ type ] = bin.readBytes( data, offset, len );
  348. } else if ( type == 'hIST' ) {
  349. var pl = out.tabs[ 'PLTE' ].length / 3;
  350. out.tabs[ type ] = [];
  351. for ( var i = 0; i < pl; i ++ ) out.tabs[ type ].push( rUs( data, offset + i * 2 ) );
  352. } else if ( type == 'tRNS' ) {
  353. if ( out.ctype == 3 ) out.tabs[ type ] = bin.readBytes( data, offset, len ); else if ( out.ctype == 0 ) out.tabs[ type ] = rUs( data, offset ); else if ( out.ctype == 2 ) out.tabs[ type ] = [ rUs( data, offset ), rUs( data, offset + 2 ), rUs( data, offset + 4 ) ]; //else console.log("tRNS for unsupported color type",out.ctype, len);
  354. } else if ( type == 'gAMA' ) out.tabs[ type ] = bin.readUint( data, offset ) / 100000; else if ( type == 'sRGB' ) out.tabs[ type ] = data[ offset ]; else if ( type == 'bKGD' ) {
  355. if ( out.ctype == 0 || out.ctype == 4 ) out.tabs[ type ] = [ rUs( data, offset ) ]; else if ( out.ctype == 2 || out.ctype == 6 ) out.tabs[ type ] = [ rUs( data, offset ), rUs( data, offset + 2 ), rUs( data, offset + 4 ) ]; else if ( out.ctype == 3 ) out.tabs[ type ] = data[ offset ];
  356. } else if ( type == 'IEND' ) {
  357. break;
  358. } //else { console.log("unknown chunk type", type, len); out.tabs[type]=data.slice(offset,offset+len); }
  359. offset += len;
  360. bin.readUint( data, offset );
  361. offset += 4;
  362. }
  363. if ( foff != 0 ) {
  364. var fr = out.frames[ out.frames.length - 1 ];
  365. fr.data = UPNG.decode._decompress( out, fd.slice( 0, foff ), fr.rect.width, fr.rect.height );
  366. }
  367. out.data = UPNG.decode._decompress( out, dd, out.width, out.height );
  368. delete out.compress;
  369. delete out.interlace;
  370. delete out.filter;
  371. return out;
  372. };
  373. UPNG.decode._decompress = function ( out, dd, w, h ) {
  374. var bpp = UPNG.decode._getBPP( out ),
  375. bpl = Math.ceil( w * bpp / 8 ),
  376. buff = new Uint8Array( ( bpl + 1 + out.interlace ) * h );
  377. if ( out.tabs[ 'CgBI' ] ) dd = UPNG.inflateRaw( dd, buff ); else dd = UPNG.decode._inflate( dd, buff );
  378. if ( out.interlace == 0 ) dd = UPNG.decode._filterZero( dd, out, 0, w, h ); else if ( out.interlace == 1 ) dd = UPNG.decode._readInterlace( dd, out );
  379. return dd;
  380. };
  381. UPNG.decode._inflate = function ( data, buff ) {
  382. var out = UPNG[ 'inflateRaw' ]( new Uint8Array( data.buffer, 2, data.length - 6 ), buff );
  383. return out;
  384. };
  385. UPNG.inflateRaw = function () {
  386. var H = {};
  387. H.H = {};
  388. H.H.N = function ( N, W ) {
  389. var R = Uint8Array,
  390. i = 0,
  391. m = 0,
  392. J = 0,
  393. h = 0,
  394. Q = 0,
  395. X = 0,
  396. u = 0,
  397. w = 0,
  398. d = 0,
  399. v,
  400. C;
  401. if ( N[ 0 ] == 3 && N[ 1 ] == 0 ) return W ? W : new R( 0 );
  402. var V = H.H,
  403. n = V.b,
  404. A = V.e,
  405. l = V.R,
  406. M = V.n,
  407. I = V.A,
  408. e = V.Z,
  409. b = V.m,
  410. Z = W == null;
  411. if ( Z ) W = new R( N.length >>> 2 << 5 );
  412. while ( i == 0 ) {
  413. i = n( N, d, 1 );
  414. m = n( N, d + 1, 2 );
  415. d += 3;
  416. if ( m == 0 ) {
  417. if ( ( d & 7 ) != 0 ) d += 8 - ( d & 7 );
  418. var D = ( d >>> 3 ) + 4,
  419. q = N[ D - 4 ] | N[ D - 3 ] << 8;
  420. if ( Z ) W = H.H.W( W, w + q );
  421. W.set( new R( N.buffer, N.byteOffset + D, q ), w );
  422. d = D + q << 3;
  423. w += q;
  424. continue;
  425. }
  426. if ( Z ) W = H.H.W( W, w + ( 1 << 17 ) );
  427. if ( m == 1 ) {
  428. v = b.J;
  429. C = b.h;
  430. X = ( 1 << 9 ) - 1;
  431. u = ( 1 << 5 ) - 1;
  432. }
  433. if ( m == 2 ) {
  434. J = A( N, d, 5 ) + 257;
  435. h = A( N, d + 5, 5 ) + 1;
  436. Q = A( N, d + 10, 4 ) + 4;
  437. d += 14;
  438. var j = 1;
  439. for ( var c = 0; c < 38; c += 2 ) {
  440. b.Q[ c ] = 0;
  441. b.Q[ c + 1 ] = 0;
  442. }
  443. for ( var c = 0; c < Q; c ++ ) {
  444. var K = A( N, d + c * 3, 3 );
  445. b.Q[ ( b.X[ c ] << 1 ) + 1 ] = K;
  446. if ( K > j ) j = K;
  447. }
  448. d += 3 * Q;
  449. M( b.Q, j );
  450. I( b.Q, j, b.u );
  451. v = b.w;
  452. C = b.d;
  453. d = l( b.u, ( 1 << j ) - 1, J + h, N, d, b.v );
  454. var r = V.V( b.v, 0, J, b.C );
  455. X = ( 1 << r ) - 1;
  456. var S = V.V( b.v, J, h, b.D );
  457. u = ( 1 << S ) - 1;
  458. M( b.C, r );
  459. I( b.C, r, v );
  460. M( b.D, S );
  461. I( b.D, S, C );
  462. }
  463. while ( ! 0 ) {
  464. var T = v[ e( N, d ) & X ];
  465. d += T & 15;
  466. var p = T >>> 4;
  467. if ( p >>> 8 == 0 ) {
  468. W[ w ++ ] = p;
  469. } else if ( p == 256 ) {
  470. break;
  471. } else {
  472. var z = w + p - 254;
  473. if ( p > 264 ) {
  474. var _ = b.q[ p - 257 ];
  475. z = w + ( _ >>> 3 ) + A( N, d, _ & 7 );
  476. d += _ & 7;
  477. }
  478. var $ = C[ e( N, d ) & u ];
  479. d += $ & 15;
  480. var s = $ >>> 4,
  481. Y = b.c[ s ],
  482. a = ( Y >>> 4 ) + n( N, d, Y & 15 );
  483. d += Y & 15;
  484. while ( w < z ) {
  485. W[ w ] = W[ w ++ - a ];
  486. W[ w ] = W[ w ++ - a ];
  487. W[ w ] = W[ w ++ - a ];
  488. W[ w ] = W[ w ++ - a ];
  489. }
  490. w = z;
  491. }
  492. }
  493. }
  494. return W.length == w ? W : W.slice( 0, w );
  495. };
  496. H.H.W = function ( N, W ) {
  497. var R = N.length;
  498. if ( W <= R ) return N;
  499. var V = new Uint8Array( R << 1 );
  500. V.set( N, 0 );
  501. return V;
  502. };
  503. H.H.R = function ( N, W, R, V, n, A ) {
  504. var l = H.H.e,
  505. M = H.H.Z,
  506. I = 0;
  507. while ( I < R ) {
  508. var e = N[ M( V, n ) & W ];
  509. n += e & 15;
  510. var b = e >>> 4;
  511. if ( b <= 15 ) {
  512. A[ I ] = b;
  513. I ++;
  514. } else {
  515. var Z = 0,
  516. m = 0;
  517. if ( b == 16 ) {
  518. m = 3 + l( V, n, 2 );
  519. n += 2;
  520. Z = A[ I - 1 ];
  521. } else if ( b == 17 ) {
  522. m = 3 + l( V, n, 3 );
  523. n += 3;
  524. } else if ( b == 18 ) {
  525. m = 11 + l( V, n, 7 );
  526. n += 7;
  527. }
  528. var J = I + m;
  529. while ( I < J ) {
  530. A[ I ] = Z;
  531. I ++;
  532. }
  533. }
  534. }
  535. return n;
  536. };
  537. H.H.V = function ( N, W, R, V ) {
  538. var n = 0,
  539. A = 0,
  540. l = V.length >>> 1;
  541. while ( A < R ) {
  542. var M = N[ A + W ];
  543. V[ A << 1 ] = 0;
  544. V[ ( A << 1 ) + 1 ] = M;
  545. if ( M > n ) n = M;
  546. A ++;
  547. }
  548. while ( A < l ) {
  549. V[ A << 1 ] = 0;
  550. V[ ( A << 1 ) + 1 ] = 0;
  551. A ++;
  552. }
  553. return n;
  554. };
  555. H.H.n = function ( N, W ) {
  556. var R = H.H.m,
  557. V = N.length,
  558. n,
  559. A,
  560. l,
  561. M,
  562. I,
  563. e = R.j;
  564. for ( var M = 0; M <= W; M ++ ) e[ M ] = 0;
  565. for ( M = 1; M < V; M += 2 ) e[ N[ M ] ] ++;
  566. var b = R.K;
  567. n = 0;
  568. e[ 0 ] = 0;
  569. for ( A = 1; A <= W; A ++ ) {
  570. n = n + e[ A - 1 ] << 1;
  571. b[ A ] = n;
  572. }
  573. for ( l = 0; l < V; l += 2 ) {
  574. I = N[ l + 1 ];
  575. if ( I != 0 ) {
  576. N[ l ] = b[ I ];
  577. b[ I ] ++;
  578. }
  579. }
  580. };
  581. H.H.A = function ( N, W, R ) {
  582. var V = N.length,
  583. n = H.H.m,
  584. A = n.r;
  585. for ( var l = 0; l < V; l += 2 ) if ( N[ l + 1 ] != 0 ) {
  586. var M = l >> 1,
  587. I = N[ l + 1 ],
  588. e = M << 4 | I,
  589. b = W - I,
  590. Z = N[ l ] << b,
  591. m = Z + ( 1 << b );
  592. while ( Z != m ) {
  593. var J = A[ Z ] >>> 15 - W;
  594. R[ J ] = e;
  595. Z ++;
  596. }
  597. }
  598. };
  599. H.H.l = function ( N, W ) {
  600. var R = H.H.m.r,
  601. V = 15 - W;
  602. for ( var n = 0; n < N.length; n += 2 ) {
  603. var A = N[ n ] << W - N[ n + 1 ];
  604. N[ n ] = R[ A ] >>> V;
  605. }
  606. };
  607. H.H.M = function ( N, W, R ) {
  608. R = R << ( W & 7 );
  609. var V = W >>> 3;
  610. N[ V ] |= R;
  611. N[ V + 1 ] |= R >>> 8;
  612. };
  613. H.H.I = function ( N, W, R ) {
  614. R = R << ( W & 7 );
  615. var V = W >>> 3;
  616. N[ V ] |= R;
  617. N[ V + 1 ] |= R >>> 8;
  618. N[ V + 2 ] |= R >>> 16;
  619. };
  620. H.H.e = function ( N, W, R ) {
  621. return ( N[ W >>> 3 ] | N[ ( W >>> 3 ) + 1 ] << 8 ) >>> ( W & 7 ) & ( 1 << R ) - 1;
  622. };
  623. H.H.b = function ( N, W, R ) {
  624. return ( N[ W >>> 3 ] | N[ ( W >>> 3 ) + 1 ] << 8 | N[ ( W >>> 3 ) + 2 ] << 16 ) >>> ( W & 7 ) & ( 1 << R ) - 1;
  625. };
  626. H.H.Z = function ( N, W ) {
  627. return ( N[ W >>> 3 ] | N[ ( W >>> 3 ) + 1 ] << 8 | N[ ( W >>> 3 ) + 2 ] << 16 ) >>> ( W & 7 );
  628. };
  629. H.H.i = function ( N, W ) {
  630. return ( N[ W >>> 3 ] | N[ ( W >>> 3 ) + 1 ] << 8 | N[ ( W >>> 3 ) + 2 ] << 16 | N[ ( W >>> 3 ) + 3 ] << 24 ) >>> ( W & 7 );
  631. };
  632. H.H.m = function () {
  633. var N = Uint16Array,
  634. W = Uint32Array;
  635. return {
  636. K: new N( 16 ),
  637. j: new N( 16 ),
  638. X: [ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ],
  639. S: [ 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 999, 999, 999 ],
  640. T: [ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 0, 0, 0 ],
  641. q: new N( 32 ),
  642. p: [ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 65535, 65535 ],
  643. z: [ 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 0, 0 ],
  644. c: new W( 32 ),
  645. J: new N( 512 ),
  646. _: [],
  647. h: new N( 32 ),
  648. $: [],
  649. w: new N( 32768 ),
  650. C: [],
  651. v: [],
  652. d: new N( 32768 ),
  653. D: [],
  654. u: new N( 512 ),
  655. Q: [],
  656. r: new N( 1 << 15 ),
  657. s: new W( 286 ),
  658. Y: new W( 30 ),
  659. a: new W( 19 ),
  660. t: new W( 15e3 ),
  661. k: new N( 1 << 16 ),
  662. g: new N( 1 << 15 )
  663. };
  664. }();
  665. ( function () {
  666. var N = H.H.m,
  667. W = 1 << 15;
  668. for ( var R = 0; R < W; R ++ ) {
  669. var V = R;
  670. V = ( V & 2863311530 ) >>> 1 | ( V & 1431655765 ) << 1;
  671. V = ( V & 3435973836 ) >>> 2 | ( V & 858993459 ) << 2;
  672. V = ( V & 4042322160 ) >>> 4 | ( V & 252645135 ) << 4;
  673. V = ( V & 4278255360 ) >>> 8 | ( V & 16711935 ) << 8;
  674. N.r[ R ] = ( V >>> 16 | V << 16 ) >>> 17;
  675. }
  676. function n( A, l, M ) {
  677. while ( l -- != 0 ) A.push( 0, M );
  678. }
  679. for ( var R = 0; R < 32; R ++ ) {
  680. N.q[ R ] = N.S[ R ] << 3 | N.T[ R ];
  681. N.c[ R ] = N.p[ R ] << 4 | N.z[ R ];
  682. }
  683. n( N._, 144, 8 );
  684. n( N._, 255 - 143, 9 );
  685. n( N._, 279 - 255, 7 );
  686. n( N._, 287 - 279, 8 );
  687. H.H.n( N._, 9 );
  688. H.H.A( N._, 9, N.J );
  689. H.H.l( N._, 9 );
  690. n( N.$, 32, 5 );
  691. H.H.n( N.$, 5 );
  692. H.H.A( N.$, 5, N.h );
  693. H.H.l( N.$, 5 );
  694. n( N.Q, 19, 0 );
  695. n( N.C, 286, 0 );
  696. n( N.D, 30, 0 );
  697. n( N.v, 320, 0 );
  698. } )();
  699. return H.H.N;
  700. }();
  701. UPNG.decode._readInterlace = function ( data, out ) {
  702. var w = out.width,
  703. h = out.height;
  704. var bpp = UPNG.decode._getBPP( out ),
  705. cbpp = bpp >> 3,
  706. bpl = Math.ceil( w * bpp / 8 );
  707. var img = new Uint8Array( h * bpl );
  708. var di = 0;
  709. var starting_row = [ 0, 0, 4, 0, 2, 0, 1 ];
  710. var starting_col = [ 0, 4, 0, 2, 0, 1, 0 ];
  711. var row_increment = [ 8, 8, 8, 4, 4, 2, 2 ];
  712. var col_increment = [ 8, 8, 4, 4, 2, 2, 1 ];
  713. var pass = 0;
  714. while ( pass < 7 ) {
  715. var ri = row_increment[ pass ],
  716. ci = col_increment[ pass ];
  717. var sw = 0,
  718. sh = 0;
  719. var cr = starting_row[ pass ];
  720. while ( cr < h ) {
  721. cr += ri;
  722. sh ++;
  723. }
  724. var cc = starting_col[ pass ];
  725. while ( cc < w ) {
  726. cc += ci;
  727. sw ++;
  728. }
  729. var bpll = Math.ceil( sw * bpp / 8 );
  730. UPNG.decode._filterZero( data, out, di, sw, sh );
  731. var y = 0,
  732. row = starting_row[ pass ];
  733. var val;
  734. while ( row < h ) {
  735. var col = starting_col[ pass ];
  736. var cdi = di + y * bpll << 3;
  737. while ( col < w ) {
  738. if ( bpp == 1 ) {
  739. val = data[ cdi >> 3 ];
  740. val = val >> 7 - ( cdi & 7 ) & 1;
  741. img[ row * bpl + ( col >> 3 ) ] |= val << 7 - ( ( col & 7 ) << 0 );
  742. }
  743. if ( bpp == 2 ) {
  744. val = data[ cdi >> 3 ];
  745. val = val >> 6 - ( cdi & 7 ) & 3;
  746. img[ row * bpl + ( col >> 2 ) ] |= val << 6 - ( ( col & 3 ) << 1 );
  747. }
  748. if ( bpp == 4 ) {
  749. val = data[ cdi >> 3 ];
  750. val = val >> 4 - ( cdi & 7 ) & 15;
  751. img[ row * bpl + ( col >> 1 ) ] |= val << 4 - ( ( col & 1 ) << 2 );
  752. }
  753. if ( bpp >= 8 ) {
  754. var ii = row * bpl + col * cbpp;
  755. for ( var j = 0; j < cbpp; j ++ ) img[ ii + j ] = data[ ( cdi >> 3 ) + j ];
  756. }
  757. cdi += bpp;
  758. col += ci;
  759. }
  760. y ++;
  761. row += ri;
  762. }
  763. if ( sw * sh != 0 ) di += sh * ( 1 + bpll );
  764. pass = pass + 1;
  765. }
  766. return img;
  767. };
  768. UPNG.decode._getBPP = function ( out ) {
  769. var noc = [ 1, null, 3, 1, 2, null, 4 ][ out.ctype ];
  770. return noc * out.depth;
  771. };
  772. UPNG.decode._filterZero = function ( data, out, off, w, h ) {
  773. var bpp = UPNG.decode._getBPP( out ),
  774. bpl = Math.ceil( w * bpp / 8 ),
  775. paeth = UPNG.decode._paeth;
  776. bpp = Math.ceil( bpp / 8 );
  777. var i,
  778. di,
  779. type = data[ off ],
  780. x = 0;
  781. if ( type > 1 ) data[ off ] = [ 0, 0, 1 ][ type - 2 ];
  782. if ( type == 3 ) for ( x = bpp; x < bpl; x ++ ) data[ x + 1 ] = data[ x + 1 ] + ( data[ x + 1 - bpp ] >>> 1 ) & 255;
  783. for ( var y = 0; y < h; y ++ ) {
  784. i = off + y * bpl;
  785. di = i + y + 1;
  786. type = data[ di - 1 ];
  787. x = 0;
  788. if ( type == 0 ) for ( ; x < bpl; x ++ ) data[ i + x ] = data[ di + x ]; else if ( type == 1 ) {
  789. for ( ; x < bpp; x ++ ) data[ i + x ] = data[ di + x ];
  790. for ( ; x < bpl; x ++ ) data[ i + x ] = data[ di + x ] + data[ i + x - bpp ];
  791. } else if ( type == 2 ) {
  792. for ( ; x < bpl; x ++ ) data[ i + x ] = data[ di + x ] + data[ i + x - bpl ];
  793. } else if ( type == 3 ) {
  794. for ( ; x < bpp; x ++ ) data[ i + x ] = data[ di + x ] + ( data[ i + x - bpl ] >>> 1 );
  795. for ( ; x < bpl; x ++ ) data[ i + x ] = data[ di + x ] + ( data[ i + x - bpl ] + data[ i + x - bpp ] >>> 1 );
  796. } else {
  797. for ( ; x < bpp; x ++ ) data[ i + x ] = data[ di + x ] + paeth( 0, data[ i + x - bpl ], 0 );
  798. for ( ; x < bpl; x ++ ) data[ i + x ] = data[ di + x ] + paeth( data[ i + x - bpp ], data[ i + x - bpl ], data[ i + x - bpp - bpl ] );
  799. }
  800. }
  801. return data;
  802. };
  803. UPNG.decode._paeth = function ( a, b, c ) {
  804. var p = a + b - c,
  805. pa = p - a,
  806. pb = p - b,
  807. pc = p - c;
  808. if ( pa * pa <= pb * pb && pa * pa <= pc * pc ) return a; else if ( pb * pb <= pc * pc ) return b;
  809. return c;
  810. };
  811. UPNG.decode._IHDR = function ( data, offset, out ) {
  812. var bin = UPNG._bin;
  813. out.width = bin.readUint( data, offset );
  814. offset += 4;
  815. out.height = bin.readUint( data, offset );
  816. offset += 4;
  817. out.depth = data[ offset ];
  818. offset ++;
  819. out.ctype = data[ offset ];
  820. offset ++;
  821. out.compress = data[ offset ];
  822. offset ++;
  823. out.filter = data[ offset ];
  824. offset ++;
  825. out.interlace = data[ offset ];
  826. offset ++;
  827. };
  828. UPNG._bin = {
  829. nextZero: function ( data, p ) {
  830. while ( data[ p ] != 0 ) p ++;
  831. return p;
  832. },
  833. readUshort: function ( buff, p ) {
  834. return buff[ p ] << 8 | buff[ p + 1 ];
  835. },
  836. writeUshort: function ( buff, p, n ) {
  837. buff[ p ] = n >> 8 & 255;
  838. buff[ p + 1 ] = n & 255;
  839. },
  840. readUint: function ( buff, p ) {
  841. return buff[ p ] * ( 256 * 256 * 256 ) + ( buff[ p + 1 ] << 16 | buff[ p + 2 ] << 8 | buff[ p + 3 ] );
  842. },
  843. writeUint: function ( buff, p, n ) {
  844. buff[ p ] = n >> 24 & 255;
  845. buff[ p + 1 ] = n >> 16 & 255;
  846. buff[ p + 2 ] = n >> 8 & 255;
  847. buff[ p + 3 ] = n & 255;
  848. },
  849. readASCII: function ( buff, p, l ) {
  850. var s = '';
  851. for ( var i = 0; i < l; i ++ ) s += String.fromCharCode( buff[ p + i ] );
  852. return s;
  853. },
  854. writeASCII: function ( data, p, s ) {
  855. for ( var i = 0; i < s.length; i ++ ) data[ p + i ] = s.charCodeAt( i );
  856. },
  857. readBytes: function ( buff, p, l ) {
  858. var arr = [];
  859. for ( var i = 0; i < l; i ++ ) arr.push( buff[ p + i ] );
  860. return arr;
  861. },
  862. pad: function ( n ) {
  863. return n.length < 2 ? '0' + n : n;
  864. },
  865. readUTF8: function ( buff, p, l ) {
  866. var s = '',
  867. ns;
  868. for ( var i = 0; i < l; i ++ ) s += '%' + UPNG._bin.pad( buff[ p + i ].toString( 16 ) );
  869. try {
  870. ns = decodeURIComponent( s );
  871. } catch ( e ) {
  872. return UPNG._bin.readASCII( buff, p, l );
  873. }
  874. return ns;
  875. }
  876. };
  877. UPNG._copyTile = function ( sb, sw, sh, tb, tw, th, xoff, yoff, mode ) {
  878. var w = Math.min( sw, tw ),
  879. h = Math.min( sh, th );
  880. var si = 0,
  881. ti = 0;
  882. for ( var y = 0; y < h; y ++ ) for ( var x = 0; x < w; x ++ ) {
  883. if ( xoff >= 0 && yoff >= 0 ) {
  884. si = y * sw + x << 2;
  885. ti = ( yoff + y ) * tw + xoff + x << 2;
  886. } else {
  887. si = ( - yoff + y ) * sw - xoff + x << 2;
  888. ti = y * tw + x << 2;
  889. }
  890. if ( mode == 0 ) {
  891. tb[ ti ] = sb[ si ];
  892. tb[ ti + 1 ] = sb[ si + 1 ];
  893. tb[ ti + 2 ] = sb[ si + 2 ];
  894. tb[ ti + 3 ] = sb[ si + 3 ];
  895. } else if ( mode == 1 ) {
  896. var fa = sb[ si + 3 ] * ( 1 / 255 ),
  897. fr = sb[ si ] * fa,
  898. fg = sb[ si + 1 ] * fa,
  899. fb = sb[ si + 2 ] * fa;
  900. var ba = tb[ ti + 3 ] * ( 1 / 255 ),
  901. br = tb[ ti ] * ba,
  902. bg = tb[ ti + 1 ] * ba,
  903. bb = tb[ ti + 2 ] * ba;
  904. var ifa = 1 - fa,
  905. oa = fa + ba * ifa,
  906. ioa = oa == 0 ? 0 : 1 / oa;
  907. tb[ ti + 3 ] = 255 * oa;
  908. tb[ ti + 0 ] = ( fr + br * ifa ) * ioa;
  909. tb[ ti + 1 ] = ( fg + bg * ifa ) * ioa;
  910. tb[ ti + 2 ] = ( fb + bb * ifa ) * ioa;
  911. } else if ( mode == 2 ) {
  912. // copy only differences, otherwise zero
  913. var fa = sb[ si + 3 ],
  914. fr = sb[ si ],
  915. fg = sb[ si + 1 ],
  916. fb = sb[ si + 2 ];
  917. var ba = tb[ ti + 3 ],
  918. br = tb[ ti ],
  919. bg = tb[ ti + 1 ],
  920. bb = tb[ ti + 2 ];
  921. if ( fa == ba && fr == br && fg == bg && fb == bb ) {
  922. tb[ ti ] = 0;
  923. tb[ ti + 1 ] = 0;
  924. tb[ ti + 2 ] = 0;
  925. tb[ ti + 3 ] = 0;
  926. } else {
  927. tb[ ti ] = fr;
  928. tb[ ti + 1 ] = fg;
  929. tb[ ti + 2 ] = fb;
  930. tb[ ti + 3 ] = fa;
  931. }
  932. } else if ( mode == 3 ) {
  933. // check if can be blended
  934. var fa = sb[ si + 3 ],
  935. fr = sb[ si ],
  936. fg = sb[ si + 1 ],
  937. fb = sb[ si + 2 ];
  938. var ba = tb[ ti + 3 ],
  939. br = tb[ ti ],
  940. bg = tb[ ti + 1 ],
  941. bb = tb[ ti + 2 ];
  942. if ( fa == ba && fr == br && fg == bg && fb == bb ) continue; //if(fa!=255 && ba!=0) return false;
  943. if ( fa < 220 && ba > 20 ) return false;
  944. }
  945. }
  946. return true;
  947. };
  948. THREE.RGBMLoader = RGBMLoader;
  949. } )();