From 008b55fd23e325b8c5f2bf80ce6e2346549dbb65 Mon Sep 17 00:00:00 2001 From: Alireza Date: Tue, 2 May 2023 22:53:21 -0400 Subject: [PATCH 1/2] fix(scroll): was not able to scroll back --- .../core/src/RenderingEngine/StackViewport.ts | 4 +- packages/tools/src/tools/StackScrollTool.ts | 4 +- .../StackScrollToolMouseWheelTool_test.js | 67 ++++++++++++------ .../groundTruth/imageURI_64_64_10_5_3_2_0.png | Bin 2968 -> 3074 bytes .../groundTruth/imageURI_64_64_15_5_3_2_0.png | Bin 0 -> 3137 bytes 5 files changed, 50 insertions(+), 25 deletions(-) create mode 100644 packages/tools/test/groundTruth/imageURI_64_64_15_5_3_2_0.png diff --git a/packages/core/src/RenderingEngine/StackViewport.ts b/packages/core/src/RenderingEngine/StackViewport.ts index 2c02eaaef..efa5996ee 100644 --- a/packages/core/src/RenderingEngine/StackViewport.ts +++ b/packages/core/src/RenderingEngine/StackViewport.ts @@ -1461,11 +1461,13 @@ class StackViewport extends Viewport implements IStackViewport { numComps, pixelArray, }): void { + const values = new pixelArray.constructor(pixelArray.length); + // Todo: I guess nothing should be done for use16bit? const scalarArray = vtkDataArray.newInstance({ name: 'Pixels', numberOfComponents: numComps, - values: pixelArray, + values: values, }); this._imageData = vtkImageData.newInstance(); diff --git a/packages/tools/src/tools/StackScrollTool.ts b/packages/tools/src/tools/StackScrollTool.ts index 93afd056d..ca0393d6b 100644 --- a/packages/tools/src/tools/StackScrollTool.ts +++ b/packages/tools/src/tools/StackScrollTool.ts @@ -22,7 +22,7 @@ class StackScrollTool extends BaseTool { configuration: { invert: false, debounceIfNotLoaded: true, - loop: false + loop: false, }, } ) { @@ -65,7 +65,7 @@ class StackScrollTool extends BaseTool { delta: invert ? -imageIdIndexOffset : imageIdIndexOffset, volumeId, debounceLoading: debounceIfNotLoaded, - loop: loop + loop: loop, }); this.deltaY = deltaY % pixelsPerImage; diff --git a/packages/tools/test/StackScrollToolMouseWheelTool_test.js b/packages/tools/test/StackScrollToolMouseWheelTool_test.js index fa9d7000c..eef96f225 100644 --- a/packages/tools/test/StackScrollToolMouseWheelTool_test.js +++ b/packages/tools/test/StackScrollToolMouseWheelTool_test.js @@ -4,6 +4,7 @@ import * as testUtils from '../../../utils/test/testUtils'; import * as volumeURI_100_100_10_1_1_1_0_scrolled from './groundTruth/volumeURI_100_100_10_1_1_1_0_scrolled.png'; import * as imageURI_64_64_0_20_1_1_0_scrolled from './groundTruth/imageURI_64_64_0_20_1_1_0_scrolled.png'; +import * as imageURI_64_64_15_5_3_2_0 from './groundTruth/imageURI_64_64_15_5_3_2_0.png'; import * as imageURI_64_64_10_5_3_2_0 from './groundTruth/imageURI_64_64_10_5_3_2_0.png'; const { @@ -19,12 +20,7 @@ const { const { Events, ViewportType, InterpolationType } = Enums; const { registerVolumeLoader } = volumeLoader; -const { - StackScrollMouseWheelTool, - ZoomTool, - ToolGroupManager, - Enums: { MouseBindings }, -} = csTools3d; +const { StackScrollMouseWheelTool, ZoomTool, ToolGroupManager } = csTools3d; const { fakeImageLoader, @@ -80,17 +76,7 @@ describe('Cornerstone Tools Scroll Wheel: ', () => { this.stackToolGroup.addTool(StackScrollMouseWheelTool.toolName, { debounceIfNotLoaded: false, }); - this.stackToolGroup.addTool(ZoomTool.toolName, { - debounceIfNotLoaded: false, - }); this.stackToolGroup.setToolActive(StackScrollMouseWheelTool.toolName); - this.stackToolGroup.setToolActive(ZoomTool.toolName, { - bindings: [ - { - mouseButton: MouseBindings.Secondary, // Right Click - }, - ], - }); this.renderingEngine = new RenderingEngine(renderingEngineId); imageLoader.registerImageLoader('fakeImageLoader', fakeImageLoader); @@ -273,7 +259,7 @@ describe('Cornerstone Tools Scroll Wheel: ', () => { } }); - it('Should successfully scroll through stack of images of non square spacing', function (done) { + fit('Should successfully scroll through stack of images and then go back', function (done) { const element = createViewport( this.renderingEngine, ViewportType.STACK, @@ -287,6 +273,8 @@ describe('Cornerstone Tools Scroll Wheel: ', () => { const vp = this.renderingEngine.getViewport(viewportId); let handlerRun = false; + let pageX1; + let pageY1; function renderEventHandler() { if (handlerRun) return; handlerRun = true; @@ -298,12 +286,15 @@ describe('Cornerstone Tools Scroll Wheel: ', () => { const { imageData } = vp.getImageData(); const { - pageX: pageX1, - pageY: pageY1, + pageX, + pageY, clientX: clientX1, clientY: clientY1, } = createNormalizedMouseEvent(imageData, index1, element, vp); + pageX1 = pageX; + pageY1 = pageY; + const { pageX: pageX2, pageY: pageY2, @@ -353,18 +344,50 @@ describe('Cornerstone Tools Scroll Wheel: ', () => { } function attachEventHandler() { - const canvas = vp.getCanvas(); - element.addEventListener( Events.IMAGE_RENDERED, function secondImageRendered() { // Second render is as a result of scrolling - const image = canvas.toDataURL('image/png'); element.removeEventListener( Events.IMAGE_RENDERED, secondImageRendered ); + // Scroll back + setTimeout(() => { + const evt = new WheelEvent('wheel', { + target: element, + pageX: pageX1, + pageY: pageY1, + deltaX: 0, + deltaY: -12, + deltaMode: 0, + wheelDelta: 36, + wheelDeltaX: 0, + wheelDeltaY: 36, + }); + + attachThirdImageRenderedHandler(); + + element.dispatchEvent(evt); + }, 500); + } + ); + } + + function attachThirdImageRenderedHandler() { + const canvas = vp.getCanvas(); + + element.addEventListener( + Events.IMAGE_RENDERED, + function thirdImageRendered() { + // Third render is as a result of scrolling back + const image = canvas.toDataURL('image/png'); + element.removeEventListener( + Events.IMAGE_RENDERED, + thirdImageRendered + ); + compareImages( image, imageURI_64_64_10_5_3_2_0, diff --git a/packages/tools/test/groundTruth/imageURI_64_64_10_5_3_2_0.png b/packages/tools/test/groundTruth/imageURI_64_64_10_5_3_2_0.png index 40af80b2f040321b05f104f09b79e7b12bbbcdd5..0f558484fde19a2e7ea84c6ad3c91c4fe2411d41 100644 GIT binary patch literal 3074 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G$1D;)7d$|)7e=epeR2rGbfdS zL1SX>guUK}14NGc=PdcrSW*yB(D7hFkn1JBvNf(QF9cq1kDhfb#N)Mc=Zeiu&3C!_ z7AgE=brO}ibv8EOqx_3!i&8EMz0ba~<<;JpbN#0)`%g1kxlA<-W(m-+3QNm#i;BKK z;ZSLZgoAjg$JLx^AyZ5uKdgQG)Xw2SmHom0R(m9L?oa8vw3%~ZRdr1D@7MXO-_6O( zULtSuSZcG3gM?~Wne4I3{vG!hE$;B1!#n@HMSAVNtg2~7nvbj>bxaE{KH`7mV$SJ% z84sIwF0Q?MVEy~6-KV>k)S5U4Olaw`Shlf2^whKZ{5>yy6Qy~6Z`i=fTxl`kh3R6m zg~I0-bMQ{?5IQ|$QRl~=`gHL(Hy9^q2=8IBzRI#r^Y@9&4bm$w?>y}AcFxLazb3DE z(Dg0N=iAQZOeOOw?!DF$kYkqWpZ7iP6?!9*At7BC~&Ajz#Q zTORLsS+C#C9DzC zHb_`sNdc^+B->Ug!Z$#{Ilm}X!A#FU&p^qJOF==wrYI%ND#*nRsvXF)RmvzSDX`Ml zFE20GD>v55FG|-pw6wI;H!#vSGSUUA&@HaaD@m--%_~-h7y>iLCAB!YD6^m>Ge1uO zWNuy%qvMP0&0fZ26G^86;QKm^g+Re6nv1l0gD17$BxTJA0E+mT+>!~U0`5ff9C1p z7*fIb_WDI%kpz*JK$9;{rqdL80~&J!+H)h?Q`dCzey|ltekK>U^XAz(KaCsp`2HIZeoolTly853UR>S&Cx8Aioe1IMe8VZxu-8vjX#y*c!?Gfe1pfmJ zZ%VZU8+8&GjHWs>RWq?AtPk$wNMU52uu?|ohOhxc^;|C(1#XE3pQjTJ%xhr0@j66_ zDe?eAidH+zHx`})am$4SPcX451Y4?XP)}g^W;M0LLCk<*<|)NSTSn#$*H^l*Y-(T} zwR$wbN0ZrT<|3g;IWHeu_xtPH#gps*|CXQsdFubvZRb0m1#_r?s|)2=Dra3)kspiwV@Vb@e| vrea|1tqW@8C}Cv2ur@|$2C!%x$yWbibP0l+XkKtjbI; literal 2968 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G$1D|)7d$|)7e=epeR2rGbfdS zL1SX>1Y7UJ0TQkLra=J{xpsBBlmx7lR}t0n+uF>*x3O;b(o7%j%qmaiS8Eo}R`6TY zz29NQ;zy74R{UV!wUdMKVo`1W;$@-lpFXwOGpE{8W`XM^$<3+^uE&dwi#LDzb!?f; zS|=y-MFAJrOQ%k|w1sukgXr1){~J0k{5Jd;zUjMIO+nhD+*eBq7VJ6~Uw=9C{LIwm zFU@IJ64tT1v~_Nk?dQCw`mRt@J_;Aw+}^NV zYDY%CbiAa?FTcx?kxFkDy=-n15mA|NL@8|L?EiZ^cbWGJNql>-h=IGZV!}()#o32d z=Cw03Kkg9Lp0Om*_4xkX+~qm)GwhTqILmkO#sq%fc)7qlWa$p(17|HS$NpV@u|t3A z_7K$veOwpH&is5WB_PX~)jwx{xW)QdhPCGpZ2ix9;X-2NmG~t~KmnZ^;hE;^%b*2h zb1<+lvN14&V}S`6`a)1PFkTon5aR8b3@l(Z3=DQant_370TWDwkzoNdf(??~+OqWl zPziTtNJL45ua8x7ey(0(N`6wRUPW#JNCAUQg%yyQn_7~nP?4LHS8P>bs{~eI1!RMS z^_3LBN=mYAl_Got6rA&mQWebf4D<|??6?#Z6l{u8(yW49+@RWlJX@uVl9B=|ef{$C za=mh6z5JqdeM3u2OML?)eIp}XpbFjM%Dj@q3f;V7Wr!g#b6ir3lZ!G7N;32F6hP)C zCgqow*eWT3EP?}wJ4-Ut5H{r%L%jv`pgu@O-%!s$A8s~Ks|`rhDk!x$Kc^IAd}v-~ ziJg%RSTVXV!ZwI5|Dw!PpnE~u>!aoACFkyC;pzhNXxJlMQx{{7jW}-zrcu%+uA+ JWt~$(699CD6jlHL diff --git a/packages/tools/test/groundTruth/imageURI_64_64_15_5_3_2_0.png b/packages/tools/test/groundTruth/imageURI_64_64_15_5_3_2_0.png new file mode 100644 index 0000000000000000000000000000000000000000..1de0fb41490388a01ea13e6f1f17d79d3683e496 GIT binary patch literal 3137 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G$1D;)7d$|)7e=epeR2rGbfdS zL1SX>guUK}14NGc=PdcrSW*yB(D7hFkn1JBvNf(QF9cq1kDhfb#N)Mc=Zeiu&3C!_ z7AgE=brO}ibv8EOqx_3!i&8EMz0ba~<<;JpbN#0)`%g1kxlA<-W(m-+3QNm#i;BKK z;ZSLZgoAjg$JLx^AyZ5uKdgQG)Xw2SmHom0R(m9L?oa8vw3%~ZRdr1D@7MXO-_6O( zULtSuSZcG3gM?~Wne4I3{vG!hE$;B1!#n@HMSAVNtg2~7nvbj>bxaE{KH`7mV$SJ% z84sIwF0Q?MVEy~6-KV>k)S5U4Olaw`Shlf2^whKZ{5>yy6Qy~6Z`i=fTxl`kh3R6m zg~I0-bMQ{?5IQ|$QRl~=`gHL(Hy9^q2=8IBzRI#r^Y@9&4bm$w?>y}AcFxLazb3DE z(Dg0N=iAQZOeOOw?!DF$kYkqWpZ7iP6?!9*At7BC~&Ajz#Q zTORLsS+C#C9DzC zHb_`sNdc^+B->Ug!Z$#{Ilm}X!A#FU&p^qJOF==wrYI%ND#*nRsvXF)RmvzSDX`Ml zFE20GD>v55FG|-pw6wI;H!#vSGSUUA&@HaaD@m--%_~-h7y>iLCAB!YD6^m>Ge1uO zWNuy%qvMP0&0fZ26G^86;QKm^g+Re6nv1l0gD17$BxTJA0E+mT+>!~T>z#yRZkbk zkP61P*Dv~tF$%N>8hlAIoubjTVP@gu<~Z>1arE2mL~$k^?>%E{4?-*6z2 zkoq`QM)B=jY3Rd$)f5UO)M^ zC*pt08|C-c+0_31Y+Bd1pCL)BndKJ?%YygI%#;MUIUIaaCpgS+VEA(PiW^H3BV)%( z9-$Y)0uB3S-|BDxhN|IIN2XdPrVHi4(t;hVEDFnvJQnynF#O8PQfAuNz;Gmljq?j9 zhr@l}To(mkjLbNt&}hfV_+t0UUXCM7Oaj4@Di?qOTx-5nun`z7qn3{b`)Gn2&1#es zG8L8ipKia;f8SekZ~p&3JHpqO{jyNopE>iu=f^KUMtt*&YiDRwWc<%6(ezD%Nt%@< n;c@65VW0@(sK8(fkAF<_G=+RFW}kHewH7^H{an^LB{Ts56FxKc literal 0 HcmV?d00001 From 016306f94e5f85bcc2c072364eb299bf36cecfa6 Mon Sep 17 00:00:00 2001 From: Alireza Date: Tue, 2 May 2023 22:54:23 -0400 Subject: [PATCH 2/2] fix test --- packages/tools/test/StackScrollToolMouseWheelTool_test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/tools/test/StackScrollToolMouseWheelTool_test.js b/packages/tools/test/StackScrollToolMouseWheelTool_test.js index eef96f225..3a8e56b7d 100644 --- a/packages/tools/test/StackScrollToolMouseWheelTool_test.js +++ b/packages/tools/test/StackScrollToolMouseWheelTool_test.js @@ -259,7 +259,7 @@ describe('Cornerstone Tools Scroll Wheel: ', () => { } }); - fit('Should successfully scroll through stack of images and then go back', function (done) { + it('Should successfully scroll through stack of images and then go back', function (done) { const element = createViewport( this.renderingEngine, ViewportType.STACK,