add new viewer folder
This commit is contained in:
1 parent
d541c23117
commit
fc5bd73c1e
26 files changed
+23182
No files matched your search
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"name": "react-cornerstone-viewport-example",
|
||||||
|
"version": "0.0.0",
|
||||||
|
"license": "MIT",
|
||||||
|
"private": true,
|
||||||
|
"dependencies": {
|
||||||
|
"cornerstone-core": "2.2.8",
|
||||||
|
"cornerstone-math": "0.1.7",
|
||||||
|
"cornerstone-tools": "3.0.0-b.1471",
|
||||||
|
"cornerstone-wado-image-loader": "2.2.3",
|
||||||
|
"dicom-parser": "1.8.3",
|
||||||
|
"hammerjs": "^2.0.8",
|
||||||
|
"lodash.debounce": "^4.0.8",
|
||||||
|
"moment": "^2.22.2",
|
||||||
|
"prop-types": "^15.6.2",
|
||||||
|
"react": "^16.4.1",
|
||||||
|
"react-cornerstone-viewport": "^0.1.1",
|
||||||
|
"react-dom": "^16.4.1",
|
||||||
|
"react-scripts": "^2.1.1",
|
||||||
|
"react-viewerbase": "^0.1.2",
|
||||||
|
"ohif-core": "link:/Users/Erik/Projects/OHIF/ohif-core"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"copy:webworkers": "cp node_modules/cornerstone-wado-image-loader/dist/*.min.js* public",
|
||||||
|
"version": "node -p -e \"'export default \\'' + require('./package.json').version + '\\';'\" > src/version.js",
|
||||||
|
"sha": "echo \"export default '\"$(git rev-parse HEAD)\"';\" > src/sha.js",
|
||||||
|
"details": "npm run version && npm run sha",
|
||||||
|
"prep": "npm run details && npm run copy:webworkers",
|
||||||
|
"start": "npm run prep && react-scripts start",
|
||||||
|
"build": "npm run prep && react-scripts build",
|
||||||
|
"test": "react-scripts test --env=jsdom",
|
||||||
|
"eject": "react-scripts eject"
|
||||||
|
},
|
||||||
|
"browserslist": [
|
||||||
|
">0.2%",
|
||||||
|
"not dead",
|
||||||
|
"not ie <= 11",
|
||||||
|
"not op_mini all"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
/*! cornerstone-wado-image-loader - 2.2.2 - 2018-12-05 | (c) 2016 Chris Hafey | https://github.com/cornerstonejs/cornerstoneWADOImageLoader */
|
||||||
|
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("cornerstoneWADOImageLoader",[],t):"object"==typeof exports?exports.cornerstoneWADOImageLoader=t():e.cornerstoneWADOImageLoader=t()}(this,function(){return function(r){var a={};function n(e){if(a[e])return a[e].exports;var t=a[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,n),t.l=!0,t.exports}return n.m=r,n.c=a,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var a in t)n.d(r,a,function(e){return t[e]}.bind(null,a));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=6)}([function(e,t,r){"use strict";t.a=function(e){for(var t,r=e[0],a=e[0],n=e.length,o=1;o<n;o++)t=e[o],r=Math.min(r,t),a=Math.max(a,t);return{min:r,max:a}}},function(e,t,r){"use strict";var m;function a(){if("undefined"==typeof CharLS)throw new Error("No JPEG-LS decoder loaded");if(!(m||(m=CharLS())&&m._jpegls_decode))throw new Error("JPEG-LS failed to initialize")}r.d(t,"b",function(){return a}),t.a=function(e,t){a();var r=function(e,t){var r=m._malloc(e.length);m.writeArrayToMemory(e,r);var a=m._malloc(4),n=m._malloc(4),o=m._malloc(4),i=m._malloc(4),l=m._malloc(4),s=m._malloc(4),u=m._malloc(4),c=m._malloc(4),f=m._malloc(4),d={result:m.ccall("jpegls_decode","number",["number","number","number","number","number","number","number","number","number","number","number"],[r,e.length,a,n,o,i,l,s,c,u,f]),width:m.getValue(o,"i32"),height:m.getValue(i,"i32"),bitsPerSample:m.getValue(l,"i32"),stride:m.getValue(s,"i32"),components:m.getValue(c,"i32"),allowedLossyError:m.getValue(u,"i32"),interleaveMode:m.getValue(f,"i32"),pixelData:void 0},p=m.getValue(a,"*");return d.bitsPerSample<=8?(d.pixelData=new Uint8Array(d.width*d.height*d.components),d.pixelData.set(new Uint8Array(m.HEAP8.buffer,p,d.pixelData.length))):t?(d.pixelData=new Int16Array(d.width*d.height*d.components),d.pixelData.set(new Int16Array(m.HEAP16.buffer,p,d.pixelData.length))):(d.pixelData=new Uint16Array(d.width*d.height*d.components),d.pixelData.set(new Uint16Array(m.HEAP16.buffer,p,d.pixelData.length))),m._free(r),m._free(p),m._free(a),m._free(n),m._free(o),m._free(i),m._free(l),m._free(s),m._free(c),m._free(f),d}(t,1===e.pixelRepresentation);if(0!==r.result&&6!==r.result)throw new Error("JPEG-LS decoder failed to decode frame (error code ".concat(r.result,")"));return e.columns=r.width,e.rows=r.height,e.pixelData=r.pixelData,e}},function(e,t,r){"use strict";var h;function n(e,t){var r=function(e,t,r){var a=h._malloc(e.length);h.writeArrayToMemory(e,a);var n=h._malloc(4),o=h._malloc(4),i=h._malloc(4),l=h._malloc(4),s=h._malloc(4),u=(new Date).getTime();if(0!==h.ccall("jp2_decode","number",["number","number","number","number","number","number","number"],[a,e.length,n,o,i,l,s]))return console.log("[opj_decode] decoding failed!"),h._free(a),h._free(h.getValue(n,"*")),h._free(i),h._free(l),h._free(o),void h._free(s);var c=h.getValue(n,"*"),f={length:h.getValue(o,"i32"),sx:h.getValue(i,"i32"),sy:h.getValue(l,"i32"),nbChannels:h.getValue(s,"i32"),perf_timetodecode:void 0,pixelData:void 0},d=f.sx*f.sy*f.nbChannels,p=new Int32Array(h.HEAP32.buffer,c,d);if(1===t)if(Uint8Array.from)f.pixelData=Uint8Array.from(p);else{f.pixelData=new Uint8Array(d);for(var m=0;m<d;m++)f.pixelData[m]=p[m]}else if(r)if(Int16Array.from)f.pixelData=Int16Array.from(p);else{f.pixelData=new Int16Array(d);for(var g=0;g<d;g++)f.pixelData[g]=p[g]}else if(Uint16Array.from)f.pixelData=Uint16Array.from(p);else{f.pixelData=new Uint16Array(d);for(var v=0;v<d;v++)f.pixelData[v]=p[v]}var x=(new Date).getTime();return f.perf_timetodecode=x-u,h._free(a),h._free(n),h._free(c),h._free(o),h._free(i),h._free(l),h._free(s),f}(t,e.bitsAllocated<=8?1:2,1===e.pixelRepresentation);return e.columns=r.sx,e.rows=r.sy,e.pixelData=r.pixelData,1<r.nbChannels&&(e.photometricInterpretation="RGB"),e}function o(e){if(!e.usePDFJS&&"undefined"==typeof OpenJPEG)throw new Error("OpenJPEG decoder not loaded");if(!(h||(h=OpenJPEG())&&h._jp2_decode))throw new Error("OpenJPEG failed to initialize")}r.d(t,"b",function(){return o}),t.a=function(e,t,r){var a=3<arguments.length&&void 0!==arguments[3]?arguments[3]:{};return o(r),a.usePDFJS||r.usePDFJS?function(e,t){var r=new JpxImage;r.parse(t);var a=r.tiles.length;if(1!==a)throw new Error("JPEG2000 decoder returned a tileCount of ".concat(a,", when 1 is expected"));return e.columns=r.width,e.rows=r.heiLine truncated
|
||||||
|
//# sourceMappingURL=cornerstoneWADOImageLoader.min.js.map
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{"version":3,"sources":["webpack://[name]/webpack/universalModuleDefinition","webpack://[name]/webpack/bootstrap","webpack://[name]/./shared/getMinMax.js","webpack://[name]/./shared/decoders/decodeJPEGLS.js","webpack://[name]/./shared/decoders/decodeJPEG2000.js","webpack://[name]/./version.js","webpack://[name]/./shared/calculateMinMax.js","webpack://[name]/./shared/decoders/decodeLittleEndian.js","webpack://[name]/./shared/decoders/decodeBigEndian.js","webpack://[name]/./shared/decoders/decodeRLE.js","webpack://[name]/./shared/decoders/decodeJPEGBaseline.js","webpack://[name]/./shared/decoders/decodeJPEGLossless.js","webpack://[name]/./shared/decodeImageFrame.js","webpack://[name]/./imageLoader/colorSpaceConverters/convertRGBColorByPixel.js","webpack://[name]/./imageLoader/colorSpaceConverters/convertRGBColorByPlane.js","webpack://[name]/./imageLoader/colorSpaceConverters/convertYBRFullByPixel.js","webpack://[name]/./imageLoader/colorSpaceConverters/convertYBRFullByPlane.js","webpack://[name]/./imageLoader/colorSpaceConverters/convertPALETTECOLOR.js","webpack://[name]/./imageLoader/wadouri/metaData/getImagePixelModule.js","webpack://[name]/./imageLoader/wadouri/metaData/getLUTs.js","webpack://[name]/./imageLoader/wadouri/metaData/getModalityLUTOutputPixelRepresentation.js","webpack://[name]/./imageLoader/wadouri/metaData/getNumberValues.js","webpack://[name]/./imageLoader/wadors/metaData/getValue.js","webpack://[name]/./imageLoader/wadors/metaData/getNumberString.js","webpack://[name]/./imageLoader/wadors/metaData/getNumberValue.js","webpack://[name]/./imageLoader/wadors/metaData/getNumberValues.js","webpack://[name]/./imageLoader/wadors/metaDataManager.js","webpack://[name]/./imageLoader/wadors/metaData/metaDataProvider.js","webpack://[name]/./imageLoader/wadors/findIndexOfString.js","webpack://[name]/./imageLoader/internal/options.js","webpack://[name]/./imageLoader/internal/xhrRequest.js","webpack://[name]/./imageLoader/internal/index.js","webpack://[name]/./imageLoader/wadors/getPixelData.js","webpack://[name]/./imageLoader/getImageFrame.js","webpack://[name]/./imageLoader/webWorkerManager.js","webpack://[name]/./imageLoader/decodeJPEGBaseline8BitColor.js","webpack://[name]/./imageLoader/decodeImageFrame.js","webpack://[name]/./imageLoader/isColorImage.js","webpack://[name]/./imageLoader/convertColorSpace.js","webpack://[name]/./imageLoader/isJPEGBaseline8BitColor.js","webpack://[name]/./imageLoader/createImage.js","webpack://[name]/./imageLoader/wadors/loadImage.js","webpack://[name]/./imageLoader/wadors/index.js","webpack://[name]/./imageLoader/wadors/register.js","webpack://[name]/./imageLoader/registerLoaders.js","webpack://[name]/./externalModules.js","webpack://[name]/./imageLoader/wadouri/parseImageId.js","webpack://[name]/./imageLoader/wadouri/dataSetCacheManager.js","webpack://[name]/./imageLoader/wadouri/metaData/metaDataProvider.js","webpack://[name]/./imageLoader/wadouri/fileManager.js","webpack://[name]/./imageLoader/wadouri/getEncapsulatedImageFrame.js","webpack://[name]/./imageLoader/wadouri/unpackBinaryFrame.js","webpack://[name]/./imageLoader/wadouri/getUncompressedImageFrame.js","webpack://[name]/./imageLoader/wadouri/loadFileRequest.js","webpack://[name]/./imageLoader/wadouri/getPixelData.js","webpack://[name]/./imageLoader/wadouri/loadImage.js","webpack://[name]/./imageLoader/wadouri/register.js","webpack://[name]/./imageLoader/wadouri/index.js","webpack://[name]/./imageLoader/configure.js","webpack://[name]/./imageLoader/index.js"],"names":["root","factory","exports","module","define","amd","this","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","getMinMax","storedPixelData","storedPixel","min","max","numPixels","length","index","Math","charLS","initializeJPEGLS","CharLS","Error","_jpegls_decode","__webpack_exports__","decodeJPEGLS","imageFrame","pixelData","image","data","isSigned","dataPtr","_malloc","writeArrayToMemory","imagePtrPtr","imageSizePtr","widthPtr","heightPtr","bitsPerSamplePtr","stridePtr","allowedLossyErrorPtr","componentsPtr","interleaveModePtr","result","ccall","width","getValue","height","bitsPerSample","stride","components","allowedLossyError","interleaveMode","undefined","imagePtr","Uint8Array","set","HEAP8","buffer","Int16Array","HEAP16","Uint16Array","_free","jpegLSDecode","pixelRepresentation","concat","columns","rows","openJPEG","decodeOpenJpeg2000","bytesPerPixel","signed","imageSizeXPtr","imageSizeYPtr","imageSizeCompPtr","t0","Date","getTime","console","log","sx","sy","nbChannels","perf_timetodecode","src32","Int32Array","HEAP32","from","t1","decodeOpenJPEG","bitsAllocated","photometricInterpretation","initializeJPEG2000","decodeConfig","usePDFJS","OpenJPEG","_jp2_decode","decodeJPEG2000","options","argumeLine truncated
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
/*! CharLS.js - v2.0.1 - 2016-06-08 | (c) 2016 Chris Hafey | https://github.com/chafey/charls */
|
||||||
|
var CharLS=function(Module){Module=Module||{};var Module;if(!Module)Module=(typeof CharLS!=="undefined"?CharLS:null)||{};var moduleOverrides={};for(var key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var ENVIRONMENT_IS_WEB=typeof window==="object";var ENVIRONMENT_IS_WORKER=typeof importScripts==="function";var ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof require==="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;var ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;if(ENVIRONMENT_IS_NODE){if(!Module["print"])Module["print"]=function print(x){process["stdout"].write(x+"\n")};if(!Module["printErr"])Module["printErr"]=function printErr(x){process["stderr"].write(x+"\n")};var nodeFS=require("fs");var nodePath=require("path");Module["read"]=function read(filename,binary){filename=nodePath["normalize"](filename);var ret=nodeFS["readFileSync"](filename);if(!ret&&filename!=nodePath["resolve"](filename)){filename=path.join(__dirname,"..","src",filename);ret=nodeFS["readFileSync"](filename)}if(ret&&!binary)ret=ret.toString();return ret};Module["readBinary"]=function readBinary(filename){var ret=Module["read"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};Module["load"]=function load(f){globalEval(read(f))};if(!Module["thisProgram"]){if(process["argv"].length>1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/")}else{Module["thisProgram"]="unknown-program"}}Module["arguments"]=process["argv"].slice(2);if(typeof module!=="undefined"){module["exports"]=Module}process["on"]("uncaughtException",function(ex){if(!(ex instanceof ExitStatus)){throw ex}});Module["inspect"]=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_SHELL){if(!Module["print"])Module["print"]=print;if(typeof printErr!="undefined")Module["printErr"]=printErr;if(typeof read!="undefined"){Module["read"]=read}else{Module["read"]=function read(){throw"no read() available (jsc?)"}}Module["readBinary"]=function readBinary(f){if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}var data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){Module["arguments"]=scriptArgs}else if(typeof arguments!="undefined"){Module["arguments"]=arguments}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){Module["read"]=function read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof console!=="undefined"){if(!Module["print"])Module["print"]=function print(x){console.log(x)};if(!Module["printErr"])Module["printErr"]=function printErr(x){console.log(x)}}else{var TRY_USE_DUMP=false;if(!Module["print"])Module["print"]=TRY_USE_DUMP&&typeof dump!=="undefined"?function(x){dump(x)}:function(x){}}if(ENVIRONMENT_IS_WORKER){Module["load"]=importScripts}if(typeof Module["setWindowTitle"]==="undefined"){Module["setWindowTitle"]=function(title){document.title=title}}}else{throw"Unknown runtime environment. Where are we?"}function globalEval(x){eval.call(null,x)}if(!Module["load"]&&Module["read"]){Module["load"]=function load(f){globalEval(Module["read"](f))}}if(!Module["print"]){Module["print"]=function(){}}if(!Module["printErr"]){Module["printErr"]=Module["print"]}if(!Module["arguments"]){Module["arguments"]=[]}if(!Module["thisProgram"]){Module["thisProgram"]="./this.program"}Module.print=Module["print"];Module.printErr=Module["printErr"];Module["preRun"]=[];Module["postRun"]=[];for(var key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}var Runtime={setTempRet0:function(value){tempRet0=value},getTempRet0:function(){return tempRet0},stackSave:function(){return STACKTOP},stackRestore:function(stackTop){STACKTOP=stackTop},getNativeTypeSize:function(type){switch(type){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(type[type.length-1]==="*"){return Runtime.QUANTUM_SIZE}else if(type[0]==="i"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}},getNativeFieldSize:function(type){return Math.max(Runtime.getNativeTypeSize(type),Runtime.QUANTUM_SIZE)},STACK_ALIGN:16,prepVararg:function(ptr,type){if(type==="double"||type==="i64"){if(ptr&7){assert((ptr&7)===4);ptr+=4}}else{assert((ptr&3)===0)}return ptr},getAlignSize:function(type,size,vararg){if(!vararg&&(type=="i64"||type=="double"))return 8;if(!type)return Math.min(size,8);return Math.min(size||(type?Runtime.getNativeFieldSize(type):0),Runtime.QUANTUM_SIZE)},dynCall:function(sig,ptr,args){if(args&&args.length){if(!args.splice)args=Array.prototype.slice.call(args);args.splice(0,0,ptr);return Module["dynCall_"+sig].apply(null,args)}else{return Module["dynCall_"+sig].call(null,ptr)}},functionPointers:[],addFunction:function(func){for(var i=0;i<Runtime.funLine truncated
|
||||||
|
/*! image-JPEG2000 - v0.3.1 - 2015-08-26 | https://github.com/OHIF/image-JPEG2000 */"use strict";function info(a){PDFJS.verbosity>=PDFJS.VERBOSITY_LEVELS.infos&&console.log("Info: "+a)}function warn(a){PDFJS.verbosity>=PDFJS.VERBOSITY_LEVELS.warnings&&console.log("Warning: "+a)}function error(a){if(arguments.length>1){var b=["Error:"];b.push.apply(b,arguments),console.log.apply(console,b),a=[].join.call(arguments," ")}else console.log("Error: "+a);throw console.log(backtrace()),UnsupportedManager.notify(UNSUPPORTED_FEATURES.unknown),new Error(a)}function backtrace(){try{throw new Error}catch(a){return a.stack?a.stack.split("\n").slice(2).join("\n"):""}}function assert(a,b){a||error(b)}function combineUrl(a,b){if(!b)return a;if(/^[a-z][a-z0-9+\-.]*:/i.test(b))return b;var c;if("/"===b.charAt(0))return c=a.indexOf("://"),"/"===b.charAt(1)?++c:c=a.indexOf("/",c+3),a.substring(0,c)+b;var d=a.length;c=a.lastIndexOf("#"),d=c>=0?c:d,c=a.lastIndexOf("?",d),d=c>=0?c:d;var e=a.lastIndexOf("/",d);return a.substring(0,e+1)+b}function isValidUrl(a,b){if(!a)return!1;var c=/^[a-z][a-z0-9+\-.]*(?=:)/i.exec(a);if(!c)return b;switch(c=c[0].toLowerCase()){case"http":case"https":case"ftp":case"mailto":case"tel":return!0;default:return!1}}function shadow(a,b,c){return Object.defineProperty(a,b,{value:c,enumerable:!0,configurable:!0,writable:!1}),c}function bytesToString(a){assert(null!==a&&"object"==typeof a&&void 0!==a.length,"Invalid argument for bytesToString");var b=a.length,c=8192;if(c>b)return String.fromCharCode.apply(null,a);for(var d=[],e=0;b>e;e+=c){var f=Math.min(e+c,b),g=a.subarray(e,f);d.push(String.fromCharCode.apply(null,g))}return d.join("")}function stringToBytes(a){assert("string"==typeof a,"Invalid argument for stringToBytes");for(var b=a.length,c=new Uint8Array(b),d=0;b>d;++d)c[d]=255&a.charCodeAt(d);return c}function string32(a){return String.fromCharCode(a>>24&255,a>>16&255,a>>8&255,255&a)}function log2(a){for(var b=1,c=0;a>b;)b<<=1,c++;return c}function readInt8(a,b){return a[b]<<24>>24}function readUint16(a,b){return a[b]<<8|a[b+1]}function readUint32(a,b){return(a[b]<<24|a[b+1]<<16|a[b+2]<<8|a[b+3])>>>0}function isLittleEndian(){var a=new Uint8Array(2);a[0]=1;var b=new Uint16Array(a.buffer);return 1===b[0]}function hasCanvasTypedArrays(){var a=document.createElement("canvas");a.width=a.height=1;var b=a.getContext("2d"),c=b.createImageData(1,1);return"undefined"!=typeof c.data.buffer}function stringToPDFString(a){var b,c=a.length,d=[];if("þ"===a[0]&&"ÿ"===a[1])for(b=2;c>b;b+=2)d.push(String.fromCharCode(a.charCodeAt(b)<<8|a.charCodeAt(b+1)));else for(b=0;c>b;++b){var e=PDFStringTranslateTable[a.charCodeAt(b)];d.push(e?String.fromCharCode(e):a.charAt(b))}return d.join("")}function stringToUTF8String(a){return decodeURIComponent(escape(a))}function isEmptyObj(a){for(var b in a)return!1;return!0}function isBool(a){return"boolean"==typeof a}function isInt(a){return"number"==typeof a&&(0|a)===a}function isNum(a){return"number"==typeof a}function isString(a){return"string"==typeof a}function isNull(a){return null===a}function isName(a){return a instanceof Name}function isCmd(a,b){return a instanceof Cmd&&(void 0===b||a.cmd===b)}function isDict(a,b){if(!(a instanceof Dict))return!1;if(!b)return!0;var c=a.get("Type");return isName(c)&&c.name===b}function isArray(a){return a instanceof Array}function isStream(a){return"object"==typeof a&&null!==a&&void 0!==a.getBytes}function isArrayBuffer(a){return"object"==typeof a&&null!==a&&void 0!==a.byteLength}function isRef(a){return a instanceof Ref}function createPromiseCapability(){var a={};return a.promise=new Promise(function(b,c){a.resolve=b,a.reject=c}),a}function MessageHandler(a,b){this.name=a,this.comObj=b,this.callbackIndex=1,this.postMessageTransfers=!0;var c=this.callbacksCapabilities={},d=this.actionHandler={};d.console_log=[function(a){console.log.apply(console,a)}],d.console_error=[function(a){console.error.apply(console,a)}],d._unsupported_feature=[function(a){UnsupportedManager.notify(a)}],b.onmessage=function(a){var e=a.data;if(e.isReply){var f=e.callbackId;if(e.callbackId in c){var g=c[f];delete c[f],"error"in e?g.reject(e.error):g.resolve(e.data)}else error("Cannot resolve callback "+f)}else if(e.action in d){var h=d[e.action];e.callbackId?Promise.resolve().then(function(){return h[0].call(h[1],e.data)}).then(function(a){b.postMessage({isReply:!0,callbackId:e.callbackId,data:a})},function(a){b.postMessage({isReply:!0,callbackId:e.callbackId,error:a})}):h[0].call(h[1],e.data)}else error("Unknown action from worker: "+e.action)}}function loadJpegStream(a,b,c){var d=new Image;d.onload=function(){c.resolve(a,d)},d.onerror=function(){c.resolve(a,null),warn("Error during JPEG image loading")},d.src=b}var JpxImage=function(){function a(){this.failOnCorruptedImage=!1}function b(a,b){a.x0=Math.ceil(b.XOsiz/a.XRsiz),a.x1=Math.ceil(b.Xsiz/a.XRsiz),a.y0=Math.ceil(b.YOsiz/a.YRsiz),a.y1=Math.ceil(b.Ysiz/a.YRsiz),a.width=a.x1-a.x0,a.height=a.y1-a.y0}function c(a,bLine truncated
|
||||||
|
/*! OpenJPEG.js - v0.2.0 - 2016-06-07 | (c) 2016 Chris Hafey | https://github.com/chafey/openjpeg */var OpenJPEG=function(Module){Module=Module||{};var Module;if(!Module)Module=(typeof OpenJPEG!=="undefined"?OpenJPEG:null)||{};var moduleOverrides={};for(var key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var ENVIRONMENT_IS_WEB=typeof window==="object";var ENVIRONMENT_IS_WORKER=typeof importScripts==="function";var ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof require==="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;var ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;if(ENVIRONMENT_IS_NODE){if(!Module["print"])Module["print"]=function print(x){process["stdout"].write(x+"\n")};if(!Module["printErr"])Module["printErr"]=function printErr(x){process["stderr"].write(x+"\n")};var nodeFS=require("fs");var nodePath=require("path");Module["read"]=function read(filename,binary){filename=nodePath["normalize"](filename);var ret=nodeFS["readFileSync"](filename);if(!ret&&filename!=nodePath["resolve"](filename)){filename=path.join(__dirname,"..","src",filename);ret=nodeFS["readFileSync"](filename)}if(ret&&!binary)ret=ret.toString();return ret};Module["readBinary"]=function readBinary(filename){var ret=Module["read"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};Module["load"]=function load(f){globalEval(read(f))};if(!Module["thisProgram"]){if(process["argv"].length>1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/")}else{Module["thisProgram"]="unknown-program"}}Module["arguments"]=process["argv"].slice(2);if(typeof module!=="undefined"){module["exports"]=Module}process["on"]("uncaughtException",function(ex){if(!(ex instanceof ExitStatus)){throw ex}});Module["inspect"]=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_SHELL){if(!Module["print"])Module["print"]=print;if(typeof printErr!="undefined")Module["printErr"]=printErr;if(typeof read!="undefined"){Module["read"]=read}else{Module["read"]=function read(){throw"no read() available (jsc?)"}}Module["readBinary"]=function readBinary(f){if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}var data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){Module["arguments"]=scriptArgs}else if(typeof arguments!="undefined"){Module["arguments"]=arguments}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){Module["read"]=function read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof console!=="undefined"){if(!Module["print"])Module["print"]=function print(x){console.log(x)};if(!Module["printErr"])Module["printErr"]=function printErr(x){console.log(x)}}else{var TRY_USE_DUMP=false;if(!Module["print"])Module["print"]=TRY_USE_DUMP&&typeof dump!=="undefined"?function(x){dump(x)}:function(x){}}if(ENVIRONMENT_IS_WORKER){Module["load"]=importScripts}if(typeof Module["setWindowTitle"]==="undefined"){Module["setWindowTitle"]=function(title){document.title=title}}}else{throw"Unknown runtime environment. Where are we?"}function globalEval(x){eval.call(null,x)}if(!Module["load"]&&Module["read"]){Module["load"]=function load(f){globalEval(Module["read"](f))}}if(!Module["print"]){Module["print"]=function(){}}if(!Module["printErr"]){Module["printErr"]=Module["print"]}if(!Module["arguments"]){Module["arguments"]=[]}if(!Module["thisProgram"]){Module["thisProgram"]="./this.program"}Module.print=Module["print"];Module.printErr=Module["printErr"];Module["preRun"]=[];Module["postRun"]=[];for(var key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}var Runtime={setTempRet0:function(value){tempRet0=value},getTempRet0:function(){return tempRet0},stackSave:function(){return STACKTOP},stackRestore:function(stackTop){STACKTOP=stackTop},getNativeTypeSize:function(type){switch(type){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(type[type.length-1]==="*"){return Runtime.QUANTUM_SIZE}else if(type[0]==="i"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}},getNativeFieldSize:function(type){return Math.max(Runtime.getNativeTypeSize(type),Runtime.QUANTUM_SIZE)},STACK_ALIGN:16,prepVararg:function(ptr,type){if(type==="double"||type==="i64"){if(ptr&7){assert((ptr&7)===4);ptr+=4}}else{assert((ptr&3)===0)}return ptr},getAlignSize:function(type,size,vararg){if(!vararg&&(type=="i64"||type=="double"))return 8;if(!type)return Math.min(size,8);return Math.min(size||(type?Runtime.getNativeFieldSize(type):0),Runtime.QUANTUM_SIZE)},dynCall:function(sig,ptr,args){if(args&&args.length){if(!args.splice)args=Array.prototype.slice.call(args);args.splice(0,0,ptr);return Module["dynCall_"+sig].apply(null,args)}else{return ModuleLine truncated
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
/*! cornerstone-wado-image-loader - 2.2.2 - 2018-12-05 | (c) 2016 Chris Hafey | https://github.com/cornerstonejs/cornerstoneWADOImageLoader */
|
||||||
|
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("cornerstoneWADOImageLoaderWebWorker",[],t):"object"==typeof exports?exports.cornerstoneWADOImageLoaderWebWorker=t():e.cornerstoneWADOImageLoaderWebWorker=t()}(this,function(){return function(r){var a={};function n(e){if(a[e])return a[e].exports;var t=a[e]={i:e,l:!1,exports:{}};return r[e].call(t.exports,t,t.exports,n),t.l=!0,t.exports}return n.m=r,n.c=a,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var a in t)n.d(r,a,function(e){return t[e]}.bind(null,a));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=7)}([function(e,t,r){"use strict";t.a=function(e){for(var t,r=e[0],a=e[0],n=e.length,i=1;i<n;i++)t=e[i],r=Math.min(r,t),a=Math.max(a,t);return{min:r,max:a}}},function(e,t,r){"use strict";var m;function a(){if("undefined"==typeof CharLS)throw new Error("No JPEG-LS decoder loaded");if(!(m||(m=CharLS())&&m._jpegls_decode))throw new Error("JPEG-LS failed to initialize")}r.d(t,"b",function(){return a}),t.a=function(e,t){a();var r=function(e,t){var r=m._malloc(e.length);m.writeArrayToMemory(e,r);var a=m._malloc(4),n=m._malloc(4),i=m._malloc(4),o=m._malloc(4),l=m._malloc(4),s=m._malloc(4),f=m._malloc(4),u=m._malloc(4),c=m._malloc(4),d={result:m.ccall("jpegls_decode","number",["number","number","number","number","number","number","number","number","number","number","number"],[r,e.length,a,n,i,o,l,s,u,f,c]),width:m.getValue(i,"i32"),height:m.getValue(o,"i32"),bitsPerSample:m.getValue(l,"i32"),stride:m.getValue(s,"i32"),components:m.getValue(u,"i32"),allowedLossyError:m.getValue(f,"i32"),interleaveMode:m.getValue(c,"i32"),pixelData:void 0},p=m.getValue(a,"*");return d.bitsPerSample<=8?(d.pixelData=new Uint8Array(d.width*d.height*d.components),d.pixelData.set(new Uint8Array(m.HEAP8.buffer,p,d.pixelData.length))):t?(d.pixelData=new Int16Array(d.width*d.height*d.components),d.pixelData.set(new Int16Array(m.HEAP16.buffer,p,d.pixelData.length))):(d.pixelData=new Uint16Array(d.width*d.height*d.components),d.pixelData.set(new Uint16Array(m.HEAP16.buffer,p,d.pixelData.length))),m._free(r),m._free(p),m._free(a),m._free(n),m._free(i),m._free(o),m._free(l),m._free(s),m._free(u),m._free(c),d}(t,1===e.pixelRepresentation);if(0!==r.result&&6!==r.result)throw new Error("JPEG-LS decoder failed to decode frame (error code ".concat(r.result,")"));return e.columns=r.width,e.rows=r.height,e.pixelData=r.pixelData,e}},function(e,t,r){"use strict";var w;function n(e,t){var r=function(e,t,r){var a=w._malloc(e.length);w.writeArrayToMemory(e,a);var n=w._malloc(4),i=w._malloc(4),o=w._malloc(4),l=w._malloc(4),s=w._malloc(4),f=(new Date).getTime();if(0!==w.ccall("jp2_decode","number",["number","number","number","number","number","number","number"],[a,e.length,n,i,o,l,s]))return console.log("[opj_decode] decoding failed!"),w._free(a),w._free(w.getValue(n,"*")),w._free(o),w._free(l),w._free(i),void w._free(s);var u=w.getValue(n,"*"),c={length:w.getValue(i,"i32"),sx:w.getValue(o,"i32"),sy:w.getValue(l,"i32"),nbChannels:w.getValue(s,"i32"),perf_timetodecode:void 0,pixelData:void 0},d=c.sx*c.sy*c.nbChannels,p=new Int32Array(w.HEAP32.buffer,u,d);if(1===t)if(Uint8Array.from)c.pixelData=Uint8Array.from(p);else{c.pixelData=new Uint8Array(d);for(var m=0;m<d;m++)c.pixelData[m]=p[m]}else if(r)if(Int16Array.from)c.pixelData=Int16Array.from(p);else{c.pixelData=new Int16Array(d);for(var g=0;g<d;g++)c.pixelData[g]=p[g]}else if(Uint16Array.from)c.pixelData=Uint16Array.from(p);else{c.pixelData=new Uint16Array(d);for(var b=0;b<d;b++)c.pixelData[b]=p[b]}var x=(new Date).getTime();return c.perf_timetodecode=x-f,w._free(a),w._free(n),w._free(u),w._free(i),w._free(o),w._free(l),w._free(s),c}(t,e.bitsAllocated<=8?1:2,1===e.pixelRepresentation);return e.columns=r.sx,e.rows=r.sy,e.pixelData=r.pixelData,1<r.nbChannels&&(e.photometricInterpretation="RGB"),e}function i(e){if(!e.usePDFJS&&"undefined"==typeof OpenJPEG)throw new Error("OpenJPEG decoder not loaded");if(!(w||(w=OpenJPEG())&&w._jp2_decode))throw new Error("OpenJPEG failed to initialize")}r.d(t,"b",function(){return i}),t.a=function(e,t,r){var a=3<arguments.length&&void 0!==arguments[3]?arguments[3]:{};return i(r),a.usePDFJS||r.usePDFJS?function(e,t){var r=new JpxImage;r.parse(t);var a=r.tiles.length;if(1!==a)throw new Error("JPEG2000 decoder returned a tileCount of ".concat(a,", when 1 is expected"));return e.cLine truncated
|
||||||
|
//# sourceMappingURL=cornerstoneWADOImageLoaderWebWorker.min.js.map
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{"version":3,"sources":["webpack://[name]/webpack/universalModuleDefinition","webpack://[name]/webpack/bootstrap","webpack://[name]/./shared/getMinMax.js","webpack://[name]/./shared/decoders/decodeJPEGLS.js","webpack://[name]/./shared/decoders/decodeJPEG2000.js","webpack://[name]/./version.js","webpack://[name]/./shared/calculateMinMax.js","webpack://[name]/./shared/decoders/decodeLittleEndian.js","webpack://[name]/./shared/decoders/decodeBigEndian.js","webpack://[name]/./shared/decoders/decodeRLE.js","webpack://[name]/./shared/decoders/decodeJPEGBaseline.js","webpack://[name]/./shared/decoders/decodeJPEGLossless.js","webpack://[name]/./shared/decodeImageFrame.js","webpack://[name]/./webWorker/webWorker.js","webpack://[name]/./webWorker/decodeTask/decodeTask.js","webpack://[name]/./webWorker/index.js"],"names":["root","factory","exports","module","define","amd","this","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","getMinMax","storedPixelData","storedPixel","min","max","numPixels","length","index","Math","charLS","initializeJPEGLS","CharLS","Error","_jpegls_decode","__webpack_exports__","decodeJPEGLS","imageFrame","pixelData","image","data","isSigned","dataPtr","_malloc","writeArrayToMemory","imagePtrPtr","imageSizePtr","widthPtr","heightPtr","bitsPerSamplePtr","stridePtr","allowedLossyErrorPtr","componentsPtr","interleaveModePtr","result","ccall","width","getValue","height","bitsPerSample","stride","components","allowedLossyError","interleaveMode","undefined","imagePtr","Uint8Array","set","HEAP8","buffer","Int16Array","HEAP16","Uint16Array","_free","jpegLSDecode","pixelRepresentation","concat","columns","rows","openJPEG","decodeOpenJpeg2000","bytesPerPixel","signed","imageSizeXPtr","imageSizeYPtr","imageSizeCompPtr","t0","Date","getTime","console","log","sx","sy","nbChannels","perf_timetodecode","src32","Int32Array","HEAP32","from","t1","decodeOpenJPEG","bitsAllocated","photometricInterpretation","initializeJPEG2000","decodeConfig","usePDFJS","OpenJPEG","_jp2_decode","decodeJPEG2000","options","arguments","jpxImage","JpxImage","parse","tileCount","tiles","items","decodeJpx","calculateMinMax","_getMinMax_js__WEBPACK_IMPORTED_MODULE_0__","strict","minMax","mustAssign","isNumber","smallestPixelValue","largestPixelValue","warn","numValue","decodeLittleEndian","arrayBuffer","offset","byteOffset","slice","Float32Array","decodeBigEndian","val","decodeRLE","planarConfiguration","frameData","frameSize","outFrame","ArrayBuffer","samplesPerPixel","header","DataView","Int8Array","out","outIndex","numSegments","getInt32","inIndex","maxIndex","endOfSegment","j","decode8Planar","decode8","highByte","decode16","decodeJPEGBaseline","JpegImage","jpeg","colorTransform","getData","getData16","decodeJPEGLossless","lossless","Decoder","byteOutput","decompressedData","decode","decodeImageFrame","transferSyntax","start","shouldShift","shift","bitsStored","end","decodeTimeInMS","config","taskHandlers","initialized","registerTaskHandler","taskHandler","taskType","initialize","taskConfiguration","self","onmessage","msg","importScripts","sourcePath","handler","transferList","postMessage","status","workerIndex","webWorkerTaskPaths","keys","forEach","codecsLoaded","loadCodecs","decodeTask","codecsPath","initializeCodecsOnStartup","doneCallback","loadCodecsOnStartup","version","cornerstoneWADOImageLoaderWebWorker"],"mappings":";CAAA,SAAAA,EAAAC,GACA,iBAAAC,SAAA,iBAAAC,OACAA,OAAAD,QAAAD,IACA,mBAAAG,eAAAC,IACAD,OAAA,yCAAAH,GACA,iBAAAC,QACAA,QAAA,oCAAAD,IAEAD,EAAA,oCAAAC,IARA,CASCK,KAAA,WACD,mBCTA,IAAAC,EAAA,GAGA,SAAAC,EAAAC,GAGA,GAAAF,EAAAE,GACA,OAAAF,EAAAE,GAAAP,QAGA,IAAAC,EAAAI,EAAAE,GAAA,CACAC,EAAAD,EACAE,GAAA,EACAT,QAAA,IAUA,OANAU,EAAAH,GAAAI,KAAAV,EAAAD,QAAAC,IAAAD,QAAAM,GAGAL,EAAAQ,GAAA,EAGAR,EAAAD,QA0DA,OArDAM,EAAAM,EAAAF,EAGAJ,EAAAO,EAAAR,EAGAC,EAAAQ,EAAA,SAAAd,EAAAe,EAAAC,GACAV,EAAAW,EAAAjB,EAAAe,IACAG,OAAAC,eAAAnB,EAAAe,EAAA,CAA0CK,YAAA,EAAAC,IAAAL,KAK1CV,EAAAgB,EAAA,SAAAtB,GACA,oBAAAuB,eAAAC,aACAN,OAAAC,eAAAnB,EAAAuB,OAAAC,YAAA,CAAwDC,MAAA,WAExDP,OAAAC,eAAAnB,EAAA,cAAiDyB,OAAA,KAQjDnB,EAAAoB,EAAA,SAAAD,EAAAE,GAEA,GADA,EAAAA,IAAAF,EAAAnB,EAAAmB,IACA,EAAAE,EAAA,OAAAF,EACA,KAAAE,GAAA,iBAAAF,QAAAG,WAAA,OAAAH,EACA,IAAAI,EAAAX,OAAAY,OAAA,MAGA,GAFAxB,EAAAgB,EAAAO,GACAX,OAAAC,eAAAU,EAAA,WAAyCT,YAAA,EAAAK,UACzC,EAAAE,GAAA,iBAAAF,EAAA,QAAAM,KAAAN,EAAAnB,EAAAQ,EAAAe,EAAAE,EAAA,SAAAA,GAAgH,OAAAN,EAAAM,IAAqBC,KAAA,KAAAD,IACrI,OAAAF,GAIAvB,EAAA2B,EAAA,SAAAhC,GACA,IAAAe,EAAAf,KAAA2B,WACA,WAA2B,OAAA3B,EAAA,SAC3B,WAAiC,OAAAA,GAEjC,OADAK,EAAAQ,EAAAE,EAAA,IAAAA,GACAA,GAIAV,EAAAW,EAAA,SAAAiB,EAAAC,GAAsD,OAAAjB,OAAAkB,UAAAC,eAAA1B,KAAAuB,EAAAC,IAGtD7B,EAAAgC,EAAA,GAIAhC,IAAAiC,EAAA,kCCvDeC,IArBf,SAAoBC,GASlB,IALA,IAEIC,EAFAC,EAAMF,EAAgB,GACtBG,EAAMH,EAAgB,GAEpBI,EAAYJ,EAAgBK,OAEzBC,EAAQ,EAAGA,EAAQFLine truncated
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||||
|
<meta name="theme-color" content="#000000">
|
||||||
|
|
||||||
|
<link rel="manifest" href="%PUBLIC_URL%/manifest.json">
|
||||||
|
|
||||||
|
<title>react-cornerstone-viewport</title>
|
||||||
|
|
||||||
|
<!-- Latest compiled and minified CSS -->
|
||||||
|
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<noscript>
|
||||||
|
You need to enable JavaScript to run this app.
|
||||||
|
</noscript>
|
||||||
|
|
||||||
|
<div id="root"></div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"short_name": "react-cornerstone-viewport",
|
||||||
|
"name": "react-cornerstone-viewport",
|
||||||
|
"start_url": "./index.html",
|
||||||
|
"display": "standalone",
|
||||||
|
"theme_color": "#000000",
|
||||||
|
"background_color": "#ffffff"
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
html,
|
||||||
|
body,
|
||||||
|
#root {
|
||||||
|
background-color: black;
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
box-sizing: border-box;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
-moz-osx-font-smoothing: grayscale;
|
||||||
|
}
|
||||||
@@ -0,0 +1,83 @@
|
|||||||
|
import React, { Component } from 'react';
|
||||||
|
import { withRouter } from 'react-router';
|
||||||
|
import { Route, Switch } from 'react-router-dom';
|
||||||
|
import { OHIF } from 'ohif-core';
|
||||||
|
import ViewerRouting from "./ViewerRouting.js";
|
||||||
|
import IHEInvokeImageDisplay from './IHEInvokeImageDisplay.js';
|
||||||
|
import './App.css';
|
||||||
|
|
||||||
|
const reload = () => window.location.reload();
|
||||||
|
const Studylist = OHIF.studylist.components.StudyList;
|
||||||
|
|
||||||
|
function setContext(context) {
|
||||||
|
/*Rollbar.configure({
|
||||||
|
payload: {
|
||||||
|
context
|
||||||
|
}
|
||||||
|
});*/
|
||||||
|
console.log(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
class App extends Component {
|
||||||
|
componentDidMount() {
|
||||||
|
// Temporary until the rest of the UI is in React
|
||||||
|
window.router = {
|
||||||
|
history: this.props.history
|
||||||
|
};
|
||||||
|
|
||||||
|
this.unlisten = this.props.history.listen((location, action) => {
|
||||||
|
setContext(window.location.pathname);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
componentWillUnmount() {
|
||||||
|
this.unlisten();
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<Switch>
|
||||||
|
<Route
|
||||||
|
exact
|
||||||
|
path="/studylist"
|
||||||
|
component={Studylist}
|
||||||
|
/*auth={this.props.auth}*/
|
||||||
|
store={this.props.store}
|
||||||
|
/>
|
||||||
|
<Route
|
||||||
|
exact
|
||||||
|
path="/"
|
||||||
|
component={Studylist}
|
||||||
|
/*auth={this.props.auth}*/
|
||||||
|
store={this.props.store}
|
||||||
|
/>
|
||||||
|
<Route
|
||||||
|
path="/viewer/:studyInstanceUids"
|
||||||
|
component={ViewerRouting}
|
||||||
|
/*auth={this.props.auth}*/
|
||||||
|
store={this.props.store}
|
||||||
|
/>
|
||||||
|
<Route
|
||||||
|
path="/study/:studyInstanceUid/series/:seriesInstanceUids"
|
||||||
|
component={ViewerRouting}
|
||||||
|
/*auth={this.props.auth}*/
|
||||||
|
store={this.props.store}
|
||||||
|
/>
|
||||||
|
<Route
|
||||||
|
path="/IHEInvokeImageDisplay"
|
||||||
|
component={IHEInvokeImageDisplay}
|
||||||
|
/*auth={this.props.auth}*/
|
||||||
|
store={this.props.store}
|
||||||
|
/>
|
||||||
|
|
||||||
|
{/*<Route path="/silent-refresh.html" onEnter={reload} />
|
||||||
|
<Route path="/logout-redirect.html" onEnter={reload} />*/}
|
||||||
|
<Route render={() =>
|
||||||
|
<div> Sorry, this page does not exist. </div>}
|
||||||
|
/>
|
||||||
|
</Switch>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default withRouter(App);
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
import React, { Component } from "react";
|
||||||
|
import PropTypes from "prop-types";
|
||||||
|
import ViewerFromStudyData from "./ViewerFromStudyData.js";
|
||||||
|
|
||||||
|
function IHEInvokeImageDisplay({ match }) {
|
||||||
|
const requestType = match.params.query.requestType;
|
||||||
|
|
||||||
|
let studyInstanceUids;
|
||||||
|
let displayStudyList = false;
|
||||||
|
if (requestType === "STUDY") {
|
||||||
|
studyInstanceUids = match.params.query.studyUID.split(';');
|
||||||
|
} else if (requestType === "STUDYBASE64") {
|
||||||
|
const uids = this.params.query.studyUID;
|
||||||
|
const decodedData = window.atob(uids);
|
||||||
|
studyInstanceUids = decodedData.split(';');
|
||||||
|
} else if (requestType === "PATIENT") {
|
||||||
|
const patientUids = this.params.query.patientID.split(';');
|
||||||
|
displayStudyList = true
|
||||||
|
} else {
|
||||||
|
displayStudyList = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if (displayStudyList) {
|
||||||
|
//return (<StudyList/>);
|
||||||
|
return ('');
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<ViewerFromStudyData studyInstanceUids={studyInstanceUids}/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default IHEInvokeImageDisplay;
|
||||||
@@ -0,0 +1,102 @@
|
|||||||
|
import React, {Component} from "react";
|
||||||
|
import PropTypes from "prop-types";
|
||||||
|
import Viewer from "./viewer/viewer.js";
|
||||||
|
import { OHIF } from 'ohif-core';
|
||||||
|
|
||||||
|
// TODO: Move to react-viewerbase
|
||||||
|
|
||||||
|
function createDisplaySets(studies) {
|
||||||
|
// Define the OHIF.viewer.data global object
|
||||||
|
// TODO: Save all data that is currently in OHIF.viewer in redux instead
|
||||||
|
OHIF.viewer.data = OHIF.viewer.data || {};
|
||||||
|
|
||||||
|
// @TypeSafeStudies
|
||||||
|
// Clears OHIF.viewer.Studies collection
|
||||||
|
OHIF.viewer.Studies.removeAll();
|
||||||
|
|
||||||
|
// @TypeSafeStudies
|
||||||
|
// Clears OHIF.viewer.StudyMetadataList collection
|
||||||
|
OHIF.viewer.StudyMetadataList.removeAll();
|
||||||
|
|
||||||
|
OHIF.viewer.data.studyInstanceUids = [];
|
||||||
|
|
||||||
|
const updatedStudies = studies.map(study => {
|
||||||
|
const studyMetadata = new OHIF.metadata.OHIFStudyMetadata(study, study.studyInstanceUid);
|
||||||
|
let displaySets = study.displaySets;
|
||||||
|
|
||||||
|
if (!study.displaySets) {
|
||||||
|
displaySets = OHIF.viewerbase.sortingManager.getDisplaySets(studyMetadata);
|
||||||
|
study.displaySets = displaySets;
|
||||||
|
}
|
||||||
|
|
||||||
|
studyMetadata.setDisplaySets(displaySets);
|
||||||
|
|
||||||
|
study.selected = true;
|
||||||
|
OHIF.viewer.Studies.insert(study);
|
||||||
|
OHIF.viewer.StudyMetadataList.insert(studyMetadata);
|
||||||
|
OHIF.viewer.data.studyInstanceUids.push(study.studyInstanceUid);
|
||||||
|
|
||||||
|
// Updates WADO-RS metaDataManager
|
||||||
|
OHIF.viewerbase.updateMetaDataManager(study);
|
||||||
|
|
||||||
|
return study;
|
||||||
|
});
|
||||||
|
|
||||||
|
return updatedStudies;
|
||||||
|
}
|
||||||
|
|
||||||
|
class ViewerFromStudyData extends Component {
|
||||||
|
constructor(props) {
|
||||||
|
super(props);
|
||||||
|
|
||||||
|
this.state = {
|
||||||
|
studies: null,
|
||||||
|
error: null
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
componentDidMount() {
|
||||||
|
// TODO: Avoid using timepoints here
|
||||||
|
//const params = { studyInstanceUids, seriesInstanceUids, timepointId, timepointsFilter={} };
|
||||||
|
const params = {
|
||||||
|
studyInstanceUids: this.props.studyInstanceUids,
|
||||||
|
seriesInstanceUids: this.props.seriesInstanceUids,
|
||||||
|
}
|
||||||
|
const promise = OHIF.viewerbase.prepareViewerData(params);
|
||||||
|
|
||||||
|
// Render the viewer when the data is ready
|
||||||
|
promise.then(({ studies, viewerData }) => {
|
||||||
|
OHIF.viewer.data = viewerData;
|
||||||
|
|
||||||
|
const updatedStudies = createDisplaySets(studies);
|
||||||
|
|
||||||
|
this.setState({
|
||||||
|
studies: updatedStudies,
|
||||||
|
});
|
||||||
|
}).catch(error => {
|
||||||
|
this.setState({
|
||||||
|
error,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
if (this.state.error) {
|
||||||
|
return (<div>Error: {JSON.stringify(this.state.error)}</div>);
|
||||||
|
} else if (!this.state.studies) {
|
||||||
|
return (<div>Loading...</div>);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Viewer studies={this.state.studies}/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ViewerFromStudyData.propTypes = {
|
||||||
|
studyInstanceUids: PropTypes.array.isRequired,
|
||||||
|
seriesInstanceUids: PropTypes.array
|
||||||
|
};
|
||||||
|
|
||||||
|
export default ViewerFromStudyData;
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
import React, {Component} from "react";
|
||||||
|
import PropTypes from "prop-types";
|
||||||
|
import ViewerFromStudyData from "./ViewerFromStudyData.js";
|
||||||
|
|
||||||
|
// TODO: Move to react-viewerbase
|
||||||
|
|
||||||
|
function ViewerRouting({ match }) {
|
||||||
|
const { studyInstanceUids, seriesInstanceUids } = match.params;
|
||||||
|
|
||||||
|
let studyUIDs;
|
||||||
|
let seriesUIDs;
|
||||||
|
|
||||||
|
if (studyInstanceUids && !seriesInstanceUids) {
|
||||||
|
studyUIDs = studyInstanceUids.split(';');
|
||||||
|
} else if (studyInstanceUids && seriesInstanceUids) {
|
||||||
|
studyUIDs = [match.params.studyInstanceUid];
|
||||||
|
seriesUIDs = match.params.seriesInstanceUids.split(';');
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<ViewerFromStudyData studyInstanceUids={studyUIDs} seriesInstanceUids={seriesUIDs}/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
ViewerRouting.propTypes = {
|
||||||
|
match: PropTypes.shape({
|
||||||
|
params: PropTypes.shape({
|
||||||
|
studyInstanceUids: PropTypes.string.isRequired,
|
||||||
|
seriesInstanceUids: PropTypes.string
|
||||||
|
})
|
||||||
|
})
|
||||||
|
};
|
||||||
|
|
||||||
|
export default ViewerRouting;
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
import { OHIF } from 'ohif-core';
|
||||||
|
import cornerstoneWADOImageLoader from 'cornerstone-wado-image-loader';
|
||||||
|
import sha from './sha.js';
|
||||||
|
import version from './version.js';
|
||||||
|
|
||||||
|
OHIF.info = {
|
||||||
|
sha,
|
||||||
|
version
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
const maxWebWorkers = Math.max(navigator.hardwareConcurrency - 1, 1);
|
||||||
|
const config = {
|
||||||
|
maxWebWorkers,
|
||||||
|
startWebWorkersOnDemand: true,
|
||||||
|
webWorkerPath: OHIF.utils.absoluteUrl('packages/ohif_cornerstone/public/js/cornerstoneWADOImageLoaderWebWorker.es5.js'),
|
||||||
|
taskConfiguration: {
|
||||||
|
decodeTask: {
|
||||||
|
loadCodecsOnStartup: true,
|
||||||
|
initializeCodecsOnStartup: false,
|
||||||
|
codecsPath: OHIF.utils.absoluteUrl('packages/ohif_cornerstone/public/js/cornerstoneWADOImageLoaderCodecs.es5.js'),
|
||||||
|
usePDFJS: false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
cornerstoneWADOImageLoader.webWorkerManager.initialize(config);
|
||||||
|
|
||||||
|
cornerstoneWADOImageLoader.configure({
|
||||||
|
beforeSend: function(xhr) {
|
||||||
|
const headers = OHIF.DICOMWeb.getAuthorizationHeader();
|
||||||
|
|
||||||
|
if (headers.Authorization) {
|
||||||
|
xhr.setRequestHeader("Authorization", headers.Authorization);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
@@ -0,0 +1,169 @@
|
|||||||
|
import React, { Component } from 'react';
|
||||||
|
import PropTypes from 'prop-types';
|
||||||
|
import { OHIF } from 'ohif-core';
|
||||||
|
import { StudyBrowser } from 'react-viewerbase';
|
||||||
|
import cornerstone from 'cornerstone-core';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Asynchronous wrapper around Cornerstone's renderToCanvas method.
|
||||||
|
*
|
||||||
|
* @param {HTMLElement} canvasElement An HTML <canvas> element
|
||||||
|
* @param {Image} image A Cornerstone Image
|
||||||
|
*
|
||||||
|
* @return {Promise} A promise tracking the progress of the rendering. Resolves empty.
|
||||||
|
*/
|
||||||
|
function renderAsync(canvasElement, image) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
try {
|
||||||
|
cornerstone.renderToCanvas(canvasElement, image);
|
||||||
|
resolve();
|
||||||
|
} catch(error) {
|
||||||
|
reject(error);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Define a handler for success on image load
|
||||||
|
const loadSuccess = function(image, studyInstanceUid, displaySetInstanceUid) {
|
||||||
|
// This is an off-screen canvas. It's used to get dataURL images by using
|
||||||
|
// cornerstone.renderToCanvas function.
|
||||||
|
const canvasElement = document.createElement('canvas');
|
||||||
|
canvasElement.width = 193;
|
||||||
|
canvasElement.height = 123;
|
||||||
|
|
||||||
|
// Render the image to canvas to be able to get its dataURL
|
||||||
|
renderAsync(canvasElement, image).then(() => {
|
||||||
|
const studies = this.state.studiesForBrowser;
|
||||||
|
const study = studies.find(study => study.studyInstanceUid === studyInstanceUid);
|
||||||
|
const thumbnail = study.thumbnails.find(t => t.displaySetInstanceUid === displaySetInstanceUid);
|
||||||
|
|
||||||
|
thumbnail.imageSrc = canvasElement.toDataURL('image/jpeg', 1);
|
||||||
|
|
||||||
|
this.setState({
|
||||||
|
studiesForBrowser: studies
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
// Define a handler for error on image load
|
||||||
|
const loadError = function(error, studyInstanceUid, displaySetInstanceUid) {
|
||||||
|
const studies = this.state.studiesForBrowser;
|
||||||
|
const study = studies.find(study => study.studyInstanceUid === studyInstanceUid);
|
||||||
|
const thumbnail = study.thumbnails.find(t => t.displaySetInstanceUid === displaySetInstanceUid);
|
||||||
|
|
||||||
|
thumbnail.error = error;
|
||||||
|
|
||||||
|
this.setState({
|
||||||
|
studiesForBrowser: studies
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
class FlexboxLayout extends Component {
|
||||||
|
constructor(props) {
|
||||||
|
super(props);
|
||||||
|
|
||||||
|
this.state = {
|
||||||
|
leftSidebarOpen: true,
|
||||||
|
rightSidebarOpen: false,
|
||||||
|
studiesForBrowser: this.getStudiesForBrowser(),
|
||||||
|
};
|
||||||
|
|
||||||
|
this.getStudiesForBrowser = this.getStudiesForBrowser.bind(this);
|
||||||
|
this.getThumbnailsFromImageIds = this.getThumbnailsFromImageIds.bind(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
componentDidMount() {
|
||||||
|
this.getThumbnailsFromImageIds();
|
||||||
|
}
|
||||||
|
|
||||||
|
getThumbnailsFromImageIds() {
|
||||||
|
const studyThumbnails = this.state.studiesForBrowser.forEach(function (study) {
|
||||||
|
const { studyInstanceUid } = study;
|
||||||
|
|
||||||
|
study.thumbnails.forEach(function (displaySet) {
|
||||||
|
const imageId = displaySet.imageId;
|
||||||
|
const {displaySetInstanceUid, seriesDescription, seriesNumber, instanceNumber, numImageFrames} = displaySet;
|
||||||
|
|
||||||
|
cornerstone.loadAndCacheImage(imageId).then((image) => {
|
||||||
|
loadSuccess.call(this, image, studyInstanceUid, displaySetInstanceUid);
|
||||||
|
}, error => {
|
||||||
|
loadError.call(this, error, studyInstanceUid, displaySetInstanceUid);
|
||||||
|
});
|
||||||
|
}, this);
|
||||||
|
}, this);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
getStudiesForBrowser() {
|
||||||
|
// @TypeSafeStudies
|
||||||
|
const studies = OHIF.viewer.Studies.findAllBy({
|
||||||
|
selected: true
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
// TODO[react]:
|
||||||
|
// - Add sorting of display sets
|
||||||
|
// - Pass in which display set is active from Redux
|
||||||
|
// - Pass in errors and stack loading progress from Redux
|
||||||
|
// - Add useMiddleSeriesInstanceAsThumbnail
|
||||||
|
// - Add showStackLoadingProgressBar option
|
||||||
|
return studies.map((study) => {
|
||||||
|
const { studyInstanceUid } = study;
|
||||||
|
|
||||||
|
const thumbnails = study.displaySets.map((displaySet) => {
|
||||||
|
const active = false;
|
||||||
|
const stackPercentComplete = 0;
|
||||||
|
const { displaySetInstanceUid, seriesDescription, seriesNumber, instanceNumber, numImageFrames } = displaySet;
|
||||||
|
const imageId = displaySet.images[0].getImageId();
|
||||||
|
return {
|
||||||
|
imageSrc: '',
|
||||||
|
imageId,
|
||||||
|
displaySetInstanceUid,
|
||||||
|
seriesDescription,
|
||||||
|
seriesNumber,
|
||||||
|
instanceNumber,
|
||||||
|
numImageFrames,
|
||||||
|
active,
|
||||||
|
stackPercentComplete
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
studyInstanceUid,
|
||||||
|
thumbnails
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
let mainContentClassName = "mainContent"
|
||||||
|
if (this.state.leftSidebarOpen) {
|
||||||
|
mainContentClassName += ' sidebar-left-open';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.state.rightSidebarOpen) {
|
||||||
|
mainContentClassName += ' sidebar-right-open';
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO[react]: Add measurementLightTable
|
||||||
|
return (
|
||||||
|
<div className="viewerSection">
|
||||||
|
<div className={this.state.leftSidebarOpen ? "sidebarMenu sidebar-left sidebar-open" : "sidebarMenu sidebar-left"}>
|
||||||
|
<StudyBrowser studies={this.state.studiesForBrowser}/>
|
||||||
|
</div>
|
||||||
|
<div className={mainContentClassName}>
|
||||||
|
{/* TODO: Needs to be moved from Meteor package to react-viewerbase: <ViewerMain studies={this.props.studies}/>*/}
|
||||||
|
</div>
|
||||||
|
<div className={this.state.rightSidebarOpen ? "sidebarMenu sidebar-right sidebar-open" : "sidebarMenu sidebar-right"}>
|
||||||
|
{/*{{> measurementLightTable (clone this)}}*/}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FlexboxLayout.propTypes = {
|
||||||
|
studies: PropTypes.array.isRequired
|
||||||
|
};
|
||||||
|
|
||||||
|
export default FlexboxLayout;
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
.viewerSection
|
||||||
|
display: flex
|
||||||
|
flex: 1
|
||||||
|
flex-flow: row nowrap
|
||||||
|
align-items: stretch
|
||||||
|
height: 'calc(100% - %s)' % ($toolbarHeight)
|
||||||
|
width: 100%
|
||||||
|
|
||||||
|
.sidebarMenu
|
||||||
|
height: 100%
|
||||||
|
// required transformation to make inner fixed elements relative to this one
|
||||||
|
transform(scale(1))
|
||||||
|
transition($sidebarTransition)
|
||||||
|
|
||||||
|
.sidebar-option
|
||||||
|
height: 100%
|
||||||
|
max-width: inherit
|
||||||
|
position: absolute
|
||||||
|
transform(translateX(100%))
|
||||||
|
transition($sidebarTransition)
|
||||||
|
width: 100%
|
||||||
|
|
||||||
|
&.active
|
||||||
|
transform(translateX(0%))
|
||||||
|
|
||||||
|
.sidebar-left
|
||||||
|
theme('border-right', '%s solid $uiBorderColor' % $uiBorderThickness)
|
||||||
|
flex: 1
|
||||||
|
margin-left: - $studiesSidebarMenuWidth
|
||||||
|
max-width: $studiesSidebarMenuWidth
|
||||||
|
order: 1
|
||||||
|
|
||||||
|
&.sidebar-open
|
||||||
|
margin-left: 0
|
||||||
|
|
||||||
|
.mainContent
|
||||||
|
flex: 1
|
||||||
|
height: 100%
|
||||||
|
order: 2
|
||||||
|
overflow: hidden
|
||||||
|
transition($sidebarTransition)
|
||||||
|
width: 100%
|
||||||
|
|
||||||
|
.sidebar-right
|
||||||
|
flex: 1
|
||||||
|
margin-right: - $rightSidebarMenuWidth
|
||||||
|
max-width: $rightSidebarMenuWidth
|
||||||
|
order: 3
|
||||||
|
position: relative
|
||||||
|
|
||||||
|
&[data-timepoints="3"]
|
||||||
|
margin-right: - ($rightSidebarMenuWidth + 135.5px)
|
||||||
|
max-width: $rightSidebarMenuWidth + 135.5px
|
||||||
|
|
||||||
|
&[data-timepoints="4"]
|
||||||
|
margin-right: - ($rightSidebarMenuWidth + 270px)
|
||||||
|
max-width: $rightSidebarMenuWidth + 270px
|
||||||
|
|
||||||
|
&.sidebar-open
|
||||||
|
margin-right: 0
|
||||||
|
|
||||||
|
.studiesListedChanger
|
||||||
|
theme('border-bottom', '%s solid $uiBorderColor' % $uiBorderThickness)
|
||||||
|
padding: 20px 10px
|
||||||
|
text-align: center
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>OHIF Viewer</title>
|
||||||
|
<meta name="description" content="Open Health Imaging Foundation DICOM Viewer">
|
||||||
|
<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1,maximum-scale=1,user-scalable=no">
|
||||||
|
<link rel="shortcut icon" type="image/png" href="/images/logo.png" sizes="16x16 32x32 64x64">
|
||||||
|
<!--Best display for mobile devices-->
|
||||||
|
<meta http-equiv="cleartype" content="on">
|
||||||
|
<meta name="MobileOptimized" content="320">
|
||||||
|
<meta name="HandheldFriendly" content="True">
|
||||||
|
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="root"></div>
|
||||||
|
</body>
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import ReactDOM from 'react-dom';
|
||||||
|
import { BrowserRouter } from 'react-router-dom';
|
||||||
|
import { Provider } from 'react-redux';
|
||||||
|
import { createStore } from 'redux';
|
||||||
|
import App from './App.js';
|
||||||
|
import { OHIF } from 'ohif-core';
|
||||||
|
import './config';
|
||||||
|
|
||||||
|
const store = createStore(OHIF.redux.combinedReducer);
|
||||||
|
|
||||||
|
// TODO[react] Use a provider when the whole tree is React
|
||||||
|
window.store = store;
|
||||||
|
|
||||||
|
ReactDOM.render(
|
||||||
|
<Provider store={store}>
|
||||||
|
<BrowserRouter>
|
||||||
|
<App store={store}/>
|
||||||
|
</BrowserRouter>
|
||||||
|
</Provider>,
|
||||||
|
document.getElementById('root')
|
||||||
|
);
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
import loglevel from 'loglevel';
|
||||||
|
log = loglevel.getLogger('OHIFViewer');
|
||||||
|
log.setLevel('info');
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
export default '7b66dec163174eae2f6aca133f740529c8b4d08c';
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
export default '0.0.0';
|
||||||
@@ -0,0 +1,99 @@
|
|||||||
|
import React, { Component } from "react";
|
||||||
|
import PropTypes from "prop-types";
|
||||||
|
import cornerstone from 'cornerstone-core';
|
||||||
|
import cornerstoneTools from 'cornerstone-tools';
|
||||||
|
import { OHIF } from 'ohif-core';
|
||||||
|
import { CineDialog } from 'react-viewerbase';
|
||||||
|
import FlexboxLayout from '../flexboxLayout/flexboxLayout.js';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inits OHIF Hanging Protocol's onReady.
|
||||||
|
* It waits for OHIF Hanging Protocol to be ready to instantiate the ProtocolEngine
|
||||||
|
* Hanging Protocol will use OHIF LayoutManager to render viewports properly
|
||||||
|
*/
|
||||||
|
/*const initHangingProtocol = () => {
|
||||||
|
// When Hanging Protocol is ready
|
||||||
|
HP.ProtocolStore.onReady(() => {
|
||||||
|
|
||||||
|
// Gets all StudyMetadata objects: necessary for Hanging Protocol to access study metadata
|
||||||
|
const studyMetadataList = OHIF.viewer.StudyMetadataList.all();
|
||||||
|
|
||||||
|
// Caches Layout Manager: Hanging Protocol uses it for layout management according to current protocol
|
||||||
|
const layoutManager = OHIF.viewerbase.layoutManager;
|
||||||
|
|
||||||
|
// Instantiate StudyMetadataSource: necessary for Hanging Protocol to get study metadata
|
||||||
|
const studyMetadataSource = new OHIF.studies.classes.OHIFStudyMetadataSource();
|
||||||
|
|
||||||
|
// Get prior studies map
|
||||||
|
const studyPriorsMap = OHIF.studylist.functions.getStudyPriorsMap(studyMetadataList);
|
||||||
|
|
||||||
|
// Creates Protocol Engine object with required arguments
|
||||||
|
const ProtocolEngine = new HP.ProtocolEngine(layoutManager, studyMetadataList, studyPriorsMap, studyMetadataSource);
|
||||||
|
|
||||||
|
// Sets up Hanging Protocol engine
|
||||||
|
HP.setEngine(ProtocolEngine);
|
||||||
|
});
|
||||||
|
};*/
|
||||||
|
|
||||||
|
|
||||||
|
OHIF.viewer.defaultTool = {
|
||||||
|
left: 'wwwc',
|
||||||
|
right: 'zoom',
|
||||||
|
middle: 'pan'
|
||||||
|
};
|
||||||
|
|
||||||
|
OHIF.viewer.refLinesEnabled = true;
|
||||||
|
OHIF.viewer.cine = {
|
||||||
|
framesPerSecond: 24,
|
||||||
|
loop: true
|
||||||
|
};
|
||||||
|
|
||||||
|
const viewportUtils = OHIF.viewerbase.viewportUtils;
|
||||||
|
|
||||||
|
OHIF.viewer.functionList = {
|
||||||
|
toggleCineDialog: viewportUtils.toggleCineDialog,
|
||||||
|
toggleCinePlay: viewportUtils.toggleCinePlay,
|
||||||
|
clearTools: viewportUtils.clearTools,
|
||||||
|
resetViewport: viewportUtils.resetViewport,
|
||||||
|
invert: viewportUtils.invert
|
||||||
|
};
|
||||||
|
|
||||||
|
// Create the synchronizer used to update reference lines
|
||||||
|
OHIF.viewer.updateImageSynchronizer = new cornerstoneTools.Synchronizer('cornerstonenewimage', cornerstoneTools.updateImageSynchronizer);
|
||||||
|
|
||||||
|
OHIF.viewer.metadataProvider = new OHIF.cornerstone.MetadataProvider();
|
||||||
|
|
||||||
|
// Metadata configuration
|
||||||
|
const metadataProvider = OHIF.viewer.metadataProvider;
|
||||||
|
cornerstone.metaData.addProvider(metadataProvider.provider.bind(metadataProvider));
|
||||||
|
|
||||||
|
class Viewer extends Component {
|
||||||
|
constructor(props) {
|
||||||
|
super(props);
|
||||||
|
|
||||||
|
this.state = {
|
||||||
|
leftSidebar: 'studies',
|
||||||
|
rightSidebar: 'measurements',
|
||||||
|
studies: this.props.studies
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
return (<>
|
||||||
|
<div className='viewerDialogs'>
|
||||||
|
{/*<CineDialog/>*/}
|
||||||
|
</div>
|
||||||
|
<div id="viewer" className='Viewer'>
|
||||||
|
{/*<ToolbarSection/>*/}
|
||||||
|
<FlexboxLayout studies={this.state.studies}/>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Viewer.propTypes = {
|
||||||
|
studies: PropTypes.array
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Viewer;
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
@import "{ohif:viewerbase}/app"
|
||||||
|
|
||||||
|
body
|
||||||
|
background-color: black
|
||||||
|
|
||||||
|
#viewer
|
||||||
|
background-color: black
|
||||||
|
height: 100%
|
||||||
|
width: 100%
|
||||||
|
|
||||||
|
.loadingTextDiv
|
||||||
|
theme('color', '$textSecondaryColor')
|
||||||
|
font-size: 30px
|
||||||
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
Reference in new issue
Block a user