Skip to content

Commit

Permalink
Merge branch 'v0.30.0'
Browse files Browse the repository at this point in the history
  • Loading branch information
ivmartel committed Dec 2, 2021
2 parents e84b930 + 0f9d9ff commit dfbad27
Show file tree
Hide file tree
Showing 180 changed files with 21,475 additions and 11,211 deletions.
9 changes: 9 additions & 0 deletions .eslint-full.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
module.exports = {
plugins: [
'jsdoc'
],
extends: [
'.eslintrc.js',
'plugin:jsdoc/recommended',
]
};
4 changes: 0 additions & 4 deletions .eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,8 @@ module.exports = {
globals: {
dwv: 'readonly'
},
plugins: [
'jsdoc'
],
extends: [
'eslint:recommended',
'plugin:jsdoc/recommended'
],
rules: {
// require triple equal
Expand Down
7 changes: 1 addition & 6 deletions .github/workflows/nodejs-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,6 @@ jobs:
- name: Run lint
run: yarn run lint
- name: Run tests
run: yarn run test-ci --coverage --verbose
run: yarn run test-ci
- name: Build
run: yarn run build
- name: Coveralls
uses: coverallsapp/github-action@master
with:
path-to-lcov: 'build/coverage/dwv/report-lcovonly.txt'
github-token: ${{ secrets.GITHUB_TOKEN }}
3 changes: 3 additions & 0 deletions Gruntfile.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ module.exports = function (grunt) {
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
eslint: {
options: {
overrideConfigFile: '.eslint-full.js'
},
files: [
'Gruntfile.js',
'karma.conf.js',
Expand Down
23 changes: 23 additions & 0 deletions changelog.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,28 @@
# Changelog

## [v0.30.0](https://github.com/ivmartel/dwv/releases/tag/v0.30.0) - 02/12/2021

### Added

- Allow for manual frame add [#1034](https://github.com/ivmartel/dwv/issues/1034)
- Add support for multi-resolution data [#1003](https://github.com/ivmartel/dwv/issues/1003)
- Remove coveralls and use karma coverage check [#1002](https://github.com/ivmartel/dwv/issues/1002)
- Use the same (web) worker for multiple data decode [#993](https://github.com/ivmartel/dwv/issues/993)
- Add text encoding in data writer [#963](https://github.com/ivmartel/dwv/issues/963)
- Support anisotropic pixels [#952](https://github.com/ivmartel/dwv/issues/952)
- Check data allocation size to avoid error [#951](https://github.com/ivmartel/dwv/issues/951)
- Allow to load files based on UID [#949](https://github.com/ivmartel/dwv/issues/949)
- Simplify image class data storage [#905](https://github.com/ivmartel/dwv/issues/905)
- Multi-slice view [#133](https://github.com/ivmartel/dwv/issues/133)
- Add MPR [#4](https://github.com/ivmartel/dwv/issues/4)

### Fixed

- Check var length before accessing it [#1017](https://github.com/ivmartel/dwv/issues/1017)
- Drag&drop of the ruler label causes console errors [#994](https://github.com/ivmartel/dwv/issues/994)

---

## [v0.29.1](https://github.com/ivmartel/dwv/releases/tag/v0.29.1) - 11/06/2021

### Added
Expand Down
22 changes: 11 additions & 11 deletions decoders/dwv/decode-rle.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,21 @@
* RLE decoder worker.
*/
// Do not warn if these variables were not defined before.
/* global importScripts, self, JpxImage */
/* global importScripts */

importScripts('rle.js');

self.addEventListener('message', function (event) {

// decode DICOM buffer
var decoder = new dwv.decoder.RleDecoder();
// post decoded data
self.postMessage([decoder.decode(
event.data.buffer,
event.data.meta.bitsAllocated,
event.data.meta.isSigned,
event.data.meta.sliceSize,
event.data.meta.samplesPerPixel,
event.data.meta.planarConfiguration )]);
// decode DICOM buffer
var decoder = new dwv.decoder.RleDecoder();
// post decoded data
self.postMessage([decoder.decode(
event.data.buffer,
event.data.meta.bitsAllocated,
event.data.meta.isSigned,
event.data.meta.sliceSize,
event.data.meta.samplesPerPixel,
event.data.meta.planarConfiguration)]);

}, false);
186 changes: 93 additions & 93 deletions decoders/dwv/rle.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,110 +20,110 @@ dwv.decoder.RleDecoder = function () {};
* @returns The decoded buffer.
* @see http://dicom.nema.org/dicom/2013/output/chtml/part05/sect_G.3.html
*/
dwv.decoder.RleDecoder.prototype.decode = function ( buffer,
bitsAllocated, isSigned, sliceSize, samplesPerPixel, planarConfiguration ) {
dwv.decoder.RleDecoder.prototype.decode = function (buffer,
bitsAllocated, isSigned, sliceSize, samplesPerPixel, planarConfiguration) {

// bytes per element
var bpe = bitsAllocated / 8;
// bytes per element
var bpe = bitsAllocated / 8;

// input
var inputDataView = new DataView(buffer.buffer, buffer.byteOffset);
var inputArray = new Int8Array(buffer.buffer, buffer.byteOffset);
// output
var outputBuffer = new ArrayBuffer(sliceSize * samplesPerPixel * bpe);
var outputArray = new Int8Array(outputBuffer);
// input
var inputDataView = new DataView(buffer.buffer, buffer.byteOffset);
var inputArray = new Int8Array(buffer.buffer, buffer.byteOffset);
// output
var outputBuffer = new ArrayBuffer(sliceSize * samplesPerPixel * bpe);
var outputArray = new Int8Array(outputBuffer);

// first value of the RLE header is the number of segments
var numberOfSegments = inputDataView.getInt32(0, true);
// first value of the RLE header is the number of segments
var numberOfSegments = inputDataView.getInt32(0, true);

// index increment in output array
var outputIndexIncrement = 1;
var incrementFactor = 1;
if (samplesPerPixel !== 1 && planarConfiguration === 0) {
incrementFactor *= samplesPerPixel;
}
if (bpe !== 1 ) {
incrementFactor *= bpe;
}
outputIndexIncrement *= incrementFactor;
// index increment in output array
var outputIndexIncrement = 1;
var incrementFactor = 1;
if (samplesPerPixel !== 1 && planarConfiguration === 0) {
incrementFactor *= samplesPerPixel;
}
if (bpe !== 1) {
incrementFactor *= bpe;
}
outputIndexIncrement *= incrementFactor;

// loop on segments
var outputIndex = 0;
var inputIndex = 0;
var remainder = 0;
var maxOutputIndex = 0;
var groupOutputIndex = 0;
for (var segment = 0; segment < numberOfSegments; ++segment) {
// handle special cases:
// - more than one sample per pixel: one segment per channel
// - 16bits: sort high and low bytes
if (incrementFactor !== 1) {
remainder = segment % incrementFactor;
if (remainder === 0) {
groupOutputIndex = maxOutputIndex;
}
outputIndex = groupOutputIndex + remainder;
// 16bits data
if (bpe === 2) {
outputIndex += (remainder % bpe ? -1 : 1);
}
}
// loop on segments
var outputIndex = 0;
var inputIndex = 0;
var remainder = 0;
var maxOutputIndex = 0;
var groupOutputIndex = 0;
for (var segment = 0; segment < numberOfSegments; ++segment) {
// handle special cases:
// - more than one sample per pixel: one segment per channel
// - 16bits: sort high and low bytes
if (incrementFactor !== 1) {
remainder = segment % incrementFactor;
if (remainder === 0) {
groupOutputIndex = maxOutputIndex;
}
outputIndex = groupOutputIndex + remainder;
// 16bits data
if (bpe === 2) {
outputIndex += (remainder % bpe ? -1 : 1);
}
}

// RLE header: list of segment sizes
var segmentStartIndex = inputDataView.getInt32((segment + 1) * 4, true);
var nextSegmentStartIndex = inputDataView.getInt32((segment + 2) * 4, true);
if (segment === numberOfSegments - 1 || nextSegmentStartIndex === 0) {
nextSegmentStartIndex = buffer.length;
// RLE header: list of segment sizes
var segmentStartIndex = inputDataView.getInt32((segment + 1) * 4, true);
var nextSegmentStartIndex = inputDataView.getInt32((segment + 2) * 4, true);
if (segment === numberOfSegments - 1 || nextSegmentStartIndex === 0) {
nextSegmentStartIndex = buffer.length;
}
// decode segment
inputIndex = segmentStartIndex;
var count = 0;
while (inputIndex < nextSegmentStartIndex) {
// get the count value
count = inputArray[inputIndex];
++inputIndex;
// store according to count
if (count >= 0 && count <= 127) {
// output the next count+1 bytes literally
for (var i = 0; i < count + 1; ++i) {
// store
outputArray[outputIndex] = inputArray[inputIndex];
// increment indexes
++inputIndex;
outputIndex += outputIndexIncrement;
}
// decode segment
inputIndex = segmentStartIndex;
var count = 0;
while (inputIndex < nextSegmentStartIndex) {
// get the count value
count = inputArray[inputIndex];
++inputIndex;
// store according to count
if (count >= 0 && count <= 127) {
// output the next count+1 bytes literally
for (var i = 0; i < count + 1; ++i) {
// store
outputArray[outputIndex] = inputArray[inputIndex];
// increment indexes
++inputIndex;
outputIndex += outputIndexIncrement;
}
} else if (count <= -1 && count >= -127) {
// output the next byte -count+1 times
var value = inputArray[inputIndex];
++inputIndex;
for (var j = 0; j < -count + 1; ++j) {
// store
outputArray[outputIndex] = value;
// increment index
outputIndex += outputIndexIncrement;
}
}
} else if (count <= -1 && count >= -127) {
// output the next byte -count+1 times
var value = inputArray[inputIndex];
++inputIndex;
for (var j = 0; j < -count + 1; ++j) {
// store
outputArray[outputIndex] = value;
// increment index
outputIndex += outputIndexIncrement;
}
}
}

if (outputIndex > maxOutputIndex) {
maxOutputIndex = outputIndex;
}
if (outputIndex > maxOutputIndex) {
maxOutputIndex = outputIndex;
}
}

var decodedBuffer = null;
if (bitsAllocated === 8) {
if (isSigned) {
decodedBuffer = new Int8Array(outputBuffer);
} else {
decodedBuffer = new Uint8Array(outputBuffer);
}
} else if (bitsAllocated === 16) {
if (isSigned) {
decodedBuffer = new Int16Array(outputBuffer);
} else {
decodedBuffer = new Uint16Array(outputBuffer);
}
var decodedBuffer = null;
if (bitsAllocated === 8) {
if (isSigned) {
decodedBuffer = new Int8Array(outputBuffer);
} else {
decodedBuffer = new Uint8Array(outputBuffer);
}
} else if (bitsAllocated === 16) {
if (isSigned) {
decodedBuffer = new Int16Array(outputBuffer);
} else {
decodedBuffer = new Uint16Array(outputBuffer);
}
}

return decodedBuffer;
return decodedBuffer;
};
20 changes: 10 additions & 10 deletions decoders/pdfjs/decode-jpeg2000.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,17 @@
* JPEG 2000 decoder worker.
*/
// Do not warn if these variables were not defined before.
/* global importScripts, self, JpxImage */
/* global importScripts, JpxImage */

importScripts('jpx.js', 'util.js', 'arithmetic_decoder.js');
importScripts('jpx.js', 'util.js', 'arithmetic_decoder.js');

self.addEventListener('message', function (event) {
// decode DICOM buffer
var decoder = new JpxImage();
decoder.parse( event.data.buffer );
// post decoded data
var res = decoder.tiles[0].items;
self.postMessage([res]);

// decode DICOM buffer
var decoder = new JpxImage();
decoder.parse(event.data.buffer);
// post decoded data
var res = decoder.tiles[0].items;
self.postMessage([res]);

}, false);
20 changes: 10 additions & 10 deletions decoders/pdfjs/decode-jpegbaseline.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,17 @@
* JPEG Baseline decoder worker.
*/
// Do not warn if these variables were not defined before.
/* global importScripts, self, JpegImage */
/* global importScripts, JpegImage */

importScripts('jpg.js');
importScripts('jpg.js');

self.addEventListener('message', function (event) {
// decode DICOM buffer
var decoder = new JpegImage();
decoder.parse( event.data.buffer );
// post decoded data
var res = decoder.getData(decoder.width,decoder.height);
self.postMessage([res]);

// decode DICOM buffer
var decoder = new JpegImage();
decoder.parse(event.data.buffer);
// post decoded data
var res = decoder.getData(decoder.width, decoder.height);
self.postMessage([res]);

}, false);
Loading

0 comments on commit dfbad27

Please sign in to comment.