libjxl

FORK: libjxl patches used on blog
git clone https://git.neptards.moe/blog/libjxl.git
Log | Files | Refs | Submodules | README | LICENSE

jxl_decoder_test.js (4470B)


      1 // Copyright (c) the JPEG XL Project Authors. All rights reserved.
      2 //
      3 // Use of this source code is governed by a BSD-style
      4 // license that can be found in the LICENSE file.
      5 
      6 function assertTrue(ok, msg) {
      7   if (!ok) {
      8     console.log('FAIL: ' + msg);
      9     process.exit(1);
     10   }
     11 }
     12 
     13 function runTest(testFn) {
     14   console.log('Running ' + testFn.name);
     15   testFn();
     16   console.log('PASS');
     17 }
     18 
     19 let jxlModule;
     20 
     21 const isAddress = (v) => {
     22   return (v >= 4) && ((v & (1 << 31)) === 0);
     23 };
     24 
     25 let splinesJxl = new Uint8Array([
     26   0xff, 0x0a, 0xf8, 0x19, 0x10, 0x09, 0xd8, 0x63, 0x10, 0x00, 0xbc, 0x00,
     27   0xa6, 0x19, 0x4a, 0xa3, 0x56, 0x8c, 0x94, 0x62, 0x24, 0x7d, 0x12, 0x72,
     28   0x87, 0x00, 0x00, 0xda, 0xd4, 0xc9, 0xc1, 0xe2, 0x9e, 0x02, 0xb9, 0x37,
     29   0x00, 0xfe, 0x07, 0x9a, 0x91, 0x08, 0xcd, 0xbf, 0xa1, 0xdc, 0x71, 0x36,
     30   0x62, 0xc8, 0x97, 0x31, 0xc4, 0x3e, 0x58, 0x02, 0xc1, 0x01, 0x00
     31 ]);
     32 
     33 let crossJxl = new Uint8Array([
     34   0xff, 0x0a, 0x98, 0x10, 0x10, 0x50, 0x5c, 0x08, 0x08, 0x02, 0x01,
     35   0x00, 0x98, 0x00, 0x4b, 0x18, 0x8b, 0x15, 0x00, 0xd4, 0x92, 0x62,
     36   0xcc, 0x98, 0x91, 0x17, 0x08, 0x01, 0xe0, 0x92, 0xbc, 0x7e, 0xdf,
     37   0xbf, 0xff, 0x50, 0xc0, 0x64, 0x35, 0xb0, 0x40, 0x1e, 0x24, 0xa9,
     38   0xac, 0x38, 0xd9, 0x13, 0x1e, 0x85, 0x4a, 0x0d
     39 ]);
     40 
     41 function testSdr() {
     42   let decoder = jxlModule._jxlCreateInstance(
     43       /* wantSdr */ true, /* displayNits */ 100);
     44   assertTrue(isAddress(decoder), 'create decoder instance');
     45   let encoded = splinesJxl;
     46   let buffer = jxlModule._malloc(encoded.length);
     47   jxlModule.HEAP8.set(encoded, buffer);
     48 
     49   let result = jxlModule._jxlProcessInput(decoder, buffer, encoded.length);
     50   assertTrue(result === 0, 'process input');
     51 
     52   let w = jxlModule.HEAP32[decoder >> 2];
     53   let h = jxlModule.HEAP32[(decoder + 4) >> 2];
     54   let pixelData = jxlModule.HEAP32[(decoder + 8) >> 2];
     55 
     56   assertTrue(pixelData, 'output allocated');
     57   assertTrue(h === 320, 'output height');
     58   assertTrue(w === 320, 'output width ');
     59 
     60   jxlModule._jxlDestroyInstance(decoder);
     61   jxlModule._free(buffer);
     62 }
     63 
     64 function testRegular() {
     65   let decoder = jxlModule._jxlCreateInstance(
     66       /* wantSdr */ false, /* displayNits */ 100);
     67   assertTrue(isAddress(decoder), 'create decoder instance');
     68   let encoded = splinesJxl;
     69   let buffer = jxlModule._malloc(encoded.length);
     70   jxlModule.HEAP8.set(encoded, buffer);
     71 
     72   let result = jxlModule._jxlProcessInput(decoder, buffer, encoded.length);
     73   assertTrue(result === 0, 'process input');
     74 
     75   let w = jxlModule.HEAP32[decoder >> 2];
     76   let h = jxlModule.HEAP32[(decoder + 4) >> 2];
     77   let pixelData = jxlModule.HEAP32[(decoder + 8) >> 2];
     78 
     79   assertTrue(pixelData, 'output allocated');
     80   assertTrue(h === 320, 'output height');
     81   assertTrue(w === 320, 'output width ');
     82 
     83   jxlModule._jxlDestroyInstance(decoder);
     84   jxlModule._free(buffer);
     85 }
     86 
     87 function testChunks() {
     88   let decoder = jxlModule._jxlCreateInstance(
     89       /* wantSdr */ false, /* displayNits */ 100);
     90   assertTrue(isAddress(decoder), 'create decoder instance');
     91   let encoded = splinesJxl;
     92   let buffer = jxlModule._malloc(encoded.length);
     93   jxlModule.HEAP8.set(encoded, buffer);
     94 
     95   let part1_length = encoded.length >> 1;
     96   let part2_length = encoded.length - part1_length;
     97 
     98   let result = jxlModule._jxlProcessInput(decoder, buffer, part1_length);
     99   assertTrue(result === 2, 'process first part');
    100 
    101   result =
    102       jxlModule._jxlProcessInput(decoder, buffer + part1_length, part2_length);
    103   assertTrue(result === 0, 'process second part');
    104 
    105   let w = jxlModule.HEAP32[decoder >> 2];
    106   let h = jxlModule.HEAP32[(decoder + 4) >> 2];
    107   let pixelData = jxlModule.HEAP32[(decoder + 8) >> 2];
    108 
    109   assertTrue(pixelData, 'output allocated');
    110   assertTrue(h === 320, 'output height');
    111   assertTrue(w === 320, 'output width ');
    112 
    113   jxlModule._jxlDestroyInstance(decoder);
    114   jxlModule._free(buffer);
    115 }
    116 
    117 function testDecompress() {
    118   let encoded = crossJxl;
    119   let buffer = jxlModule._malloc(encoded.length);
    120   jxlModule.HEAP8.set(encoded, buffer);
    121 
    122   let output = jxlModule._jxlDecompress(buffer, encoded.length);
    123   assertTrue(isAddress(output), 'decompress');
    124 
    125   jxlModule._free(buffer);
    126 
    127   let pngSize = jxlModule.HEAP32[output >> 2];
    128   let px = 20 * 20;
    129   assertTrue(pngSize >= 6 * px, 'png size');
    130   assertTrue(pngSize <= 6 * px + 800, 'png size');
    131 
    132   jxlModule._jxlCleanup(output);
    133 }
    134 
    135 require('jxl_decoder_for_test.js')().then(module => {
    136   jxlModule = module;
    137   let tests = [testSdr, testRegular, testChunks, testDecompress];
    138   tests.forEach(runTest);
    139   process.exit(0);
    140 });