Skip to content

Commit

Permalink
reduce memory consumption and slice processing speed
Browse files Browse the repository at this point in the history
  • Loading branch information
frickt committed Aug 29, 2018
1 parent 2942679 commit e41d859
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 27 deletions.
5 changes: 3 additions & 2 deletions src/app/application.js
Original file line number Diff line number Diff line change
Expand Up @@ -608,14 +608,15 @@ dwv.App = function ()
}
// flag used by scroll to decide wether to activate or not
// TODO: supposing multi-slice for zip files, could not be...
isMonoSliceData = (data.length === 1 &&
var numberOfImages = data.length;
isMonoSliceData = (numberOfImages === 1 &&
firstName.split('.').pop().toLowerCase() !== "zip" &&
!dwv.utils.endsWith(firstName, "DICOMDIR"));
// set IO
loader.setDefaultCharacterSet(defaultCharacterSet);
loader.onload = function (data) {
if ( image ) {
view.append( data.view );
view.append( data.view, numberOfImages);
if ( drawController ) {
//drawController.appendDrawLayer(image.getNumberOfFrames());
}
Expand Down
35 changes: 15 additions & 20 deletions src/image/image.js
Original file line number Diff line number Diff line change
Expand Up @@ -322,7 +322,7 @@ dwv.image.Image = function(geometry, buffer, numberOfFrames)
* @param {Image} The slice to append.
* @return {Number} The number of the inserted slice.
*/
this.appendSlice = function (rhs, frame)
this.appendSlice = function (rhs, frame, numberOfImages)
{
// check input
if( rhs === null ) {
Expand Down Expand Up @@ -361,40 +361,35 @@ dwv.image.Image = function(geometry, buffer, numberOfFrames)
}
var sliceSize = mul * size.getSliceSize();

// create the new buffer
var newBuffer = dwv.dicom.getTypedArray(
buffer[f].BYTES_PER_ELEMENT * 8,
meta.IsSigned ? 1 : 0,
sliceSize * (size.getNumberOfSlices() + 1) );
// create the new buffer for all slices
if(buffer[f].length != sliceSize * numberOfImages){
var newBuffer = dwv.dicom.getTypedArray(
buffer[f].BYTES_PER_ELEMENT * 8,
meta.IsSigned ? 1 : 0,
sliceSize * numberOfImages );

newBuffer.set(buffer[f]);
buffer[f] = newBuffer;
}

// append slice at new position
var newSliceNb = geometry.getSliceIndex( rhs.getGeometry().getOrigin() );
if( newSliceNb === 0 )
if( newSliceNb === size.getNumberOfSlices() )
{
newBuffer.set(rhs.getFrame(f));
newBuffer.set(buffer[f], sliceSize);
}
else if( newSliceNb === size.getNumberOfSlices() )
{
newBuffer.set(buffer[f]);
newBuffer.set(rhs.getFrame(f), size.getNumberOfSlices() * sliceSize);
buffer[f].set(rhs.getFrame(f), size.getNumberOfSlices() * sliceSize);
}
else
{
var offset = newSliceNb * sliceSize;
newBuffer.set(buffer[f].subarray(0, offset - 1));
newBuffer.set(rhs.getFrame(f), offset);
newBuffer.set(buffer[f].subarray(offset), offset + sliceSize);
buffer[f].set(buffer[f].subarray(offset, offset + (sliceSize * (size.getNumberOfSlices() - newSliceNb))), offset + sliceSize);
buffer[f].set(rhs.getFrame(f), offset);
}

// update geometry
geometry.appendOrigin( rhs.getGeometry().getOrigin(), newSliceNb );
// update rsi
rsis.splice(newSliceNb, 0, rhs.getRescaleSlopeAndIntercept(0));

// copy to class variables
buffer[f] = newBuffer;

// insert overlay information of the slice to the image
overlays.splice(newSliceNb, 0, rhs.getOverlays()[0]);

Expand Down
4 changes: 2 additions & 2 deletions src/image/view.js
Original file line number Diff line number Diff line change
Expand Up @@ -443,10 +443,10 @@ dwv.image.View = function (image)
* Append another view to this one.
* @param {Object} rhs The view to append.
*/
this.append = function( rhs )
this.append = function( rhs , numberOfImages)
{
// append images
var newSliceNumber = this.getImage().appendSlice( rhs.getImage() );
var newSliceNumber = this.getImage().appendSlice( rhs.getImage(), 0, numberOfImages );
// update position if a slice was appended before
if ( newSliceNumber <= this.getCurrentPosition().k ) {
this.setCurrentPosition(
Expand Down
6 changes: 3 additions & 3 deletions tests/image/image.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,7 @@ QUnit.test("Test Image append slice.", function (assert) {
var sliceGeometry = new dwv.image.Geometry(sliceOrigin, sliceSize, imgSpacing);
var slice0 = new dwv.image.Image(sliceGeometry, [sliceBuffer]);
// append slice before
image0.appendSlice(slice0);
image0.appendSlice(slice0, 0, 4);
// test its values
assert.equal( image0.getValue(0, 0, 0), 2, "Value at 0,0,0 (append before)" );
assert.equal( image0.getValue(3, 3, 0), 2, "Value at 3,3,0 (append before)" );
Expand All @@ -194,7 +194,7 @@ QUnit.test("Test Image append slice.", function (assert) {
var sliceGeometry1 = new dwv.image.Geometry(sliceOrigin1, sliceSize, imgSpacing);
var slice1 = new dwv.image.Image(sliceGeometry1, [sliceBuffer]);
// append slice before
image1.appendSlice(slice1);
image1.appendSlice(slice1, 0, 4);
// test its values
assert.equal( image1.getValue(0, 0, 0), 0, "Value at 0,0,0 (append after)" );
assert.equal( image1.getValue(3, 3, 0), 0, "Value at 3,3,0 (append after)" );
Expand All @@ -217,7 +217,7 @@ QUnit.test("Test Image append slice.", function (assert) {
var sliceGeometry2 = new dwv.image.Geometry(sliceOrigin2, sliceSize, imgSpacing);
var slice2 = new dwv.image.Image(sliceGeometry2, [sliceBuffer]);
// append slice before
image2.appendSlice(slice2);
image2.appendSlice(slice2, 0, 4);
// test its values
assert.equal( image2.getValue(0, 0, 0), 0, "Value at 0,0,0 (append between)" );
assert.equal( image2.getValue(3, 3, 0), 0, "Value at 3,3,0 (append between)" );
Expand Down

0 comments on commit e41d859

Please sign in to comment.