├── .babelrc ├── .editorconfig ├── .gitignore ├── .postcssrc.js ├── README.md ├── build ├── build.js ├── check-versions.js ├── logo.png ├── utils.js ├── vue-loader.conf.js ├── webpack.base.conf.js ├── webpack.dev.conf.js └── webpack.prod.conf.js ├── config ├── dev.env.js ├── index.js ├── prod.env.js └── test.env.js ├── index.html ├── package-lock.json ├── package.json ├── src ├── App.vue ├── assets │ └── logo.png ├── components │ ├── Dicom.json │ └── HelloWorld.vue ├── main.js └── router │ └── index.js ├── static ├── .gitkeep └── dist │ ├── cornerstoneWADOImageLoader.js │ ├── cornerstoneWADOImageLoader.min.js │ ├── cornerstoneWADOImageLoaderCodecs.js │ ├── cornerstoneWADOImageLoaderCodecs.min.js │ ├── cornerstoneWADOImageLoaderWebWorker.js │ └── cornerstoneWADOImageLoaderWebWorker.min.js └── test └── unit ├── .eslintrc ├── jest.conf.js ├── setup.js └── specs └── HelloWorld.spec.js /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | ["env", { 4 | "modules": false, 5 | "targets": { 6 | "browsers": ["> 1%", "last 2 versions", "not ie <= 8"] 7 | } 8 | }], 9 | "stage-2" 10 | ], 11 | "plugins": ["transform-vue-jsx", "transform-runtime"], 12 | "env": { 13 | "test": { 14 | "presets": ["env", "stage-2"], 15 | "plugins": ["transform-vue-jsx", "transform-es2015-modules-commonjs", "dynamic-import-node"] 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | /dist/ 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | /test/unit/coverage/ 8 | 9 | # Editor directories and files 10 | .idea 11 | .vscode 12 | *.suo 13 | *.ntvs* 14 | *.njsproj 15 | *.sln 16 | -------------------------------------------------------------------------------- /.postcssrc.js: -------------------------------------------------------------------------------- 1 | // https://github.com/michael-ciniawsky/postcss-load-config 2 | 3 | module.exports = { 4 | "plugins": { 5 | "postcss-import": {}, 6 | "postcss-url": {}, 7 | // to edit target browsers: use "browserslist" field in package.json 8 | "autoprefixer": {} 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CornerstoneVueWADO 2 | 3 | > 一个基于 Cornerstone 解析并显示 Dicom 图像的 Vue 项目 4 | 5 | ## Build Setup 6 | 7 | ``` bash 8 | # 安装依赖 9 | npm install 10 | 11 | * 以下依赖项 如果在 node_modules 目录中不存在 才需要 安装 12 | 13 | # install cornerstone 14 | npm install cornerstone-core --save 15 | 16 | # install dicom-parser 17 | npm install dicom-parser --save 18 | 19 | # serve with hot reload at localhost:8080 20 | npm run dev 21 | 22 | ``` 23 | # 使用方法 24 | 25 | * 具体使用步骤 请看 HelloWorld.vue 文件 26 | * 如需帮助请 发送邮件给我 Email: bianliuzhu@gmail.com 27 | 代码图片 28 | ![代码](https://github.com/GleasonBian/GithubReadmeImage/blob/master/code.jpg) 29 | 30 | response(res): 31 | ![response](https://github.com/GleasonBian/GithubReadmeImage/blob/master/res.jpg) 32 | 33 | ![cornerstoneWADO_res.jpg](https://github.com/GleasonBian/GithubReadmeImage/blob/master/cornerstoneWADO_res.jpg) 34 | 35 | ![cornerstoneWADO_res.body.value.jpg](https://github.com/GleasonBian/GithubReadmeImage/blob/master/cornerstoneWADO_res.body.value.jpg) -------------------------------------------------------------------------------- /build/build.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | require('./check-versions')() 3 | 4 | process.env.NODE_ENV = 'production' 5 | 6 | const ora = require('ora') 7 | const rm = require('rimraf') 8 | const path = require('path') 9 | const chalk = require('chalk') 10 | const webpack = require('webpack') 11 | const config = require('../config') 12 | const webpackConfig = require('./webpack.prod.conf') 13 | 14 | const spinner = ora('building for production...') 15 | spinner.start() 16 | 17 | rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => { 18 | if (err) throw err 19 | webpack(webpackConfig, (err, stats) => { 20 | spinner.stop() 21 | if (err) throw err 22 | process.stdout.write(stats.toString({ 23 | colors: true, 24 | modules: false, 25 | children: false, // If you are using ts-loader, setting this to true will make TypeScript errors show up during build. 26 | chunks: false, 27 | chunkModules: false 28 | }) + '\n\n') 29 | 30 | if (stats.hasErrors()) { 31 | console.log(chalk.red(' Build failed with errors.\n')) 32 | process.exit(1) 33 | } 34 | 35 | console.log(chalk.cyan(' Build complete.\n')) 36 | console.log(chalk.yellow( 37 | ' Tip: built files are meant to be served over an HTTP server.\n' + 38 | ' Opening index.html over file:// won\'t work.\n' 39 | )) 40 | }) 41 | }) 42 | -------------------------------------------------------------------------------- /build/check-versions.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const chalk = require('chalk') 3 | const semver = require('semver') 4 | const packageConfig = require('../package.json') 5 | const shell = require('shelljs') 6 | 7 | function exec (cmd) { 8 | return require('child_process').execSync(cmd).toString().trim() 9 | } 10 | 11 | const versionRequirements = [ 12 | { 13 | name: 'node', 14 | currentVersion: semver.clean(process.version), 15 | versionRequirement: packageConfig.engines.node 16 | } 17 | ] 18 | 19 | if (shell.which('npm')) { 20 | versionRequirements.push({ 21 | name: 'npm', 22 | currentVersion: exec('npm --version'), 23 | versionRequirement: packageConfig.engines.npm 24 | }) 25 | } 26 | 27 | module.exports = function () { 28 | const warnings = [] 29 | 30 | for (let i = 0; i < versionRequirements.length; i++) { 31 | const mod = versionRequirements[i] 32 | 33 | if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) { 34 | warnings.push(mod.name + ': ' + 35 | chalk.red(mod.currentVersion) + ' should be ' + 36 | chalk.green(mod.versionRequirement) 37 | ) 38 | } 39 | } 40 | 41 | if (warnings.length) { 42 | console.log('') 43 | console.log(chalk.yellow('To use this template, you must update following to modules:')) 44 | console.log() 45 | 46 | for (let i = 0; i < warnings.length; i++) { 47 | const warning = warnings[i] 48 | console.log(' ' + warning) 49 | } 50 | 51 | console.log() 52 | process.exit(1) 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /build/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bianliuzhu/CornerstoneVueWADO/3aefaba2dfd688046d2515c5713a0d6e23a20f0e/build/logo.png -------------------------------------------------------------------------------- /build/utils.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const path = require('path') 3 | const config = require('../config') 4 | const ExtractTextPlugin = require('extract-text-webpack-plugin') 5 | const packageConfig = require('../package.json') 6 | 7 | exports.assetsPath = function (_path) { 8 | const assetsSubDirectory = process.env.NODE_ENV === 'production' 9 | ? config.build.assetsSubDirectory 10 | : config.dev.assetsSubDirectory 11 | 12 | return path.posix.join(assetsSubDirectory, _path) 13 | } 14 | 15 | exports.cssLoaders = function (options) { 16 | options = options || {} 17 | 18 | const cssLoader = { 19 | loader: 'css-loader', 20 | options: { 21 | sourceMap: options.sourceMap 22 | } 23 | } 24 | 25 | const postcssLoader = { 26 | loader: 'postcss-loader', 27 | options: { 28 | sourceMap: options.sourceMap 29 | } 30 | } 31 | 32 | // generate loader string to be used with extract text plugin 33 | function generateLoaders (loader, loaderOptions) { 34 | const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader] 35 | 36 | if (loader) { 37 | loaders.push({ 38 | loader: loader + '-loader', 39 | options: Object.assign({}, loaderOptions, { 40 | sourceMap: options.sourceMap 41 | }) 42 | }) 43 | } 44 | 45 | // Extract CSS when that option is specified 46 | // (which is the case during production build) 47 | if (options.extract) { 48 | return ExtractTextPlugin.extract({ 49 | use: loaders, 50 | fallback: 'vue-style-loader' 51 | }) 52 | } else { 53 | return ['vue-style-loader'].concat(loaders) 54 | } 55 | } 56 | 57 | // https://vue-loader.vuejs.org/en/configurations/extract-css.html 58 | return { 59 | css: generateLoaders(), 60 | postcss: generateLoaders(), 61 | less: generateLoaders('less'), 62 | sass: generateLoaders('sass', { indentedSyntax: true }), 63 | scss: generateLoaders('sass'), 64 | stylus: generateLoaders('stylus'), 65 | styl: generateLoaders('stylus') 66 | } 67 | } 68 | 69 | // Generate loaders for standalone style files (outside of .vue) 70 | exports.styleLoaders = function (options) { 71 | const output = [] 72 | const loaders = exports.cssLoaders(options) 73 | 74 | for (const extension in loaders) { 75 | const loader = loaders[extension] 76 | output.push({ 77 | test: new RegExp('\\.' + extension + '$'), 78 | use: loader 79 | }) 80 | } 81 | 82 | return output 83 | } 84 | 85 | exports.createNotifierCallback = () => { 86 | const notifier = require('node-notifier') 87 | 88 | return (severity, errors) => { 89 | if (severity !== 'error') return 90 | 91 | const error = errors[0] 92 | const filename = error.file && error.file.split('!').pop() 93 | 94 | notifier.notify({ 95 | title: packageConfig.name, 96 | message: severity + ': ' + error.name, 97 | subtitle: filename || '', 98 | icon: path.join(__dirname, 'logo.png') 99 | }) 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /build/vue-loader.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const utils = require('./utils') 3 | const config = require('../config') 4 | const isProduction = process.env.NODE_ENV === 'production' 5 | const sourceMapEnabled = isProduction 6 | ? config.build.productionSourceMap 7 | : config.dev.cssSourceMap 8 | 9 | module.exports = { 10 | loaders: utils.cssLoaders({ 11 | sourceMap: sourceMapEnabled, 12 | extract: isProduction 13 | }), 14 | cssSourceMap: sourceMapEnabled, 15 | cacheBusting: config.dev.cacheBusting, 16 | transformToRequire: { 17 | video: ['src', 'poster'], 18 | source: 'src', 19 | img: 'src', 20 | image: 'xlink:href' 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /build/webpack.base.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const path = require('path') 3 | const utils = require('./utils') 4 | const config = require('../config') 5 | const vueLoaderConfig = require('./vue-loader.conf') 6 | 7 | function resolve (dir) { 8 | return path.join(__dirname, '..', dir) 9 | } 10 | 11 | 12 | 13 | module.exports = { 14 | context: path.resolve(__dirname, '../'), 15 | entry: { 16 | app: './src/main.js' 17 | }, 18 | output: { 19 | path: config.build.assetsRoot, 20 | filename: '[name].js', 21 | publicPath: process.env.NODE_ENV === 'production' 22 | ? config.build.assetsPublicPath 23 | : config.dev.assetsPublicPath 24 | }, 25 | resolve: { 26 | extensions: ['.js', '.vue', '.json'], 27 | alias: { 28 | 'vue$': 'vue/dist/vue.esm.js', 29 | '@': resolve('src'), 30 | } 31 | }, 32 | module: { 33 | rules: [ 34 | { 35 | test: /\.vue$/, 36 | loader: 'vue-loader', 37 | options: vueLoaderConfig 38 | }, 39 | { 40 | test: /\.js$/, 41 | loader: 'babel-loader', 42 | include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')] 43 | }, 44 | { 45 | test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, 46 | loader: 'url-loader', 47 | options: { 48 | limit: 10000, 49 | name: utils.assetsPath('img/[name].[hash:7].[ext]') 50 | } 51 | }, 52 | { 53 | test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, 54 | loader: 'url-loader', 55 | options: { 56 | limit: 10000, 57 | name: utils.assetsPath('media/[name].[hash:7].[ext]') 58 | } 59 | }, 60 | { 61 | test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, 62 | loader: 'url-loader', 63 | options: { 64 | limit: 10000, 65 | name: utils.assetsPath('fonts/[name].[hash:7].[ext]') 66 | } 67 | } 68 | ] 69 | }, 70 | node: { 71 | // prevent webpack from injecting useless setImmediate polyfill because Vue 72 | // source contains it (although only uses it if it's native). 73 | setImmediate: false, 74 | // prevent webpack from injecting mocks to Node native modules 75 | // that does not make sense for the client 76 | dgram: 'empty', 77 | fs: 'empty', 78 | net: 'empty', 79 | tls: 'empty', 80 | child_process: 'empty' 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /build/webpack.dev.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const utils = require('./utils') 3 | const webpack = require('webpack') 4 | const config = require('../config') 5 | const merge = require('webpack-merge') 6 | const path = require('path') 7 | const baseWebpackConfig = require('./webpack.base.conf') 8 | const CopyWebpackPlugin = require('copy-webpack-plugin') 9 | const HtmlWebpackPlugin = require('html-webpack-plugin') 10 | const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin') 11 | const portfinder = require('portfinder') 12 | 13 | const HOST = process.env.HOST 14 | const PORT = process.env.PORT && Number(process.env.PORT) 15 | 16 | const devWebpackConfig = merge(baseWebpackConfig, { 17 | module: { 18 | rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true }) 19 | }, 20 | // cheap-module-eval-source-map is faster for development 21 | devtool: config.dev.devtool, 22 | 23 | // these devServer options should be customized in /config/index.js 24 | devServer: { 25 | clientLogLevel: 'warning', 26 | historyApiFallback: { 27 | rewrites: [ 28 | { from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, 'index.html') }, 29 | ], 30 | }, 31 | hot: true, 32 | contentBase: false, // since we use CopyWebpackPlugin. 33 | compress: true, 34 | host: HOST || config.dev.host, 35 | port: PORT || config.dev.port, 36 | open: config.dev.autoOpenBrowser, 37 | overlay: config.dev.errorOverlay 38 | ? { warnings: false, errors: true } 39 | : false, 40 | publicPath: config.dev.assetsPublicPath, 41 | proxy: config.dev.proxyTable, 42 | quiet: true, // necessary for FriendlyErrorsPlugin 43 | watchOptions: { 44 | poll: config.dev.poll, 45 | } 46 | }, 47 | plugins: [ 48 | new webpack.DefinePlugin({ 49 | 'process.env': require('../config/dev.env') 50 | }), 51 | new webpack.HotModuleReplacementPlugin(), 52 | new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update. 53 | new webpack.NoEmitOnErrorsPlugin(), 54 | // https://github.com/ampedandwired/html-webpack-plugin 55 | new HtmlWebpackPlugin({ 56 | filename: 'index.html', 57 | template: 'index.html', 58 | inject: true 59 | }), 60 | // copy custom static assets 61 | new CopyWebpackPlugin([ 62 | { 63 | from: path.resolve(__dirname, '../static'), 64 | to: config.dev.assetsSubDirectory, 65 | ignore: ['.*'] 66 | } 67 | ]) 68 | ] 69 | }) 70 | 71 | module.exports = new Promise((resolve, reject) => { 72 | portfinder.basePort = process.env.PORT || config.dev.port 73 | portfinder.getPort((err, port) => { 74 | if (err) { 75 | reject(err) 76 | } else { 77 | // publish the new Port, necessary for e2e tests 78 | process.env.PORT = port 79 | // add port to devServer config 80 | devWebpackConfig.devServer.port = port 81 | 82 | // Add FriendlyErrorsPlugin 83 | devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({ 84 | compilationSuccessInfo: { 85 | messages: [`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}`], 86 | }, 87 | onErrors: config.dev.notifyOnErrors 88 | ? utils.createNotifierCallback() 89 | : undefined 90 | })) 91 | 92 | resolve(devWebpackConfig) 93 | } 94 | }) 95 | }) 96 | -------------------------------------------------------------------------------- /build/webpack.prod.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const path = require('path') 3 | const utils = require('./utils') 4 | const webpack = require('webpack') 5 | const config = require('../config') 6 | const merge = require('webpack-merge') 7 | const baseWebpackConfig = require('./webpack.base.conf') 8 | const CopyWebpackPlugin = require('copy-webpack-plugin') 9 | const HtmlWebpackPlugin = require('html-webpack-plugin') 10 | const ExtractTextPlugin = require('extract-text-webpack-plugin') 11 | const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin') 12 | const UglifyJsPlugin = require('uglifyjs-webpack-plugin') 13 | 14 | const env = process.env.NODE_ENV === 'testing' 15 | ? require('../config/test.env') 16 | : require('../config/prod.env') 17 | 18 | const webpackConfig = merge(baseWebpackConfig, { 19 | module: { 20 | rules: utils.styleLoaders({ 21 | sourceMap: config.build.productionSourceMap, 22 | extract: true, 23 | usePostCSS: true 24 | }) 25 | }, 26 | devtool: config.build.productionSourceMap ? config.build.devtool : false, 27 | output: { 28 | path: config.build.assetsRoot, 29 | filename: utils.assetsPath('js/[name].[chunkhash].js'), 30 | chunkFilename: utils.assetsPath('js/[id].[chunkhash].js') 31 | }, 32 | plugins: [ 33 | // http://vuejs.github.io/vue-loader/en/workflow/production.html 34 | new webpack.DefinePlugin({ 35 | 'process.env': env 36 | }), 37 | new UglifyJsPlugin({ 38 | uglifyOptions: { 39 | compress: { 40 | warnings: false 41 | } 42 | }, 43 | sourceMap: config.build.productionSourceMap, 44 | parallel: true 45 | }), 46 | // extract css into its own file 47 | new ExtractTextPlugin({ 48 | filename: utils.assetsPath('css/[name].[contenthash].css'), 49 | // Setting the following option to `false` will not extract CSS from codesplit chunks. 50 | // Their CSS will instead be inserted dynamically with style-loader when the codesplit chunk has been loaded by webpack. 51 | // It's currently set to `true` because we are seeing that sourcemaps are included in the codesplit bundle as well when it's `false`, 52 | // increasing file size: https://github.com/vuejs-templates/webpack/issues/1110 53 | allChunks: true, 54 | }), 55 | // Compress extracted CSS. We are using this plugin so that possible 56 | // duplicated CSS from different components can be deduped. 57 | new OptimizeCSSPlugin({ 58 | cssProcessorOptions: config.build.productionSourceMap 59 | ? { safe: true, map: { inline: false } } 60 | : { safe: true } 61 | }), 62 | // generate dist index.html with correct asset hash for caching. 63 | // you can customize output by editing /index.html 64 | // see https://github.com/ampedandwired/html-webpack-plugin 65 | new HtmlWebpackPlugin({ 66 | filename: process.env.NODE_ENV === 'testing' 67 | ? 'index.html' 68 | : config.build.index, 69 | template: 'index.html', 70 | inject: true, 71 | minify: { 72 | removeComments: true, 73 | collapseWhitespace: true, 74 | removeAttributeQuotes: true 75 | // more options: 76 | // https://github.com/kangax/html-minifier#options-quick-reference 77 | }, 78 | // necessary to consistently work with multiple chunks via CommonsChunkPlugin 79 | chunksSortMode: 'dependency' 80 | }), 81 | // keep module.id stable when vendor modules does not change 82 | new webpack.HashedModuleIdsPlugin(), 83 | // enable scope hoisting 84 | new webpack.optimize.ModuleConcatenationPlugin(), 85 | // split vendor js into its own file 86 | new webpack.optimize.CommonsChunkPlugin({ 87 | name: 'vendor', 88 | minChunks (module) { 89 | // any required modules inside node_modules are extracted to vendor 90 | return ( 91 | module.resource && 92 | /\.js$/.test(module.resource) && 93 | module.resource.indexOf( 94 | path.join(__dirname, '../node_modules') 95 | ) === 0 96 | ) 97 | } 98 | }), 99 | // extract webpack runtime and module manifest to its own file in order to 100 | // prevent vendor hash from being updated whenever app bundle is updated 101 | new webpack.optimize.CommonsChunkPlugin({ 102 | name: 'manifest', 103 | minChunks: Infinity 104 | }), 105 | // This instance extracts shared chunks from code splitted chunks and bundles them 106 | // in a separate chunk, similar to the vendor chunk 107 | // see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk 108 | new webpack.optimize.CommonsChunkPlugin({ 109 | name: 'app', 110 | async: 'vendor-async', 111 | children: true, 112 | minChunks: 3 113 | }), 114 | 115 | // copy custom static assets 116 | new CopyWebpackPlugin([ 117 | { 118 | from: path.resolve(__dirname, '../static'), 119 | to: config.build.assetsSubDirectory, 120 | ignore: ['.*'] 121 | } 122 | ]) 123 | ] 124 | }) 125 | 126 | if (config.build.productionGzip) { 127 | const CompressionWebpackPlugin = require('compression-webpack-plugin') 128 | 129 | webpackConfig.plugins.push( 130 | new CompressionWebpackPlugin({ 131 | asset: '[path].gz[query]', 132 | algorithm: 'gzip', 133 | test: new RegExp( 134 | '\\.(' + 135 | config.build.productionGzipExtensions.join('|') + 136 | ')$' 137 | ), 138 | threshold: 10240, 139 | minRatio: 0.8 140 | }) 141 | ) 142 | } 143 | 144 | if (config.build.bundleAnalyzerReport) { 145 | const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin 146 | webpackConfig.plugins.push(new BundleAnalyzerPlugin()) 147 | } 148 | 149 | module.exports = webpackConfig 150 | -------------------------------------------------------------------------------- /config/dev.env.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const merge = require('webpack-merge') 3 | const prodEnv = require('./prod.env') 4 | 5 | module.exports = merge(prodEnv, { 6 | NODE_ENV: '"development"' 7 | }) 8 | -------------------------------------------------------------------------------- /config/index.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | // Template version: 1.3.1 3 | // see http://vuejs-templates.github.io/webpack for documentation. 4 | 5 | const path = require('path') 6 | 7 | module.exports = { 8 | dev: { 9 | 10 | // Paths 11 | assetsSubDirectory: 'static', 12 | assetsPublicPath: '/', 13 | proxyTable: {}, 14 | // Various Dev Server settings 15 | host: 'localhost', // can be overwritten by process.env.HOST 16 | port: 8686, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined 17 | autoOpenBrowser: true, 18 | errorOverlay: true, 19 | notifyOnErrors: true, 20 | poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions- 21 | // https://webpack.js.org/configuration/devtool/#development 22 | devtool: 'cheap-module-eval-source-map', 23 | cacheBusting: true, 24 | cssSourceMap: true 25 | }, 26 | build: { 27 | // Template for index.html 28 | index: path.resolve(__dirname, '../dist/index.html'), 29 | // Paths 30 | assetsRoot: path.resolve(__dirname, '../dist'), 31 | assetsSubDirectory: 'static', 32 | assetsPublicPath: '/', 33 | 34 | /** 35 | * Source Maps 36 | */ 37 | 38 | productionSourceMap: true, 39 | // https://webpack.js.org/configuration/devtool/#production 40 | devtool: '#source-map', 41 | 42 | // Gzip off by default as many popular static hosts such as 43 | // Surge or Netlify already gzip all static assets for you. 44 | // Before setting to `true`, make sure to: 45 | // npm install --save-dev compression-webpack-plugin 46 | productionGzip: false, 47 | productionGzipExtensions: ['js', 'css'], 48 | 49 | // Run the build command with an extra argument to 50 | // View the bundle analyzer report after build finishes: 51 | // `npm run build --report` 52 | // Set to `true` or `false` to always turn it on or off 53 | bundleAnalyzerReport: process.env.npm_config_report 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /config/prod.env.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | module.exports = { 3 | NODE_ENV: '"production"' 4 | } 5 | -------------------------------------------------------------------------------- /config/test.env.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const merge = require('webpack-merge') 3 | const devEnv = require('./dev.env') 4 | 5 | module.exports = merge(devEnv, { 6 | NODE_ENV: '"testing"' 7 | }) 8 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | test-cornerstone 7 | 8 | 9 |
10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "test-cornerstone", 3 | "version": "1.0.0", 4 | "description": "A Vue.js project", 5 | "author": "Wilson ", 6 | "private": true, 7 | "scripts": { 8 | "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js", 9 | "start": "npm run dev", 10 | "unit": "jest --config test/unit/jest.conf.js --coverage", 11 | "test": "npm run unit", 12 | "build": "node build/build.js" 13 | }, 14 | "dependencies": { 15 | "axios": "^0.18.0", 16 | "cornerstone-core": "^2.2.4", 17 | "cornerstone-math": "^0.1.6", 18 | "cornerstone-tools": "^2.3.6", 19 | "dicom-parser": "^1.8.1", 20 | "hammerjs": "^2.0.8", 21 | "jquery": "^3.3.1", 22 | "vue": "^2.5.2", 23 | "vue-resource": "^1.5.1", 24 | "vue-router": "^3.0.1" 25 | }, 26 | "devDependencies": { 27 | "autoprefixer": "^7.1.2", 28 | "babel-core": "^6.22.1", 29 | "babel-helper-vue-jsx-merge-props": "^2.0.3", 30 | "babel-jest": "^21.0.2", 31 | "babel-loader": "^7.1.1", 32 | "babel-plugin-dynamic-import-node": "^1.2.0", 33 | "babel-plugin-syntax-jsx": "^6.18.0", 34 | "babel-plugin-transform-es2015-modules-commonjs": "^6.26.0", 35 | "babel-plugin-transform-runtime": "^6.22.0", 36 | "babel-plugin-transform-vue-jsx": "^3.5.0", 37 | "babel-preset-env": "^1.3.2", 38 | "babel-preset-stage-2": "^6.22.0", 39 | "chalk": "^2.0.1", 40 | "copy-webpack-plugin": "^4.0.1", 41 | "css-loader": "^0.28.0", 42 | "extract-text-webpack-plugin": "^3.0.0", 43 | "file-loader": "^1.1.4", 44 | "friendly-errors-webpack-plugin": "^1.6.1", 45 | "html-webpack-plugin": "^2.30.1", 46 | "jest": "^22.0.4", 47 | "jest-serializer-vue": "^0.3.0", 48 | "node-notifier": "^5.1.2", 49 | "optimize-css-assets-webpack-plugin": "^3.2.0", 50 | "ora": "^1.2.0", 51 | "portfinder": "^1.0.13", 52 | "postcss-import": "^11.0.0", 53 | "postcss-loader": "^2.0.8", 54 | "postcss-url": "^7.2.1", 55 | "rimraf": "^2.6.0", 56 | "semver": "^5.3.0", 57 | "shelljs": "^0.7.6", 58 | "uglifyjs-webpack-plugin": "^1.1.1", 59 | "url-loader": "^0.5.8", 60 | "vue-jest": "^1.0.2", 61 | "vue-loader": "^13.3.0", 62 | "vue-style-loader": "^3.0.1", 63 | "vue-template-compiler": "^2.5.2", 64 | "webpack": "^3.6.0", 65 | "webpack-bundle-analyzer": "^2.9.0", 66 | "webpack-dev-server": "^2.9.1", 67 | "webpack-merge": "^4.1.0" 68 | }, 69 | "engines": { 70 | "node": ">= 6.0.0", 71 | "npm": ">= 3.0.0" 72 | }, 73 | "browserslist": [ 74 | "> 1%", 75 | "last 2 versions", 76 | "not ie <= 8" 77 | ] 78 | } 79 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 13 | 14 | 24 | -------------------------------------------------------------------------------- /src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bianliuzhu/CornerstoneVueWADO/3aefaba2dfd688046d2515c5713a0d6e23a20f0e/src/assets/logo.png -------------------------------------------------------------------------------- /src/components/Dicom.json: -------------------------------------------------------------------------------- 1 | { 2 | "test1": "", 3 | "test2": "", 4 | "testData": { 5 | "testData1": [ 6 | "MRStudy/MR000000.dcm", 7 | "MRStudy/MR000001.dcm", 8 | "MRStudy/MR000002.dcm", 9 | "MRStudy/MR000003.dcm" 10 | ], 11 | "testData2": [ 12 | "MRStudy/MR000000.dcm", 13 | "MRStudy/MR000001.dcm", 14 | "MRStudy/MR000002.dcm", 15 | "MRStudy/MR000003.dcm" 16 | ] 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/components/HelloWorld.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 205 | 206 | 207 | 219 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | // The Vue build version to load with the `import` command 2 | // (runtime-only or standalone) has been set in webpack.base.conf with an alias. 3 | import Vue from 'vue' 4 | import App from './App' 5 | import router from './router' 6 | import VueResource from 'vue-resource' 7 | Vue.config.productionTip = false 8 | Vue.use(VueResource); 9 | /* eslint-disable no-new */ 10 | new Vue({ 11 | el: '#app', 12 | router, 13 | components: { 14 | App 15 | }, 16 | template: '' 17 | }) 18 | -------------------------------------------------------------------------------- /src/router/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Router from 'vue-router' 3 | import HelloWorld from '@/components/HelloWorld' 4 | 5 | Vue.use(Router) 6 | 7 | export default new Router({ 8 | routes: [ 9 | { 10 | path: '/', 11 | name: 'HelloWorld', 12 | component: HelloWorld 13 | } 14 | ] 15 | }) 16 | -------------------------------------------------------------------------------- /static/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bianliuzhu/CornerstoneVueWADO/3aefaba2dfd688046d2515c5713a0d6e23a20f0e/static/.gitkeep -------------------------------------------------------------------------------- /static/dist/cornerstoneWADOImageLoader.min.js: -------------------------------------------------------------------------------- 1 | /*! cornerstone-wado-image-loader - 2.1.1 - 2018-04-18 | (c) 2016 Chris Hafey | https://github.com/cornerstonejs/cornerstoneWADOImageLoader */ 2 | !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("dicom-parser")):"function"==typeof define&&define.amd?define("cornerstoneWADOImageLoader",["dicom-parser"],t):"object"==typeof exports?exports.cornerstoneWADOImageLoader=t(require("dicom-parser")):e.cornerstoneWADOImageLoader=t(e.dicomParser)}(this,function(e){return function(e){var t={};function r(a){if(t[a])return t[a].exports;var n=t[a]={i:a,l:!1,exports:{}};return e[a].call(n.exports,n,n.exports,r),n.l=!0,n.exports}return r.m=e,r.c=t,r.d=function(e,t,a){r.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:a})},r.r=function(e){Object.defineProperty(e,"__esModule",{value:!0})},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=64)}([function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.external=t.dicomParser=void 0;var a,n=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t.default=e,t}(r(57)),o=r(56),i=(a=o)&&a.__esModule?a:{default:a};var l=void 0,u={set cornerstone(e){l=e,(0,i.default)(l)},get cornerstone(){return l}};t.dicomParser=n,t.external=u},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){for(var t=e[0],r=e[0],a=void 0,n=e.length,o=1;o1&&(e.photometricInterpretation="RGB"),e}function o(e){if(!e.usePDFJS&&"undefined"==typeof OpenJPEG)throw new Error("OpenJPEG decoder not loaded");if(!(a||(a=OpenJPEG())&&a._jp2_decode))throw new Error("OpenJPEG failed to initialize")}t.default=function(e,t,r){var a=arguments.length>3&&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 "+a+", when 1 is expected");return e.columns=r.width,e.rows=r.height,e.pixelData=r.tiles[0].items,e}(e,t):n(e,t)},t.initializeJPEG2000=o},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a=void 0;function n(){if("undefined"==typeof CharLS)throw new Error("No JPEG-LS decoder loaded");if(!(a||(a=CharLS())&&a._jpegls_decode))throw new Error("JPEG-LS failed to initialize")}t.default=function(e,t){n();var r=function(e,t){var r=a._malloc(e.length);a.writeArrayToMemory(e,r);var n=a._malloc(4),o=a._malloc(4),i=a._malloc(4),l=a._malloc(4),u=a._malloc(4),s=a._malloc(4),d=a._malloc(4),f=a._malloc(4),c=a._malloc(4),p={result:a.ccall("jpegls_decode","number",["number","number","number","number","number","number","number","number","number","number","number"],[r,e.length,n,o,i,l,u,s,f,d,c]),width:a.getValue(i,"i32"),height:a.getValue(l,"i32"),bitsPerSample:a.getValue(u,"i32"),stride:a.getValue(s,"i32"),components:a.getValue(f,"i32"),allowedLossyError:a.getValue(d,"i32"),interleaveMode:a.getValue(c,"i32"),pixelData:void 0},m=a.getValue(n,"*");return p.bitsPerSample<=8?(p.pixelData=new Uint8Array(p.width*p.height*p.components),p.pixelData.set(new Uint8Array(a.HEAP8.buffer,m,p.pixelData.length))):t?(p.pixelData=new Int16Array(p.width*p.height*p.components),p.pixelData.set(new Int16Array(a.HEAP16.buffer,m,p.pixelData.length))):(p.pixelData=new Uint16Array(p.width*p.height*p.components),p.pixelData.set(new Uint16Array(a.HEAP16.buffer,m,p.pixelData.length))),a._free(r),a._free(m),a._free(n),a._free(o),a._free(i),a._free(l),a._free(u),a._free(s),a._free(f),a._free(c),p}(t,1===e.pixelRepresentation);if(0!==r.result&&6!==r.result)throw new Error("JPEG-LS decoder failed to decode frame (error code "+r.result+")");return e.columns=r.width,e.rows=r.height,e.pixelData=r.pixelData,e},t.initializeJPEGLS=n},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.internal=t.xhrRequest=t.getOptions=t.setOptions=void 0;var a,n=r(53),o=(a=n)&&a.__esModule?a:{default:a},i=r(6);var l={xhrRequest:o.default,setOptions:i.setOptions,getOptions:i.getOptions};t.setOptions=i.setOptions,t.getOptions=i.getOptions,t.xhrRequest=o.default,t.internal=l},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t=e.indexOf(":"),r=e.substring(t+1),a=r.indexOf("frame="),n=void 0;if(-1!==a){var o=r.substr(a+6);n=parseInt(o,10),r=r.substr(0,a-1)}return{scheme:e.substr(0,t),url:r,frame:n}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.setOptions=function(e){a=Object.assign(a,e)},t.getOptions=function(){return a};var a={beforeSend:function(){},imageCreated:function(){},strict:!1,useWebWorkers:!0,decodeConfig:{usePDFJS:!1}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,r){return t=t||0,e&&e.Value?e.Value.length<=t?r:e.Value[t]:r}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default="2.1.1"},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getInfo=u;var a=r(0),n=r(4),o=0,i={},l={};function u(){return{cacheSizeInBytes:o,numberOfDataSetsCached:Object.keys(i).length}}t.default={isLoaded:function(e){return void 0!==i[e]},load:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:n.xhrRequest,r=arguments[2],s=a.external.cornerstone;if(i[e])return new Promise(function(t){i[e].cacheCount++,t(i[e].dataSet)});if(l[e])return l[e].cacheCount++,l[e];var d=t(e,r),f=new Promise(function(t,r){d.then(function(n){var l=new Uint8Array(n),d=void 0;try{d=a.dicomParser.parseDicom(l)}catch(e){return r(e)}i[e]={dataSet:d,cacheCount:f.cacheCount},o+=d.byteArray.length,t(d),s.triggerEvent(s.events,"datasetscachechanged",{uri:e,action:"loaded",cacheInfo:u()})},r).then(function(){delete l[e]},function(){delete l[e]})});return f.cacheCount=1,l[e]=f,f},unload:function(e){var t=a.external.cornerstone;i[e]&&(i[e].cacheCount--,0===i[e].cacheCount&&(o-=i[e].dataSet.byteArray.length,delete i[e],t.triggerEvent(t.events,"datasetscachechanged",{uri:e,action:"unloaded",cacheInfo:u()})))},getInfo:u,purge:function(){i={},l={}},get:function(e){if(i[e])return i[e].dataSet}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],r=(0,o.default)(e.pixelData);!0===t?(e.smallestPixelValue!==r.min&&console.warn("Image smallestPixelValue tag is incorrect. Rendering performance will suffer considerably."),e.largestPixelValue!==r.max&&console.warn("Image largestPixelValue tag is incorrect. Rendering performance will suffer considerably.")):(e.smallestPixelValue=r.min,e.largestPixelValue=r.max)};var a,n=r(1),o=(a=n)&&a.__esModule?a:{default:a}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){if("undefined"==typeof jpeg||void 0===jpeg.lossless||void 0===jpeg.lossless.Decoder)throw new Error("No JPEG Lossless decoder loaded");var r=e.bitsAllocated<=8?1:2,a=t.buffer,n=(new jpeg.lossless.Decoder).decode(a,t.byteOffset,t.length,r);return 0===e.pixelRepresentation?16===e.bitsAllocated?(e.pixelData=new Uint16Array(n.buffer),e):(e.pixelData=new Uint8Array(n.buffer),e):(e.pixelData=new Int16Array(n.buffer),e)}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){if("undefined"==typeof JpegImage)throw new Error("No JPEG Baseline decoder loaded");var r=new JpegImage;return r.parse(t),r.colorTransform=!1,8===e.bitsAllocated?(e.pixelData=r.getData(e.columns,e.rows),e):16===e.bitsAllocated?(e.pixelData=r.getData16(e.columns,e.rows),e):void 0}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){if(8===e.bitsAllocated)return e.planarConfiguration?function(e,t){for(var r=t,a=e.rows*e.columns,n=new ArrayBuffer(a*e.samplesPerPixel),o=new DataView(r.buffer,r.byteOffset),i=new Int8Array(r.buffer,r.byteOffset),l=new Int8Array(n),u=0,s=o.getInt32(0,!0),d=0;d=0&&m<=127)for(var g=0;g=-127)for(var v=i[f++],b=0;b<1-m&&u=0&&m<=127)for(var g=0;g=-127)for(var v=i[f++],b=0;b<1-m&&u=0&&m<=127)for(var g=0;g=-127)for(var v=i[c++],b=0;b<1-m&&d>8&255}else 8===e.bitsAllocated&&(e.pixelData=t);var i;return e}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){var r=t.buffer,a=t.byteOffset,n=t.length;return 16===e.bitsAllocated?(a%2&&(r=r.slice(a),a=0),0===e.pixelRepresentation?e.pixelData=new Uint16Array(r,a,n/2):e.pixelData=new Int16Array(r,a,n/2)):8===e.bitsAllocated||1===e.bitsAllocated?e.pixelData=t:32===e.bitsAllocated&&(a%2&&(r=r.slice(a),a=0),e.pixelData=new Float32Array(r,a,n/4)),e}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a=d(r(15)),n=d(r(14)),o=d(r(13)),i=d(r(12)),l=d(r(11)),u=d(r(3)),s=d(r(2));function d(e){return e&&e.__esModule?e:{default:e}}t.default=function(e,t,r,d,f){var c=(new Date).getTime();if("1.2.840.10008.1.2"===t)e=(0,a.default)(e,r);else if("1.2.840.10008.1.2.1"===t)e=(0,a.default)(e,r);else if("1.2.840.10008.1.2.2"===t)e=(0,n.default)(e,r);else if("1.2.840.10008.1.2.1.99"===t)e=(0,a.default)(e,r);else if("1.2.840.10008.1.2.5"===t)e=(0,o.default)(e,r);else if("1.2.840.10008.1.2.4.50"===t)e=(0,i.default)(e,r);else if("1.2.840.10008.1.2.4.51"===t)e=(0,i.default)(e,r);else if("1.2.840.10008.1.2.4.57"===t)e=(0,l.default)(e,r);else if("1.2.840.10008.1.2.4.70"===t)e=(0,l.default)(e,r);else if("1.2.840.10008.1.2.4.80"===t)e=(0,u.default)(e,r);else if("1.2.840.10008.1.2.4.81"===t)e=(0,u.default)(e,r);else if("1.2.840.10008.1.2.4.90"===t)e=(0,s.default)(e,r,d,f);else{if("1.2.840.10008.1.2.4.91"!==t)throw new Error("no decoder for transfer syntax "+t);e=(0,s.default)(e,r,d,f)}var p=void 0!==e.pixelRepresentation&&1===e.pixelRepresentation,m=p&&void 0!==e.bitsStored?32-e.bitsStored:void 0;if(p&&void 0!==m)for(var g=0;g>m;var v=(new Date).getTime();return e.decodeTimeInMS=v-c,e}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a=r(0),n=d(r(31)),o=d(r(30)),i=d(r(27)),l=d(r(26)),u=d(r(1)),s=d(r(25));function d(e){return e&&e.__esModule?e:{default:e}}var f="";t.default=function(e,t,r,d){if(!t||!t.length)return Promise.reject(new Error("The file does not contain image data."));var c=a.external.cornerstone,p=document.createElement("canvas"),m=(0,n.default)(e),g=(0,o.default)(m,r,t,p,d);return new Promise(function(t,a){g.then(function(a){var n=c.metaData.get("imagePlaneModule",e)||{},o=c.metaData.get("voiLutModule",e)||{},d=c.metaData.get("modalityLutModule",e)||{},m=c.metaData.get("sopCommonModule",e)||{},g=(0,i.default)(a.photometricInterpretation);if(!(0,s.default)(a,r)&&(function(e){32===e.bitsAllocated?e.pixelData=new Float32Array(e.pixelData):16===e.bitsAllocated?0===e.pixelRepresentation?e.pixelData=new Uint16Array(e.pixelData):e.pixelData=new Int16Array(e.pixelData):e.pixelData=new Uint8Array(e.pixelData)}(a),g)){p.height=a.rows,p.width=a.columns;var v=p.getContext("2d").createImageData(a.columns,a.rows);(0,l.default)(a,v),a.imageData=v,a.pixelData=v.data;var b=(0,u.default)(a.pixelData);a.smallestPixelValue=b.min,a.largestPixelValue=b.max}var x,P={imageId:e,color:g,columnPixelSpacing:n.pixelSpacing?n.pixelSpacing[1]:void 0,columns:a.columns,height:a.rows,intercept:d.rescaleIntercept?d.rescaleIntercept:0,invert:"MONOCHROME1"===a.photometricInterpretation,minPixelValue:a.smallestPixelValue,maxPixelValue:a.largestPixelValue,render:void 0,rowPixelSpacing:n.pixelSpacing?n.pixelSpacing[0]:void 0,rows:a.rows,sizeInBytes:a.pixelData.length,slope:d.rescaleSlope?d.rescaleSlope:1,width:a.columns,windowCenter:o.windowCenter?o.windowCenter[0]:void 0,windowWidth:o.windowWidth?o.windowWidth[0]:void 0,decodeTimeInMS:a.decodeTimeInMS,floatPixelData:void 0};if(a.pixelData instanceof Float32Array){var y=a.pixelData,h=function(e){for(var t=(0,u.default)(e),r=Math.abs(t.max-t.min)/65535,a=t.min,n=e.length,o=new Uint16Array(n),i=65535,l=0,s=0;s0&&"1.2.840.10008.5.1.4.1.1.12.1"!==(x=m.sopClassUID)&&"1.2.840.10008.5.1.4.1.1.12.2.1"!==x&&(P.modalityLUT=d.modalityLUTSequence[0]),o.voiLUTSequence&&o.voiLUTSequence.length>0&&(P.voiLUT=o.voiLUTSequence[0]),P.color&&(P.windowWidth=255,P.windowCenter=127),void 0===P.windowCenter||void 0===P.windowWidth){var w=P.maxPixelValue*P.slope+P.intercept,_=P.minPixelValue*P.slope+P.intercept;P.windowWidth=w-_,P.windowCenter=(w+_)/2}t(P)},a)})}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a=[];t.default={add:function(e,t){a[e]=t},get:function(e){return a[e]},remove:function(e){a[e]=void 0},purge:function(){a=[]}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.loadImage=t.getLoaderForScheme=t.loadImageFromPromise=void 0;var a=s(r(17)),n=s(r(5)),o=s(r(9)),i=s(r(20)),l=s(r(51)),u=r(4);function s(e){return e&&e.__esModule?e:{default:e}}function d(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,i=arguments[3],u=arguments[4],s=arguments[5],d=(new Date).getTime(),f={cancelFn:void 0};return f.promise=new Promise(function(c,p){e.then(function(e){var m=(0,l.default)(e,r),g=e.string("x00020010"),v=(new Date).getTime(),b=(0,a.default)(t,m,g,u);!function(e,t){e.decache=function(){var e=(0,n.default)(t);o.default.unload(e.url)}}(f,t),b.then(function(t){t.data=e,t.sharedCacheKey=i;var r=(new Date).getTime();t.loadTimeInMS=v-d,t.totalTimeInMS=r-d,void 0!==s&&void 0!==s.imageDoneCallback&&s.imageDoneCallback(t),c(t)},function(t){p({error:t,dataSet:e})})},function(e){p({error:e})})}),f}function f(e){return"dicomweb"===e||"wadouri"===e?u.xhrRequest:"dicomfile"===e?i.default:void 0}t.loadImageFromPromise=d,t.getLoaderForScheme=f,t.loadImage=function(e,t){var r=(0,n.default)(e),i=f(r.scheme);return o.default.isLoaded(r.url)?function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,n=arguments[3],o=arguments[4],i=(new Date).getTime();return{promise:new Promise(function(u,s){var d=(new Date).getTime(),f=void 0;try{var c=(0,l.default)(e,r),p=e.string("x00020010");f=(0,a.default)(t,c,p,o)}catch(t){return void s({error:t,dataSet:e})}f.then(function(t){t.data=e,t.sharedCacheKey=n;var r=(new Date).getTime();t.loadTimeInMS=d-i,t.totalTimeInMS=r-i,u(t)},s)}),cancelFn:void 0}}(o.default.get(r.url,i,e),e,r.frame,r.url,t):d(o.default.load(r.url,i,e),e,r.frame,r.url,t)}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a=o(r(5)),n=o(r(24));function o(e){return e&&e.__esModule?e:{default:e}}t.default=function(e){var t=(0,a.default)(e),r=parseInt(t.url,10),o=n.default.get(r);return new Promise(function(e,t){var r=new FileReader;r.onload=function(t){var r=t.target.result;e(r)},r.onerror=t,r.readAsArrayBuffer(o)})}},function(e,t,r){"use strict";function a(e,t){return e&1<=e.byteArray.length)throw new Error("frame exceeds size of pixelData");return new Uint8Array(e.byteArray.buffer,d,s)}if(16===a){if((d=u+t*s*2)>=e.byteArray.length)throw new Error("frame exceeds size of pixelData");return new Uint8Array(e.byteArray.buffer,d,2*s)}if(1===a){if((d=u+t*s*.125)>=e.byteArray.length)throw new Error("frame exceeds size of pixelData");return(0,o.default)(e.byteArray,d,s)}if(32===a){if((d=u+t*s*4)>=e.byteArray.length)throw new Error("frame exceeds size of pixelData");return new Uint8Array(e.byteArray.buffer,d,4*s)}throw new Error("unsupported pixel format")}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){if(e.elements.x7fe00010&&e.elements.x7fe00010.basicOffsetTable.length)return a.dicomParser.readEncapsulatedImageFrame(e,e.elements.x7fe00010,t);if(function(e){var t=e.intString("x00280008"),r=e.elements.x7fe00010;return t!==r.fragments.length}(e)){var r=a.dicomParser.createJPEGBasicOffsetTable(e,e.elements.x7fe00010);return a.dicomParser.readEncapsulatedImageFrame(e,e.elements.x7fe00010,t,r)}return a.dicomParser.readEncapsulatedPixelDataFromFragments(e,e.elements.x7fe00010,t)};var a=r(0)},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a=[];t.default={add:function(e){return"dicomfile:"+(a.push(e)-1)},get:function(e){return a[e]},remove:function(e){a[e]=void 0},purge:function(){a=[]}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){if(t=t||e.transferSyntax,8===e.bitsAllocated&&"1.2.840.10008.1.2.4.50"===t&&(3===e.samplesPerPixel||4===e.samplesPerPixel))return!0}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){var r=t.data;if("RGB"===e.photometricInterpretation)n(e,r);else if("YBR_RCT"===e.photometricInterpretation)n(e,r);else if("YBR_ICT"===e.photometricInterpretation)n(e,r);else if("PALETTE COLOR"===e.photometricInterpretation)(0,a.convertPALETTECOLOR)(e,r);else if("YBR_FULL_422"===e.photometricInterpretation)n(e,r);else{if("YBR_FULL"!==e.photometricInterpretation)throw new Error("No color space conversion for photometric interpretation "+e.photometricInterpretation);!function(e,t){0===e.planarConfiguration?(0,a.convertYBRFullByPixel)(e.pixelData,t):(0,a.convertYBRFullByPlane)(e.pixelData,t)}(e,r)}};var a=r(45);function n(e,t){0===e.planarConfiguration?(0,a.convertRGBColorByPixel)(e.pixelData,t):(0,a.convertRGBColorByPlane)(e.pixelData,t)}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return"RGB"===e||"PALETTE COLOR"===e||"YBR_FULL"===e||"YBR_FULL_422"===e||"YBR_PARTIAL_422"===e||"YBR_PARTIAL_420"===e||"YBR_RCT"===e||"YBR_ICT"===e}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a,n=r(1),o=(a=n)&&a.__esModule?a:{default:a};function i(e){return function(e){var t=void 0;try{return decodeURIComponent(escape(e))}catch(r){if((t=r)instanceof URIError)return e;throw t}}(String.fromCharCode.apply(null,Array.prototype.slice.apply(new Uint8Array(e))))}t.default=function(e,t,r){var a=(new Date).getTime(),n=new Blob([t],{type:"image/jpeg"});return new Promise(function(t,l){var u=new FileReader;void 0===u.readAsBinaryString?u.readAsArrayBuffer(n):u.readAsBinaryString(n),u.onload=function(){var n=new Image;n.onload=function(){r.height=n.height,r.width=n.width,e.rows=n.height,e.columns=n.width;var i=r.getContext("2d");i.drawImage(this,0,0);var l=i.getImageData(0,0,n.width,n.height),u=(new Date).getTime();e.pixelData=l.data,e.imageData=l,e.decodeTimeInMS=u-a;var s=(0,o.default)(e.pixelData);e.smallestPixelValue=s.min,e.largestPixelValue=s.max,t(e)},n.onerror=function(e){l(e)},void 0===u.readAsBinaryString?n.src="data:image/jpeg;base64,"+window.btoa(i(u.result)):n.src="data:image/jpeg;base64,"+window.btoa(u.result)},u.onerror=function(e){l(e)}})}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a=0,n=[],o=[],i=(0,r(6).getOptions)(),l={maxWebWorkers:navigator.hardwareConcurrency||1,startWebWorkersOnDemand:!0,webWorkerPath:"../../dist/cornerstoneWADOImageLoaderWebWorker.js",webWorkerTaskPaths:[],taskConfiguration:{decodeTask:{loadCodecsOnStartup:!0,initializeCodecsOnStartup:!1,codecsPath:"../dist/cornerstoneWADOImageLoaderCodecs.js",usePDFJS:!1,strict:i.strict}}},u=void 0,s={maxWebWorkers:0,numWebWorkers:0,numTasksQueued:0,numTasksExecuting:0,numTasksCompleted:0,totalTaskTimeInMS:0,totalTimeDelayedInMS:0};function d(){if(n.length){for(var e=0;e=u.maxWebWorkers)){var e=new Worker(u.webWorkerPath);o.push({worker:e,status:"initializing"}),e.addEventListener("message",f),e.postMessage({taskType:"initialize",workerIndex:o.length-1,config:u})}}function p(e){if(e=e||l,u)throw new Error("WebWorkerManager already initialized");if((u=e).maxWebWorkers=u.maxWebWorkers||navigator.hardwareConcurrency||1,!u.startWebWorkersOnDemand)for(var t=0;t2&&void 0!==arguments[2]?arguments[2]:0,o=arguments[3];u||p();var i={},l=new Promise(function(e,t){i={resolve:e,reject:t}}),s=void 0;for(s=0;s1&&void 0!==arguments[1]?arguments[1]:0,r=0;r4&&void 0!==arguments[4]?arguments[4]:{};return"1.2.840.10008.1.2"===t?c(e,t,r,n):"1.2.840.10008.1.2.1"===t?c(e,t,r,n):"1.2.840.10008.1.2.2"===t?c(e,t,r,n):"1.2.840.10008.1.2.1.99"===t?c(e,t,r,n):"1.2.840.10008.1.2.5"===t?c(e,t,r,n):"1.2.840.10008.1.2.4.50"===t?8!==e.bitsAllocated||3!==e.samplesPerPixel&&4!==e.samplesPerPixel?c(e,t,r,n):(0,o.default)(e,r,a):"1.2.840.10008.1.2.4.51"===t?c(e,t,r,n):"1.2.840.10008.1.2.4.57"===t?c(e,t,r,n):"1.2.840.10008.1.2.4.70"===t?c(e,t,r,n):"1.2.840.10008.1.2.4.80"===t?c(e,t,r,n):"1.2.840.10008.1.2.4.81"===t?c(e,t,r,n):"1.2.840.10008.1.2.4.90"===t?c(e,t,r,n):"1.2.840.10008.1.2.4.91"===t?c(e,t,r,n):new Promise(function(e,r){r(new Error("No decoder for transfer syntax "+t))})}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a=r(0);t.default=function(e){var t=a.external.cornerstone.metaData.get("imagePixelModule",e);return{samplesPerPixel:t.samplesPerPixel,photometricInterpretation:t.photometricInterpretation,planarConfiguration:t.planarConfiguration,rows:t.rows,columns:t.columns,bitsAllocated:t.bitsAllocated,bitsStored:t.bitsStored,pixelRepresentation:t.pixelRepresentation,smallestPixelValue:t.smallestPixelValue,largestPixelValue:t.largestPixelValue,redPaletteColorLookupTableDescriptor:t.redPaletteColorLookupTableDescriptor,greenPaletteColorLookupTableDescriptor:t.greenPaletteColorLookupTableDescriptor,bluePaletteColorLookupTableDescriptor:t.bluePaletteColorLookupTableDescriptor,redPaletteColorLookupTableData:t.redPaletteColorLookupTableData,greenPaletteColorLookupTableData:t.greenPaletteColorLookupTableData,bluePaletteColorLookupTableData:t.bluePaletteColorLookupTableData,pixelData:void 0}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getTransferSyntaxForContentType=l;var a=i(r(18)),n=i(r(33)),o=i(r(17));function i(e){return e&&e.__esModule?e:{default:e}}function l(e){var t="1.2.840.10008.1.2";if(e){var r=e.split(";");for(var a in r){var n=r[a].split("=");2===n.length&&("transfer-syntax"===n[0].trim()&&(t=n[1].trim()||t))}}return t}t.default=function(e,t){var r=(new Date).getTime(),i=e.substring(7);return{promise:new Promise(function(u,s){if(void 0===a.default.get(e)){var d=new Error("no metadata for imageId "+e);return s(d)}(0,n.default)(i,e,'multipart/related; type="application/octet-stream"').then(function(a){var n=l(a.contentType),i=a.imageFrame.pixelData;(0,o.default)(e,i,n,t).then(function(e){var t=(new Date).getTime();e.loadTimeInMS=t-r,u(e)},s)},s)}),cancelFn:void 0}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a,n=r(4),o=r(34),i=(a=o)&&a.__esModule?a:{default:a};t.default=function(e,t){var r={accept:arguments.length>2&&void 0!==arguments[2]?arguments[2]:"application/octet-stream"};return new Promise(function(a,o){(0,n.xhrRequest)(e,t,r).then(function(e){var t=new Uint8Array(e),r=(0,i.default)(t,"\r\n\r\n");-1===r&&o(new Error("invalid response - no multipart mime header"));var n=function(e,t,r){t=t||0,r=r||e.length-t;for(var a="",n=t;nt.length)return!1;for(var a=r,n=0;n0?0:e.uint16("x00280103")}},function(e,t,r){"use strict";function a(e,t){var r=t.uint16("x00283002",0);0===r&&(r=65535);for(var a={id:"1",firstValueMapped:0===e?t.uint16("x00283002",1):t.int16("x00283002",1),numBitsPerEntry:t.uint16("x00283002",2),lut:[]},n=0;n1&&void 0!==arguments[1]?arguments[1]:0,r=e.elements.x7fe00010||e.elements.x7fe00008;return r?r.encapsulatedPixelData?(0,a.default)(e,t):(0,n.default)(e,t):null}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){e.registerImageLoader("wadors",o.default),e.metaData.addProvider(i.metaDataProvider)};var a,n=r(32),o=(a=n)&&a.__esModule?a:{default:a},i=r(37)},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a=r(0),n=r(6);t.default=function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},i=a.external.cornerstone,l=(0,n.getOptions)();return new Promise(function(a,n){var u=new XMLHttpRequest;u.open("get",e,!0),u.responseType="arraybuffer",l.beforeSend(u,t),Object.keys(r).forEach(function(e){u.setRequestHeader(e,r[e])}),o.deferred={resolve:a,reject:n},o.url=e,o.imageId=t,u.onloadstart=function(r){l.onloadstart&&l.onloadstart(r,o);var a={url:e,imageId:t};i.triggerEvent(i.events,"cornerstoneimageloadstart",a)},u.onloadend=function(r){l.onloadend&&l.onloadend(r,o);var a={url:e,imageId:t};i.triggerEvent(i.events,"cornerstoneimageloadend",a)},u.onreadystatechange=function(e){l.onreadystatechange?l.onreadystatechange(e,o):4===u.readyState&&(200===u.status?a(u.response,u):n(u))},u.onprogress=function(r){var a=r.loaded,n=void 0,u=void 0;r.lengthComputable&&(n=r.total,u=Math.round(a/n*100)),l.onprogress&&l.onprogress(r,o);var s={url:e,imageId:t,loaded:a,total:n,percentComplete:u};i.triggerEvent(i.events,"cornerstoneimageloadprogress",s)},u.send()})}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a=r(0),n=u(r(35)),o=u(r(7)),i=u(r(36)),l=u(r(18));function u(e){return e&&e.__esModule?e:{default:e}}t.default=function(e,t){var r=l.default.get(t);if(r){if("generalSeriesModule"===e)return{modality:(0,o.default)(r["00080060"]),seriesInstanceUID:(0,o.default)(r["0020000e"]),seriesNumber:(0,i.default)(r["00200011"]),studyInstanceUID:(0,o.default)(r["0020000d"]),seriesDate:a.dicomParser.parseDA((0,o.default)(r["00080021"])),seriesTime:a.dicomParser.parseTM((0,o.default)(r["00080031"],0,""))};if("patientStudyModule"===e)return{patientAge:(0,i.default)(r["00101010"]),patientSize:(0,i.default)(r["00101020"]),patientWeight:(0,i.default)(r["00101030"])};if("imagePlaneModule"===e){var u=(0,n.default)(r["00200037"],6),s=(0,n.default)(r["00200032"],3),d=(0,n.default)(r["00280030"],2),f=1,c=1;d&&(c=d[0],f=d[1]);var p=null,m=null;return u&&(p=[parseFloat(u[0]),parseFloat(u[1]),parseFloat(u[2])],m=[parseFloat(u[3]),parseFloat(u[4]),parseFloat(u[5])]),{frameOfReferenceUID:(0,o.default)(r["00200052"]),rows:(0,i.default)(r["00280010"]),columns:(0,i.default)(r["00280011"]),imageOrientationPatient:u,rowCosines:p,columnCosines:m,imagePositionPatient:s,sliceThickness:(0,i.default)(r["00180050"]),sliceLocation:(0,i.default)(r["00201041"]),pixelSpacing:d,rowPixelSpacing:c,columnPixelSpacing:f}}if("imagePixelModule"===e)return{samplesPerPixel:(0,i.default)(r["00280002"]),photometricInterpretation:(0,o.default)(r["00280004"]),rows:(0,i.default)(r["00280010"]),columns:(0,i.default)(r["00280011"]),bitsAllocated:(0,i.default)(r["00280100"]),bitsStored:(0,i.default)(r["00280101"]),highBit:(0,o.default)(r["00280102"]),pixelRepresentation:(0,i.default)(r["00280103"]),planarConfiguration:(0,i.default)(r["00280006"]),pixelAspectRatio:(0,o.default)(r["00280034"]),smallestPixelValue:(0,i.default)(r["00280106"]),largestPixelValue:(0,i.default)(r["00280107"]),redPaletteColorLookupTableDescriptor:(0,n.default)(r["00281101"]),greenPaletteColorLookupTableDescriptor:(0,n.default)(r["00281102"]),bluePaletteColorLookupTableDescriptor:(0,n.default)(r["00281103"]),redPaletteColorLookupTableData:(0,n.default)(r["00281201"]),greenPaletteColorLookupTableData:(0,n.default)(r["00281202"]),bluePaletteColorLookupTableData:(0,n.default)(r["00281203"])};if("voiLutModule"===e)return{windowCenter:(0,n.default)(r["00281050"],1),windowWidth:(0,n.default)(r["00281051"],1)};if("modalityLutModule"===e)return{rescaleIntercept:(0,i.default)(r["00281052"]),rescaleSlope:(0,i.default)(r["00281053"]),rescaleType:(0,o.default)(r["00281054"])};if("sopCommonModule"===e)return{sopClassUID:(0,o.default)(r["00080016"]),sopInstanceUID:(0,o.default)(r["00080018"])};if("petIsotopeModule"===e){var g=(0,o.default)(r["00540016"]);if(void 0===g)return;return{radiopharmaceuticalInfo:{radiopharmaceuticalStartTime:a.dicomParser.parseTM((0,o.default)(g["00181072"],0,"")),radionuclideTotalDose:(0,i.default)(g["00181074"]),radionuclideHalfLife:(0,i.default)(g["00181075"])}}}}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a,n=r(7),o=(a=n)&&a.__esModule?a:{default:a};t.default=function(e,t,r){var a=(0,o.default)(e,t,r);if(void 0!==a)return parseFloat(a)}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a=o(r(38)),n=o(r(44));function o(e){return e&&e.__esModule?e:{default:e}}t.default=function(e){a.default.register(e),n.default.register(e)}},function(t,r){t.exports=e},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a=r(0),n=d(r(39)),o=d(r(5)),i=d(r(9)),l=d(r(42)),u=d(r(41)),s=d(r(40));function d(e){return e&&e.__esModule?e:{default:e}}t.default=function(e,t){var r=(0,o.default)(t),d=i.default.get(r.url);if(d){if("generalSeriesModule"===e)return{modality:d.string("x00080060"),seriesInstanceUID:d.string("x0020000e"),seriesNumber:d.intString("x00200011"),studyInstanceUID:d.string("x0020000d"),seriesDate:a.dicomParser.parseDA(d.string("x00080021")),seriesTime:a.dicomParser.parseTM(d.string("x00080031")||"")};if("patientStudyModule"===e)return{patientAge:d.intString("x00101010"),patientSize:d.floatString("x00101020"),patientWeight:d.floatString("x00101030")};if("imagePlaneModule"===e){var f=(0,n.default)(d,"x00200037",6),c=(0,n.default)(d,"x00200032",3),p=(0,n.default)(d,"x00280030",2),m=1,g=1;p&&(g=p[0],m=p[1]);var v=null,b=null;return f&&(v=[parseFloat(f[0]),parseFloat(f[1]),parseFloat(f[2])],b=[parseFloat(f[3]),parseFloat(f[4]),parseFloat(f[5])]),{frameOfReferenceUID:d.string("x00200052"),rows:d.uint16("x00280010"),columns:d.uint16("x00280011"),imageOrientationPatient:f,rowCosines:v,columnCosines:b,imagePositionPatient:c,sliceThickness:d.floatString("x00180050"),sliceLocation:d.floatString("x00201041"),pixelSpacing:p,rowPixelSpacing:g,columnPixelSpacing:m}}if("imagePixelModule"===e)return(0,l.default)(d);if("modalityLutModule"===e)return{rescaleIntercept:d.floatString("x00281052"),rescaleSlope:d.floatString("x00281053"),rescaleType:d.string("x00281054"),modalityLUTSequence:(0,u.default)(d.uint16("x00280103"),d.elements.x00283000)};if("voiLutModule"===e){var x=(0,s.default)(d);return{windowCenter:(0,n.default)(d,"x00281050",1),windowWidth:(0,n.default)(d,"x00281051",1),voiLUTSequence:(0,u.default)(x,d.elements.x00283010)}}if("sopCommonModule"===e)return{sopClassUID:d.string("x00080016"),sopInstanceUID:d.string("x00080018")};if("petIsotopeModule"===e){var P=d.elements.x00540016;if(void 0===P)return;var y=P.items[0].dataSet;return{radiopharmaceuticalInfo:{radiopharmaceuticalStartTime:a.dicomParser.parseTM(y.string("x00181072")||""),radionuclideTotalDose:y.floatString("x00181074"),radionuclideHalfLife:y.floatString("x00181075")}}}}}},function(e,t,r){"use strict";function a(e,t){for(var r=e.length,a=new Uint8ClampedArray(r),n=0;n>t;return a}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){for(var r=e.columns*e.rows,n=e.pixelData,o=e.redPaletteColorLookupTableData,i=e.greenPaletteColorLookupTableData,l=e.bluePaletteColorLookupTableData,u=e.redPaletteColorLookupTableData.length,s=0,d=0,f=e.redPaletteColorLookupTableDescriptor[1],c=8===e.redPaletteColorLookupTableDescriptor[2]?0:8,p=a(o,c),m=a(i,c),g=a(l,c),v=0;vf+u-1?b=u-1:b-=f,t[d++]=p[b],t[d++]=m[b],t[d++]=g[b],t[d++]=255}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){if(void 0===e)throw new Error("decodeRGB: ybrBuffer must not be undefined");if(e.length%3!=0)throw new Error("decodeRGB: ybrBuffer length must be divisble by 3");for(var r=e.length/3,a=0,n=0,o=r,i=2*r,l=0;l 1 && arguments[1] !== undefined ? arguments[1] : true; 118 | 119 | var minMax = (0, _getMinMax2.default)(imageFrame.pixelData); 120 | 121 | if (strict === true) { 122 | if (imageFrame.smallestPixelValue !== minMax.min) { 123 | console.warn('Image smallestPixelValue tag is incorrect. Rendering performance will suffer considerably.'); 124 | } 125 | 126 | if (imageFrame.largestPixelValue !== minMax.max) { 127 | console.warn('Image largestPixelValue tag is incorrect. Rendering performance will suffer considerably.'); 128 | } 129 | } else { 130 | imageFrame.smallestPixelValue = minMax.min; 131 | imageFrame.largestPixelValue = minMax.max; 132 | } 133 | } 134 | 135 | /***/ }), 136 | 137 | /***/ "./shared/decodeImageFrame.js": 138 | /*!************************************!*\ 139 | !*** ./shared/decodeImageFrame.js ***! 140 | \************************************/ 141 | /*! no static exports found */ 142 | /***/ (function(module, exports, __webpack_require__) { 143 | 144 | "use strict"; 145 | 146 | 147 | Object.defineProperty(exports, "__esModule", { 148 | value: true 149 | }); 150 | 151 | var _decodeLittleEndian = __webpack_require__(/*! ./decoders/decodeLittleEndian.js */ "./shared/decoders/decodeLittleEndian.js"); 152 | 153 | var _decodeLittleEndian2 = _interopRequireDefault(_decodeLittleEndian); 154 | 155 | var _decodeBigEndian = __webpack_require__(/*! ./decoders/decodeBigEndian.js */ "./shared/decoders/decodeBigEndian.js"); 156 | 157 | var _decodeBigEndian2 = _interopRequireDefault(_decodeBigEndian); 158 | 159 | var _decodeRLE = __webpack_require__(/*! ./decoders/decodeRLE.js */ "./shared/decoders/decodeRLE.js"); 160 | 161 | var _decodeRLE2 = _interopRequireDefault(_decodeRLE); 162 | 163 | var _decodeJPEGBaseline = __webpack_require__(/*! ./decoders/decodeJPEGBaseline.js */ "./shared/decoders/decodeJPEGBaseline.js"); 164 | 165 | var _decodeJPEGBaseline2 = _interopRequireDefault(_decodeJPEGBaseline); 166 | 167 | var _decodeJPEGLossless = __webpack_require__(/*! ./decoders/decodeJPEGLossless.js */ "./shared/decoders/decodeJPEGLossless.js"); 168 | 169 | var _decodeJPEGLossless2 = _interopRequireDefault(_decodeJPEGLossless); 170 | 171 | var _decodeJPEGLS = __webpack_require__(/*! ./decoders/decodeJPEGLS.js */ "./shared/decoders/decodeJPEGLS.js"); 172 | 173 | var _decodeJPEGLS2 = _interopRequireDefault(_decodeJPEGLS); 174 | 175 | var _decodeJPEG = __webpack_require__(/*! ./decoders/decodeJPEG2000.js */ "./shared/decoders/decodeJPEG2000.js"); 176 | 177 | var _decodeJPEG2 = _interopRequireDefault(_decodeJPEG); 178 | 179 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 180 | 181 | function decodeImageFrame(imageFrame, transferSyntax, pixelData, decodeConfig, options) { 182 | var start = new Date().getTime(); 183 | 184 | if (transferSyntax === '1.2.840.10008.1.2') { 185 | // Implicit VR Little Endian 186 | imageFrame = (0, _decodeLittleEndian2.default)(imageFrame, pixelData); 187 | } else if (transferSyntax === '1.2.840.10008.1.2.1') { 188 | // Explicit VR Little Endian 189 | imageFrame = (0, _decodeLittleEndian2.default)(imageFrame, pixelData); 190 | } else if (transferSyntax === '1.2.840.10008.1.2.2') { 191 | // Explicit VR Big Endian (retired) 192 | imageFrame = (0, _decodeBigEndian2.default)(imageFrame, pixelData); 193 | } else if (transferSyntax === '1.2.840.10008.1.2.1.99') { 194 | // Deflate transfer syntax (deflated by dicomParser) 195 | imageFrame = (0, _decodeLittleEndian2.default)(imageFrame, pixelData); 196 | } else if (transferSyntax === '1.2.840.10008.1.2.5') { 197 | // RLE Lossless 198 | imageFrame = (0, _decodeRLE2.default)(imageFrame, pixelData); 199 | } else if (transferSyntax === '1.2.840.10008.1.2.4.50') { 200 | // JPEG Baseline lossy process 1 (8 bit) 201 | imageFrame = (0, _decodeJPEGBaseline2.default)(imageFrame, pixelData); 202 | } else if (transferSyntax === '1.2.840.10008.1.2.4.51') { 203 | // JPEG Baseline lossy process 2 & 4 (12 bit) 204 | imageFrame = (0, _decodeJPEGBaseline2.default)(imageFrame, pixelData); 205 | } else if (transferSyntax === '1.2.840.10008.1.2.4.57') { 206 | // JPEG Lossless, Nonhierarchical (Processes 14) 207 | imageFrame = (0, _decodeJPEGLossless2.default)(imageFrame, pixelData); 208 | } else if (transferSyntax === '1.2.840.10008.1.2.4.70') { 209 | // JPEG Lossless, Nonhierarchical (Processes 14 [Selection 1]) 210 | imageFrame = (0, _decodeJPEGLossless2.default)(imageFrame, pixelData); 211 | } else if (transferSyntax === '1.2.840.10008.1.2.4.80') { 212 | // JPEG-LS Lossless Image Compression 213 | imageFrame = (0, _decodeJPEGLS2.default)(imageFrame, pixelData); 214 | } else if (transferSyntax === '1.2.840.10008.1.2.4.81') { 215 | // JPEG-LS Lossy (Near-Lossless) Image Compression 216 | imageFrame = (0, _decodeJPEGLS2.default)(imageFrame, pixelData); 217 | } else if (transferSyntax === '1.2.840.10008.1.2.4.90') { 218 | // JPEG 2000 Lossless 219 | imageFrame = (0, _decodeJPEG2.default)(imageFrame, pixelData, decodeConfig, options); 220 | } else if (transferSyntax === '1.2.840.10008.1.2.4.91') { 221 | // JPEG 2000 Lossy 222 | imageFrame = (0, _decodeJPEG2.default)(imageFrame, pixelData, decodeConfig, options); 223 | } else { 224 | throw new Error('no decoder for transfer syntax ' + transferSyntax); 225 | } 226 | 227 | /* Don't know if these work... 228 | // JPEG 2000 Part 2 Multicomponent Image Compression (Lossless Only) 229 | else if(transferSyntax === "1.2.840.10008.1.2.4.92") 230 | { 231 | return decodeJPEG2000(dataSet, frame); 232 | } 233 | // JPEG 2000 Part 2 Multicomponent Image Compression 234 | else if(transferSyntax === "1.2.840.10008.1.2.4.93") 235 | { 236 | return decodeJPEG2000(dataSet, frame); 237 | } 238 | */ 239 | 240 | var shouldShift = imageFrame.pixelRepresentation !== undefined && imageFrame.pixelRepresentation === 1; 241 | var shift = shouldShift && imageFrame.bitsStored !== undefined ? 32 - imageFrame.bitsStored : undefined; 242 | 243 | if (shouldShift && shift !== undefined) { 244 | for (var i = 0; i < imageFrame.pixelData.length; i++) { 245 | // eslint-disable-next-line no-bitwise 246 | imageFrame.pixelData[i] = imageFrame.pixelData[i] << shift >> shift; 247 | } 248 | } 249 | 250 | var end = new Date().getTime(); 251 | 252 | imageFrame.decodeTimeInMS = end - start; 253 | 254 | return imageFrame; 255 | } 256 | 257 | exports.default = decodeImageFrame; 258 | 259 | /***/ }), 260 | 261 | /***/ "./shared/decoders/decodeBigEndian.js": 262 | /*!********************************************!*\ 263 | !*** ./shared/decoders/decodeBigEndian.js ***! 264 | \********************************************/ 265 | /*! no static exports found */ 266 | /***/ (function(module, exports, __webpack_require__) { 267 | 268 | "use strict"; 269 | 270 | 271 | Object.defineProperty(exports, "__esModule", { 272 | value: true 273 | }); 274 | /* eslint no-bitwise: 0 */ 275 | function swap16(val) { 276 | return (val & 0xFF) << 8 | val >> 8 & 0xFF; 277 | } 278 | 279 | function decodeBigEndian(imageFrame, pixelData) { 280 | if (imageFrame.bitsAllocated === 16) { 281 | var arrayBuffer = pixelData.buffer; 282 | var offset = pixelData.byteOffset; 283 | var length = pixelData.length; 284 | // if pixel data is not aligned on even boundary, shift it so we can create the 16 bit array 285 | // buffers on it 286 | 287 | if (offset % 2) { 288 | arrayBuffer = arrayBuffer.slice(offset); 289 | offset = 0; 290 | } 291 | 292 | if (imageFrame.pixelRepresentation === 0) { 293 | imageFrame.pixelData = new Uint16Array(arrayBuffer, offset, length / 2); 294 | } else { 295 | imageFrame.pixelData = new Int16Array(arrayBuffer, offset, length / 2); 296 | } 297 | // Do the byte swap 298 | for (var i = 0; i < imageFrame.pixelData.length; i++) { 299 | imageFrame.pixelData[i] = swap16(imageFrame.pixelData[i]); 300 | } 301 | } else if (imageFrame.bitsAllocated === 8) { 302 | imageFrame.pixelData = pixelData; 303 | } 304 | 305 | return imageFrame; 306 | } 307 | 308 | exports.default = decodeBigEndian; 309 | 310 | /***/ }), 311 | 312 | /***/ "./shared/decoders/decodeJPEG2000.js": 313 | /*!*******************************************!*\ 314 | !*** ./shared/decoders/decodeJPEG2000.js ***! 315 | \*******************************************/ 316 | /*! no static exports found */ 317 | /***/ (function(module, exports, __webpack_require__) { 318 | 319 | "use strict"; 320 | 321 | 322 | Object.defineProperty(exports, "__esModule", { 323 | value: true 324 | }); 325 | function decodeJpx(imageFrame, pixelData) { 326 | var jpxImage = new JpxImage(); 327 | 328 | jpxImage.parse(pixelData); 329 | 330 | var tileCount = jpxImage.tiles.length; 331 | 332 | if (tileCount !== 1) { 333 | throw new Error('JPEG2000 decoder returned a tileCount of ' + tileCount + ', when 1 is expected'); 334 | } 335 | 336 | imageFrame.columns = jpxImage.width; 337 | imageFrame.rows = jpxImage.height; 338 | imageFrame.pixelData = jpxImage.tiles[0].items; 339 | 340 | return imageFrame; 341 | } 342 | 343 | var openJPEG = void 0; 344 | 345 | function decodeOpenJPEG(data, bytesPerPixel, signed) { 346 | var dataPtr = openJPEG._malloc(data.length); 347 | 348 | openJPEG.writeArrayToMemory(data, dataPtr); 349 | 350 | // create param outpout 351 | var imagePtrPtr = openJPEG._malloc(4); 352 | var imageSizePtr = openJPEG._malloc(4); 353 | var imageSizeXPtr = openJPEG._malloc(4); 354 | var imageSizeYPtr = openJPEG._malloc(4); 355 | var imageSizeCompPtr = openJPEG._malloc(4); 356 | 357 | var t0 = new Date().getTime(); 358 | var ret = openJPEG.ccall('jp2_decode', 'number', ['number', 'number', 'number', 'number', 'number', 'number', 'number'], [dataPtr, data.length, imagePtrPtr, imageSizePtr, imageSizeXPtr, imageSizeYPtr, imageSizeCompPtr]); 359 | // add num vomp..etc 360 | 361 | if (ret !== 0) { 362 | console.log('[opj_decode] decoding failed!'); 363 | openJPEG._free(dataPtr); 364 | openJPEG._free(openJPEG.getValue(imagePtrPtr, '*')); 365 | openJPEG._free(imageSizeXPtr); 366 | openJPEG._free(imageSizeYPtr); 367 | openJPEG._free(imageSizePtr); 368 | openJPEG._free(imageSizeCompPtr); 369 | 370 | return; 371 | } 372 | 373 | var imagePtr = openJPEG.getValue(imagePtrPtr, '*'); 374 | 375 | var image = { 376 | length: openJPEG.getValue(imageSizePtr, 'i32'), 377 | sx: openJPEG.getValue(imageSizeXPtr, 'i32'), 378 | sy: openJPEG.getValue(imageSizeYPtr, 'i32'), 379 | nbChannels: openJPEG.getValue(imageSizeCompPtr, 'i32'), // hard coded for now 380 | perf_timetodecode: undefined, 381 | pixelData: undefined 382 | }; 383 | 384 | // Copy the data from the EMSCRIPTEN heap into the correct type array 385 | var length = image.sx * image.sy * image.nbChannels; 386 | var src32 = new Int32Array(openJPEG.HEAP32.buffer, imagePtr, length); 387 | 388 | if (bytesPerPixel === 1) { 389 | if (Uint8Array.from) { 390 | image.pixelData = Uint8Array.from(src32); 391 | } else { 392 | image.pixelData = new Uint8Array(length); 393 | for (var i = 0; i < length; i++) { 394 | image.pixelData[i] = src32[i]; 395 | } 396 | } 397 | } else if (signed) { 398 | if (Int16Array.from) { 399 | image.pixelData = Int16Array.from(src32); 400 | } else { 401 | image.pixelData = new Int16Array(length); 402 | for (var _i = 0; _i < length; _i++) { 403 | image.pixelData[_i] = src32[_i]; 404 | } 405 | } 406 | } else if (Uint16Array.from) { 407 | image.pixelData = Uint16Array.from(src32); 408 | } else { 409 | image.pixelData = new Uint16Array(length); 410 | for (var _i2 = 0; _i2 < length; _i2++) { 411 | image.pixelData[_i2] = src32[_i2]; 412 | } 413 | } 414 | 415 | var t1 = new Date().getTime(); 416 | 417 | image.perf_timetodecode = t1 - t0; 418 | 419 | // free 420 | openJPEG._free(dataPtr); 421 | openJPEG._free(imagePtrPtr); 422 | openJPEG._free(imagePtr); 423 | openJPEG._free(imageSizePtr); 424 | openJPEG._free(imageSizeXPtr); 425 | openJPEG._free(imageSizeYPtr); 426 | openJPEG._free(imageSizeCompPtr); 427 | 428 | return image; 429 | } 430 | 431 | function decodeOpenJpeg2000(imageFrame, pixelData) { 432 | var bytesPerPixel = imageFrame.bitsAllocated <= 8 ? 1 : 2; 433 | var signed = imageFrame.pixelRepresentation === 1; 434 | 435 | var image = decodeOpenJPEG(pixelData, bytesPerPixel, signed); 436 | 437 | imageFrame.columns = image.sx; 438 | imageFrame.rows = image.sy; 439 | imageFrame.pixelData = image.pixelData; 440 | if (image.nbChannels > 1) { 441 | imageFrame.photometricInterpretation = 'RGB'; 442 | } 443 | 444 | return imageFrame; 445 | } 446 | 447 | function initializeJPEG2000(decodeConfig) { 448 | // check to make sure codec is loaded 449 | if (!decodeConfig.usePDFJS) { 450 | if (typeof OpenJPEG === 'undefined') { 451 | throw new Error('OpenJPEG decoder not loaded'); 452 | } 453 | } 454 | 455 | if (!openJPEG) { 456 | openJPEG = OpenJPEG(); 457 | if (!openJPEG || !openJPEG._jp2_decode) { 458 | throw new Error('OpenJPEG failed to initialize'); 459 | } 460 | } 461 | } 462 | 463 | function decodeJPEG2000(imageFrame, pixelData, decodeConfig) { 464 | var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; 465 | 466 | initializeJPEG2000(decodeConfig); 467 | 468 | if (options.usePDFJS || decodeConfig.usePDFJS) { 469 | // OHIF image-JPEG2000 https://github.com/OHIF/image-JPEG2000 470 | // console.log('PDFJS') 471 | return decodeJpx(imageFrame, pixelData); 472 | } 473 | 474 | // OpenJPEG2000 https://github.com/jpambrun/openjpeg 475 | // console.log('OpenJPEG') 476 | return decodeOpenJpeg2000(imageFrame, pixelData); 477 | } 478 | 479 | exports.default = decodeJPEG2000; 480 | exports.initializeJPEG2000 = initializeJPEG2000; 481 | 482 | /***/ }), 483 | 484 | /***/ "./shared/decoders/decodeJPEGBaseline.js": 485 | /*!***********************************************!*\ 486 | !*** ./shared/decoders/decodeJPEGBaseline.js ***! 487 | \***********************************************/ 488 | /*! no static exports found */ 489 | /***/ (function(module, exports, __webpack_require__) { 490 | 491 | "use strict"; 492 | 493 | 494 | Object.defineProperty(exports, "__esModule", { 495 | value: true 496 | }); 497 | 498 | 499 | function decodeJPEGBaseline(imageFrame, pixelData) { 500 | // check to make sure codec is loaded 501 | if (typeof JpegImage === 'undefined') { 502 | throw new Error('No JPEG Baseline decoder loaded'); 503 | } 504 | var jpeg = new JpegImage(); 505 | 506 | jpeg.parse(pixelData); 507 | 508 | // Do not use the internal jpeg.js color transformation, 509 | // since we will handle this afterwards 510 | jpeg.colorTransform = false; 511 | 512 | if (imageFrame.bitsAllocated === 8) { 513 | imageFrame.pixelData = jpeg.getData(imageFrame.columns, imageFrame.rows); 514 | 515 | return imageFrame; 516 | } else if (imageFrame.bitsAllocated === 16) { 517 | imageFrame.pixelData = jpeg.getData16(imageFrame.columns, imageFrame.rows); 518 | 519 | return imageFrame; 520 | } 521 | } 522 | 523 | exports.default = decodeJPEGBaseline; 524 | 525 | /***/ }), 526 | 527 | /***/ "./shared/decoders/decodeJPEGLS.js": 528 | /*!*****************************************!*\ 529 | !*** ./shared/decoders/decodeJPEGLS.js ***! 530 | \*****************************************/ 531 | /*! no static exports found */ 532 | /***/ (function(module, exports, __webpack_require__) { 533 | 534 | "use strict"; 535 | 536 | 537 | Object.defineProperty(exports, "__esModule", { 538 | value: true 539 | }); 540 | var charLS = void 0; 541 | 542 | function jpegLSDecode(data, isSigned) { 543 | // prepare input parameters 544 | var dataPtr = charLS._malloc(data.length); 545 | 546 | charLS.writeArrayToMemory(data, dataPtr); 547 | 548 | // prepare output parameters 549 | var imagePtrPtr = charLS._malloc(4); 550 | var imageSizePtr = charLS._malloc(4); 551 | var widthPtr = charLS._malloc(4); 552 | var heightPtr = charLS._malloc(4); 553 | var bitsPerSamplePtr = charLS._malloc(4); 554 | var stridePtr = charLS._malloc(4); 555 | var allowedLossyErrorPtr = charLS._malloc(4); 556 | var componentsPtr = charLS._malloc(4); 557 | var interleaveModePtr = charLS._malloc(4); 558 | 559 | // Decode the image 560 | var result = charLS.ccall('jpegls_decode', 'number', ['number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'number'], [dataPtr, data.length, imagePtrPtr, imageSizePtr, widthPtr, heightPtr, bitsPerSamplePtr, stridePtr, componentsPtr, allowedLossyErrorPtr, interleaveModePtr]); 561 | 562 | // Extract result values into object 563 | var image = { 564 | result: result, 565 | width: charLS.getValue(widthPtr, 'i32'), 566 | height: charLS.getValue(heightPtr, 'i32'), 567 | bitsPerSample: charLS.getValue(bitsPerSamplePtr, 'i32'), 568 | stride: charLS.getValue(stridePtr, 'i32'), 569 | components: charLS.getValue(componentsPtr, 'i32'), 570 | allowedLossyError: charLS.getValue(allowedLossyErrorPtr, 'i32'), 571 | interleaveMode: charLS.getValue(interleaveModePtr, 'i32'), 572 | pixelData: undefined 573 | }; 574 | 575 | // Copy image from emscripten heap into appropriate array buffer type 576 | var imagePtr = charLS.getValue(imagePtrPtr, '*'); 577 | 578 | if (image.bitsPerSample <= 8) { 579 | image.pixelData = new Uint8Array(image.width * image.height * image.components); 580 | image.pixelData.set(new Uint8Array(charLS.HEAP8.buffer, imagePtr, image.pixelData.length)); 581 | } else if (isSigned) { 582 | image.pixelData = new Int16Array(image.width * image.height * image.components); 583 | image.pixelData.set(new Int16Array(charLS.HEAP16.buffer, imagePtr, image.pixelData.length)); 584 | } else { 585 | image.pixelData = new Uint16Array(image.width * image.height * image.components); 586 | image.pixelData.set(new Uint16Array(charLS.HEAP16.buffer, imagePtr, image.pixelData.length)); 587 | } 588 | 589 | // free memory and return image object 590 | charLS._free(dataPtr); 591 | charLS._free(imagePtr); 592 | charLS._free(imagePtrPtr); 593 | charLS._free(imageSizePtr); 594 | charLS._free(widthPtr); 595 | charLS._free(heightPtr); 596 | charLS._free(bitsPerSamplePtr); 597 | charLS._free(stridePtr); 598 | charLS._free(componentsPtr); 599 | charLS._free(interleaveModePtr); 600 | 601 | return image; 602 | } 603 | 604 | function initializeJPEGLS() { 605 | // check to make sure codec is loaded 606 | if (typeof CharLS === 'undefined') { 607 | throw new Error('No JPEG-LS decoder loaded'); 608 | } 609 | 610 | // Try to initialize CharLS 611 | // CharLS https://github.com/cornerstonejs/charls 612 | if (!charLS) { 613 | charLS = CharLS(); 614 | if (!charLS || !charLS._jpegls_decode) { 615 | throw new Error('JPEG-LS failed to initialize'); 616 | } 617 | } 618 | } 619 | 620 | function decodeJPEGLS(imageFrame, pixelData) { 621 | initializeJPEGLS(); 622 | 623 | var image = jpegLSDecode(pixelData, imageFrame.pixelRepresentation === 1); 624 | 625 | // throw error if not success or too much data 626 | if (image.result !== 0 && image.result !== 6) { 627 | throw new Error('JPEG-LS decoder failed to decode frame (error code ' + image.result + ')'); 628 | } 629 | 630 | imageFrame.columns = image.width; 631 | imageFrame.rows = image.height; 632 | imageFrame.pixelData = image.pixelData; 633 | 634 | return imageFrame; 635 | } 636 | 637 | exports.default = decodeJPEGLS; 638 | exports.initializeJPEGLS = initializeJPEGLS; 639 | 640 | /***/ }), 641 | 642 | /***/ "./shared/decoders/decodeJPEGLossless.js": 643 | /*!***********************************************!*\ 644 | !*** ./shared/decoders/decodeJPEGLossless.js ***! 645 | \***********************************************/ 646 | /*! no static exports found */ 647 | /***/ (function(module, exports, __webpack_require__) { 648 | 649 | "use strict"; 650 | 651 | 652 | Object.defineProperty(exports, "__esModule", { 653 | value: true 654 | }); 655 | 656 | 657 | function decodeJPEGLossless(imageFrame, pixelData) { 658 | // check to make sure codec is loaded 659 | if (typeof jpeg === 'undefined' || typeof jpeg.lossless === 'undefined' || typeof jpeg.lossless.Decoder === 'undefined') { 660 | throw new Error('No JPEG Lossless decoder loaded'); 661 | } 662 | 663 | var byteOutput = imageFrame.bitsAllocated <= 8 ? 1 : 2; 664 | // console.time('jpeglossless'); 665 | var buffer = pixelData.buffer; 666 | var decoder = new jpeg.lossless.Decoder(); 667 | var decompressedData = decoder.decode(buffer, pixelData.byteOffset, pixelData.length, byteOutput); 668 | // console.timeEnd('jpeglossless'); 669 | 670 | if (imageFrame.pixelRepresentation === 0) { 671 | if (imageFrame.bitsAllocated === 16) { 672 | imageFrame.pixelData = new Uint16Array(decompressedData.buffer); 673 | 674 | return imageFrame; 675 | } 676 | // untested! 677 | imageFrame.pixelData = new Uint8Array(decompressedData.buffer); 678 | 679 | return imageFrame; 680 | } 681 | imageFrame.pixelData = new Int16Array(decompressedData.buffer); 682 | 683 | return imageFrame; 684 | } 685 | 686 | exports.default = decodeJPEGLossless; 687 | 688 | /***/ }), 689 | 690 | /***/ "./shared/decoders/decodeLittleEndian.js": 691 | /*!***********************************************!*\ 692 | !*** ./shared/decoders/decodeLittleEndian.js ***! 693 | \***********************************************/ 694 | /*! no static exports found */ 695 | /***/ (function(module, exports, __webpack_require__) { 696 | 697 | "use strict"; 698 | 699 | 700 | Object.defineProperty(exports, "__esModule", { 701 | value: true 702 | }); 703 | function decodeLittleEndian(imageFrame, pixelData) { 704 | var arrayBuffer = pixelData.buffer; 705 | var offset = pixelData.byteOffset; 706 | var length = pixelData.length; 707 | 708 | if (imageFrame.bitsAllocated === 16) { 709 | // if pixel data is not aligned on even boundary, shift it so we can create the 16 bit array 710 | // buffers on it 711 | if (offset % 2) { 712 | arrayBuffer = arrayBuffer.slice(offset); 713 | offset = 0; 714 | } 715 | 716 | if (imageFrame.pixelRepresentation === 0) { 717 | imageFrame.pixelData = new Uint16Array(arrayBuffer, offset, length / 2); 718 | } else { 719 | imageFrame.pixelData = new Int16Array(arrayBuffer, offset, length / 2); 720 | } 721 | } else if (imageFrame.bitsAllocated === 8 || imageFrame.bitsAllocated === 1) { 722 | imageFrame.pixelData = pixelData; 723 | } else if (imageFrame.bitsAllocated === 32) { 724 | // if pixel data is not aligned on even boundary, shift it 725 | if (offset % 2) { 726 | arrayBuffer = arrayBuffer.slice(offset); 727 | offset = 0; 728 | } 729 | 730 | imageFrame.pixelData = new Float32Array(arrayBuffer, offset, length / 4); 731 | } 732 | 733 | return imageFrame; 734 | } 735 | 736 | exports.default = decodeLittleEndian; 737 | 738 | /***/ }), 739 | 740 | /***/ "./shared/decoders/decodeRLE.js": 741 | /*!**************************************!*\ 742 | !*** ./shared/decoders/decodeRLE.js ***! 743 | \**************************************/ 744 | /*! no static exports found */ 745 | /***/ (function(module, exports, __webpack_require__) { 746 | 747 | "use strict"; 748 | 749 | 750 | Object.defineProperty(exports, "__esModule", { 751 | value: true 752 | }); 753 | function decodeRLE(imageFrame, pixelData) { 754 | if (imageFrame.bitsAllocated === 8) { 755 | if (imageFrame.planarConfiguration) { 756 | return decode8Planar(imageFrame, pixelData); 757 | } 758 | 759 | return decode8(imageFrame, pixelData); 760 | } else if (imageFrame.bitsAllocated === 16) { 761 | return decode16(imageFrame, pixelData); 762 | } 763 | 764 | throw new Error('unsupported pixel format for RLE'); 765 | } 766 | 767 | function decode8(imageFrame, pixelData) { 768 | var frameData = pixelData; 769 | var frameSize = imageFrame.rows * imageFrame.columns; 770 | var outFrame = new ArrayBuffer(frameSize * imageFrame.samplesPerPixel); 771 | var header = new DataView(frameData.buffer, frameData.byteOffset); 772 | var data = new Int8Array(frameData.buffer, frameData.byteOffset); 773 | var out = new Int8Array(outFrame); 774 | 775 | var outIndex = 0; 776 | var numSegments = header.getInt32(0, true); 777 | 778 | for (var s = 0; s < numSegments; ++s) { 779 | outIndex = s; 780 | 781 | var inIndex = header.getInt32((s + 1) * 4, true); 782 | var maxIndex = header.getInt32((s + 2) * 4, true); 783 | 784 | if (maxIndex === 0) { 785 | maxIndex = frameData.length; 786 | } 787 | 788 | var endOfSegment = frameSize * numSegments; 789 | 790 | while (inIndex < maxIndex) { 791 | var n = data[inIndex++]; 792 | 793 | if (n >= 0 && n <= 127) { 794 | // copy n bytes 795 | for (var i = 0; i < n + 1 && outIndex < endOfSegment; ++i) { 796 | out[outIndex] = data[inIndex++]; 797 | outIndex += imageFrame.samplesPerPixel; 798 | } 799 | } else if (n <= -1 && n >= -127) { 800 | var value = data[inIndex++]; 801 | // run of n bytes 802 | 803 | for (var j = 0; j < -n + 1 && outIndex < endOfSegment; ++j) { 804 | out[outIndex] = value; 805 | outIndex += imageFrame.samplesPerPixel; 806 | } 807 | } /* else if (n === -128) { 808 | } // do nothing */ 809 | } 810 | } 811 | imageFrame.pixelData = new Uint8Array(outFrame); 812 | 813 | return imageFrame; 814 | } 815 | 816 | function decode8Planar(imageFrame, pixelData) { 817 | var frameData = pixelData; 818 | var frameSize = imageFrame.rows * imageFrame.columns; 819 | var outFrame = new ArrayBuffer(frameSize * imageFrame.samplesPerPixel); 820 | var header = new DataView(frameData.buffer, frameData.byteOffset); 821 | var data = new Int8Array(frameData.buffer, frameData.byteOffset); 822 | var out = new Int8Array(outFrame); 823 | 824 | var outIndex = 0; 825 | var numSegments = header.getInt32(0, true); 826 | 827 | for (var s = 0; s < numSegments; ++s) { 828 | outIndex = s * frameSize; 829 | 830 | var inIndex = header.getInt32((s + 1) * 4, true); 831 | var maxIndex = header.getInt32((s + 2) * 4, true); 832 | 833 | if (maxIndex === 0) { 834 | maxIndex = frameData.length; 835 | } 836 | 837 | var endOfSegment = frameSize * numSegments; 838 | 839 | while (inIndex < maxIndex) { 840 | var n = data[inIndex++]; 841 | 842 | if (n >= 0 && n <= 127) { 843 | // copy n bytes 844 | for (var i = 0; i < n + 1 && outIndex < endOfSegment; ++i) { 845 | out[outIndex] = data[inIndex++]; 846 | outIndex++; 847 | } 848 | } else if (n <= -1 && n >= -127) { 849 | var value = data[inIndex++]; 850 | // run of n bytes 851 | 852 | for (var j = 0; j < -n + 1 && outIndex < endOfSegment; ++j) { 853 | out[outIndex] = value; 854 | outIndex++; 855 | } 856 | } /* else if (n === -128) { 857 | } // do nothing */ 858 | } 859 | } 860 | imageFrame.pixelData = new Uint8Array(outFrame); 861 | 862 | return imageFrame; 863 | } 864 | 865 | function decode16(imageFrame, pixelData) { 866 | var frameData = pixelData; 867 | var frameSize = imageFrame.rows * imageFrame.columns; 868 | var outFrame = new ArrayBuffer(frameSize * imageFrame.samplesPerPixel * 2); 869 | 870 | var header = new DataView(frameData.buffer, frameData.byteOffset); 871 | var data = new Int8Array(frameData.buffer, frameData.byteOffset); 872 | var out = new Int8Array(outFrame); 873 | 874 | var numSegments = header.getInt32(0, true); 875 | 876 | for (var s = 0; s < numSegments; ++s) { 877 | var outIndex = 0; 878 | var highByte = s === 0 ? 1 : 0; 879 | 880 | var inIndex = header.getInt32((s + 1) * 4, true); 881 | var maxIndex = header.getInt32((s + 2) * 4, true); 882 | 883 | if (maxIndex === 0) { 884 | maxIndex = frameData.length; 885 | } 886 | 887 | while (inIndex < maxIndex) { 888 | var n = data[inIndex++]; 889 | 890 | if (n >= 0 && n <= 127) { 891 | for (var i = 0; i < n + 1 && outIndex < frameSize; ++i) { 892 | out[outIndex * 2 + highByte] = data[inIndex++]; 893 | outIndex++; 894 | } 895 | } else if (n <= -1 && n >= -127) { 896 | var value = data[inIndex++]; 897 | 898 | for (var j = 0; j < -n + 1 && outIndex < frameSize; ++j) { 899 | out[outIndex * 2 + highByte] = value; 900 | outIndex++; 901 | } 902 | } /* else if (n === -128) { 903 | } // do nothing */ 904 | } 905 | } 906 | if (imageFrame.pixelRepresentation === 0) { 907 | imageFrame.pixelData = new Uint16Array(outFrame); 908 | } else { 909 | imageFrame.pixelData = new Int16Array(outFrame); 910 | } 911 | 912 | return imageFrame; 913 | } 914 | 915 | exports.default = decodeRLE; 916 | 917 | /***/ }), 918 | 919 | /***/ "./shared/getMinMax.js": 920 | /*!*****************************!*\ 921 | !*** ./shared/getMinMax.js ***! 922 | \*****************************/ 923 | /*! no static exports found */ 924 | /***/ (function(module, exports, __webpack_require__) { 925 | 926 | "use strict"; 927 | 928 | 929 | Object.defineProperty(exports, "__esModule", { 930 | value: true 931 | }); 932 | /** 933 | * Calculate the minimum and maximum values in an Array 934 | * 935 | * @param {Number[]} storedPixelData 936 | * @return {{min: Number, max: Number}} 937 | */ 938 | function getMinMax(storedPixelData) { 939 | // we always calculate the min max values since they are not always 940 | // present in DICOM and we don't want to trust them anyway as cornerstone 941 | // depends on us providing reliable values for these 942 | var min = storedPixelData[0]; 943 | var max = storedPixelData[0]; 944 | var storedPixel = void 0; 945 | var numPixels = storedPixelData.length; 946 | 947 | for (var index = 1; index < numPixels; index++) { 948 | storedPixel = storedPixelData[index]; 949 | min = Math.min(min, storedPixel); 950 | max = Math.max(max, storedPixel); 951 | } 952 | 953 | return { 954 | min: min, 955 | max: max 956 | }; 957 | } 958 | 959 | exports.default = getMinMax; 960 | 961 | /***/ }), 962 | 963 | /***/ "./version.js": 964 | /*!********************!*\ 965 | !*** ./version.js ***! 966 | \********************/ 967 | /*! no static exports found */ 968 | /***/ (function(module, exports, __webpack_require__) { 969 | 970 | "use strict"; 971 | 972 | 973 | Object.defineProperty(exports, "__esModule", { 974 | value: true 975 | }); 976 | exports.default = '2.1.1'; 977 | 978 | /***/ }), 979 | 980 | /***/ "./webWorker/decodeTask/decodeTask.js": 981 | /*!********************************************!*\ 982 | !*** ./webWorker/decodeTask/decodeTask.js ***! 983 | \********************************************/ 984 | /*! no static exports found */ 985 | /***/ (function(module, exports, __webpack_require__) { 986 | 987 | "use strict"; 988 | 989 | 990 | Object.defineProperty(exports, "__esModule", { 991 | value: true 992 | }); 993 | 994 | var _decodeJPEG = __webpack_require__(/*! ../../shared/decoders/decodeJPEG2000.js */ "./shared/decoders/decodeJPEG2000.js"); 995 | 996 | var _decodeJPEGLS = __webpack_require__(/*! ../../shared/decoders/decodeJPEGLS.js */ "./shared/decoders/decodeJPEGLS.js"); 997 | 998 | var _calculateMinMax = __webpack_require__(/*! ../../shared/calculateMinMax.js */ "./shared/calculateMinMax.js"); 999 | 1000 | var _calculateMinMax2 = _interopRequireDefault(_calculateMinMax); 1001 | 1002 | var _decodeImageFrame = __webpack_require__(/*! ../../shared/decodeImageFrame.js */ "./shared/decodeImageFrame.js"); 1003 | 1004 | var _decodeImageFrame2 = _interopRequireDefault(_decodeImageFrame); 1005 | 1006 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 1007 | 1008 | // flag to ensure codecs are loaded only once 1009 | var codecsLoaded = false; 1010 | 1011 | // the configuration object for the decodeTask 1012 | var decodeConfig = void 0; 1013 | 1014 | /** 1015 | * Function to control loading and initializing the codecs 1016 | * @param config 1017 | */ 1018 | function loadCodecs(config) { 1019 | // prevent loading codecs more than once 1020 | if (codecsLoaded) { 1021 | return; 1022 | } 1023 | 1024 | // Load the codecs 1025 | // console.time('loadCodecs'); 1026 | self.importScripts(config.decodeTask.codecsPath); 1027 | codecsLoaded = true; 1028 | // console.timeEnd('loadCodecs'); 1029 | 1030 | // Initialize the codecs 1031 | if (config.decodeTask.initializeCodecsOnStartup) { 1032 | // console.time('initializeCodecs'); 1033 | (0, _decodeJPEG.initializeJPEG2000)(config.decodeTask); 1034 | (0, _decodeJPEGLS.initializeJPEGLS)(config.decodeTask); 1035 | // console.timeEnd('initializeCodecs'); 1036 | } 1037 | } 1038 | 1039 | /** 1040 | * Task initialization function 1041 | */ 1042 | function initialize(config) { 1043 | decodeConfig = config; 1044 | if (config.decodeTask.loadCodecsOnStartup) { 1045 | loadCodecs(config); 1046 | } 1047 | } 1048 | 1049 | /** 1050 | * Task handler function 1051 | */ 1052 | function handler(data, doneCallback) { 1053 | // Load the codecs if they aren't already loaded 1054 | loadCodecs(decodeConfig); 1055 | 1056 | var strict = decodeConfig && decodeConfig.decodeTask && decodeConfig.decodeTask.strict; 1057 | var imageFrame = data.data.imageFrame; 1058 | 1059 | // convert pixel data from ArrayBuffer to Uint8Array since web workers support passing ArrayBuffers but 1060 | // not typed arrays 1061 | var pixelData = new Uint8Array(data.data.pixelData); 1062 | 1063 | (0, _decodeImageFrame2.default)(imageFrame, data.data.transferSyntax, pixelData, decodeConfig.decodeTask, data.data.options); 1064 | 1065 | if (!imageFrame.pixelData) { 1066 | throw new Error('decodeTask: imageFrame.pixelData is undefined after decoding'); 1067 | } 1068 | 1069 | (0, _calculateMinMax2.default)(imageFrame, strict); 1070 | 1071 | // convert from TypedArray to ArrayBuffer since web workers support passing ArrayBuffers but not 1072 | // typed arrays 1073 | imageFrame.pixelData = imageFrame.pixelData.buffer; 1074 | 1075 | // invoke the callback with our result and pass the pixelData in the transferList to move it to 1076 | // UI thread without making a copy 1077 | doneCallback(imageFrame, [imageFrame.pixelData]); 1078 | } 1079 | 1080 | exports.default = { 1081 | taskType: 'decodeTask', 1082 | handler: handler, 1083 | initialize: initialize 1084 | }; 1085 | 1086 | /***/ }), 1087 | 1088 | /***/ "./webWorker/index.js": 1089 | /*!****************************!*\ 1090 | !*** ./webWorker/index.js ***! 1091 | \****************************/ 1092 | /*! no static exports found */ 1093 | /***/ (function(module, exports, __webpack_require__) { 1094 | 1095 | "use strict"; 1096 | 1097 | 1098 | Object.defineProperty(exports, "__esModule", { 1099 | value: true 1100 | }); 1101 | exports.version = exports.registerTaskHandler = undefined; 1102 | 1103 | var _version = __webpack_require__(/*! ../version.js */ "./version.js"); 1104 | 1105 | Object.defineProperty(exports, 'version', { 1106 | enumerable: true, 1107 | get: function get() { 1108 | return _interopRequireDefault(_version).default; 1109 | } 1110 | }); 1111 | 1112 | var _webWorker = __webpack_require__(/*! ./webWorker.js */ "./webWorker/webWorker.js"); 1113 | 1114 | var _decodeTask = __webpack_require__(/*! ./decodeTask/decodeTask.js */ "./webWorker/decodeTask/decodeTask.js"); 1115 | 1116 | var _decodeTask2 = _interopRequireDefault(_decodeTask); 1117 | 1118 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 1119 | 1120 | // register our task 1121 | (0, _webWorker.registerTaskHandler)(_decodeTask2.default); 1122 | 1123 | exports.registerTaskHandler = _webWorker.registerTaskHandler; 1124 | 1125 | /***/ }), 1126 | 1127 | /***/ "./webWorker/webWorker.js": 1128 | /*!********************************!*\ 1129 | !*** ./webWorker/webWorker.js ***! 1130 | \********************************/ 1131 | /*! no static exports found */ 1132 | /***/ (function(module, exports, __webpack_require__) { 1133 | 1134 | "use strict"; 1135 | 1136 | 1137 | Object.defineProperty(exports, "__esModule", { 1138 | value: true 1139 | }); 1140 | exports.registerTaskHandler = registerTaskHandler; 1141 | // an object of task handlers 1142 | var taskHandlers = {}; 1143 | 1144 | // Flag to ensure web worker is only initialized once 1145 | var initialized = false; 1146 | 1147 | // the configuration object passed in when the web worker manager is initialized 1148 | var config = void 0; 1149 | 1150 | /** 1151 | * Initialization function that loads additional web workers and initializes them 1152 | * @param data 1153 | */ 1154 | function initialize(data) { 1155 | // console.log('web worker initialize ', data.workerIndex); 1156 | // prevent initialization from happening more than once 1157 | if (initialized) { 1158 | return; 1159 | } 1160 | 1161 | // save the config data 1162 | config = data.config; 1163 | 1164 | // load any additional web worker tasks 1165 | if (data.config.webWorkerTaskPaths) { 1166 | for (var i = 0; i < data.config.webWorkerTaskPaths.length; i++) { 1167 | self.importScripts(data.config.webWorkerTaskPaths[i]); 1168 | } 1169 | } 1170 | 1171 | // initialize each task handler 1172 | Object.keys(taskHandlers).forEach(function (key) { 1173 | taskHandlers[key].initialize(config.taskConfiguration); 1174 | }); 1175 | 1176 | // tell main ui thread that we have completed initialization 1177 | self.postMessage({ 1178 | taskType: 'initialize', 1179 | status: 'success', 1180 | result: {}, 1181 | workerIndex: data.workerIndex 1182 | }); 1183 | 1184 | initialized = true; 1185 | } 1186 | 1187 | /** 1188 | * Function exposed to web worker tasks to register themselves 1189 | * @param taskHandler 1190 | */ 1191 | function registerTaskHandler(taskHandler) { 1192 | if (taskHandlers[taskHandler.taskType]) { 1193 | console.log('attempt to register duplicate task handler "', taskHandler.taskType, '"'); 1194 | 1195 | return false; 1196 | } 1197 | taskHandlers[taskHandler.taskType] = taskHandler; 1198 | if (initialized) { 1199 | taskHandler.initialize(config.taskConfiguration); 1200 | } 1201 | } 1202 | 1203 | /** 1204 | * Function to load a new web worker task with updated configuration 1205 | * @param data 1206 | */ 1207 | function loadWebWorkerTask(data) { 1208 | config = data.config; 1209 | self.importScripts(data.sourcePath); 1210 | } 1211 | 1212 | /** 1213 | * Web worker message handler - dispatches messages to the registered task handlers 1214 | * @param msg 1215 | */ 1216 | self.onmessage = function (msg) { 1217 | // console.log('web worker onmessage', msg.data); 1218 | 1219 | // handle initialize message 1220 | if (msg.data.taskType === 'initialize') { 1221 | initialize(msg.data); 1222 | 1223 | return; 1224 | } 1225 | 1226 | // handle loadWebWorkerTask message 1227 | if (msg.data.taskType === 'loadWebWorkerTask') { 1228 | loadWebWorkerTask(msg.data); 1229 | 1230 | return; 1231 | } 1232 | 1233 | // dispatch the message if there is a handler registered for it 1234 | if (taskHandlers[msg.data.taskType]) { 1235 | taskHandlers[msg.data.taskType].handler(msg.data, function (result, transferList) { 1236 | self.postMessage({ 1237 | taskType: msg.data.taskType, 1238 | status: 'success', 1239 | result: result, 1240 | workerIndex: msg.data.workerIndex 1241 | }, transferList); 1242 | }); 1243 | 1244 | return; 1245 | } 1246 | 1247 | // not task handler registered - send a failure message back to ui thread 1248 | console.log('no task handler for ', msg.data.taskType); 1249 | console.log(taskHandlers); 1250 | self.postMessage({ 1251 | taskType: msg.data.taskType, 1252 | status: 'failed - no task handler registered', 1253 | workerIndex: msg.data.workerIndex 1254 | }); 1255 | }; 1256 | 1257 | /***/ }) 1258 | 1259 | /******/ }); 1260 | }); 1261 | //# sourceMappingURL=cornerstoneWADOImageLoaderWebWorker.js.map -------------------------------------------------------------------------------- /static/dist/cornerstoneWADOImageLoaderWebWorker.min.js: -------------------------------------------------------------------------------- 1 | /*! cornerstone-wado-image-loader - 2.1.1 - 2018-04-18 | (c) 2016 Chris Hafey | https://github.com/cornerstonejs/cornerstoneWADOImageLoader */ 2 | !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(e){var t={};function r(a){if(t[a])return t[a].exports;var n=t[a]={i:a,l:!1,exports:{}};return e[a].call(n.exports,n,n.exports,r),n.l=!0,n.exports}return r.m=e,r.c=t,r.d=function(e,t,a){r.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:a})},r.r=function(e){Object.defineProperty(e,"__esModule",{value:!0})},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=48)}([,function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){for(var t=e[0],r=e[0],a=void 0,n=e.length,i=1;i1&&(e.photometricInterpretation="RGB"),e}function i(e){if(!e.usePDFJS&&"undefined"==typeof OpenJPEG)throw new Error("OpenJPEG decoder not loaded");if(!(a||(a=OpenJPEG())&&a._jp2_decode))throw new Error("OpenJPEG failed to initialize")}t.default=function(e,t,r){var a=arguments.length>3&&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 "+a+", when 1 is expected");return e.columns=r.width,e.rows=r.height,e.pixelData=r.tiles[0].items,e}(e,t):n(e,t)},t.initializeJPEG2000=i},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a=void 0;function n(){if("undefined"==typeof CharLS)throw new Error("No JPEG-LS decoder loaded");if(!(a||(a=CharLS())&&a._jpegls_decode))throw new Error("JPEG-LS failed to initialize")}t.default=function(e,t){n();var r=function(e,t){var r=a._malloc(e.length);a.writeArrayToMemory(e,r);var n=a._malloc(4),i=a._malloc(4),o=a._malloc(4),l=a._malloc(4),s=a._malloc(4),f=a._malloc(4),u=a._malloc(4),d=a._malloc(4),c=a._malloc(4),p={result:a.ccall("jpegls_decode","number",["number","number","number","number","number","number","number","number","number","number","number"],[r,e.length,n,i,o,l,s,f,d,u,c]),width:a.getValue(o,"i32"),height:a.getValue(l,"i32"),bitsPerSample:a.getValue(s,"i32"),stride:a.getValue(f,"i32"),components:a.getValue(d,"i32"),allowedLossyError:a.getValue(u,"i32"),interleaveMode:a.getValue(c,"i32"),pixelData:void 0},m=a.getValue(n,"*");return p.bitsPerSample<=8?(p.pixelData=new Uint8Array(p.width*p.height*p.components),p.pixelData.set(new Uint8Array(a.HEAP8.buffer,m,p.pixelData.length))):t?(p.pixelData=new Int16Array(p.width*p.height*p.components),p.pixelData.set(new Int16Array(a.HEAP16.buffer,m,p.pixelData.length))):(p.pixelData=new Uint16Array(p.width*p.height*p.components),p.pixelData.set(new Uint16Array(a.HEAP16.buffer,m,p.pixelData.length))),a._free(r),a._free(m),a._free(n),a._free(i),a._free(o),a._free(l),a._free(s),a._free(f),a._free(d),a._free(c),p}(t,1===e.pixelRepresentation);if(0!==r.result&&6!==r.result)throw new Error("JPEG-LS decoder failed to decode frame (error code "+r.result+")");return e.columns=r.width,e.rows=r.height,e.pixelData=r.pixelData,e},t.initializeJPEGLS=n},,,,,function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default="2.1.1"},,function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],r=(0,i.default)(e.pixelData);!0===t?(e.smallestPixelValue!==r.min&&console.warn("Image smallestPixelValue tag is incorrect. Rendering performance will suffer considerably."),e.largestPixelValue!==r.max&&console.warn("Image largestPixelValue tag is incorrect. Rendering performance will suffer considerably.")):(e.smallestPixelValue=r.min,e.largestPixelValue=r.max)};var a,n=r(1),i=(a=n)&&a.__esModule?a:{default:a}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){if("undefined"==typeof jpeg||void 0===jpeg.lossless||void 0===jpeg.lossless.Decoder)throw new Error("No JPEG Lossless decoder loaded");var r=e.bitsAllocated<=8?1:2,a=t.buffer,n=(new jpeg.lossless.Decoder).decode(a,t.byteOffset,t.length,r);return 0===e.pixelRepresentation?16===e.bitsAllocated?(e.pixelData=new Uint16Array(n.buffer),e):(e.pixelData=new Uint8Array(n.buffer),e):(e.pixelData=new Int16Array(n.buffer),e)}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){if("undefined"==typeof JpegImage)throw new Error("No JPEG Baseline decoder loaded");var r=new JpegImage;return r.parse(t),r.colorTransform=!1,8===e.bitsAllocated?(e.pixelData=r.getData(e.columns,e.rows),e):16===e.bitsAllocated?(e.pixelData=r.getData16(e.columns,e.rows),e):void 0}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){if(8===e.bitsAllocated)return e.planarConfiguration?function(e,t){for(var r=t,a=e.rows*e.columns,n=new ArrayBuffer(a*e.samplesPerPixel),i=new DataView(r.buffer,r.byteOffset),o=new Int8Array(r.buffer,r.byteOffset),l=new Int8Array(n),s=0,f=i.getInt32(0,!0),u=0;u=0&&m<=127)for(var g=0;g=-127)for(var y=o[d++],b=0;b<1-m&&s=0&&m<=127)for(var g=0;g=-127)for(var y=o[d++],b=0;b<1-m&&s=0&&m<=127)for(var g=0;g=-127)for(var y=o[c++],b=0;b<1-m&&u>8&255}else 8===e.bitsAllocated&&(e.pixelData=t);var o;return e}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){var r=t.buffer,a=t.byteOffset,n=t.length;return 16===e.bitsAllocated?(a%2&&(r=r.slice(a),a=0),0===e.pixelRepresentation?e.pixelData=new Uint16Array(r,a,n/2):e.pixelData=new Int16Array(r,a,n/2)):8===e.bitsAllocated||1===e.bitsAllocated?e.pixelData=t:32===e.bitsAllocated&&(a%2&&(r=r.slice(a),a=0),e.pixelData=new Float32Array(r,a,n/4)),e}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a=u(r(15)),n=u(r(14)),i=u(r(13)),o=u(r(12)),l=u(r(11)),s=u(r(3)),f=u(r(2));function u(e){return e&&e.__esModule?e:{default:e}}t.default=function(e,t,r,u,d){var c=(new Date).getTime();if("1.2.840.10008.1.2"===t)e=(0,a.default)(e,r);else if("1.2.840.10008.1.2.1"===t)e=(0,a.default)(e,r);else if("1.2.840.10008.1.2.2"===t)e=(0,n.default)(e,r);else if("1.2.840.10008.1.2.1.99"===t)e=(0,a.default)(e,r);else if("1.2.840.10008.1.2.5"===t)e=(0,i.default)(e,r);else if("1.2.840.10008.1.2.4.50"===t)e=(0,o.default)(e,r);else if("1.2.840.10008.1.2.4.51"===t)e=(0,o.default)(e,r);else if("1.2.840.10008.1.2.4.57"===t)e=(0,l.default)(e,r);else if("1.2.840.10008.1.2.4.70"===t)e=(0,l.default)(e,r);else if("1.2.840.10008.1.2.4.80"===t)e=(0,s.default)(e,r);else if("1.2.840.10008.1.2.4.81"===t)e=(0,s.default)(e,r);else if("1.2.840.10008.1.2.4.90"===t)e=(0,f.default)(e,r,u,d);else{if("1.2.840.10008.1.2.4.91"!==t)throw new Error("no decoder for transfer syntax "+t);e=(0,f.default)(e,r,u,d)}var p=void 0!==e.pixelRepresentation&&1===e.pixelRepresentation,m=p&&void 0!==e.bitsStored?32-e.bitsStored:void 0;if(p&&void 0!==m)for(var g=0;g>m;var y=(new Date).getTime();return e.decodeTimeInMS=y-c,e}},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a=r(2),n=r(3),i=l(r(10)),o=l(r(16));function l(e){return e&&e.__esModule?e:{default:e}}var s=!1,f=void 0;function u(e){s||(self.importScripts(e.decodeTask.codecsPath),s=!0,e.decodeTask.initializeCodecsOnStartup&&((0,a.initializeJPEG2000)(e.decodeTask),(0,n.initializeJPEGLS)(e.decodeTask)))}t.default={taskType:"decodeTask",handler:function(e,t){u(f);var r=f&&f.decodeTask&&f.decodeTask.strict,a=e.data.imageFrame,n=new Uint8Array(e.data.pixelData);if((0,o.default)(a,e.data.transferSyntax,n,f.decodeTask,e.data.options),!a.pixelData)throw new Error("decodeTask: imageFrame.pixelData is undefined after decoding");(0,i.default)(a,r),a.pixelData=a.pixelData.buffer,t(a,[a.pixelData])},initialize:function(e){f=e,e.decodeTask.loadCodecsOnStartup&&u(e)}}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.registerTaskHandler=function(e){if(a[e.taskType])return console.log('attempt to register duplicate task handler "',e.taskType,'"'),!1;a[e.taskType]=e,n&&e.initialize(i.taskConfiguration)};var a={},n=!1,i=void 0;self.onmessage=function(e){var t;{if("initialize"!==e.data.taskType)return"loadWebWorkerTask"===e.data.taskType?(t=e.data,i=t.config,void self.importScripts(t.sourcePath)):void(a[e.data.taskType]?a[e.data.taskType].handler(e.data,function(t,r){self.postMessage({taskType:e.data.taskType,status:"success",result:t,workerIndex:e.data.workerIndex},r)}):(console.log("no task handler for ",e.data.taskType),console.log(a),self.postMessage({taskType:e.data.taskType,status:"failed - no task handler registered",workerIndex:e.data.workerIndex})));!function(e){if(!n){if(i=e.config,e.config.webWorkerTaskPaths)for(var t=0;t/src/$1' 12 | }, 13 | transform: { 14 | '^.+\\.js$': '/node_modules/babel-jest', 15 | '.*\\.(vue)$': '/node_modules/vue-jest' 16 | }, 17 | snapshotSerializers: ['/node_modules/jest-serializer-vue'], 18 | setupFiles: ['/test/unit/setup'], 19 | mapCoverage: true, 20 | coverageDirectory: '/test/unit/coverage', 21 | collectCoverageFrom: [ 22 | 'src/**/*.{js,vue}', 23 | '!src/main.js', 24 | '!src/router/index.js', 25 | '!**/node_modules/**' 26 | ] 27 | } 28 | -------------------------------------------------------------------------------- /test/unit/setup.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | 3 | Vue.config.productionTip = false 4 | -------------------------------------------------------------------------------- /test/unit/specs/HelloWorld.spec.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import HelloWorld from '@/components/HelloWorld' 3 | 4 | describe('HelloWorld.vue', () => { 5 | it('should render correct contents', () => { 6 | const Constructor = Vue.extend(HelloWorld) 7 | const vm = new Constructor().$mount() 8 | expect(vm.$el.querySelector('.hello h1').textContent) 9 | .toEqual('Welcome to Your Vue.js App') 10 | }) 11 | }) 12 | --------------------------------------------------------------------------------