├── .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 | 
29 |
30 | response(res):
31 | 
32 |
33 | 
34 |
35 | 
--------------------------------------------------------------------------------
/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 |
2 |
3 |
4 |
5 |
6 |
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 |
2 |
10 |
11 |
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 |
--------------------------------------------------------------------------------