diff --git a/package-lock.json b/package-lock.json index d75ac38eb51e08916ceefef5a76d2a847477bd17..de8a3c5ff2e138c86010df9952288e018a47dd67 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "medsurf-draw", - "version": "1.0.10", + "version": "1.0.11", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 8366bd7260565a76262958f50933dfcb88dd91e6..377153a344557805c24aa2ad6b5454d0cda87f2e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "medsurf-draw", - "version": "1.0.10", + "version": "1.0.11", "description": "Draw annotations on jpg/zoomify images, based on PIXI.js", "keywords": [ "draw", diff --git a/src/app/index.ts b/src/app/index.ts index c23a515811f723b912348d7b6b467e8f669f103a..eb0a2d4f5e48d1ad171b5a4cb0d62e8620ef1ef7 100644 --- a/src/app/index.ts +++ b/src/app/index.ts @@ -20,6 +20,7 @@ const buttonDefault = document.getElementById("button_default") as HTMLButtonEle const buttonMarker = document.getElementById("button_marker") as HTMLButtonElement; const buttonSelftest = document.getElementById("button_selftest") as HTMLButtonElement; const buttonAuthor = document.getElementById("button_author") as HTMLButtonElement; +const buttonChange = document.getElementById("button_change") as HTMLButtonElement; // TODO CANVASRENDERER has gaps between Tiles // https://www.html5gamedevs.com/topic/27366-gaps-between-sprite-tiles-when-scaling-the-stage/ @@ -232,18 +233,38 @@ PIXI.Renderer.registerPlugin('bla', bla); // IMAGES // BaseSprite - // const image = new MedsurfSprite(app.renderer, canvas, PIXI.Texture.from("https://api.medsurf.stage.iml.unibe.ch/v1/file/slides/3893/image/1500x1514_80_eaaa24fd-e69e-491e-b576-fccab29c85a2.jpg")); - // const image = new MedsurfSprite(app.renderer, canvas, PIXI.Texture.from("http://localhost:3000/v1/file/slide/2701,2701/image/1800x1800_80.jpeg")); + // let image = new MedsurfSprite(app.renderer, canvas, PIXI.Texture.from("https://api.medsurf.stage.iml.unibe.ch/v1/file/slides/3893/image/1500x1514_80_eaaa24fd-e69e-491e-b576-fccab29c85a2.jpg")); + // let image = new MedsurfSprite(app.renderer, canvas, PIXI.Texture.from("http://localhost:3000/v1/file/slide/2701,2701/image/1800x1800_80.jpeg")); // Tile BaseSprite - const image = new MedsurfTileSprite(app.renderer, canvas, 5800, "https://api.medsurf.stage.iml.unibe.ch:443/v1/file/slide/5800/image/", 29512, 20512); + let image = new MedsurfTileSprite(app.renderer, canvas, 5800, "https://api.medsurf.stage.iml.unibe.ch:443/v1/file/slide/5800/image/", 29512, 20512); // Video // const image = new MedsurfSprite(app.renderer, canvas, PIXI.Texture.from("./assets/juldem.mp4")); app.stage.addChild(image); - const navigator = new ImageNavigatorElement(app.renderer, canvas, image); + let navigator = new ImageNavigatorElement(app.renderer, canvas, image); app.stage.addChild(navigator); + buttonChange.addEventListener("click", () => { + /* + // @ts-ignore + app.stage.removeChild(navigator); + // @ts-ignore + navigator.destroy(); + */ + + app.stage.removeChild(image); + image.destroy(); + + setTimeout(() => { + image = new MedsurfTileSprite(app.renderer, canvas, 5802, "https://api.medsurf.stage.iml.unibe.ch:443/v1/file/slide/5802/image/", 19992, 15832); + app.stage.addChild(image); + + let navigator = new ImageNavigatorElement(app.renderer, canvas, image); + app.stage.addChild(navigator); + }, 50); + }); + // ELEMENTS // Arrow const point1 = new PositionPoint(600, 400); diff --git a/src/lib/elements/images/MedsurfTileSprite.ts b/src/lib/elements/images/MedsurfTileSprite.ts index ccfc2822ba2bb271e14fc521386e024659ecab18..00e23a82edbb7bf7a6b63f26345f7bfe3b29b114 100644 --- a/src/lib/elements/images/MedsurfTileSprite.ts +++ b/src/lib/elements/images/MedsurfTileSprite.ts @@ -15,11 +15,14 @@ export class Point { * Medsurf tile sprite * Zoom And Pan: https://github.com/anvaka/ngraph/tree/master/examples/pixi.js/03%20-%20Zoom%20And%20Pan * ZoomifyImage: https://github.com/foobarable/openseadragon/blob/master/src/zoomifytilesource.js + * TODO loading not working when image changed -> how to stop the current loading stuff */ export class MedsurfTileSprite extends MedsurfSprite { /** * Members */ + protected _deleted: boolean; + // TODO use this for better performance public renderer: PIXI.Renderer; // TODO for better performance public texture: PIXI.RenderTexture; protected _canvas: HTMLCanvasElement; @@ -55,6 +58,8 @@ export class MedsurfTileSprite extends MedsurfSprite { public constructor(renderer: PIXI.Renderer | PIXI.CanvasRenderer, canvas: HTMLCanvasElement, slideId: number, tilesUrl: string, imgWidth: number, imgHeight: number, tileSize: number = 256) { super(renderer, canvas, PIXI.Texture.EMPTY); + this._deleted = false; + // TODO use this for better performance this.renderer = renderer; this._canvas = canvas; @@ -71,9 +76,8 @@ export class MedsurfTileSprite extends MedsurfSprite { // Init this._loader = PIXI.Loader.shared; - this._loader.onLoad.add((loader: PIXI.Loader, resource: PIXI.LoaderResource) => { - this._drawTexture(resource); - }); + this._loader.concurrency = 20; + this._loader.onLoad.add(this._onLoad.bind(this)); this._container = new PIXI.Container(); this.addChild(this._container); // TODO remove and use RenderTexture for better performance @@ -90,12 +94,41 @@ export class MedsurfTileSprite extends MedsurfSprite { } public cleanUp() { + this._loader.progress = 0; + this._loader.loading = false; + + /* TODO check this + // @ts-ignore + this._loader._queue.reset(); + // @ts-ignore + this._loader._queue.pause(); + */ + + for (const k in this._loader.resources) { + const res = this._loader.resources[k]; + + if (!res || !res.name.startsWith(this._slideId + "-")) { + continue; + } + + // @ts-ignore + if (res._onCompleteBinding) { + // @ts-ignore + res._onCompleteBinding.detach(); + } + + if (res.isLoading) { + res.abort(); + } + } + this.off("onMove", this._onMoveTile, this); this.off("endMove", this._endMoveTile, this); this.off("onZoom", this._onZoomTile, this); } public destroy(options?: { children?: boolean; texture?: boolean; baseTexture?: boolean }): void { + this._deleted = true; this.cleanUp(); super.destroy(options); } @@ -155,6 +188,13 @@ export class MedsurfTileSprite extends MedsurfSprite { }); } + protected _onLoad(loader: PIXI.Loader, resource: PIXI.LoaderResource): void { + if (this._deleted) { + return; + } + this._drawTexture(resource); + } + //<editor-fold desc="Deep Zoom"> /** * Init texture @@ -238,8 +278,10 @@ export class MedsurfTileSprite extends MedsurfSprite { } } - this._loader.load(); - this._loader.loading = false; + if (!this._deleted) { + this._loader.load(); + this._loader.loading = false; + } } /** diff --git a/src/public/index.html b/src/public/index.html index de58cce2221a80e18e37408a4b8b0d8ca74fe75e..b18a8c34b15aee0de4dda9301a6a5b3d099733cf 100644 --- a/src/public/index.html +++ b/src/public/index.html @@ -263,6 +263,7 @@ <button id="button_marker">Marker</button> <button id="button_selftest">Selftest</button> <button id="button_author">Author</button> + <button id="button_change">Change Image</button> <!-- <div id="mouse" style="display: block;"><i class="fas fa-mouse-pointer" style="padding-left: 7px; padding-top: 6px;"></i></div> <div id="select2" style="display: block;"><i class="fas fa-expand"></i></div>