module . exports =
/******/ ( function ( modules ) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = { } ;
/******/
/******/ // The require function
/******/ function _ _webpack _require _ _ ( moduleId ) {
/******/
/******/ // Check if module is in cache
/******/ if ( installedModules [ moduleId ] )
/******/ return installedModules [ moduleId ] . exports ;
/******/
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules [ moduleId ] = {
/******/ exports : { } ,
/******/ id : moduleId ,
/******/ loaded : false
/******/ } ;
/******/
/******/ // Execute the module function
/******/ modules [ moduleId ] . call ( module . exports , module , module . exports , _ _webpack _require _ _ ) ;
/******/
/******/ // Flag the module as loaded
/******/ module . loaded = true ;
/******/
/******/ // Return the exports of the module
/******/ return module . exports ;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ _ _webpack _require _ _ . m = modules ;
/******/
/******/ // expose the module cache
/******/ _ _webpack _require _ _ . c = installedModules ;
/******/
/******/ // __webpack_public_path__
/******/ _ _webpack _require _ _ . p = "/" ;
/******/
/******/ // Load entry module and return exports
/******/ return _ _webpack _require _ _ ( 0 ) ;
/******/ } )
/************************************************************************/
/******/ ( [
/* 0 */
/***/ function ( module , exports , _ _webpack _require _ _ ) {
module . exports = _ _webpack _require _ _ ( 1 ) ;
/***/ } ,
/* 1 */
/***/ function ( module , exports , _ _webpack _require _ _ ) {
'use strict' ;
Object . defineProperty ( exports , '__esModule' , {
value : true
} ) ;
function _interopRequireDefault ( obj ) { return obj && obj . _ _esModule ? obj : { 'default' : obj } ; }
var _typedefs = _ _webpack _require _ _ ( 2 ) ;
var _typedefs2 = _interopRequireDefault ( _typedefs ) ;
// eslint-disable-line no-unused-vars
var _image _wrapper = _ _webpack _require _ _ ( 3 ) ;
var _image _wrapper2 = _interopRequireDefault ( _image _wrapper ) ;
var _barcode _locator = _ _webpack _require _ _ ( 9 ) ;
var _barcode _locator2 = _interopRequireDefault ( _barcode _locator ) ;
var _barcode _decoder = _ _webpack _require _ _ ( 14 ) ;
var _barcode _decoder2 = _interopRequireDefault ( _barcode _decoder ) ;
var _config2 = _ _webpack _require _ _ ( 59 ) ;
var _config3 = _interopRequireDefault ( _config2 ) ;
var _events = _ _webpack _require _ _ ( 60 ) ;
var _events2 = _interopRequireDefault ( _events ) ;
var _camera _access = _ _webpack _require _ _ ( 61 ) ;
var _camera _access2 = _interopRequireDefault ( _camera _access ) ;
var _image _debug = _ _webpack _require _ _ ( 13 ) ;
var _image _debug2 = _interopRequireDefault ( _image _debug ) ;
var _glMatrix = _ _webpack _require _ _ ( 7 ) ;
var _result _collector = _ _webpack _require _ _ ( 62 ) ;
var _result _collector2 = _interopRequireDefault ( _result _collector ) ;
var merge = _ _webpack _require _ _ ( 26 ) ;
var InputStream = _ _webpack _require _ _ ( 63 ) ;
var FrameGrabber = _ _webpack _require _ _ ( 65 ) ;
var _inputStream ,
_framegrabber ,
_stopped ,
_canvasContainer = {
ctx : {
image : null ,
overlay : null
} ,
dom : {
image : null ,
overlay : null
}
} ,
_inputImageWrapper ,
_boxSize ,
_decoder ,
_workerPool = [ ] ,
_onUIThread = true ,
_resultCollector ,
_config = { } ;
function initializeData ( imageWrapper ) {
initBuffers ( imageWrapper ) ;
_decoder = _barcode _decoder2 [ 'default' ] . create ( _config . decoder , _inputImageWrapper ) ;
}
function initInputStream ( cb ) {
var video ;
if ( _config . inputStream . type === "VideoStream" ) {
video = document . createElement ( "video" ) ;
_inputStream = InputStream . createVideoStream ( video ) ;
} else if ( _config . inputStream . type === "ImageStream" ) {
_inputStream = InputStream . createImageStream ( ) ;
} else if ( _config . inputStream . type === "LiveStream" ) {
var $viewport = getViewPort ( _config ) ;
if ( $viewport ) {
video = $viewport . querySelector ( "video" ) ;
if ( ! video ) {
video = document . createElement ( "video" ) ;
$viewport . appendChild ( video ) ;
}
}
_inputStream = InputStream . createLiveStream ( video ) ;
_camera _access2 [ 'default' ] . request ( video , _config . inputStream . constraints , function ( err ) {
if ( ! err ) {
_inputStream . trigger ( "canrecord" ) ;
} else {
return cb ( err ) ;
}
} ) ;
}
_inputStream . setAttribute ( "preload" , "auto" ) ;
_inputStream . setAttribute ( "autoplay" , true ) ;
_inputStream . setInputStream ( _config . inputStream ) ;
_inputStream . addEventListener ( "canrecord" , canRecord . bind ( undefined , cb ) ) ;
}
function getViewPort ( _config ) {
var target = _config . inputStream . target ;
// Check if target is already a DOM element
if ( target && target . nodeName && target . nodeType === 1 ) {
return target ;
} else {
// Use '#interactive.viewport' as a fallback selector (backwards compatibility)
var selector = typeof target === 'string' ? target : '#interactive.viewport' ;
return document . querySelector ( selector ) ;
}
}
function canRecord ( cb ) {
_barcode _locator2 [ 'default' ] . checkImageConstraints ( _inputStream , _config . locator ) ;
initCanvas ( _config ) ;
_framegrabber = FrameGrabber . create ( _inputStream , _canvasContainer . dom . image ) ;
if ( _config . numOfWorkers > 0 ) {
initWorkers ( function ( ) {
console . log ( "Workers created" ) ;
ready ( cb ) ;
} ) ;
} else {
initializeData ( ) ;
ready ( cb ) ;
}
}
function ready ( cb ) {
_inputStream . play ( ) ;
cb ( ) ;
}
function initCanvas ( _config ) {
if ( typeof document !== "undefined" ) {
var $viewport = getViewPort ( _config ) ;
_canvasContainer . dom . image = document . querySelector ( "canvas.imgBuffer" ) ;
if ( ! _canvasContainer . dom . image ) {
_canvasContainer . dom . image = document . createElement ( "canvas" ) ;
_canvasContainer . dom . image . className = "imgBuffer" ;
if ( $viewport && _config . inputStream . type === "ImageStream" ) {
$viewport . appendChild ( _canvasContainer . dom . image ) ;
}
}
_canvasContainer . ctx . image = _canvasContainer . dom . image . getContext ( "2d" ) ;
_canvasContainer . dom . image . width = _inputStream . getCanvasSize ( ) . x ;
_canvasContainer . dom . image . height = _inputStream . getCanvasSize ( ) . y ;
_canvasContainer . dom . overlay = document . querySelector ( "canvas.drawingBuffer" ) ;
if ( ! _canvasContainer . dom . overlay ) {
_canvasContainer . dom . overlay = document . createElement ( "canvas" ) ;
_canvasContainer . dom . overlay . className = "drawingBuffer" ;
if ( $viewport ) {
$viewport . appendChild ( _canvasContainer . dom . overlay ) ;
}
var clearFix = document . createElement ( "br" ) ;
clearFix . setAttribute ( "clear" , "all" ) ;
if ( $viewport ) {
$viewport . appendChild ( clearFix ) ;
}
}
_canvasContainer . ctx . overlay = _canvasContainer . dom . overlay . getContext ( "2d" ) ;
_canvasContainer . dom . overlay . width = _inputStream . getCanvasSize ( ) . x ;
_canvasContainer . dom . overlay . height = _inputStream . getCanvasSize ( ) . y ;
}
}
function initBuffers ( imageWrapper ) {
if ( imageWrapper ) {
_inputImageWrapper = imageWrapper ;
} else {
_inputImageWrapper = new _image _wrapper2 [ 'default' ] ( {
x : _inputStream . getWidth ( ) ,
y : _inputStream . getHeight ( )
} ) ;
}
console . log ( _inputImageWrapper . size ) ;
_boxSize = [ _glMatrix . vec2 . clone ( [ 0 , 0 ] ) , _glMatrix . vec2 . clone ( [ 0 , _inputImageWrapper . size . y ] ) , _glMatrix . vec2 . clone ( [ _inputImageWrapper . size . x , _inputImageWrapper . size . y ] ) , _glMatrix . vec2 . clone ( [ _inputImageWrapper . size . x , 0 ] ) ] ;
_barcode _locator2 [ 'default' ] . init ( _inputImageWrapper , _config . locator ) ;
}
function getBoundingBoxes ( ) {
if ( _config . locate ) {
return _barcode _locator2 [ 'default' ] . locate ( ) ;
} else {
return [ [ _glMatrix . vec2 . clone ( _boxSize [ 0 ] ) , _glMatrix . vec2 . clone ( _boxSize [ 1 ] ) , _glMatrix . vec2 . clone ( _boxSize [ 2 ] ) , _glMatrix . vec2 . clone ( _boxSize [ 3 ] ) ] ] ;
}
}
function transformResult ( result ) {
var topRight = _inputStream . getTopRight ( ) ,
xOffset = topRight . x ,
yOffset = topRight . y ,
i ;
if ( ! result || xOffset === 0 && yOffset === 0 ) {
return ;
}
if ( result . line && result . line . length === 2 ) {
moveLine ( result . line ) ;
}
if ( result . boxes && result . boxes . length > 0 ) {
for ( i = 0 ; i < result . boxes . length ; i ++ ) {
moveBox ( result . boxes [ i ] ) ;
}
}
function moveBox ( box ) {
var corner = box . length ;
while ( corner -- ) {
box [ corner ] [ 0 ] += xOffset ;
box [ corner ] [ 1 ] += yOffset ;
}
}
function moveLine ( line ) {
line [ 0 ] . x += xOffset ;
line [ 0 ] . y += yOffset ;
line [ 1 ] . x += xOffset ;
line [ 1 ] . y += yOffset ;
}
}
function publishResult ( result , imageData ) {
if ( _onUIThread ) {
transformResult ( result ) ;
if ( imageData && result && result . codeResult ) {
if ( _resultCollector ) {
_resultCollector . addResult ( imageData , _inputStream . getCanvasSize ( ) , result . codeResult ) ;
}
}
}
_events2 [ 'default' ] . publish ( "processed" , result ) ;
if ( result && result . codeResult ) {
_events2 [ 'default' ] . publish ( "detected" , result ) ;
}
}
function locateAndDecode ( ) {
var result , boxes ;
boxes = getBoundingBoxes ( ) ;
if ( boxes ) {
result = _decoder . decodeFromBoundingBoxes ( boxes ) ;
result = result || { } ;
result . boxes = boxes ;
publishResult ( result , _inputImageWrapper . data ) ;
} else {
publishResult ( ) ;
}
}
function update ( ) {
var availableWorker ;
if ( _onUIThread ) {
if ( _workerPool . length > 0 ) {
availableWorker = _workerPool . filter ( function ( workerThread ) {
return ! workerThread . busy ;
} ) [ 0 ] ;
if ( availableWorker ) {
_framegrabber . attachData ( availableWorker . imageData ) ;
} else {
return ; // all workers are busy
}
} else {
_framegrabber . attachData ( _inputImageWrapper . data ) ;
}
if ( _framegrabber . grab ( ) ) {
if ( availableWorker ) {
availableWorker . busy = true ;
availableWorker . worker . postMessage ( {
cmd : 'process' ,
imageData : availableWorker . imageData
} , [ availableWorker . imageData . buffer ] ) ;
} else {
locateAndDecode ( ) ;
}
}
} else {
locateAndDecode ( ) ;
}
}
function _start ( ) {
_stopped = false ;
( function frame ( ) {
if ( ! _stopped ) {
update ( ) ;
if ( _onUIThread && _config . inputStream . type === "LiveStream" ) {
window . requestAnimFrame ( frame ) ;
}
}
} ) ( ) ;
}
function initWorkers ( cb ) {
var i ;
_workerPool = [ ] ;
for ( i = 0 ; i < _config . numOfWorkers ; i ++ ) {
initWorker ( workerInitialized ) ;
}
function workerInitialized ( workerThread ) {
_workerPool . push ( workerThread ) ;
if ( _workerPool . length >= _config . numOfWorkers ) {
cb ( ) ;
}
}
}
function initWorker ( cb ) {
var blobURL ,
workerThread = {
worker : undefined ,
imageData : new Uint8Array ( _inputStream . getWidth ( ) * _inputStream . getHeight ( ) ) ,
busy : true
} ;
blobURL = generateWorkerBlob ( ) ;
workerThread . worker = new Worker ( blobURL ) ;
workerThread . worker . onmessage = function ( e ) {
if ( e . data . event === 'initialized' ) {
URL . revokeObjectURL ( blobURL ) ;
workerThread . busy = false ;
workerThread . imageData = new Uint8Array ( e . data . imageData ) ;
console . log ( "Worker initialized" ) ;
return cb ( workerThread ) ;
} else if ( e . data . event === 'processed' ) {
workerThread . imageData = new Uint8Array ( e . data . imageData ) ;
workerThread . busy = false ;
publishResult ( e . data . result , workerThread . imageData ) ;
} else if ( e . data . event === 'error' ) {
console . log ( "Worker error: " + e . data . message ) ;
}
} ;
workerThread . worker . postMessage ( {
cmd : 'init' ,
size : { x : _inputStream . getWidth ( ) , y : _inputStream . getHeight ( ) } ,
imageData : workerThread . imageData ,
config : _config
} , [ workerThread . imageData . buffer ] ) ;
}
function workerInterface ( factory ) {
/* eslint-disable no-undef*/
if ( factory ) {
var Quagga = factory ( ) ;
if ( ! Quagga ) {
self . postMessage ( { 'event' : 'error' , message : 'Quagga could not be created' } ) ;
return ;
}
}
var imageWrapper ;
self . onmessage = function ( e ) {
if ( e . data . cmd === 'init' ) {
var config = e . data . config ;
config . numOfWorkers = 0 ;
imageWrapper = new Quagga . ImageWrapper ( {
x : e . data . size . x ,
y : e . data . size . y
} , new Uint8Array ( e . data . imageData ) ) ;
Quagga . init ( config , ready , imageWrapper ) ;
Quagga . onProcessed ( onProcessed ) ;
} else if ( e . data . cmd === 'process' ) {
imageWrapper . data = new Uint8Array ( e . data . imageData ) ;
Quagga . start ( ) ;
} else if ( e . data . cmd === 'setReaders' ) {
Quagga . setReaders ( e . data . readers ) ;
}
} ;
function onProcessed ( result ) {
self . postMessage ( {
'event' : 'processed' ,
imageData : imageWrapper . data ,
result : result
} , [ imageWrapper . data . buffer ] ) ;
}
function ready ( ) {
// eslint-disable-line
self . postMessage ( { 'event' : 'initialized' , imageData : imageWrapper . data } , [ imageWrapper . data . buffer ] ) ;
}
/* eslint-enable */
}
function generateWorkerBlob ( ) {
var blob , factorySource ;
/* jshint ignore:start */
if ( typeof _ _factorySource _ _ !== 'undefined' ) {
factorySource = _ _factorySource _ _ ; // eslint-disable-line no-undef
}
/* jshint ignore:end */
blob = new Blob ( [ '(' + workerInterface . toString ( ) + ')(' + factorySource + ');' ] , { type : 'text/javascript' } ) ;
return window . URL . createObjectURL ( blob ) ;
}
function _setReaders ( readers ) {
if ( _decoder ) {
_decoder . setReaders ( readers ) ;
} else if ( _onUIThread && _workerPool . length > 0 ) {
_workerPool . forEach ( function ( workerThread ) {
workerThread . worker . postMessage ( { cmd : 'setReaders' , readers : readers } ) ;
} ) ;
}
}
exports [ 'default' ] = {
init : function init ( config , cb , imageWrapper ) {
_config = merge ( { } , _config3 [ 'default' ] , config ) ;
if ( imageWrapper ) {
_onUIThread = false ;
initializeData ( imageWrapper ) ;
return cb ( ) ;
} else {
initInputStream ( cb ) ;
}
} ,
start : function start ( ) {
_start ( ) ;
} ,
stop : function stop ( ) {
_stopped = true ;
_workerPool . forEach ( function ( workerThread ) {
workerThread . worker . terminate ( ) ;
console . log ( "Worker terminated!" ) ;
} ) ;
_workerPool . length = 0 ;
if ( _config . inputStream . type === "LiveStream" ) {
_camera _access2 [ 'default' ] . release ( ) ;
_inputStream . clearEventHandlers ( ) ;
}
} ,
pause : function pause ( ) {
_stopped = true ;
} ,
onDetected : function onDetected ( callback ) {
_events2 [ 'default' ] . subscribe ( "detected" , callback ) ;
} ,
offDetected : function offDetected ( callback ) {
_events2 [ 'default' ] . unsubscribe ( "detected" , callback ) ;
} ,
onProcessed : function onProcessed ( callback ) {
_events2 [ 'default' ] . subscribe ( "processed" , callback ) ;
} ,
offProcessed : function offProcessed ( callback ) {
_events2 [ 'default' ] . unsubscribe ( "processed" , callback ) ;
} ,
setReaders : function setReaders ( readers ) {
_setReaders ( readers ) ;
} ,
registerResultCollector : function registerResultCollector ( resultCollector ) {
if ( resultCollector && typeof resultCollector . addResult === 'function' ) {
_resultCollector = resultCollector ;
}
} ,
canvas : _canvasContainer ,
decodeSingle : function decodeSingle ( config , resultCallback ) {
config = merge ( {
inputStream : {
type : "ImageStream" ,
sequence : false ,
size : 800 ,
src : config . src
} ,
numOfWorkers : 1 ,
locator : {
halfSample : false
}
} , config ) ;
this . init ( config , function ( ) {
_events2 [ 'default' ] . once ( "processed" , function ( result ) {
_stopped = true ;
resultCallback . call ( null , result ) ;
} , true ) ;
_start ( ) ;
} ) ;
} ,
ImageWrapper : _image _wrapper2 [ 'default' ] ,
ImageDebug : _image _debug2 [ 'default' ] ,
ResultCollector : _result _collector2 [ 'default' ]
} ;
module . exports = exports [ 'default' ] ;
/***/ } ,
/* 2 */
/***/ function ( module , exports ) {
/ *
* typedefs . js
* Normalizes browser - specific prefixes
* /
'use strict' ;
if ( typeof window !== 'undefined' ) {
window . requestAnimFrame = ( function ( ) {
return window . requestAnimationFrame || window . webkitRequestAnimationFrame || window . mozRequestAnimationFrame || window . oRequestAnimationFrame || window . msRequestAnimationFrame || function ( /* function FrameRequestCallback */ callback ) {
window . setTimeout ( callback , 1000 / 60 ) ;
} ;
} ) ( ) ;
navigator . getUserMedia = navigator . getUserMedia || navigator . webkitGetUserMedia || navigator . mozGetUserMedia || navigator . msGetUserMedia ;
window . URL = window . URL || window . webkitURL || window . mozURL || window . msURL ;
}
Math . imul = Math . imul || function ( a , b ) {
var ah = a >>> 16 & 0xffff ,
al = a & 0xffff ,
bh = b >>> 16 & 0xffff ,
bl = b & 0xffff ;
// the shift by 0 fixes the sign on the high part
// the final |0 converts the unsigned value into a signed value
return al * bl + ( ah * bl + al * bh << 16 >>> 0 ) | 0 ;
} ;
/***/ } ,
/* 3 */
/***/ function ( module , exports , _ _webpack _require _ _ ) {
'use strict' ;
Object . defineProperty ( exports , '__esModule' , {
value : true
} ) ;
function _interopRequireDefault ( obj ) { return obj && obj . _ _esModule ? obj : { 'default' : obj } ; }
var _subImage = _ _webpack _require _ _ ( 4 ) ;
var _subImage2 = _interopRequireDefault ( _subImage ) ;
var _cv _utils = _ _webpack _require _ _ ( 5 ) ;
var _cv _utils2 = _interopRequireDefault ( _cv _utils ) ;
var _array _helper = _ _webpack _require _ _ ( 8 ) ;
var _array _helper2 = _interopRequireDefault ( _array _helper ) ;
var _glMatrix = _ _webpack _require _ _ ( 7 ) ;
/ * *
* Represents a basic image combining the data and size .
* In addition , some methods for manipulation are contained .
* @ param size { x , y } The size of the image in pixel
* @ param data { Array } If given , a flat array containing the pixel data
* @ param ArrayType { Type } If given , the desired DataType of the Array ( may be typed / non - typed )
* @ param initialize { Boolean } Indicating if the array should be initialized on creation .
* @ returns { ImageWrapper }
* /
function ImageWrapper ( size , data , ArrayType , initialize ) {
if ( ! data ) {
if ( ArrayType ) {
this . data = new ArrayType ( size . x * size . y ) ;
if ( ArrayType === Array && initialize ) {
_array _helper2 [ 'default' ] . init ( this . data , 0 ) ;
}
} else {
this . data = new Uint8Array ( size . x * size . y ) ;
if ( Uint8Array === Array && initialize ) {
_array _helper2 [ 'default' ] . init ( this . data , 0 ) ;
}
}
} else {
this . data = data ;
}
this . size = size ;
}
/ * *
* tests if a position is within the image with a given offset
* @ param imgRef { x , y } The location to test
* @ param border Number the padding value in pixel
* @ returns { Boolean } true if location inside the image ' s border , false otherwise
* @ see cvd / image . h
* /
ImageWrapper . prototype . inImageWithBorder = function ( imgRef , border ) {
return imgRef . x >= border && imgRef . y >= border && imgRef . x < this . size . x - border && imgRef . y < this . size . y - border ;
} ;
/ * *
* Performs bilinear sampling
* @ param inImg Image to extract sample from
* @ param x the x - coordinate
* @ param y the y - coordinate
* @ returns the sampled value
* @ see cvd / vision . h
* /
ImageWrapper . sample = function ( inImg , x , y ) {
var lx = Math . floor ( x ) ;
var ly = Math . floor ( y ) ;
var w = inImg . size . x ;
var base = ly * inImg . size . x + lx ;
var a = inImg . data [ base + 0 ] ;
var b = inImg . data [ base + 1 ] ;
var c = inImg . data [ base + w ] ;
var d = inImg . data [ base + w + 1 ] ;
var e = a - b ;
x -= lx ;
y -= ly ;
var result = Math . floor ( x * ( y * ( e - c + d ) - e ) + y * ( c - a ) + a ) ;
return result ;
} ;
/ * *
* Initializes a given array . Sets each element to zero .
* @ param array { Array } The array to initialize
* /
ImageWrapper . clearArray = function ( array ) {
var l = array . length ;
while ( l -- ) {
array [ l ] = 0 ;
}
} ;
/ * *
* Creates a { SubImage } from the current image ( { this } ) .
* @ param from { ImageRef } The position where to start the { SubImage } from . ( top - left corner )
* @ param size { ImageRef } The size of the resulting image
* @ returns { SubImage } A shared part of the original image
* /
ImageWrapper . prototype . subImage = function ( from , size ) {
return new _subImage2 [ 'default' ] ( from , size , this ) ;
} ;
/ * *
* Creates an { ImageWrapper ) and copies the needed underlying image - data area
* @ param imageWrapper { ImageWrapper } The target { ImageWrapper } where the data should be copied
* @ param from { ImageRef } The location where to copy from ( top - left location )
* /
ImageWrapper . prototype . subImageAsCopy = function ( imageWrapper , from ) {
var sizeY = imageWrapper . size . y ,
sizeX = imageWrapper . size . x ;
var x , y ;
for ( x = 0 ; x < sizeX ; x ++ ) {
for ( y = 0 ; y < sizeY ; y ++ ) {
imageWrapper . data [ y * sizeX + x ] = this . data [ ( from . y + y ) * this . size . x + from . x + x ] ;
}
}
} ;
ImageWrapper . prototype . copyTo = function ( imageWrapper ) {
var length = this . data . length ,
srcData = this . data ,
dstData = imageWrapper . data ;
while ( length -- ) {
dstData [ length ] = srcData [ length ] ;
}
} ;
/ * *
* Retrieves a given pixel position from the image
* @ param x { Number } The x - position
* @ param y { Number } The y - position
* @ returns { Number } The grayscale value at the pixel - position
* /
ImageWrapper . prototype . get = function ( x , y ) {
return this . data [ y * this . size . x + x ] ;
} ;
/ * *
* Retrieves a given pixel position from the image
* @ param x { Number } The x - position
* @ param y { Number } The y - position
* @ returns { Number } The grayscale value at the pixel - position
* /
ImageWrapper . prototype . getSafe = function ( x , y ) {
var i ;
if ( ! this . indexMapping ) {
this . indexMapping = {
x : [ ] ,
y : [ ]
} ;
for ( i = 0 ; i < this . size . x ; i ++ ) {
this . indexMapping . x [ i ] = i ;
this . indexMapping . x [ i + this . size . x ] = i ;
}
for ( i = 0 ; i < this . size . y ; i ++ ) {
this . indexMapping . y [ i ] = i ;
this . indexMapping . y [ i + this . size . y ] = i ;
}
}
return this . data [ this . indexMapping . y [ y + this . size . y ] * this . size . x + this . indexMapping . x [ x + this . size . x ] ] ;
} ;
/ * *
* Sets a given pixel position in the image
* @ param x { Number } The x - position
* @ param y { Number } The y - position
* @ param value { Number } The grayscale value to set
* @ returns { ImageWrapper } The Image itself ( for possible chaining )
* /
ImageWrapper . prototype . set = function ( x , y , value ) {
this . data [ y * this . size . x + x ] = value ;
return this ;
} ;
/ * *
* Sets the border of the image ( 1 pixel ) to zero
* /
ImageWrapper . prototype . zeroBorder = function ( ) {
var i ,
width = this . size . x ,
height = this . size . y ,
data = this . data ;
for ( i = 0 ; i < width ; i ++ ) {
data [ i ] = data [ ( height - 1 ) * width + i ] = 0 ;
}
for ( i = 1 ; i < height - 1 ; i ++ ) {
data [ i * width ] = data [ i * width + ( width - 1 ) ] = 0 ;
}
} ;
/ * *
* Inverts a binary image in place
* /
ImageWrapper . prototype . invert = function ( ) {
var data = this . data ,
length = data . length ;
while ( length -- ) {
data [ length ] = data [ length ] ? 0 : 1 ;
}
} ;
ImageWrapper . prototype . convolve = function ( kernel ) {
var x ,
y ,
kx ,
ky ,
kSize = kernel . length / 2 | 0 ,
accu = 0 ;
for ( y = 0 ; y < this . size . y ; y ++ ) {
for ( x = 0 ; x < this . size . x ; x ++ ) {
accu = 0 ;
for ( ky = - kSize ; ky <= kSize ; ky ++ ) {
for ( kx = - kSize ; kx <= kSize ; kx ++ ) {
accu += kernel [ ky + kSize ] [ kx + kSize ] * this . getSafe ( x + kx , y + ky ) ;
}
}
this . data [ y * this . size . x + x ] = accu ;
}
}
} ;
ImageWrapper . prototype . moments = function ( labelcount ) {
var data = this . data ,
x ,
y ,
height = this . size . y ,
width = this . size . x ,
val ,
ysq ,
labelsum = [ ] ,
i ,
label ,
mu11 ,
mu02 ,
mu20 ,
x _ ,
y _ ,
tmp ,
result = [ ] ,
PI = Math . PI ,
PI _4 = PI / 4 ;
if ( labelcount <= 0 ) {
return result ;
}
for ( i = 0 ; i < labelcount ; i ++ ) {
labelsum [ i ] = {
m00 : 0 ,
m01 : 0 ,
m10 : 0 ,
m11 : 0 ,
m02 : 0 ,
m20 : 0 ,
theta : 0 ,
rad : 0
} ;
}
for ( y = 0 ; y < height ; y ++ ) {
ysq = y * y ;
for ( x = 0 ; x < width ; x ++ ) {
val = data [ y * width + x ] ;
if ( val > 0 ) {
label = labelsum [ val - 1 ] ;
label . m00 += 1 ;
label . m01 += y ;
label . m10 += x ;
label . m11 += x * y ;
label . m02 += ysq ;
label . m20 += x * x ;
}
}
}
for ( i = 0 ; i < labelcount ; i ++ ) {
label = labelsum [ i ] ;
if ( ! isNaN ( label . m00 ) && label . m00 !== 0 ) {
x _ = label . m10 / label . m00 ;
y _ = label . m01 / label . m00 ;
mu11 = label . m11 / label . m00 - x _ * y _ ;
mu02 = label . m02 / label . m00 - y _ * y _ ;
mu20 = label . m20 / label . m00 - x _ * x _ ;
tmp = ( mu02 - mu20 ) / ( 2 * mu11 ) ;
tmp = 0.5 * Math . atan ( tmp ) + ( mu11 >= 0 ? PI _4 : - PI _4 ) + PI ;
label . theta = ( tmp * 180 / PI + 90 ) % 180 - 90 ;
if ( label . theta < 0 ) {
label . theta += 180 ;
}
label . rad = tmp > PI ? tmp - PI : tmp ;
label . vec = _glMatrix . vec2 . clone ( [ Math . cos ( tmp ) , Math . sin ( tmp ) ] ) ;
result . push ( label ) ;
}
}
return result ;
} ;
/ * *
* Displays the { ImageWrapper } in a given canvas
* @ param canvas { Canvas } The canvas element to write to
* @ param scale { Number } Scale which is applied to each pixel - value
* /
ImageWrapper . prototype . show = function ( canvas , scale ) {
var ctx , frame , data , current , pixel , x , y ;
if ( ! scale ) {
scale = 1.0 ;
}
ctx = canvas . getContext ( '2d' ) ;
canvas . width = this . size . x ;
canvas . height = this . size . y ;
frame = ctx . getImageData ( 0 , 0 , canvas . width , canvas . height ) ;
data = frame . data ;
current = 0 ;
for ( y = 0 ; y < this . size . y ; y ++ ) {
for ( x = 0 ; x < this . size . x ; x ++ ) {
pixel = y * this . size . x + x ;
current = this . get ( x , y ) * scale ;
data [ pixel * 4 + 0 ] = current ;
data [ pixel * 4 + 1 ] = current ;
data [ pixel * 4 + 2 ] = current ;
data [ pixel * 4 + 3 ] = 255 ;
}
}
//frame.data = data;
ctx . putImageData ( frame , 0 , 0 ) ;
} ;
/ * *
* Displays the { SubImage } in a given canvas
* @ param canvas { Canvas } The canvas element to write to
* @ param scale { Number } Scale which is applied to each pixel - value
* /
ImageWrapper . prototype . overlay = function ( canvas , scale , from ) {
if ( ! scale || scale < 0 || scale > 360 ) {
scale = 360 ;
}
var hsv = [ 0 , 1 , 1 ] ;
var rgb = [ 0 , 0 , 0 ] ;
var whiteRgb = [ 255 , 255 , 255 ] ;
var blackRgb = [ 0 , 0 , 0 ] ;
var result = [ ] ;
var ctx = canvas . getContext ( '2d' ) ;
var frame = ctx . getImageData ( from . x , from . y , this . size . x , this . size . y ) ;
var data = frame . data ;
var length = this . data . length ;
while ( length -- ) {
hsv [ 0 ] = this . data [ length ] * scale ;
result = hsv [ 0 ] <= 0 ? whiteRgb : hsv [ 0 ] >= 360 ? blackRgb : _cv _utils2 [ 'default' ] . hsv2rgb ( hsv , rgb ) ;
data [ length * 4 + 0 ] = result [ 0 ] ;
data [ length * 4 + 1 ] = result [ 1 ] ;
data [ length * 4 + 2 ] = result [ 2 ] ;
data [ length * 4 + 3 ] = 255 ;
}
ctx . putImageData ( frame , from . x , from . y ) ;
} ;
exports [ 'default' ] = ImageWrapper ;
module . exports = exports [ 'default' ] ;
/***/ } ,
/* 4 */
/***/ function ( module , exports ) {
/ * *
* Construct representing a part of another { ImageWrapper } . Shares data
* between the parent and the child .
* @ param from { ImageRef } The position where to start the { SubImage } from . ( top - left corner )
* @ param size { ImageRef } The size of the resulting image
* @ param I { ImageWrapper } The { ImageWrapper } to share from
* @ returns { SubImage } A shared part of the original image
* /
'use strict' ;
Object . defineProperty ( exports , '__esModule' , {
value : true
} ) ;
function SubImage ( from , size , I ) {
if ( ! I ) {
I = {
data : null ,
size : size
} ;
}
this . data = I . data ;
this . originalSize = I . size ;
this . I = I ;
this . from = from ;
this . size = size ;
}
/ * *
* Displays the { SubImage } in a given canvas
* @ param canvas { Canvas } The canvas element to write to
* @ param scale { Number } Scale which is applied to each pixel - value
* /
SubImage . prototype . show = function ( canvas , scale ) {
var ctx , frame , data , current , y , x , pixel ;
if ( ! scale ) {
scale = 1.0 ;
}
ctx = canvas . getContext ( '2d' ) ;
canvas . width = this . size . x ;
canvas . height = this . size . y ;
frame = ctx . getImageData ( 0 , 0 , canvas . width , canvas . height ) ;
data = frame . data ;
current = 0 ;
for ( y = 0 ; y < this . size . y ; y ++ ) {
for ( x = 0 ; x < this . size . x ; x ++ ) {
pixel = y * this . size . x + x ;
current = this . get ( x , y ) * scale ;
data [ pixel * 4 + 0 ] = current ;
data [ pixel * 4 + 1 ] = current ;
data [ pixel * 4 + 2 ] = current ;
data [ pixel * 4 + 3 ] = 255 ;
}
}
frame . data = data ;
ctx . putImageData ( frame , 0 , 0 ) ;
} ;
/ * *
* Retrieves a given pixel position from the { SubImage }
* @ param x { Number } The x - position
* @ param y { Number } The y - position
* @ returns { Number } The grayscale value at the pixel - position
* /
SubImage . prototype . get = function ( x , y ) {
return this . data [ ( this . from . y + y ) * this . originalSize . x + this . from . x + x ] ;
} ;
/ * *
* Updates the underlying data from a given { ImageWrapper }
* @ param image { ImageWrapper } The updated image
* /
SubImage . prototype . updateData = function ( image ) {
this . originalSize = image . size ;
this . data = image . data ;
} ;
/ * *
* Updates the position of the shared area
* @ param from { x , y } The new location
* @ returns { SubImage } returns { this } for possible chaining
* /
SubImage . prototype . updateFrom = function ( from ) {
this . from = from ;
return this ;
} ;
exports [ 'default' ] = SubImage ;
module . exports = exports [ 'default' ] ;
/***/ } ,
/* 5 */
/***/ function ( module , exports , _ _webpack _require _ _ ) {
'use strict' ;
Object . defineProperty ( exports , '__esModule' , {
value : true
} ) ;
function _interopRequireDefault ( obj ) { return obj && obj . _ _esModule ? obj : { 'default' : obj } ; }
var _cluster = _ _webpack _require _ _ ( 6 ) ;
var _cluster2 = _interopRequireDefault ( _cluster ) ;
var _array _helper = _ _webpack _require _ _ ( 8 ) ;
var _array _helper2 = _interopRequireDefault ( _array _helper ) ;
var _glMatrix = _ _webpack _require _ _ ( 7 ) ;
var CVUtils = { } ;
/ * *
* @ param x x - coordinate
* @ param y y - coordinate
* @ return ImageReference { x , y } Coordinate
* /
CVUtils . imageRef = function ( x , y ) {
var that = {
x : x ,
y : y ,
toVec2 : function toVec2 ( ) {
return _glMatrix . vec2 . clone ( [ this . x , this . y ] ) ;
} ,
toVec3 : function toVec3 ( ) {
return _glMatrix . vec3 . clone ( [ this . x , this . y , 1 ] ) ;
} ,
round : function round ( ) {
this . x = this . x > 0.0 ? Math . floor ( this . x + 0.5 ) : Math . floor ( this . x - 0.5 ) ;
this . y = this . y > 0.0 ? Math . floor ( this . y + 0.5 ) : Math . floor ( this . y - 0.5 ) ;
return this ;
}
} ;
return that ;
} ;
/ * *
* Computes an integral image of a given grayscale image .
* @ param imageDataContainer { ImageDataContainer } the image to be integrated
* /
CVUtils . computeIntegralImage2 = function ( imageWrapper , integralWrapper ) {
var imageData = imageWrapper . data ;
var width = imageWrapper . size . x ;
var height = imageWrapper . size . y ;
var integralImageData = integralWrapper . data ;
var sum = 0 ,
posA = 0 ,
posB = 0 ,
posC = 0 ,
posD = 0 ,
x ,
y ;
// sum up first column
posB = width ;
sum = 0 ;
for ( y = 1 ; y < height ; y ++ ) {
sum += imageData [ posA ] ;
integralImageData [ posB ] += sum ;
posA += width ;
posB += width ;
}
posA = 0 ;
posB = 1 ;
sum = 0 ;
for ( x = 1 ; x < width ; x ++ ) {
sum += imageData [ posA ] ;
integralImageData [ posB ] += sum ;
posA ++ ;
posB ++ ;
}
for ( y = 1 ; y < height ; y ++ ) {
posA = y * width + 1 ;
posB = ( y - 1 ) * width + 1 ;
posC = y * width ;
posD = ( y - 1 ) * width ;
for ( x = 1 ; x < width ; x ++ ) {
integralImageData [ posA ] += imageData [ posA ] + integralImageData [ posB ] + integralImageData [ posC ] - integralImageData [ posD ] ;
posA ++ ;
posB ++ ;
posC ++ ;
posD ++ ;
}
}
} ;
CVUtils . computeIntegralImage = function ( imageWrapper , integralWrapper ) {
var imageData = imageWrapper . data ;
var width = imageWrapper . size . x ;
var height = imageWrapper . size . y ;
var integralImageData = integralWrapper . data ;
var sum = 0 ;
// sum up first row
for ( var i = 0 ; i < width ; i ++ ) {
sum += imageData [ i ] ;
integralImageData [ i ] = sum ;
}
for ( var v = 1 ; v < height ; v ++ ) {
sum = 0 ;
for ( var u = 0 ; u < width ; u ++ ) {
sum += imageData [ v * width + u ] ;
integralImageData [ v * width + u ] = sum + integralImageData [ ( v - 1 ) * width + u ] ;
}
}
} ;
CVUtils . thresholdImage = function ( imageWrapper , threshold , targetWrapper ) {
if ( ! targetWrapper ) {
targetWrapper = imageWrapper ;
}
var imageData = imageWrapper . data ,
length = imageData . length ,
targetData = targetWrapper . data ;
while ( length -- ) {
targetData [ length ] = imageData [ length ] < threshold ? 1 : 0 ;
}
} ;
CVUtils . computeHistogram = function ( imageWrapper , bitsPerPixel ) {
if ( ! bitsPerPixel ) {
bitsPerPixel = 8 ;
}
var imageData = imageWrapper . data ,
length = imageData . length ,
bitShift = 8 - bitsPerPixel ,
bucketCnt = 1 << bitsPerPixel ,
hist = new Int32Array ( bucketCnt ) ;
while ( length -- ) {
hist [ imageData [ length ] >> bitShift ] ++ ;
}
return hist ;
} ;
CVUtils . sharpenLine = function ( line ) {
var i ,
length = line . length ,
left = line [ 0 ] ,
center = line [ 1 ] ,
right ;
for ( i = 1 ; i < length - 1 ; i ++ ) {
right = line [ i + 1 ] ;
// -1 4 -1 kernel
line [ i - 1 ] = center * 2 - left - right & 255 ;
left = center ;
center = right ;
}
return line ;
} ;
CVUtils . determineOtsuThreshold = function ( imageWrapper , bitsPerPixel ) {
if ( ! bitsPerPixel ) {
bitsPerPixel = 8 ;
}
var hist ,
threshold ,
bitShift = 8 - bitsPerPixel ;
function px ( init , end ) {
var sum = 0 ,
i ;
for ( i = init ; i <= end ; i ++ ) {
sum += hist [ i ] ;
}
return sum ;
}
function mx ( init , end ) {
var i ,
sum = 0 ;
for ( i = init ; i <= end ; i ++ ) {
sum += i * hist [ i ] ;
}
return sum ;
}
function determineThreshold ( ) {
var vet = [ 0 ] ,
p1 ,
p2 ,
p12 ,
k ,
m1 ,
m2 ,
m12 ,
max = ( 1 << bitsPerPixel ) - 1 ;
hist = CVUtils . computeHistogram ( imageWrapper , bitsPerPixel ) ;
for ( k = 1 ; k < max ; k ++ ) {
p1 = px ( 0 , k ) ;
p2 = px ( k + 1 , max ) ;
p12 = p1 * p2 ;
if ( p12 === 0 ) {
p12 = 1 ;
}
m1 = mx ( 0 , k ) * p2 ;
m2 = mx ( k + 1 , max ) * p1 ;
m12 = m1 - m2 ;
vet [ k ] = m12 * m12 / p12 ;
}
return _array _helper2 [ 'default' ] . maxIndex ( vet ) ;
}
threshold = determineThreshold ( ) ;
return threshold << bitShift ;
} ;
CVUtils . otsuThreshold = function ( imageWrapper , targetWrapper ) {
var threshold = CVUtils . determineOtsuThreshold ( imageWrapper ) ;
CVUtils . thresholdImage ( imageWrapper , threshold , targetWrapper ) ;
return threshold ;
} ;
// local thresholding
CVUtils . computeBinaryImage = function ( imageWrapper , integralWrapper , targetWrapper ) {
CVUtils . computeIntegralImage ( imageWrapper , integralWrapper ) ;
if ( ! targetWrapper ) {
targetWrapper = imageWrapper ;
}
var imageData = imageWrapper . data ;
var targetData = targetWrapper . data ;
var width = imageWrapper . size . x ;
var height = imageWrapper . size . y ;
var integralImageData = integralWrapper . data ;
var sum = 0 ,
v ,
u ,
kernel = 3 ,
A ,
B ,
C ,
D ,
avg ,
size = ( kernel * 2 + 1 ) * ( kernel * 2 + 1 ) ;
// clear out top & bottom-border
for ( v = 0 ; v <= kernel ; v ++ ) {
for ( u = 0 ; u < width ; u ++ ) {
targetData [ v * width + u ] = 0 ;
targetData [ ( height - 1 - v ) * width + u ] = 0 ;
}
}
// clear out left & right border
for ( v = kernel ; v < height - kernel ; v ++ ) {
for ( u = 0 ; u <= kernel ; u ++ ) {
targetData [ v * width + u ] = 0 ;
targetData [ v * width + ( width - 1 - u ) ] = 0 ;
}
}
for ( v = kernel + 1 ; v < height - kernel - 1 ; v ++ ) {
for ( u = kernel + 1 ; u < width - kernel ; u ++ ) {
A = integralImageData [ ( v - kernel - 1 ) * width + ( u - kernel - 1 ) ] ;
B = integralImageData [ ( v - kernel - 1 ) * width + ( u + kernel ) ] ;
C = integralImageData [ ( v + kernel ) * width + ( u - kernel - 1 ) ] ;
D = integralImageData [ ( v + kernel ) * width + ( u + kernel ) ] ;
sum = D - C - B + A ;
avg = sum / size ;
targetData [ v * width + u ] = imageData [ v * width + u ] > avg + 5 ? 0 : 1 ;
}
}
} ;
CVUtils . cluster = function ( points , threshold , property ) {
var i ,
k ,
cluster ,
point ,
clusters = [ ] ;
if ( ! property ) {
property = "rad" ;
}
function addToCluster ( newPoint ) {
var found = false ;
for ( k = 0 ; k < clusters . length ; k ++ ) {
cluster = clusters [ k ] ;
if ( cluster . fits ( newPoint ) ) {
cluster . add ( newPoint ) ;
found = true ;
}
}
return found ;
}
// iterate over each cloud
for ( i = 0 ; i < points . length ; i ++ ) {
point = _cluster2 [ 'default' ] . createPoint ( points [ i ] , i , property ) ;
if ( ! addToCluster ( point ) ) {
clusters . push ( _cluster2 [ 'default' ] . create ( point , threshold ) ) ;
}
}
return clusters ;
} ;
CVUtils . Tracer = {
trace : function trace ( points , vec ) {
var iteration ,
maxIterations = 10 ,
top = [ ] ,
result = [ ] ,
centerPos = 0 ,
currentPos = 0 ;
function trace ( idx , forward ) {
var from ,
to ,
toIdx ,
predictedPos ,
thresholdX = 1 ,
thresholdY = Math . abs ( vec [ 1 ] / 10 ) ,
found = false ;
function match ( pos , predicted ) {
if ( pos . x > predicted . x - thresholdX && pos . x < predicted . x + thresholdX && pos . y > predicted . y - thresholdY && pos . y < predicted . y + thresholdY ) {
return true ;
} else {
return false ;
}
}
// check if the next index is within the vec specifications
// if not, check as long as the threshold is met
from = points [ idx ] ;
if ( forward ) {
predictedPos = {
x : from . x + vec [ 0 ] ,
y : from . y + vec [ 1 ]
} ;
} else {
predictedPos = {
x : from . x - vec [ 0 ] ,
y : from . y - vec [ 1 ]
} ;
}
toIdx = forward ? idx + 1 : idx - 1 ;
to = points [ toIdx ] ;
while ( to && ( found = match ( to , predictedPos ) ) !== true && Math . abs ( to . y - from . y ) < vec [ 1 ] ) {
toIdx = forward ? toIdx + 1 : toIdx - 1 ;
to = points [ toIdx ] ;
}
return found ? toIdx : null ;
}
for ( iteration = 0 ; iteration < maxIterations ; iteration ++ ) {
// randomly select point to start with
centerPos = Math . floor ( Math . random ( ) * points . length ) ;
// trace forward
top = [ ] ;
currentPos = centerPos ;
top . push ( points [ currentPos ] ) ;
while ( ( currentPos = trace ( currentPos , true ) ) !== null ) {
top . push ( points [ currentPos ] ) ;
}
if ( centerPos > 0 ) {
currentPos = centerPos ;
while ( ( currentPos = trace ( currentPos , false ) ) !== null ) {
top . push ( points [ currentPos ] ) ;
}
}
if ( top . length > result . length ) {
result = top ;
}
}
return result ;
}
} ;
CVUtils . DILATE = 1 ;
CVUtils . ERODE = 2 ;
CVUtils . dilate = function ( inImageWrapper , outImageWrapper ) {
var v ,
u ,
inImageData = inImageWrapper . data ,
outImageData = outImageWrapper . data ,
height = inImageWrapper . size . y ,
width = inImageWrapper . size . x ,
sum ,
yStart1 ,
yStart2 ,
xStart1 ,
xStart2 ;
for ( v = 1 ; v < height - 1 ; v ++ ) {
for ( u = 1 ; u < width - 1 ; u ++ ) {
yStart1 = v - 1 ;
yStart2 = v + 1 ;
xStart1 = u - 1 ;
xStart2 = u + 1 ;
sum = inImageData [ yStart1 * width + xStart1 ] + inImageData [ yStart1 * width + xStart2 ] + inImageData [ v * width + u ] + inImageData [ yStart2 * width + xStart1 ] + inImageData [ yStart2 * width + xStart2 ] ;
outImageData [ v * width + u ] = sum > 0 ? 1 : 0 ;
}
}
} ;
CVUtils . erode = function ( inImageWrapper , outImageWrapper ) {
var v ,
u ,
inImageData = inImageWrapper . data ,
outImageData = outImageWrapper . data ,
height = inImageWrapper . size . y ,
width = inImageWrapper . size . x ,
sum ,
yStart1 ,
yStart2 ,
xStart1 ,
xStart2 ;
for ( v = 1 ; v < height - 1 ; v ++ ) {
for ( u = 1 ; u < width - 1 ; u ++ ) {
yStart1 = v - 1 ;
yStart2 = v + 1 ;
xStart1 = u - 1 ;
xStart2 = u + 1 ;
sum = inImageData [ yStart1 * width + xStart1 ] + inImageData [ yStart1 * width + xStart2 ] + inImageData [ v * width + u ] + inImageData [ yStart2 * width + xStart1 ] + inImageData [ yStart2 * width + xStart2 ] ;
outImageData [ v * width + u ] = sum === 5 ? 1 : 0 ;
}
}
} ;
CVUtils . subtract = function ( aImageWrapper , bImageWrapper , resultImageWrapper ) {
if ( ! resultImageWrapper ) {
resultImageWrapper = aImageWrapper ;
}
var length = aImageWrapper . data . length ,
aImageData = aImageWrapper . data ,
bImageData = bImageWrapper . data ,
cImageData = resultImageWrapper . data ;
while ( length -- ) {
cImageData [ length ] = aImageData [ length ] - bImageData [ length ] ;
}
} ;
CVUtils . bitwiseOr = function ( aImageWrapper , bImageWrapper , resultImageWrapper ) {
if ( ! resultImageWrapper ) {
resultImageWrapper = aImageWrapper ;
}
var length = aImageWrapper . data . length ,
aImageData = aImageWrapper . data ,
bImageData = bImageWrapper . data ,
cImageData = resultImageWrapper . data ;
while ( length -- ) {
cImageData [ length ] = aImageData [ length ] || bImageData [ length ] ;
}
} ;
CVUtils . countNonZero = function ( imageWrapper ) {
var length = imageWrapper . data . length ,
data = imageWrapper . data ,
sum = 0 ;
while ( length -- ) {
sum += data [ length ] ;
}
return sum ;
} ;
CVUtils . topGeneric = function ( list , top , scoreFunc ) {
var i ,
minIdx = 0 ,
min = 0 ,
queue = [ ] ,
score ,
hit ,
pos ;
for ( i = 0 ; i < top ; i ++ ) {
queue [ i ] = {
score : 0 ,
item : null
} ;
}
for ( i = 0 ; i < list . length ; i ++ ) {
score = scoreFunc . apply ( this , [ list [ i ] ] ) ;
if ( score > min ) {
hit = queue [ minIdx ] ;
hit . score = score ;
hit . item = list [ i ] ;
min = Number . MAX _VALUE ;
for ( pos = 0 ; pos < top ; pos ++ ) {
if ( queue [ pos ] . score < min ) {
min = queue [ pos ] . score ;
minIdx = pos ;
}
}
}
}
return queue ;
} ;
CVUtils . grayArrayFromImage = function ( htmlImage , offsetX , ctx , array ) {
ctx . drawImage ( htmlImage , offsetX , 0 , htmlImage . width , htmlImage . height ) ;
var ctxData = ctx . getImageData ( offsetX , 0 , htmlImage . width , htmlImage . height ) . data ;
CVUtils . computeGray ( ctxData , array ) ;
} ;
CVUtils . grayArrayFromContext = function ( ctx , size , offset , array ) {
var ctxData = ctx . getImageData ( offset . x , offset . y , size . x , size . y ) . data ;
CVUtils . computeGray ( ctxData , array ) ;
} ;
CVUtils . grayAndHalfSampleFromCanvasData = function ( canvasData , size , outArray ) {
var topRowIdx = 0 ;
var bottomRowIdx = size . x ;
var endIdx = Math . floor ( canvasData . length / 4 ) ;
var outWidth = size . x / 2 ;
var outImgIdx = 0 ;
var inWidth = size . x ;
var i ;
while ( bottomRowIdx < endIdx ) {
for ( i = 0 ; i < outWidth ; i ++ ) {
outArray [ outImgIdx ] = Math . floor ( ( 0.299 * canvasData [ topRowIdx * 4 + 0 ] + 0.587 * canvasData [ topRowIdx * 4 + 1 ] + 0.114 * canvasData [ topRowIdx * 4 + 2 ] + ( 0.299 * canvasData [ ( topRowIdx + 1 ) * 4 + 0 ] + 0.587 * canvasData [ ( topRowIdx + 1 ) * 4 + 1 ] + 0.114 * canvasData [ ( topRowIdx + 1 ) * 4 + 2 ] ) + ( 0.299 * canvasData [ bottomRowIdx * 4 + 0 ] + 0.587 * canvasData [ bottomRowIdx * 4 + 1 ] + 0.114 * canvasData [ bottomRowIdx * 4 + 2 ] ) + ( 0.299 * canvasData [ ( bottomRowIdx + 1 ) * 4 + 0 ] + 0.587 * canvasData [ ( bottomRowIdx + 1 ) * 4 + 1 ] + 0.114 * canvasData [ ( bottomRowIdx + 1 ) * 4 + 2 ] ) ) / 4 ) ;
outImgIdx ++ ;
topRowIdx = topRowIdx + 2 ;
bottomRowIdx = bottomRowIdx + 2 ;
}
topRowIdx = topRowIdx + inWidth ;
bottomRowIdx = bottomRowIdx + inWidth ;
}
} ;
CVUtils . computeGray = function ( imageData , outArray , config ) {
var l = imageData . length / 4 | 0 ,
i ,
singleChannel = config && config . singleChannel === true ;
if ( singleChannel ) {
for ( i = 0 ; i < l ; i ++ ) {
outArray [ i ] = imageData [ i * 4 + 0 ] ;
}
} else {
for ( i = 0 ; i < l ; i ++ ) {
outArray [ i ] = Math . floor ( 0.299 * imageData [ i * 4 + 0 ] + 0.587 * imageData [ i * 4 + 1 ] + 0.114 * imageData [ i * 4 + 2 ] ) ;
}
}
} ;
CVUtils . loadImageArray = function ( src , callback , canvas ) {
if ( ! canvas ) {
canvas = document . createElement ( 'canvas' ) ;
}
var img = new Image ( ) ;
img . callback = callback ;
img . onload = function ( ) {
canvas . width = this . width ;
canvas . height = this . height ;
var ctx = canvas . getContext ( '2d' ) ;
ctx . drawImage ( this , 0 , 0 ) ;
var array = new Uint8Array ( this . width * this . height ) ;
ctx . drawImage ( this , 0 , 0 ) ;
var data = ctx . getImageData ( 0 , 0 , this . width , this . height ) . data ;
CVUtils . computeGray ( data , array ) ;
this . callback ( array , {
x : this . width ,
y : this . height
} , this ) ;
} ;
img . src = src ;
} ;
/ * *
* @ param inImg { ImageWrapper } input image to be sampled
* @ param outImg { ImageWrapper } to be stored in
* /
CVUtils . halfSample = function ( inImgWrapper , outImgWrapper ) {
var inImg = inImgWrapper . data ;
var inWidth = inImgWrapper . size . x ;
var outImg = outImgWrapper . data ;
var topRowIdx = 0 ;
var bottomRowIdx = inWidth ;
var endIdx = inImg . length ;
var outWidth = inWidth / 2 ;
var outImgIdx = 0 ;
while ( bottomRowIdx < endIdx ) {
for ( var i = 0 ; i < outWidth ; i ++ ) {
outImg [ outImgIdx ] = Math . floor ( ( inImg [ topRowIdx ] + inImg [ topRowIdx + 1 ] + inImg [ bottomRowIdx ] + inImg [ bottomRowIdx + 1 ] ) / 4 ) ;
outImgIdx ++ ;
topRowIdx = topRowIdx + 2 ;
bottomRowIdx = bottomRowIdx + 2 ;
}
topRowIdx = topRowIdx + inWidth ;
bottomRowIdx = bottomRowIdx + inWidth ;
}
} ;
CVUtils . hsv2rgb = function ( hsv , rgb ) {
var h = hsv [ 0 ] ,
s = hsv [ 1 ] ,
v = hsv [ 2 ] ,
c = v * s ,
x = c * ( 1 - Math . abs ( h / 60 % 2 - 1 ) ) ,
m = v - c ,
r = 0 ,
g = 0 ,
b = 0 ;
rgb = rgb || [ 0 , 0 , 0 ] ;
if ( h < 60 ) {
r = c ;
g = x ;
} else if ( h < 120 ) {
r = x ;
g = c ;
} else if ( h < 180 ) {
g = c ;
b = x ;
} else if ( h < 240 ) {
g = x ;
b = c ;
} else if ( h < 300 ) {
r = x ;
b = c ;
} else if ( h < 360 ) {
r = c ;
b = x ;
}
rgb [ 0 ] = ( r + m ) * 255 | 0 ;
rgb [ 1 ] = ( g + m ) * 255 | 0 ;
rgb [ 2 ] = ( b + m ) * 255 | 0 ;
return rgb ;
} ;
CVUtils . _computeDivisors = function ( n ) {
var largeDivisors = [ ] ,
divisors = [ ] ,
i ;
for ( i = 1 ; i < Math . sqrt ( n ) + 1 ; i ++ ) {
if ( n % i === 0 ) {
divisors . push ( i ) ;
if ( i !== n / i ) {
largeDivisors . unshift ( Math . floor ( n / i ) ) ;
}
}
}
return divisors . concat ( largeDivisors ) ;
} ;
CVUtils . _computeIntersection = function ( arr1 , arr2 ) {
var i = 0 ,
j = 0 ,
result = [ ] ;
while ( i < arr1 . length && j < arr2 . length ) {
if ( arr1 [ i ] === arr2 [ j ] ) {
result . push ( arr1 [ i ] ) ;
i ++ ;
j ++ ;
} else if ( arr1 [ i ] > arr2 [ j ] ) {
j ++ ;
} else {
i ++ ;
}
}
return result ;
} ;
CVUtils . calculatePatchSize = function ( patchSize , imgSize ) {
var divisorsX = this . _computeDivisors ( imgSize . x ) ,
divisorsY = this . _computeDivisors ( imgSize . y ) ,
wideSide = Math . max ( imgSize . x , imgSize . y ) ,
common = this . _computeIntersection ( divisorsX , divisorsY ) ,
nrOfPatchesList = [ 8 , 10 , 15 , 20 , 32 , 60 , 80 ] ,
nrOfPatchesMap = {
"x-small" : 5 ,
"small" : 4 ,
"medium" : 3 ,
"large" : 2 ,
"x-large" : 1
} ,
nrOfPatchesIdx = nrOfPatchesMap [ patchSize ] || nrOfPatchesMap . medium ,
nrOfPatches = nrOfPatchesList [ nrOfPatchesIdx ] ,
desiredPatchSize = Math . floor ( wideSide / nrOfPatches ) ,
optimalPatchSize ;
function findPatchSizeForDivisors ( divisors ) {
var i = 0 ,
found = divisors [ Math . floor ( divisors . length / 2 ) ] ;
while ( i < divisors . length - 1 && divisors [ i ] < desiredPatchSize ) {
i ++ ;
}
if ( i > 0 ) {
if ( Math . abs ( divisors [ i ] - desiredPatchSize ) > Math . abs ( divisors [ i - 1 ] - desiredPatchSize ) ) {
found = divisors [ i - 1 ] ;
} else {
found = divisors [ i ] ;
}
}
if ( desiredPatchSize / found < nrOfPatchesList [ nrOfPatchesIdx + 1 ] / nrOfPatchesList [ nrOfPatchesIdx ] && desiredPatchSize / found > nrOfPatchesList [ nrOfPatchesIdx - 1 ] / nrOfPatchesList [ nrOfPatchesIdx ] ) {
return { x : found , y : found } ;
}
return null ;
}
optimalPatchSize = findPatchSizeForDivisors ( common ) ;
if ( ! optimalPatchSize ) {
optimalPatchSize = findPatchSizeForDivisors ( this . _computeDivisors ( wideSide ) ) ;
if ( ! optimalPatchSize ) {
optimalPatchSize = findPatchSizeForDivisors ( this . _computeDivisors ( desiredPatchSize * nrOfPatches ) ) ;
}
}
return optimalPatchSize ;
} ;
CVUtils . _parseCSSDimensionValues = function ( value ) {
var dimension = {
value : parseFloat ( value ) ,
unit : value . indexOf ( "%" ) === value . length - 1 ? "%" : "%"
} ;
return dimension ;
} ;
CVUtils . _dimensionsConverters = {
top : function top ( dimension , context ) {
if ( dimension . unit === "%" ) {
return Math . floor ( context . height * ( dimension . value / 100 ) ) ;
}
} ,
right : function right ( dimension , context ) {
if ( dimension . unit === "%" ) {
return Math . floor ( context . width - context . width * ( dimension . value / 100 ) ) ;
}
} ,
bottom : function bottom ( dimension , context ) {
if ( dimension . unit === "%" ) {
return Math . floor ( context . height - context . height * ( dimension . value / 100 ) ) ;
}
} ,
left : function left ( dimension , context ) {
if ( dimension . unit === "%" ) {
return Math . floor ( context . width * ( dimension . value / 100 ) ) ;
}
}
} ;
CVUtils . computeImageArea = function ( inputWidth , inputHeight , area ) {
var context = { width : inputWidth , height : inputHeight } ;
var parsedArea = Object . keys ( area ) . reduce ( function ( result , key ) {
var value = area [ key ] ,
parsed = CVUtils . _parseCSSDimensionValues ( value ) ,
calculated = CVUtils . _dimensionsConverters [ key ] ( parsed , context ) ;
result [ key ] = calculated ;
return result ;
} , { } ) ;
return {
sx : parsedArea . left ,
sy : parsedArea . top ,
sw : parsedArea . right - parsedArea . left ,
sh : parsedArea . bottom - parsedArea . top
} ;
} ;
exports [ 'default' ] = CVUtils ;
module . exports = exports [ 'default' ] ;
/***/ } ,
/* 6 */
/***/ function ( module , exports , _ _webpack _require _ _ ) {
'use strict' ;
Object . defineProperty ( exports , '__esModule' , {
value : true
} ) ;
var _glMatrix = _ _webpack _require _ _ ( 7 ) ;
/ * *
* Creates a cluster for grouping similar orientations of datapoints
* /
exports [ 'default' ] = {
create : function create ( point , threshold ) {
var points = [ ] ,
center = {
rad : 0 ,
vec : _glMatrix . vec2 . clone ( [ 0 , 0 ] )
} ,
pointMap = { } ;
function init ( ) {
_add ( point ) ;
updateCenter ( ) ;
}
function _add ( pointToAdd ) {
pointMap [ pointToAdd . id ] = pointToAdd ;
points . push ( pointToAdd ) ;
}
function updateCenter ( ) {
var i ,
sum = 0 ;
for ( i = 0 ; i < points . length ; i ++ ) {
sum += points [ i ] . rad ;
}
center . rad = sum / points . length ;
center . vec = _glMatrix . vec2 . clone ( [ Math . cos ( center . rad ) , Math . sin ( center . rad ) ] ) ;
}
init ( ) ;
return {
add : function add ( pointToAdd ) {
if ( ! pointMap [ pointToAdd . id ] ) {
_add ( pointToAdd ) ;
updateCenter ( ) ;
}
} ,
fits : function fits ( otherPoint ) {
// check cosine similarity to center-angle
var similarity = Math . abs ( _glMatrix . vec2 . dot ( otherPoint . point . vec , center . vec ) ) ;
if ( similarity > threshold ) {
return true ;
}
return false ;
} ,
getPoints : function getPoints ( ) {
return points ;
} ,
getCenter : function getCenter ( ) {
return center ;
}
} ;
} ,
createPoint : function createPoint ( newPoint , id , property ) {
return {
rad : newPoint [ property ] ,
point : newPoint ,
id : id
} ;
}
} ;
module . exports = exports [ 'default' ] ;
/***/ } ,
/* 7 */
/***/ function ( module , exports ) {
module . exports = require ( "gl-matrix" ) ;
/***/ } ,
/* 8 */
/***/ function ( module , exports ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
exports [ "default" ] = {
init : function init ( arr , val ) {
var l = arr . length ;
while ( l -- ) {
arr [ l ] = val ;
}
} ,
/ * *
* Shuffles the content of an array
* @ return { Array } the array itself shuffled
* /
shuffle : function shuffle ( arr ) {
var i = arr . length - 1 ,
j ,
x ;
for ( i ; i >= 0 ; i -- ) {
j = Math . floor ( Math . random ( ) * i ) ;
x = arr [ i ] ;
arr [ i ] = arr [ j ] ;
arr [ j ] = x ;
}
return arr ;
} ,
toPointList : function toPointList ( arr ) {
var i ,
j ,
row = [ ] ,
rows = [ ] ;
for ( i = 0 ; i < arr . length ; i ++ ) {
row = [ ] ;
for ( j = 0 ; j < arr [ i ] . length ; j ++ ) {
row [ j ] = arr [ i ] [ j ] ;
}
rows [ i ] = "[" + row . join ( "," ) + "]" ;
}
return "[" + rows . join ( ",\r\n" ) + "]" ;
} ,
/ * *
* returns the elements which ' s score is bigger than the threshold
* @ return { Array } the reduced array
* /
threshold : function threshold ( arr , _threshold , scoreFunc ) {
var i ,
queue = [ ] ;
for ( i = 0 ; i < arr . length ; i ++ ) {
if ( scoreFunc . apply ( arr , [ arr [ i ] ] ) >= _threshold ) {
queue . push ( arr [ i ] ) ;
}
}
return queue ;
} ,
maxIndex : function maxIndex ( arr ) {
var i ,
max = 0 ;
for ( i = 0 ; i < arr . length ; i ++ ) {
if ( arr [ i ] > arr [ max ] ) {
max = i ;
}
}
return max ;
} ,
max : function max ( arr ) {
var i ,
max = 0 ;
for ( i = 0 ; i < arr . length ; i ++ ) {
if ( arr [ i ] > max ) {
max = arr [ i ] ;
}
}
return max ;
} ,
sum : function sum ( arr ) {
var length = arr . length ,
sum = 0 ;
while ( length -- ) {
sum += arr [ length ] ;
}
return sum ;
}
} ;
module . exports = exports [ "default" ] ;
/***/ } ,
/* 9 */
/***/ function ( module , exports , _ _webpack _require _ _ ) {
/* WEBPACK VAR INJECTION */ ( function ( global ) { 'use strict' ;
Object . defineProperty ( exports , '__esModule' , {
value : true
} ) ;
function _interopRequireDefault ( obj ) { return obj && obj . _ _esModule ? obj : { 'default' : obj } ; }
var _image _wrapper = _ _webpack _require _ _ ( 3 ) ;
var _image _wrapper2 = _interopRequireDefault ( _image _wrapper ) ;
var _cv _utils = _ _webpack _require _ _ ( 5 ) ;
var _cv _utils2 = _interopRequireDefault ( _cv _utils ) ;
var _rasterizer = _ _webpack _require _ _ ( 10 ) ;
var _rasterizer2 = _interopRequireDefault ( _rasterizer ) ;
var _tracer = _ _webpack _require _ _ ( 11 ) ;
var _tracer2 = _interopRequireDefault ( _tracer ) ;
var _skeletonizer2 = _ _webpack _require _ _ ( 12 ) ;
var _skeletonizer3 = _interopRequireDefault ( _skeletonizer2 ) ;
var _array _helper = _ _webpack _require _ _ ( 8 ) ;
var _array _helper2 = _interopRequireDefault ( _array _helper ) ;
var _image _debug = _ _webpack _require _ _ ( 13 ) ;
var _image _debug2 = _interopRequireDefault ( _image _debug ) ;
var _glMatrix = _ _webpack _require _ _ ( 7 ) ;
var _glMatrix2 = _interopRequireDefault ( _glMatrix ) ;
var _config ,
_currentImageWrapper ,
_skelImageWrapper ,
_subImageWrapper ,
_labelImageWrapper ,
_patchGrid ,
_patchLabelGrid ,
_imageToPatchGrid ,
_binaryImageWrapper ,
_patchSize ,
_canvasContainer = {
ctx : {
binary : null
} ,
dom : {
binary : null
}
} ,
_numPatches = { x : 0 , y : 0 } ,
_inputImageWrapper ,
_skeletonizer ,
vec2 = _glMatrix2 [ 'default' ] . vec2 ,
mat2 = _glMatrix2 [ 'default' ] . mat2 ;
function initBuffers ( ) {
var skeletonImageData ;
if ( _config . halfSample ) {
_currentImageWrapper = new _image _wrapper2 [ 'default' ] ( {
x : _inputImageWrapper . size . x / 2 | 0 ,
y : _inputImageWrapper . size . y / 2 | 0
} ) ;
} else {
_currentImageWrapper = _inputImageWrapper ;
}
_patchSize = _cv _utils2 [ 'default' ] . calculatePatchSize ( _config . patchSize , _currentImageWrapper . size ) ;
_numPatches . x = _currentImageWrapper . size . x / _patchSize . x | 0 ;
_numPatches . y = _currentImageWrapper . size . y / _patchSize . y | 0 ;
_binaryImageWrapper = new _image _wrapper2 [ 'default' ] ( _currentImageWrapper . size , undefined , Uint8Array , false ) ;
_labelImageWrapper = new _image _wrapper2 [ 'default' ] ( _patchSize , undefined , Array , true ) ;
skeletonImageData = new ArrayBuffer ( 64 * 1024 ) ;
_subImageWrapper = new _image _wrapper2 [ 'default' ] ( _patchSize , new Uint8Array ( skeletonImageData , 0 , _patchSize . x * _patchSize . y ) ) ;
_skelImageWrapper = new _image _wrapper2 [ 'default' ] ( _patchSize , new Uint8Array ( skeletonImageData , _patchSize . x * _patchSize . y * 3 , _patchSize . x * _patchSize . y ) , undefined , true ) ;
_skeletonizer = ( 0 , _skeletonizer3 [ 'default' ] ) ( typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : global , {
size : _patchSize . x
} , skeletonImageData ) ;
_imageToPatchGrid = new _image _wrapper2 [ 'default' ] ( {
x : _currentImageWrapper . size . x / _subImageWrapper . size . x | 0 ,
y : _currentImageWrapper . size . y / _subImageWrapper . size . y | 0
} , undefined , Array , true ) ;
_patchGrid = new _image _wrapper2 [ 'default' ] ( _imageToPatchGrid . size , undefined , undefined , true ) ;
_patchLabelGrid = new _image _wrapper2 [ 'default' ] ( _imageToPatchGrid . size , undefined , Int32Array , true ) ;
}
function initCanvas ( ) {
if ( _config . useWorker || typeof document === 'undefined' ) {
return ;
}
_canvasContainer . dom . binary = document . createElement ( "canvas" ) ;
_canvasContainer . dom . binary . className = "binaryBuffer" ;
if ( _config . showCanvas === true ) {
document . querySelector ( "#debug" ) . appendChild ( _canvasContainer . dom . binary ) ;
}
_canvasContainer . ctx . binary = _canvasContainer . dom . binary . getContext ( "2d" ) ;
_canvasContainer . dom . binary . width = _binaryImageWrapper . size . x ;
_canvasContainer . dom . binary . height = _binaryImageWrapper . size . y ;
}
/ * *
* Creates a bounding box which encloses all the given patches
* @ returns { Array } The minimal bounding box
* /
function boxFromPatches ( patches ) {
var overAvg ,
i ,
j ,
patch ,
transMat ,
minx = _binaryImageWrapper . size . x ,
miny = _binaryImageWrapper . size . y ,
maxx = - _binaryImageWrapper . size . x ,
maxy = - _binaryImageWrapper . size . y ,
box ,
scale ;
// draw all patches which are to be taken into consideration
overAvg = 0 ;
for ( i = 0 ; i < patches . length ; i ++ ) {
patch = patches [ i ] ;
overAvg += patch . rad ;
if ( _config . showPatches ) {
_image _debug2 [ 'default' ] . drawRect ( patch . pos , _subImageWrapper . size , _canvasContainer . ctx . binary , { color : "red" } ) ;
}
}
overAvg /= patches . length ;
overAvg = ( overAvg * 180 / Math . PI + 90 ) % 180 - 90 ;
if ( overAvg < 0 ) {
overAvg += 180 ;
}
overAvg = ( 180 - overAvg ) * Math . PI / 180 ;
transMat = mat2 . clone ( [ Math . cos ( overAvg ) , Math . sin ( overAvg ) , - Math . sin ( overAvg ) , Math . cos ( overAvg ) ] ) ;
// iterate over patches and rotate by angle
for ( i = 0 ; i < patches . length ; i ++ ) {
patch = patches [ i ] ;
for ( j = 0 ; j < 4 ; j ++ ) {
vec2 . transformMat2 ( patch . box [ j ] , patch . box [ j ] , transMat ) ;
}
if ( _config . boxFromPatches . showTransformed ) {
_image _debug2 [ 'default' ] . drawPath ( patch . box , { x : 0 , y : 1 } , _canvasContainer . ctx . binary , { color : '#99ff00' , lineWidth : 2 } ) ;
}
}
// find bounding box
for ( i = 0 ; i < patches . length ; i ++ ) {
patch = patches [ i ] ;
for ( j = 0 ; j < 4 ; j ++ ) {
if ( patch . box [ j ] [ 0 ] < minx ) {
minx = patch . box [ j ] [ 0 ] ;
}
if ( patch . box [ j ] [ 0 ] > maxx ) {
maxx = patch . box [ j ] [ 0 ] ;
}
if ( patch . box [ j ] [ 1 ] < miny ) {
miny = patch . box [ j ] [ 1 ] ;
}
if ( patch . box [ j ] [ 1 ] > maxy ) {
maxy = patch . box [ j ] [ 1 ] ;
}
}
}
box = [ [ minx , miny ] , [ maxx , miny ] , [ maxx , maxy ] , [ minx , maxy ] ] ;
if ( _config . boxFromPatches . showTransformedBox ) {
_image _debug2 [ 'default' ] . drawPath ( box , { x : 0 , y : 1 } , _canvasContainer . ctx . binary , { color : '#ff0000' , lineWidth : 2 } ) ;
}
scale = _config . halfSample ? 2 : 1 ;
// reverse rotation;
transMat = mat2 . invert ( transMat , transMat ) ;
for ( j = 0 ; j < 4 ; j ++ ) {
vec2 . transformMat2 ( box [ j ] , box [ j ] , transMat ) ;
}
if ( _config . boxFromPatches . showBB ) {
_image _debug2 [ 'default' ] . drawPath ( box , { x : 0 , y : 1 } , _canvasContainer . ctx . binary , { color : '#ff0000' , lineWidth : 2 } ) ;
}
for ( j = 0 ; j < 4 ; j ++ ) {
vec2 . scale ( box [ j ] , box [ j ] , scale ) ;
}
return box ;
}
/ * *
* Creates a binary image of the current image
* /
function binarizeImage ( ) {
_cv _utils2 [ 'default' ] . otsuThreshold ( _currentImageWrapper , _binaryImageWrapper ) ;
_binaryImageWrapper . zeroBorder ( ) ;
if ( _config . showCanvas ) {
_binaryImageWrapper . show ( _canvasContainer . dom . binary , 255 ) ;
}
}
/ * *
* Iterate over the entire image
* extract patches
* /
function findPatches ( ) {
var i ,
j ,
x ,
y ,
moments ,
patchesFound = [ ] ,
rasterizer ,
rasterResult ,
patch ;
for ( i = 0 ; i < _numPatches . x ; i ++ ) {
for ( j = 0 ; j < _numPatches . y ; j ++ ) {
x = _subImageWrapper . size . x * i ;
y = _subImageWrapper . size . y * j ;
// seperate parts
skeletonize ( x , y ) ;
// Rasterize, find individual bars
_skelImageWrapper . zeroBorder ( ) ;
_array _helper2 [ 'default' ] . init ( _labelImageWrapper . data , 0 ) ;
rasterizer = _rasterizer2 [ 'default' ] . create ( _skelImageWrapper , _labelImageWrapper ) ;
rasterResult = rasterizer . rasterize ( 0 ) ;
if ( _config . showLabels ) {
_labelImageWrapper . overlay ( _canvasContainer . dom . binary , Math . floor ( 360 / rasterResult . count ) , { x : x , y : y } ) ;
}
// calculate moments from the skeletonized patch
moments = _labelImageWrapper . moments ( rasterResult . count ) ;
// extract eligible patches
patchesFound = patchesFound . concat ( describePatch ( moments , [ i , j ] , x , y ) ) ;
}
}
if ( _config . showFoundPatches ) {
for ( i = 0 ; i < patchesFound . length ; i ++ ) {
patch = patchesFound [ i ] ;
_image _debug2 [ 'default' ] . drawRect ( patch . pos , _subImageWrapper . size , _canvasContainer . ctx . binary , { color : "#99ff00" , lineWidth : 2 } ) ;
}
}
return patchesFound ;
}
/ * *
* Finds those connected areas which contain at least 6 patches
* and returns them ordered DESC by the number of contained patches
* @ param { Number } maxLabel
* /
function findBiggestConnectedAreas ( maxLabel ) {
var i ,
sum ,
labelHist = [ ] ,
topLabels = [ ] ;
for ( i = 0 ; i < maxLabel ; i ++ ) {
labelHist . push ( 0 ) ;
}
sum = _patchLabelGrid . data . length ;
while ( sum -- ) {
if ( _patchLabelGrid . data [ sum ] > 0 ) {
labelHist [ _patchLabelGrid . data [ sum ] - 1 ] ++ ;
}
}
labelHist = labelHist . map ( function ( val , idx ) {
return {
val : val ,
label : idx + 1
} ;
} ) ;
labelHist . sort ( function ( a , b ) {
return b . val - a . val ;
} ) ;
// extract top areas with at least 6 patches present
topLabels = labelHist . filter ( function ( el ) {
return el . val >= 5 ;
} ) ;
return topLabels ;
}
/ * *
*
* /
function findBoxes ( topLabels , maxLabel ) {
var i ,
j ,
sum ,
patches = [ ] ,
patch ,
box ,
boxes = [ ] ,
hsv = [ 0 , 1 , 1 ] ,
rgb = [ 0 , 0 , 0 ] ;
for ( i = 0 ; i < topLabels . length ; i ++ ) {
sum = _patchLabelGrid . data . length ;
patches . length = 0 ;
while ( sum -- ) {
if ( _patchLabelGrid . data [ sum ] === topLabels [ i ] . label ) {
patch = _imageToPatchGrid . data [ sum ] ;
patches . push ( patch ) ;
}
}
box = boxFromPatches ( patches ) ;
if ( box ) {
boxes . push ( box ) ;
// draw patch-labels if requested
if ( _config . showRemainingPatchLabels ) {
for ( j = 0 ; j < patches . length ; j ++ ) {
patch = patches [ j ] ;
hsv [ 0 ] = topLabels [ i ] . label / ( maxLabel + 1 ) * 360 ;
_cv _utils2 [ 'default' ] . hsv2rgb ( hsv , rgb ) ;
_image _debug2 [ 'default' ] . drawRect ( patch . pos , _subImageWrapper . size , _canvasContainer . ctx . binary , { color : "rgb(" + rgb . join ( "," ) + ")" , lineWidth : 2 } ) ;
}
}
}
}
return boxes ;
}
/ * *
* Find similar moments ( via cluster )
* @ param { Object } moments
* /
function similarMoments ( moments ) {
var clusters = _cv _utils2 [ 'default' ] . cluster ( moments , 0.90 ) ;
var topCluster = _cv _utils2 [ 'default' ] . topGeneric ( clusters , 1 , function ( e ) {
return e . getPoints ( ) . length ;
} ) ;
var points = [ ] ,
result = [ ] ;
if ( topCluster . length === 1 ) {
points = topCluster [ 0 ] . item . getPoints ( ) ;
for ( var i = 0 ; i < points . length ; i ++ ) {
result . push ( points [ i ] . point ) ;
}
}
return result ;
}
function skeletonize ( x , y ) {
_binaryImageWrapper . subImageAsCopy ( _subImageWrapper , _cv _utils2 [ 'default' ] . imageRef ( x , y ) ) ;
_skeletonizer . skeletonize ( ) ;
// Show skeleton if requested
if ( _config . showSkeleton ) {
_skelImageWrapper . overlay ( _canvasContainer . dom . binary , 360 , _cv _utils2 [ 'default' ] . imageRef ( x , y ) ) ;
}
}
/ * *
* Extracts and describes those patches which seem to contain a barcode pattern
* @ param { Array } moments
* @ param { Object } patchPos ,
* @ param { Number } x
* @ param { Number } y
* @ returns { Array } list of patches
* /
function describePatch ( moments , patchPos , x , y ) {
var k ,
avg ,
eligibleMoments = [ ] ,
matchingMoments ,
patch ,
patchesFound = [ ] ,
minComponentWeight = Math . ceil ( _patchSize . x / 3 ) ;
if ( moments . length >= 2 ) {
// only collect moments which's area covers at least minComponentWeight pixels.
for ( k = 0 ; k < moments . length ; k ++ ) {
if ( moments [ k ] . m00 > minComponentWeight ) {
eligibleMoments . push ( moments [ k ] ) ;
}
}
// if at least 2 moments are found which have at least minComponentWeights covered
if ( eligibleMoments . length >= 2 ) {
matchingMoments = similarMoments ( eligibleMoments ) ;
avg = 0 ;
// determine the similarity of the moments
for ( k = 0 ; k < matchingMoments . length ; k ++ ) {
avg += matchingMoments [ k ] . rad ;
}
// Only two of the moments are allowed not to fit into the equation
// add the patch to the set
if ( matchingMoments . length > 1 && matchingMoments . length >= eligibleMoments . length / 4 * 3 && matchingMoments . length > moments . length / 4 ) {
avg /= matchingMoments . length ;
patch = {
index : patchPos [ 1 ] * _numPatches . x + patchPos [ 0 ] ,
pos : {
x : x ,
y : y
} ,
box : [ vec2 . clone ( [ x , y ] ) , vec2 . clone ( [ x + _subImageWrapper . size . x , y ] ) , vec2 . clone ( [ x + _subImageWrapper . size . x , y + _subImageWrapper . size . y ] ) , vec2 . clone ( [ x , y + _subImageWrapper . size . y ] ) ] ,
moments : matchingMoments ,
rad : avg ,
vec : vec2 . clone ( [ Math . cos ( avg ) , Math . sin ( avg ) ] )
} ;
patchesFound . push ( patch ) ;
}
}
}
return patchesFound ;
}
/ * *
* finds patches which are connected and share the same orientation
* @ param { Object } patchesFound
* /
function rasterizeAngularSimilarity ( patchesFound ) {
var label = 0 ,
threshold = 0.95 ,
currIdx = 0 ,
j ,
patch ,
hsv = [ 0 , 1 , 1 ] ,
rgb = [ 0 , 0 , 0 ] ;
function notYetProcessed ( ) {
var i ;
for ( i = 0 ; i < _patchLabelGrid . data . length ; i ++ ) {
if ( _patchLabelGrid . data [ i ] === 0 && _patchGrid . data [ i ] === 1 ) {
return i ;
}
}
return _patchLabelGrid . length ;
}
function trace ( currentIdx ) {
var x ,
y ,
currentPatch ,
idx ,
dir ,
current = {
x : currentIdx % _patchLabelGrid . size . x ,
y : currentIdx / _patchLabelGrid . size . x | 0
} ,
similarity ;
if ( currentIdx < _patchLabelGrid . data . length ) {
currentPatch = _imageToPatchGrid . data [ currentIdx ] ;
// assign label
_patchLabelGrid . data [ currentIdx ] = label ;
for ( dir = 0 ; dir < _tracer2 [ 'default' ] . searchDirections . length ; dir ++ ) {
y = current . y + _tracer2 [ 'default' ] . searchDirections [ dir ] [ 0 ] ;
x = current . x + _tracer2 [ 'default' ] . searchDirections [ dir ] [ 1 ] ;
idx = y * _patchLabelGrid . size . x + x ;
// continue if patch empty
if ( _patchGrid . data [ idx ] === 0 ) {
_patchLabelGrid . data [ idx ] = Number . MAX _VALUE ;
continue ;
}
if ( _patchLabelGrid . data [ idx ] === 0 ) {
similarity = Math . abs ( vec2 . dot ( _imageToPatchGrid . data [ idx ] . vec , currentPatch . vec ) ) ;
if ( similarity > threshold ) {
trace ( idx ) ;
}
}
}
}
}
// prepare for finding the right patches
_array _helper2 [ 'default' ] . init ( _patchGrid . data , 0 ) ;
_array _helper2 [ 'default' ] . init ( _patchLabelGrid . data , 0 ) ;
_array _helper2 [ 'default' ] . init ( _imageToPatchGrid . data , null ) ;
for ( j = 0 ; j < patchesFound . length ; j ++ ) {
patch = patchesFound [ j ] ;
_imageToPatchGrid . data [ patch . index ] = patch ;
_patchGrid . data [ patch . index ] = 1 ;
}
// rasterize the patches found to determine area
_patchGrid . zeroBorder ( ) ;
while ( ( currIdx = notYetProcessed ( ) ) < _patchLabelGrid . data . length ) {
label ++ ;
trace ( currIdx ) ;
}
// draw patch-labels if requested
if ( _config . showPatchLabels ) {
for ( j = 0 ; j < _patchLabelGrid . data . length ; j ++ ) {
if ( _patchLabelGrid . data [ j ] > 0 && _patchLabelGrid . data [ j ] <= label ) {
patch = _imageToPatchGrid . data [ j ] ;
hsv [ 0 ] = _patchLabelGrid . data [ j ] / ( label + 1 ) * 360 ;
_cv _utils2 [ 'default' ] . hsv2rgb ( hsv , rgb ) ;
_image _debug2 [ 'default' ] . drawRect ( patch . pos , _subImageWrapper . size , _canvasContainer . ctx . binary , { color : "rgb(" + rgb . join ( "," ) + ")" , lineWidth : 2 } ) ;
}
}
}
return label ;
}
exports [ 'default' ] = {
init : function init ( inputImageWrapper , config ) {
_config = config ;
_inputImageWrapper = inputImageWrapper ;
initBuffers ( ) ;
initCanvas ( ) ;
} ,
locate : function locate ( ) {
var patchesFound , topLabels , boxes ;
if ( _config . halfSample ) {
_cv _utils2 [ 'default' ] . halfSample ( _inputImageWrapper , _currentImageWrapper ) ;
}
binarizeImage ( ) ;
patchesFound = findPatches ( ) ;
// return unless 5% or more patches are found
if ( patchesFound . length < _numPatches . x * _numPatches . y * 0.05 ) {
return null ;
}
// rasterrize area by comparing angular similarity;
var maxLabel = rasterizeAngularSimilarity ( patchesFound ) ;
if ( maxLabel < 1 ) {
return null ;
}
// search for area with the most patches (biggest connected area)
topLabels = findBiggestConnectedAreas ( maxLabel ) ;
if ( topLabels . length === 0 ) {
return null ;
}
boxes = findBoxes ( topLabels , maxLabel ) ;
return boxes ;
} ,
checkImageConstraints : function checkImageConstraints ( inputStream , config ) {
var patchSize ,
width = inputStream . getWidth ( ) ,
height = inputStream . getHeight ( ) ,
halfSample = config . halfSample ? 0.5 : 1 ,
size ,
area ;
// calculate width and height based on area
if ( inputStream . getConfig ( ) . area ) {
area = _cv _utils2 [ 'default' ] . computeImageArea ( width , height , inputStream . getConfig ( ) . area ) ;
inputStream . setTopRight ( { x : area . sx , y : area . sy } ) ;
inputStream . setCanvasSize ( { x : width , y : height } ) ;
width = area . sw ;
height = area . sh ;
}
size = {
x : Math . floor ( width * halfSample ) ,
y : Math . floor ( height * halfSample )
} ;
patchSize = _cv _utils2 [ 'default' ] . calculatePatchSize ( config . patchSize , size ) ;
console . log ( "Patch-Size: " + JSON . stringify ( patchSize ) ) ;
inputStream . setWidth ( Math . floor ( Math . floor ( size . x / patchSize . x ) * ( 1 / halfSample ) * patchSize . x ) ) ;
inputStream . setHeight ( Math . floor ( Math . floor ( size . y / patchSize . y ) * ( 1 / halfSample ) * patchSize . y ) ) ;
if ( inputStream . getWidth ( ) % patchSize . x === 0 && inputStream . getHeight ( ) % patchSize . y === 0 ) {
return true ;
}
throw new Error ( "Image dimensions do not comply with the current settings: Width (" + width + " )and height (" + height + ") must a multiple of " + patchSize . x ) ;
}
} ;
module . exports = exports [ 'default' ] ;
/* WEBPACK VAR INJECTION */ } . call ( exports , ( function ( ) { return this ; } ( ) ) ) )
/***/ } ,
/* 10 */
/***/ function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
function _interopRequireDefault ( obj ) { return obj && obj . _ _esModule ? obj : { "default" : obj } ; }
var _tracer = _ _webpack _require _ _ ( 11 ) ;
var _tracer2 = _interopRequireDefault ( _tracer ) ;
/ * *
* http : //www.codeproject.com/Tips/407172/Connected-Component-Labeling-and-Vectorization
* /
var Rasterizer = {
createContour2D : function createContour2D ( ) {
return {
dir : null ,
index : null ,
firstVertex : null ,
insideContours : null ,
nextpeer : null ,
prevpeer : null
} ;
} ,
CONTOUR _DIR : {
CW _DIR : 0 ,
CCW _DIR : 1 ,
UNKNOWN _DIR : 2
} ,
DIR : {
OUTSIDE _EDGE : - 32767 ,
INSIDE _EDGE : - 32766
} ,
create : function create ( imageWrapper , labelWrapper ) {
var imageData = imageWrapper . data ,
labelData = labelWrapper . data ,
width = imageWrapper . size . x ,
height = imageWrapper . size . y ,
tracer = _tracer2 [ "default" ] . create ( imageWrapper , labelWrapper ) ;
return {
rasterize : function rasterize ( depthlabel ) {
var color ,
bc ,
lc ,
labelindex ,
cx ,
cy ,
colorMap = [ ] ,
vertex ,
p ,
cc ,
sc ,
pos ,
connectedCount = 0 ,
i ;
for ( i = 0 ; i < 400 ; i ++ ) {
colorMap [ i ] = 0 ;
}
colorMap [ 0 ] = imageData [ 0 ] ;
cc = null ;
for ( cy = 1 ; cy < height - 1 ; cy ++ ) {
labelindex = 0 ;
bc = colorMap [ 0 ] ;
for ( cx = 1 ; cx < width - 1 ; cx ++ ) {
pos = cy * width + cx ;
if ( labelData [ pos ] === 0 ) {
color = imageData [ pos ] ;
if ( color !== bc ) {
if ( labelindex === 0 ) {
lc = connectedCount + 1 ;
colorMap [ lc ] = color ;
bc = color ;
vertex = tracer . contourTracing ( cy , cx , lc , color , Rasterizer . DIR . OUTSIDE _EDGE ) ;
if ( vertex !== null ) {
connectedCount ++ ;
labelindex = lc ;
p = Rasterizer . createContour2D ( ) ;
p . dir = Rasterizer . CONTOUR _DIR . CW _DIR ;
p . index = labelindex ;
p . firstVertex = vertex ;
p . nextpeer = cc ;
p . insideContours = null ;
if ( cc !== null ) {
cc . prevpeer = p ;
}
cc = p ;
}
} else {
vertex = tracer . contourTracing ( cy , cx , Rasterizer . DIR . INSIDE _EDGE , color , labelindex ) ;
if ( vertex !== null ) {
p = Rasterizer . createContour2D ( ) ;
p . firstVertex = vertex ;
p . insideContours = null ;
if ( depthlabel === 0 ) {
p . dir = Rasterizer . CONTOUR _DIR . CCW _DIR ;
} else {
p . dir = Rasterizer . CONTOUR _DIR . CW _DIR ;
}
p . index = depthlabel ;
sc = cc ;
while ( sc !== null && sc . index !== labelindex ) {
sc = sc . nextpeer ;
}
if ( sc !== null ) {
p . nextpeer = sc . insideContours ;
if ( sc . insideContours !== null ) {
sc . insideContours . prevpeer = p ;
}
sc . insideContours = p ;
}
}
}
} else {
labelData [ pos ] = labelindex ;
}
} else if ( labelData [ pos ] === Rasterizer . DIR . OUTSIDE _EDGE || labelData [ pos ] === Rasterizer . DIR . INSIDE _EDGE ) {
labelindex = 0 ;
if ( labelData [ pos ] === Rasterizer . DIR . INSIDE _EDGE ) {
bc = imageData [ pos ] ;
} else {
bc = colorMap [ 0 ] ;
}
} else {
labelindex = labelData [ pos ] ;
bc = colorMap [ labelindex ] ;
}
}
}
sc = cc ;
while ( sc !== null ) {
sc . index = depthlabel ;
sc = sc . nextpeer ;
}
return {
cc : cc ,
count : connectedCount
} ;
} ,
debug : {
drawContour : function drawContour ( canvas , firstContour ) {
var ctx = canvas . getContext ( "2d" ) ,
pq = firstContour ,
iq ,
q ,
p ;
ctx . strokeStyle = "red" ;
ctx . fillStyle = "red" ;
ctx . lineWidth = 1 ;
if ( pq !== null ) {
iq = pq . insideContours ;
} else {
iq = null ;
}
while ( pq !== null ) {
if ( iq !== null ) {
q = iq ;
iq = iq . nextpeer ;
} else {
q = pq ;
pq = pq . nextpeer ;
if ( pq !== null ) {
iq = pq . insideContours ;
} else {
iq = null ;
}
}
switch ( q . dir ) {
case Rasterizer . CONTOUR _DIR . CW _DIR :
ctx . strokeStyle = "red" ;
break ;
case Rasterizer . CONTOUR _DIR . CCW _DIR :
ctx . strokeStyle = "blue" ;
break ;
case Rasterizer . CONTOUR _DIR . UNKNOWN _DIR :
ctx . strokeStyle = "green" ;
break ;
}
p = q . firstVertex ;
ctx . beginPath ( ) ;
ctx . moveTo ( p . x , p . y ) ;
do {
p = p . next ;
ctx . lineTo ( p . x , p . y ) ;
} while ( p !== q . firstVertex ) ;
ctx . stroke ( ) ;
}
}
}
} ;
}
} ;
exports [ "default" ] = Rasterizer ;
module . exports = exports [ "default" ] ;
/***/ } ,
/* 11 */
/***/ function ( module , exports ) {
/ * *
* http : //www.codeproject.com/Tips/407172/Connected-Component-Labeling-and-Vectorization
* /
"use strict" ;
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
var Tracer = {
searchDirections : [ [ 0 , 1 ] , [ 1 , 1 ] , [ 1 , 0 ] , [ 1 , - 1 ] , [ 0 , - 1 ] , [ - 1 , - 1 ] , [ - 1 , 0 ] , [ - 1 , 1 ] ] ,
create : function create ( imageWrapper , labelWrapper ) {
var imageData = imageWrapper . data ,
labelData = labelWrapper . data ,
searchDirections = this . searchDirections ,
width = imageWrapper . size . x ,
pos ;
function _trace ( current , color , label , edgelabel ) {
var i , y , x ;
for ( i = 0 ; i < 7 ; i ++ ) {
y = current . cy + searchDirections [ current . dir ] [ 0 ] ;
x = current . cx + searchDirections [ current . dir ] [ 1 ] ;
pos = y * width + x ;
if ( imageData [ pos ] === color && ( labelData [ pos ] === 0 || labelData [ pos ] === label ) ) {
labelData [ pos ] = label ;
current . cy = y ;
current . cx = x ;
return true ;
} else {
if ( labelData [ pos ] === 0 ) {
labelData [ pos ] = edgelabel ;
}
current . dir = ( current . dir + 1 ) % 8 ;
}
}
return false ;
}
function vertex2D ( x , y , dir ) {
return {
dir : dir ,
x : x ,
y : y ,
next : null ,
prev : null
} ;
}
function _contourTracing ( sy , sx , label , color , edgelabel ) {
var Fv = null ,
Cv ,
P ,
ldir ,
current = {
cx : sx ,
cy : sy ,
dir : 0
} ;
if ( _trace ( current , color , label , edgelabel ) ) {
Fv = vertex2D ( sx , sy , current . dir ) ;
Cv = Fv ;
ldir = current . dir ;
P = vertex2D ( current . cx , current . cy , 0 ) ;
P . prev = Cv ;
Cv . next = P ;
P . next = null ;
Cv = P ;
do {
current . dir = ( current . dir + 6 ) % 8 ;
_trace ( current , color , label , edgelabel ) ;
if ( ldir !== current . dir ) {
Cv . dir = current . dir ;
P = vertex2D ( current . cx , current . cy , 0 ) ;
P . prev = Cv ;
Cv . next = P ;
P . next = null ;
Cv = P ;
} else {
Cv . dir = ldir ;
Cv . x = current . cx ;
Cv . y = current . cy ;
}
ldir = current . dir ;
} while ( current . cx !== sx || current . cy !== sy ) ;
Fv . prev = Cv . prev ;
Cv . prev . next = Fv ;
}
return Fv ;
}
return {
trace : function trace ( current , color , label , edgelabel ) {
return _trace ( current , color , label , edgelabel ) ;
} ,
contourTracing : function contourTracing ( sy , sx , label , color , edgelabel ) {
return _contourTracing ( sy , sx , label , color , edgelabel ) ;
}
} ;
}
} ;
exports [ "default" ] = Tracer ;
module . exports = exports [ "default" ] ;
/***/ } ,
/* 12 */
/***/ function ( module , exports ) {
/* @preserve ASM BEGIN */
/* eslint-disable eqeqeq*/
"use strict" ;
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
function Skeletonizer ( stdlib , foreign , buffer ) {
"use asm" ;
var images = new stdlib . Uint8Array ( buffer ) ,
size = foreign . size | 0 ,
imul = stdlib . Math . imul ;
function erode ( inImagePtr , outImagePtr ) {
inImagePtr = inImagePtr | 0 ;
outImagePtr = outImagePtr | 0 ;
var v = 0 ,
u = 0 ,
sum = 0 ,
yStart1 = 0 ,
yStart2 = 0 ,
xStart1 = 0 ,
xStart2 = 0 ,
offset = 0 ;
for ( v = 1 ; ( v | 0 ) < ( size - 1 | 0 ) ; v = v + 1 | 0 ) {
offset = offset + size | 0 ;
for ( u = 1 ; ( u | 0 ) < ( size - 1 | 0 ) ; u = u + 1 | 0 ) {
yStart1 = offset - size | 0 ;
yStart2 = offset + size | 0 ;
xStart1 = u - 1 | 0 ;
xStart2 = u + 1 | 0 ;
sum = ( images [ inImagePtr + yStart1 + xStart1 | 0 ] | 0 ) + ( images [ inImagePtr + yStart1 + xStart2 | 0 ] | 0 ) + ( images [ inImagePtr + offset + u | 0 ] | 0 ) + ( images [ inImagePtr + yStart2 + xStart1 | 0 ] | 0 ) + ( images [ inImagePtr + yStart2 + xStart2 | 0 ] | 0 ) | 0 ;
if ( ( sum | 0 ) == ( 5 | 0 ) ) {
images [ outImagePtr + offset + u | 0 ] = 1 ;
} else {
images [ outImagePtr + offset + u | 0 ] = 0 ;
}
}
}
return ;
}
function subtract ( aImagePtr , bImagePtr , outImagePtr ) {
aImagePtr = aImagePtr | 0 ;
bImagePtr = bImagePtr | 0 ;
outImagePtr = outImagePtr | 0 ;
var length = 0 ;
length = imul ( size , size ) | 0 ;
while ( ( length | 0 ) > 0 ) {
length = length - 1 | 0 ;
images [ outImagePtr + length | 0 ] = ( images [ aImagePtr + length | 0 ] | 0 ) - ( images [ bImagePtr + length | 0 ] | 0 ) | 0 ;
}
}
function bitwiseOr ( aImagePtr , bImagePtr , outImagePtr ) {
aImagePtr = aImagePtr | 0 ;
bImagePtr = bImagePtr | 0 ;
outImagePtr = outImagePtr | 0 ;
var length = 0 ;
length = imul ( size , size ) | 0 ;
while ( ( length | 0 ) > 0 ) {
length = length - 1 | 0 ;
images [ outImagePtr + length | 0 ] = images [ aImagePtr + length | 0 ] | 0 | ( images [ bImagePtr + length | 0 ] | 0 ) | 0 ;
}
}
function countNonZero ( imagePtr ) {
imagePtr = imagePtr | 0 ;
var sum = 0 ,
length = 0 ;
length = imul ( size , size ) | 0 ;
while ( ( length | 0 ) > 0 ) {
length = length - 1 | 0 ;
sum = ( sum | 0 ) + ( images [ imagePtr + length | 0 ] | 0 ) | 0 ;
}
return sum | 0 ;
}
function init ( imagePtr , value ) {
imagePtr = imagePtr | 0 ;
value = value | 0 ;
var length = 0 ;
length = imul ( size , size ) | 0 ;
while ( ( length | 0 ) > 0 ) {
length = length - 1 | 0 ;
images [ imagePtr + length | 0 ] = value ;
}
}
function dilate ( inImagePtr , outImagePtr ) {
inImagePtr = inImagePtr | 0 ;
outImagePtr = outImagePtr | 0 ;
var v = 0 ,
u = 0 ,
sum = 0 ,
yStart1 = 0 ,
yStart2 = 0 ,
xStart1 = 0 ,
xStart2 = 0 ,
offset = 0 ;
for ( v = 1 ; ( v | 0 ) < ( size - 1 | 0 ) ; v = v + 1 | 0 ) {
offset = offset + size | 0 ;
for ( u = 1 ; ( u | 0 ) < ( size - 1 | 0 ) ; u = u + 1 | 0 ) {
yStart1 = offset - size | 0 ;
yStart2 = offset + size | 0 ;
xStart1 = u - 1 | 0 ;
xStart2 = u + 1 | 0 ;
sum = ( images [ inImagePtr + yStart1 + xStart1 | 0 ] | 0 ) + ( images [ inImagePtr + yStart1 + xStart2 | 0 ] | 0 ) + ( images [ inImagePtr + offset + u | 0 ] | 0 ) + ( images [ inImagePtr + yStart2 + xStart1 | 0 ] | 0 ) + ( images [ inImagePtr + yStart2 + xStart2 | 0 ] | 0 ) | 0 ;
if ( ( sum | 0 ) > ( 0 | 0 ) ) {
images [ outImagePtr + offset + u | 0 ] = 1 ;
} else {
images [ outImagePtr + offset + u | 0 ] = 0 ;
}
}
}
return ;
}
function memcpy ( srcImagePtr , dstImagePtr ) {
srcImagePtr = srcImagePtr | 0 ;
dstImagePtr = dstImagePtr | 0 ;
var length = 0 ;
length = imul ( size , size ) | 0 ;
while ( ( length | 0 ) > 0 ) {
length = length - 1 | 0 ;
images [ dstImagePtr + length | 0 ] = images [ srcImagePtr + length | 0 ] | 0 ;
}
}
function zeroBorder ( imagePtr ) {
imagePtr = imagePtr | 0 ;
var x = 0 ,
y = 0 ;
for ( x = 0 ; ( x | 0 ) < ( size - 1 | 0 ) ; x = x + 1 | 0 ) {
images [ imagePtr + x | 0 ] = 0 ;
images [ imagePtr + y | 0 ] = 0 ;
y = y + size - 1 | 0 ;
images [ imagePtr + y | 0 ] = 0 ;
y = y + 1 | 0 ;
}
for ( x = 0 ; ( x | 0 ) < ( size | 0 ) ; x = x + 1 | 0 ) {
images [ imagePtr + y | 0 ] = 0 ;
y = y + 1 | 0 ;
}
}
function skeletonize ( ) {
var subImagePtr = 0 ,
erodedImagePtr = 0 ,
tempImagePtr = 0 ,
skelImagePtr = 0 ,
sum = 0 ,
done = 0 ;
erodedImagePtr = imul ( size , size ) | 0 ;
tempImagePtr = erodedImagePtr + erodedImagePtr | 0 ;
skelImagePtr = tempImagePtr + erodedImagePtr | 0 ;
// init skel-image
init ( skelImagePtr , 0 ) ;
zeroBorder ( subImagePtr ) ;
do {
erode ( subImagePtr , erodedImagePtr ) ;
dilate ( erodedImagePtr , tempImagePtr ) ;
subtract ( subImagePtr , tempImagePtr , tempImagePtr ) ;
bitwiseOr ( skelImagePtr , tempImagePtr , skelImagePtr ) ;
memcpy ( erodedImagePtr , subImagePtr ) ;
sum = countNonZero ( subImagePtr ) | 0 ;
done = ( sum | 0 ) == 0 | 0 ;
} while ( ! done ) ;
}
return {
skeletonize : skeletonize
} ;
}
exports [ "default" ] = Skeletonizer ;
/* eslint-enable eqeqeq*/
/* @preserve ASM END */
module . exports = exports [ "default" ] ;
/***/ } ,
/* 13 */
/***/ function ( module , exports ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
exports [ "default" ] = {
drawRect : function drawRect ( pos , size , ctx , style ) {
ctx . strokeStyle = style . color ;
ctx . fillStyle = style . color ;
ctx . lineWidth = 1 ;
ctx . beginPath ( ) ;
ctx . strokeRect ( pos . x , pos . y , size . x , size . y ) ;
} ,
drawPath : function drawPath ( path , def , ctx , style ) {
ctx . strokeStyle = style . color ;
ctx . fillStyle = style . color ;
ctx . lineWidth = style . lineWidth ;
ctx . beginPath ( ) ;
ctx . moveTo ( path [ 0 ] [ def . x ] , path [ 0 ] [ def . y ] ) ;
for ( var j = 1 ; j < path . length ; j ++ ) {
ctx . lineTo ( path [ j ] [ def . x ] , path [ j ] [ def . y ] ) ;
}
ctx . closePath ( ) ;
ctx . stroke ( ) ;
} ,
drawImage : function drawImage ( imageData , size , ctx ) {
var canvasData = ctx . getImageData ( 0 , 0 , size . x , size . y ) ,
data = canvasData . data ,
imageDataPos = imageData . length ,
canvasDataPos = data . length ,
value ;
if ( canvasDataPos / imageDataPos !== 4 ) {
return false ;
}
while ( imageDataPos -- ) {
value = imageData [ imageDataPos ] ;
data [ -- canvasDataPos ] = 255 ;
data [ -- canvasDataPos ] = value ;
data [ -- canvasDataPos ] = value ;
data [ -- canvasDataPos ] = value ;
}
ctx . putImageData ( canvasData , 0 , 0 ) ;
return true ;
}
} ;
module . exports = exports [ "default" ] ;
/***/ } ,
/* 14 */
/***/ function ( module , exports , _ _webpack _require _ _ ) {
'use strict' ;
Object . defineProperty ( exports , '__esModule' , {
value : true
} ) ;
function _interopRequireDefault ( obj ) { return obj && obj . _ _esModule ? obj : { 'default' : obj } ; }
var _bresenham = _ _webpack _require _ _ ( 15 ) ;
var _bresenham2 = _interopRequireDefault ( _bresenham ) ;
var _image _debug = _ _webpack _require _ _ ( 13 ) ;
var _image _debug2 = _interopRequireDefault ( _image _debug ) ;
var _code _128 _reader = _ _webpack _require _ _ ( 16 ) ;
var _code _128 _reader2 = _interopRequireDefault ( _code _128 _reader ) ;
var _ean _reader = _ _webpack _require _ _ ( 18 ) ;
var _ean _reader2 = _interopRequireDefault ( _ean _reader ) ;
var _code _39 _reader = _ _webpack _require _ _ ( 19 ) ;
var _code _39 _reader2 = _interopRequireDefault ( _code _39 _reader ) ;
var _code _39 _vin _reader = _ _webpack _require _ _ ( 20 ) ;
var _code _39 _vin _reader2 = _interopRequireDefault ( _code _39 _vin _reader ) ;
var _codabar _reader = _ _webpack _require _ _ ( 21 ) ;
var _codabar _reader2 = _interopRequireDefault ( _codabar _reader ) ;
var _upc _reader = _ _webpack _require _ _ ( 22 ) ;
var _upc _reader2 = _interopRequireDefault ( _upc _reader ) ;
var _ean _8 _reader = _ _webpack _require _ _ ( 23 ) ;
var _ean _8 _reader2 = _interopRequireDefault ( _ean _8 _reader ) ;
var _upc _e _reader = _ _webpack _require _ _ ( 24 ) ;
var _upc _e _reader2 = _interopRequireDefault ( _upc _e _reader ) ;
var _i2of5 _reader = _ _webpack _require _ _ ( 25 ) ;
var _i2of5 _reader2 = _interopRequireDefault ( _i2of5 _reader ) ;
var READERS = {
code _128 _reader : _code _128 _reader2 [ 'default' ] ,
ean _reader : _ean _reader2 [ 'default' ] ,
ean _8 _reader : _ean _8 _reader2 [ 'default' ] ,
code _39 _reader : _code _39 _reader2 [ 'default' ] ,
code _39 _vin _reader : _code _39 _vin _reader2 [ 'default' ] ,
codabar _reader : _codabar _reader2 [ 'default' ] ,
upc _reader : _upc _reader2 [ 'default' ] ,
upc _e _reader : _upc _e _reader2 [ 'default' ] ,
i2of5 _reader : _i2of5 _reader2 [ 'default' ]
} ;
exports [ 'default' ] = {
create : function create ( config , inputImageWrapper ) {
var _canvas = {
ctx : {
frequency : null ,
pattern : null ,
overlay : null
} ,
dom : {
frequency : null ,
pattern : null ,
overlay : null
}
} ,
_barcodeReaders = [ ] ;
initCanvas ( ) ;
initReaders ( ) ;
initConfig ( ) ;
function initCanvas ( ) {
if ( typeof document !== 'undefined' ) {
var $debug = document . querySelector ( "#debug.detection" ) ;
_canvas . dom . frequency = document . querySelector ( "canvas.frequency" ) ;
if ( ! _canvas . dom . frequency ) {
_canvas . dom . frequency = document . createElement ( "canvas" ) ;
_canvas . dom . frequency . className = "frequency" ;
if ( $debug ) {
$debug . appendChild ( _canvas . dom . frequency ) ;
}
}
_canvas . ctx . frequency = _canvas . dom . frequency . getContext ( "2d" ) ;
_canvas . dom . pattern = document . querySelector ( "canvas.patternBuffer" ) ;
if ( ! _canvas . dom . pattern ) {
_canvas . dom . pattern = document . createElement ( "canvas" ) ;
_canvas . dom . pattern . className = "patternBuffer" ;
if ( $debug ) {
$debug . appendChild ( _canvas . dom . pattern ) ;
}
}
_canvas . ctx . pattern = _canvas . dom . pattern . getContext ( "2d" ) ;
_canvas . dom . overlay = document . querySelector ( "canvas.drawingBuffer" ) ;
if ( _canvas . dom . overlay ) {
_canvas . ctx . overlay = _canvas . dom . overlay . getContext ( "2d" ) ;
}
}
}
function initReaders ( ) {
config . readers . forEach ( function ( readerConfig ) {
var reader ,
configuration = { } ;
if ( typeof readerConfig === 'object' ) {
reader = readerConfig . format ;
configuration = readerConfig . config ;
} else if ( typeof readerConfig === 'string' ) {
reader = readerConfig ;
}
console . log ( "Before registering reader: " , reader ) ;
_barcodeReaders . push ( new READERS [ reader ] ( configuration ) ) ;
} ) ;
console . log ( "Registered Readers: " + _barcodeReaders . map ( function ( reader ) {
return JSON . stringify ( { format : reader . FORMAT , config : reader . config } ) ;
} ) . join ( ', ' ) ) ;
}
function initConfig ( ) {
if ( typeof document !== 'undefined' ) {
var i ,
vis = [ {
node : _canvas . dom . frequency ,
prop : config . showFrequency
} , {
node : _canvas . dom . pattern ,
prop : config . showPattern
} ] ;
for ( i = 0 ; i < vis . length ; i ++ ) {
if ( vis [ i ] . prop === true ) {
vis [ i ] . node . style . display = "block" ;
} else {
vis [ i ] . node . style . display = "none" ;
}
}
}
}
/ * *
* extend the line on both ends
* @ param { Array } line
* @ param { Number } angle
* /
function getExtendedLine ( line , angle , ext ) {
function extendLine ( amount ) {
var extension = {
y : amount * Math . sin ( angle ) ,
x : amount * Math . cos ( angle )
} ;
line [ 0 ] . y -= extension . y ;
line [ 0 ] . x -= extension . x ;
line [ 1 ] . y += extension . y ;
line [ 1 ] . x += extension . x ;
}
// check if inside image
extendLine ( ext ) ;
while ( ext > 1 && ( ! inputImageWrapper . inImageWithBorder ( line [ 0 ] , 0 ) || ! inputImageWrapper . inImageWithBorder ( line [ 1 ] , 0 ) ) ) {
ext -= Math . ceil ( ext / 2 ) ;
extendLine ( - ext ) ;
}
return line ;
}
function getLine ( box ) {
return [ {
x : ( box [ 1 ] [ 0 ] - box [ 0 ] [ 0 ] ) / 2 + box [ 0 ] [ 0 ] ,
y : ( box [ 1 ] [ 1 ] - box [ 0 ] [ 1 ] ) / 2 + box [ 0 ] [ 1 ]
} , {
x : ( box [ 3 ] [ 0 ] - box [ 2 ] [ 0 ] ) / 2 + box [ 2 ] [ 0 ] ,
y : ( box [ 3 ] [ 1 ] - box [ 2 ] [ 1 ] ) / 2 + box [ 2 ] [ 1 ]
} ] ;
}
function tryDecode ( line ) {
var result = null ,
i ,
barcodeLine = _bresenham2 [ 'default' ] . getBarcodeLine ( inputImageWrapper , line [ 0 ] , line [ 1 ] ) ;
if ( config . showFrequency ) {
_image _debug2 [ 'default' ] . drawPath ( line , { x : 'x' , y : 'y' } , _canvas . ctx . overlay , { color : 'red' , lineWidth : 3 } ) ;
_bresenham2 [ 'default' ] . debug . printFrequency ( barcodeLine . line , _canvas . dom . frequency ) ;
}
_bresenham2 [ 'default' ] . toBinaryLine ( barcodeLine ) ;
if ( config . showPattern ) {
_bresenham2 [ 'default' ] . debug . printPattern ( barcodeLine . line , _canvas . dom . pattern ) ;
}
for ( i = 0 ; i < _barcodeReaders . length && result === null ; i ++ ) {
result = _barcodeReaders [ i ] . decodePattern ( barcodeLine . line ) ;
}
if ( result === null ) {
return null ;
}
return {
codeResult : result ,
barcodeLine : barcodeLine
} ;
}
/ * *
* This method slices the given area apart and tries to detect a barcode - pattern
* for each slice . It returns the decoded barcode , or null if nothing was found
* @ param { Array } box
* @ param { Array } line
* @ param { Number } lineAngle
* /
function tryDecodeBruteForce ( box , line , lineAngle ) {
var sideLength = Math . sqrt ( Math . pow ( box [ 1 ] [ 0 ] - box [ 0 ] [ 0 ] , 2 ) + Math . pow ( box [ 1 ] [ 1 ] - box [ 0 ] [ 1 ] , 2 ) ) ,
i ,
slices = 16 ,
result = null ,
dir ,
extension ,
xdir = Math . sin ( lineAngle ) ,
ydir = Math . cos ( lineAngle ) ;
for ( i = 1 ; i < slices && result === null ; i ++ ) {
// move line perpendicular to angle
dir = sideLength / slices * i * ( i % 2 === 0 ? - 1 : 1 ) ;
extension = {
y : dir * xdir ,
x : dir * ydir
} ;
line [ 0 ] . y += extension . x ;
line [ 0 ] . x -= extension . y ;
line [ 1 ] . y += extension . x ;
line [ 1 ] . x -= extension . y ;
result = tryDecode ( line ) ;
}
return result ;
}
function getLineLength ( line ) {
return Math . sqrt ( Math . pow ( Math . abs ( line [ 1 ] . y - line [ 0 ] . y ) , 2 ) + Math . pow ( Math . abs ( line [ 1 ] . x - line [ 0 ] . x ) , 2 ) ) ;
}
/ * *
* With the help of the configured readers ( Code128 or EAN ) this function tries to detect a
* valid barcode pattern within the given area .
* @ param { Object } box The area to search in
* @ returns { Object } the result { codeResult , line , angle , pattern , threshold }
* /
function _decodeFromBoundingBox ( box ) {
var line ,
lineAngle ,
ctx = _canvas . ctx . overlay ,
result ,
lineLength ;
if ( config . drawBoundingBox && ctx ) {
_image _debug2 [ 'default' ] . drawPath ( box , { x : 0 , y : 1 } , ctx , { color : "blue" , lineWidth : 2 } ) ;
}
line = getLine ( box ) ;
lineLength = getLineLength ( line ) ;
lineAngle = Math . atan2 ( line [ 1 ] . y - line [ 0 ] . y , line [ 1 ] . x - line [ 0 ] . x ) ;
line = getExtendedLine ( line , lineAngle , Math . floor ( lineLength * 0.1 ) ) ;
if ( line === null ) {
return null ;
}
result = tryDecode ( line ) ;
if ( result === null ) {
result = tryDecodeBruteForce ( box , line , lineAngle ) ;
}
if ( result === null ) {
return null ;
}
if ( result && config . drawScanline && ctx ) {
_image _debug2 [ 'default' ] . drawPath ( line , { x : 'x' , y : 'y' } , ctx , { color : 'red' , lineWidth : 3 } ) ;
}
return {
codeResult : result . codeResult ,
line : line ,
angle : lineAngle ,
pattern : result . barcodeLine . line ,
threshold : result . barcodeLine . threshold
} ;
}
return {
decodeFromBoundingBox : function decodeFromBoundingBox ( box ) {
return _decodeFromBoundingBox ( box ) ;
} ,
decodeFromBoundingBoxes : function decodeFromBoundingBoxes ( boxes ) {
var i , result ;
for ( i = 0 ; i < boxes . length ; i ++ ) {
result = _decodeFromBoundingBox ( boxes [ i ] ) ;
if ( result && result . codeResult ) {
result . box = boxes [ i ] ;
return result ;
}
}
} ,
setReaders : function setReaders ( readers ) {
config . readers = readers ;
_barcodeReaders . length = 0 ;
initReaders ( ) ;
}
} ;
}
} ;
module . exports = exports [ 'default' ] ;
/***/ } ,
/* 15 */
/***/ function ( module , exports , _ _webpack _require _ _ ) {
'use strict' ;
Object . defineProperty ( exports , '__esModule' , {
value : true
} ) ;
function _interopRequireDefault ( obj ) { return obj && obj . _ _esModule ? obj : { 'default' : obj } ; }
var _cv _utils = _ _webpack _require _ _ ( 5 ) ;
var _cv _utils2 = _interopRequireDefault ( _cv _utils ) ;
var _image _wrapper = _ _webpack _require _ _ ( 3 ) ;
var _image _wrapper2 = _interopRequireDefault ( _image _wrapper ) ;
var Bresenham = { } ;
var Slope = {
DIR : {
UP : 1 ,
DOWN : - 1
}
} ;
/ * *
* Scans a line of the given image from point p1 to p2 and returns a result object containing
* gray - scale values ( 0 - 255 ) of the underlying pixels in addition to the min
* and max values .
* @ param { Object } imageWrapper
* @ param { Object } p1 The start point { x , y }
* @ param { Object } p2 The end point { x , y }
* @ returns { line , min , max }
* /
Bresenham . getBarcodeLine = function ( imageWrapper , p1 , p2 ) {
var x0 = p1 . x | 0 ,
y0 = p1 . y | 0 ,
x1 = p2 . x | 0 ,
y1 = p2 . y | 0 ,
steep = Math . abs ( y1 - y0 ) > Math . abs ( x1 - x0 ) ,
deltax ,
deltay ,
error ,
ystep ,
y ,
tmp ,
x ,
line = [ ] ,
imageData = imageWrapper . data ,
width = imageWrapper . size . x ,
sum = 0 ,
val ,
min = 255 ,
max = 0 ;
function read ( a , b ) {
val = imageData [ b * width + a ] ;
sum += val ;
min = val < min ? val : min ;
max = val > max ? val : max ;
line . push ( val ) ;
}
if ( steep ) {
tmp = x0 ;
x0 = y0 ;
y0 = tmp ;
tmp = x1 ;
x1 = y1 ;
y1 = tmp ;
}
if ( x0 > x1 ) {
tmp = x0 ;
x0 = x1 ;
x1 = tmp ;
tmp = y0 ;
y0 = y1 ;
y1 = tmp ;
}
deltax = x1 - x0 ;
deltay = Math . abs ( y1 - y0 ) ;
error = deltax / 2 | 0 ;
y = y0 ;
ystep = y0 < y1 ? 1 : - 1 ;
for ( x = x0 ; x < x1 ; x ++ ) {
if ( steep ) {
read ( y , x ) ;
} else {
read ( x , y ) ;
}
error = error - deltay ;
if ( error < 0 ) {
y = y + ystep ;
error = error + deltax ;
}
}
return {
line : line ,
min : min ,
max : max
} ;
} ;
Bresenham . toOtsuBinaryLine = function ( result ) {
var line = result . line ,
image = new _image _wrapper2 [ 'default' ] ( { x : line . length - 1 , y : 1 } , line ) ,
threshold = _cv _utils2 [ 'default' ] . determineOtsuThreshold ( image , 5 ) ;
line = _cv _utils2 [ 'default' ] . sharpenLine ( line ) ;
_cv _utils2 [ 'default' ] . thresholdImage ( image , threshold ) ;
return {
line : line ,
threshold : threshold
} ;
} ;
/ * *
* Converts the result from getBarcodeLine into a binary representation
* also considering the frequency and slope of the signal for more robust results
* @ param { Object } result { line , min , max }
* /
Bresenham . toBinaryLine = function ( result ) {
var min = result . min ,
max = result . max ,
line = result . line ,
slope ,
slope2 ,
center = min + ( max - min ) / 2 ,
extrema = [ ] ,
currentDir ,
dir ,
threshold = ( max - min ) / 12 ,
rThreshold = - threshold ,
i ,
j ;
// 1. find extrema
currentDir = line [ 0 ] > center ? Slope . DIR . UP : Slope . DIR . DOWN ;
extrema . push ( {
pos : 0 ,
val : line [ 0 ]
} ) ;
for ( i = 0 ; i < line . length - 2 ; i ++ ) {
slope = line [ i + 1 ] - line [ i ] ;
slope2 = line [ i + 2 ] - line [ i + 1 ] ;
if ( slope + slope2 < rThreshold && line [ i + 1 ] < center * 1.5 ) {
dir = Slope . DIR . DOWN ;
} else if ( slope + slope2 > threshold && line [ i + 1 ] > center * 0.5 ) {
dir = Slope . DIR . UP ;
} else {
dir = currentDir ;
}
if ( currentDir !== dir ) {
extrema . push ( {
pos : i ,
val : line [ i ]
} ) ;
currentDir = dir ;
}
}
extrema . push ( {
pos : line . length ,
val : line [ line . length - 1 ]
} ) ;
for ( j = extrema [ 0 ] . pos ; j < extrema [ 1 ] . pos ; j ++ ) {
line [ j ] = line [ j ] > center ? 0 : 1 ;
}
// iterate over extrema and convert to binary based on avg between minmax
for ( i = 1 ; i < extrema . length - 1 ; i ++ ) {
if ( extrema [ i + 1 ] . val > extrema [ i ] . val ) {
threshold = extrema [ i ] . val + ( extrema [ i + 1 ] . val - extrema [ i ] . val ) / 3 * 2 | 0 ;
} else {
threshold = extrema [ i + 1 ] . val + ( extrema [ i ] . val - extrema [ i + 1 ] . val ) / 3 | 0 ;
}
for ( j = extrema [ i ] . pos ; j < extrema [ i + 1 ] . pos ; j ++ ) {
line [ j ] = line [ j ] > threshold ? 0 : 1 ;
}
}
return {
line : line ,
threshold : threshold
} ;
} ;
/ * *
* Used for development only
* /
Bresenham . debug = {
printFrequency : function printFrequency ( line , canvas ) {
var i ,
ctx = canvas . getContext ( "2d" ) ;
canvas . width = line . length ;
canvas . height = 256 ;
ctx . beginPath ( ) ;
ctx . strokeStyle = "blue" ;
for ( i = 0 ; i < line . length ; i ++ ) {
ctx . moveTo ( i , 255 ) ;
ctx . lineTo ( i , 255 - line [ i ] ) ;
}
ctx . stroke ( ) ;
ctx . closePath ( ) ;
} ,
printPattern : function printPattern ( line , canvas ) {
var ctx = canvas . getContext ( "2d" ) ,
i ;
canvas . width = line . length ;
ctx . fillColor = "black" ;
for ( i = 0 ; i < line . length ; i ++ ) {
if ( line [ i ] === 1 ) {
ctx . fillRect ( i , 0 , 1 , 100 ) ;
}
}
}
} ;
exports [ 'default' ] = Bresenham ;
module . exports = exports [ 'default' ] ;
/***/ } ,
/* 16 */
/***/ function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
function _interopRequireDefault ( obj ) { return obj && obj . _ _esModule ? obj : { "default" : obj } ; }
var _barcode _reader = _ _webpack _require _ _ ( 17 ) ;
var _barcode _reader2 = _interopRequireDefault ( _barcode _reader ) ;
function Code128Reader ( ) {
_barcode _reader2 [ "default" ] . call ( this ) ;
}
var properties = {
CODE _SHIFT : { value : 98 } ,
CODE _C : { value : 99 } ,
CODE _B : { value : 100 } ,
CODE _A : { value : 101 } ,
START _CODE _A : { value : 103 } ,
START _CODE _B : { value : 104 } ,
START _CODE _C : { value : 105 } ,
STOP _CODE : { value : 106 } ,
MODULO : { value : 11 } ,
CODE _PATTERN : { value : [ [ 2 , 1 , 2 , 2 , 2 , 2 ] , [ 2 , 2 , 2 , 1 , 2 , 2 ] , [ 2 , 2 , 2 , 2 , 2 , 1 ] , [ 1 , 2 , 1 , 2 , 2 , 3 ] , [ 1 , 2 , 1 , 3 , 2 , 2 ] , [ 1 , 3 , 1 , 2 , 2 , 2 ] , [ 1 , 2 , 2 , 2 , 1 , 3 ] , [ 1 , 2 , 2 , 3 , 1 , 2 ] , [ 1 , 3 , 2 , 2 , 1 , 2 ] , [ 2 , 2 , 1 , 2 , 1 , 3 ] , [ 2 , 2 , 1 , 3 , 1 , 2 ] , [ 2 , 3 , 1 , 2 , 1 , 2 ] , [ 1 , 1 , 2 , 2 , 3 , 2 ] , [ 1 , 2 , 2 , 1 , 3 , 2 ] , [ 1 , 2 , 2 , 2 , 3 , 1 ] , [ 1 , 1 , 3 , 2 , 2 , 2 ] , [ 1 , 2 , 3 , 1 , 2 , 2 ] , [ 1 , 2 , 3 , 2 , 2 , 1 ] , [ 2 , 2 , 3 , 2 , 1 , 1 ] , [ 2 , 2 , 1 , 1 , 3 , 2 ] , [ 2 , 2 , 1 , 2 , 3 , 1 ] , [ 2 , 1 , 3 , 2 , 1 , 2 ] , [ 2 , 2 , 3 , 1 , 1 , 2 ] , [ 3 , 1 , 2 , 1 , 3 , 1 ] , [ 3 , 1 , 1 , 2 , 2 , 2 ] , [ 3 , 2 , 1 , 1 , 2 , 2 ] , [ 3 , 2 , 1 , 2 , 2 , 1 ] , [ 3 , 1 , 2 , 2 , 1 , 2 ] , [ 3 , 2 , 2 , 1 , 1 , 2 ] , [ 3 , 2 , 2 , 2 , 1 , 1 ] , [ 2 , 1 , 2 , 1 , 2 , 3 ] , [ 2 , 1 , 2 , 3 , 2 , 1 ] , [ 2 , 3 , 2 , 1 , 2 , 1 ] , [ 1 , 1 , 1 , 3 , 2 , 3 ] , [ 1 , 3 , 1 , 1 , 2 , 3 ] , [ 1 , 3 , 1 , 3 , 2 , 1 ] , [ 1 , 1 , 2 , 3 , 1 , 3 ] , [ 1 , 3 , 2 , 1 , 1 , 3 ] , [ 1 , 3 , 2 , 3 , 1 , 1 ] , [ 2 , 1 , 1 , 3 , 1 , 3 ] , [ 2 , 3 , 1 , 1 , 1 , 3 ] , [ 2 , 3 , 1 , 3 , 1 , 1 ] , [ 1 , 1 , 2 , 1 , 3 , 3 ] , [ 1 , 1 , 2 , 3 , 3 , 1 ] , [ 1 , 3 , 2 , 1 , 3 , 1 ] , [ 1 , 1 , 3 , 1 , 2 , 3 ] , [ 1 , 1 , 3 , 3 , 2 , 1 ] , [ 1 , 3 , 3 , 1 , 2 , 1 ] , [ 3 , 1 , 3 , 1 , 2 , 1 ] , [ 2 , 1 , 1 , 3 , 3 , 1 ] , [ 2 , 3 , 1 , 1 , 3 , 1 ] , [ 2 , 1 , 3 , 1 , 1 , 3 ] , [ 2 , 1 , 3 , 3 , 1 , 1 ] , [ 2 , 1 , 3 , 1 , 3 , 1 ] , [ 3 , 1 , 1 , 1 , 2 , 3 ] , [ 3 , 1 , 1 , 3 , 2 , 1 ] , [ 3 , 3 , 1 , 1 , 2 , 1 ] , [ 3 , 1 , 2 , 1 , 1 , 3 ] , [ 3 , 1 , 2 , 3 , 1 , 1 ] , [ 3 , 3 , 2 , 1 , 1 , 1 ] , [ 3 , 1 , 4 , 1 , 1 , 1 ] , [ 2 , 2 , 1 , 4 , 1 , 1 ] , [ 4 , 3 , 1 , 1 , 1 , 1 ] , [ 1 , 1 , 1 , 2 , 2 , 4 ] , [ 1 , 1 , 1 , 4 , 2 , 2 ] , [ 1 , 2 , 1 , 1 , 2 , 4 ] , [ 1 , 2 , 1 , 4 , 2 , 1 ] , [ 1 , 4 , 1 , 1 , 2 , 2 ] , [ 1 , 4 , 1 , 2 , 2 , 1 ] , [ 1 , 1 , 2 , 2 , 1 , 4 ] , [ 1 , 1 , 2 , 4 , 1 , 2 ] , [ 1 , 2 , 2 , 1 , 1 , 4 ] , [ 1 , 2 , 2 , 4 , 1 , 1 ] , [ 1 , 4 , 2 , 1 , 1 , 2 ] , [ 1 , 4 , 2 , 2 , 1 , 1 ] , [ 2 , 4 , 1 , 2 , 1 , 1 ] , [ 2 , 2 , 1 , 1 , 1 , 4 ] , [ 4 , 1 , 3 , 1 , 1 , 1 ] , [ 2 , 4 , 1 , 1 , 1 , 2 ] , [ 1 , 3 , 4 , 1 , 1 , 1 ] , [ 1 , 1 , 1 , 2 , 4 , 2 ] , [ 1 , 2 , 1 , 1 , 4 , 2 ] , [ 1 , 2 , 1 , 2 , 4 , 1 ] , [ 1 , 1 , 4 , 2 , 1 , 2 ] , [ 1 , 2 , 4 , 1 , 1 , 2 ] , [ 1 , 2 , 4 , 2 , 1 , 1 ] , [ 4 , 1 , 1 , 2 , 1 , 2 ] , [ 4 , 2 , 1 , 1 , 1 , 2 ] , [ 4 , 2 , 1 , 2 , 1 , 1 ] , [ 2 , 1 , 2 , 1 , 4 , 1 ] , [ 2 , 1 , 4 , 1 , 2 , 1 ] , [ 4 , 1 , 2 , 1 , 2 , 1 ] , [ 1 , 1 , 1 , 1 , 4 , 3 ] , [ 1 , 1 , 1 , 3 , 4 , 1 ] , [ 1 , 3 , 1 , 1 , 4 , 1 ] , [ 1 , 1 , 4 , 1 , 1 , 3 ] , [ 1 , 1 , 4 , 3 , 1 , 1 ] , [ 4 , 1 , 1 , 1 , 1 , 3 ] , [ 4 , 1 , 1 , 3 , 1 , 1 ] , [ 1 , 1 , 3 , 1 , 4 , 1 ] , [ 1 , 1 , 4 , 1 , 3 , 1 ] , [ 3 , 1 , 1 , 1 , 4 , 1 ] , [ 4 , 1 , 1 , 1 , 3 , 1 ] , [ 2 , 1 , 1 , 4 , 1 , 2 ] , [ 2 , 1 , 1 , 2 , 1 , 4 ] , [ 2 , 1 , 1 , 2 , 3 , 2 ] , [ 2 , 3 , 3 , 1 , 1 , 1 , 2 ] ] } ,
SINGLE _CODE _ERROR : { value : 1 } ,
AVG _CODE _ERROR : { value : 0.5 } ,
FORMAT : { value : "code_128" , writeable : false }
} ;
Code128Reader . prototype = Object . create ( _barcode _reader2 [ "default" ] . prototype , properties ) ;
Code128Reader . prototype . constructor = Code128Reader ;
Code128Reader . prototype . _decodeCode = function ( start ) {
var counter = [ 0 , 0 , 0 , 0 , 0 , 0 ] ,
i ,
self = this ,
offset = start ,
isWhite = ! self . _row [ offset ] ,
counterPos = 0 ,
bestMatch = {
error : Number . MAX _VALUE ,
code : - 1 ,
start : start ,
end : start
} ,
code ,
error ,
normalized ;
for ( i = offset ; i < self . _row . length ; i ++ ) {
if ( self . _row [ i ] ^ isWhite ) {
counter [ counterPos ] ++ ;
} else {
if ( counterPos === counter . length - 1 ) {
normalized = self . _normalize ( counter ) ;
if ( normalized ) {
for ( code = 0 ; code < self . CODE _PATTERN . length ; code ++ ) {
error = self . _matchPattern ( normalized , self . CODE _PATTERN [ code ] ) ;
if ( error < bestMatch . error ) {
bestMatch . code = code ;
bestMatch . error = error ;
}
}
bestMatch . end = i ;
return bestMatch ;
}
} else {
counterPos ++ ;
}
counter [ counterPos ] = 1 ;
isWhite = ! isWhite ;
}
}
return null ;
} ;
Code128Reader . prototype . _findStart = function ( ) {
var counter = [ 0 , 0 , 0 , 0 , 0 , 0 ] ,
i ,
self = this ,
offset = self . _nextSet ( self . _row ) ,
isWhite = false ,
counterPos = 0 ,
bestMatch = {
error : Number . MAX _VALUE ,
code : - 1 ,
start : 0 ,
end : 0
} ,
code ,
error ,
j ,
sum ,
normalized ;
for ( i = offset ; i < self . _row . length ; i ++ ) {
if ( self . _row [ i ] ^ isWhite ) {
counter [ counterPos ] ++ ;
} else {
if ( counterPos === counter . length - 1 ) {
sum = 0 ;
for ( j = 0 ; j < counter . length ; j ++ ) {
sum += counter [ j ] ;
}
normalized = self . _normalize ( counter ) ;
if ( normalized ) {
for ( code = self . START _CODE _A ; code <= self . START _CODE _C ; code ++ ) {
error = self . _matchPattern ( normalized , self . CODE _PATTERN [ code ] ) ;
if ( error < bestMatch . error ) {
bestMatch . code = code ;
bestMatch . error = error ;
}
}
if ( bestMatch . error < self . AVG _CODE _ERROR ) {
bestMatch . start = i - sum ;
bestMatch . end = i ;
return bestMatch ;
}
}
for ( j = 0 ; j < 4 ; j ++ ) {
counter [ j ] = counter [ j + 2 ] ;
}
counter [ 4 ] = 0 ;
counter [ 5 ] = 0 ;
counterPos -- ;
} else {
counterPos ++ ;
}
counter [ counterPos ] = 1 ;
isWhite = ! isWhite ;
}
}
return null ;
} ;
Code128Reader . prototype . _decode = function ( ) {
var self = this ,
startInfo = self . _findStart ( ) ,
code = null ,
done = false ,
result = [ ] ,
multiplier = 0 ,
checksum = 0 ,
codeset ,
rawResult = [ ] ,
decodedCodes = [ ] ,
shiftNext = false ,
unshift ,
removeLastCharacter = true ;
if ( startInfo === null ) {
return null ;
}
code = {
code : startInfo . code ,
start : startInfo . start ,
end : startInfo . end
} ;
decodedCodes . push ( code ) ;
checksum = code . code ;
switch ( code . code ) {
case self . START _CODE _A :
codeset = self . CODE _A ;
break ;
case self . START _CODE _B :
codeset = self . CODE _B ;
break ;
case self . START _CODE _C :
codeset = self . CODE _C ;
break ;
default :
return null ;
}
while ( ! done ) {
unshift = shiftNext ;
shiftNext = false ;
code = self . _decodeCode ( code . end ) ;
if ( code !== null ) {
if ( code . code !== self . STOP _CODE ) {
removeLastCharacter = true ;
}
if ( code . code !== self . STOP _CODE ) {
rawResult . push ( code . code ) ;
multiplier ++ ;
checksum += multiplier * code . code ;
}
decodedCodes . push ( code ) ;
switch ( codeset ) {
case self . CODE _A :
if ( code . code < 64 ) {
result . push ( String . fromCharCode ( 32 + code . code ) ) ;
} else if ( code . code < 96 ) {
result . push ( String . fromCharCode ( code . code - 64 ) ) ;
} else {
if ( code . code !== self . STOP _CODE ) {
removeLastCharacter = false ;
}
switch ( code . code ) {
case self . CODE _SHIFT :
shiftNext = true ;
codeset = self . CODE _B ;
break ;
case self . CODE _B :
codeset = self . CODE _B ;
break ;
case self . CODE _C :
codeset = self . CODE _C ;
break ;
case self . STOP _CODE :
done = true ;
break ;
}
}
break ;
case self . CODE _B :
if ( code . code < 96 ) {
result . push ( String . fromCharCode ( 32 + code . code ) ) ;
} else {
if ( code . code !== self . STOP _CODE ) {
removeLastCharacter = false ;
}
switch ( code . code ) {
case self . CODE _SHIFT :
shiftNext = true ;
codeset = self . CODE _A ;
break ;
case self . CODE _A :
codeset = self . CODE _A ;
break ;
case self . CODE _C :
codeset = self . CODE _C ;
break ;
case self . STOP _CODE :
done = true ;
break ;
}
}
break ;
case self . CODE _C :
if ( code . code < 100 ) {
result . push ( code . code < 10 ? "0" + code . code : code . code ) ;
} else {
if ( code . code !== self . STOP _CODE ) {
removeLastCharacter = false ;
}
switch ( code . code ) {
case self . CODE _A :
codeset = self . CODE _A ;
break ;
case self . CODE _B :
codeset = self . CODE _B ;
break ;
case self . STOP _CODE :
done = true ;
break ;
}
}
break ;
}
} else {
done = true ;
}
if ( unshift ) {
codeset = codeset === self . CODE _A ? self . CODE _B : self . CODE _A ;
}
}
if ( code === null ) {
return null ;
}
code . end = self . _nextUnset ( self . _row , code . end ) ;
if ( ! self . _verifyTrailingWhitespace ( code ) ) {
return null ;
}
checksum -= multiplier * rawResult [ rawResult . length - 1 ] ;
if ( checksum % 103 !== rawResult [ rawResult . length - 1 ] ) {
return null ;
}
if ( ! result . length ) {
return null ;
}
// remove last code from result (checksum)
if ( removeLastCharacter ) {
result . splice ( result . length - 1 , 1 ) ;
}
return {
code : result . join ( "" ) ,
start : startInfo . start ,
end : code . end ,
codeset : codeset ,
startInfo : startInfo ,
decodedCodes : decodedCodes ,
endInfo : code
} ;
} ;
_barcode _reader2 [ "default" ] . prototype . _verifyTrailingWhitespace = function ( endInfo ) {
var self = this ,
trailingWhitespaceEnd ;
trailingWhitespaceEnd = endInfo . end + ( endInfo . end - endInfo . start ) / 2 ;
if ( trailingWhitespaceEnd < self . _row . length ) {
if ( self . _matchRange ( endInfo . end , trailingWhitespaceEnd , 0 ) ) {
return endInfo ;
}
}
return null ;
} ;
exports [ "default" ] = Code128Reader ;
module . exports = exports [ "default" ] ;
/***/ } ,
/* 17 */
/***/ function ( module , exports ) {
'use strict' ;
Object . defineProperty ( exports , '__esModule' , {
value : true
} ) ;
function BarcodeReader ( config ) {
this . _row = [ ] ;
this . config = config || { } ;
return this ;
}
BarcodeReader . prototype . _nextUnset = function ( line , start ) {
var i ;
if ( start === undefined ) {
start = 0 ;
}
for ( i = start ; i < line . length ; i ++ ) {
if ( ! line [ i ] ) {
return i ;
}
}
return line . length ;
} ;
BarcodeReader . prototype . _matchPattern = function ( counter , code ) {
var i ,
error = 0 ,
singleError = 0 ,
modulo = this . MODULO ,
maxSingleError = this . SINGLE _CODE _ERROR || 1 ;
for ( i = 0 ; i < counter . length ; i ++ ) {
singleError = Math . abs ( code [ i ] - counter [ i ] ) ;
if ( singleError > maxSingleError ) {
return Number . MAX _VALUE ;
}
error += singleError ;
}
return error / modulo ;
} ;
BarcodeReader . prototype . _nextSet = function ( line , offset ) {
var i ;
offset = offset || 0 ;
for ( i = offset ; i < line . length ; i ++ ) {
if ( line [ i ] ) {
return i ;
}
}
return line . length ;
} ;
BarcodeReader . prototype . _normalize = function ( counter , modulo ) {
var i ,
self = this ,
sum = 0 ,
ratio ,
numOnes = 0 ,
normalized = [ ] ,
norm = 0 ;
if ( ! modulo ) {
modulo = self . MODULO ;
}
for ( i = 0 ; i < counter . length ; i ++ ) {
if ( counter [ i ] === 1 ) {
numOnes ++ ;
} else {
sum += counter [ i ] ;
}
}
ratio = sum / ( modulo - numOnes ) ;
if ( ratio > 1.0 ) {
for ( i = 0 ; i < counter . length ; i ++ ) {
norm = counter [ i ] === 1 ? counter [ i ] : counter [ i ] / ratio ;
normalized . push ( norm ) ;
}
} else {
ratio = ( sum + numOnes ) / modulo ;
for ( i = 0 ; i < counter . length ; i ++ ) {
norm = counter [ i ] / ratio ;
normalized . push ( norm ) ;
}
}
return normalized ;
} ;
BarcodeReader . prototype . _matchTrace = function ( cmpCounter , epsilon ) {
var counter = [ ] ,
i ,
self = this ,
offset = self . _nextSet ( self . _row ) ,
isWhite = ! self . _row [ offset ] ,
counterPos = 0 ,
bestMatch = {
error : Number . MAX _VALUE ,
code : - 1 ,
start : 0
} ,
error ;
if ( cmpCounter ) {
for ( i = 0 ; i < cmpCounter . length ; i ++ ) {
counter . push ( 0 ) ;
}
for ( i = offset ; i < self . _row . length ; i ++ ) {
if ( self . _row [ i ] ^ isWhite ) {
counter [ counterPos ] ++ ;
} else {
if ( counterPos === counter . length - 1 ) {
error = self . _matchPattern ( counter , cmpCounter ) ;
if ( error < epsilon ) {
bestMatch . start = i - offset ;
bestMatch . end = i ;
bestMatch . counter = counter ;
return bestMatch ;
} else {
return null ;
}
} else {
counterPos ++ ;
}
counter [ counterPos ] = 1 ;
isWhite = ! isWhite ;
}
}
} else {
counter . push ( 0 ) ;
for ( i = offset ; i < self . _row . length ; i ++ ) {
if ( self . _row [ i ] ^ isWhite ) {
counter [ counterPos ] ++ ;
} else {
counterPos ++ ;
counter . push ( 0 ) ;
counter [ counterPos ] = 1 ;
isWhite = ! isWhite ;
}
}
}
// if cmpCounter was not given
bestMatch . start = offset ;
bestMatch . end = self . _row . length - 1 ;
bestMatch . counter = counter ;
return bestMatch ;
} ;
BarcodeReader . prototype . decodePattern = function ( pattern ) {
var self = this ,
result ;
self . _row = pattern ;
result = self . _decode ( ) ;
if ( result === null ) {
self . _row . reverse ( ) ;
result = self . _decode ( ) ;
if ( result ) {
result . direction = BarcodeReader . DIRECTION . REVERSE ;
result . start = self . _row . length - result . start ;
result . end = self . _row . length - result . end ;
}
} else {
result . direction = BarcodeReader . DIRECTION . FORWARD ;
}
if ( result ) {
result . format = self . FORMAT ;
}
return result ;
} ;
BarcodeReader . prototype . _matchRange = function ( start , end , value ) {
var i ;
start = start < 0 ? 0 : start ;
for ( i = start ; i < end ; i ++ ) {
if ( this . _row [ i ] !== value ) {
return false ;
}
}
return true ;
} ;
BarcodeReader . prototype . _fillCounters = function ( offset , end , isWhite ) {
var self = this ,
counterPos = 0 ,
i ,
counters = [ ] ;
isWhite = typeof isWhite !== 'undefined' ? isWhite : true ;
offset = typeof offset !== 'undefined' ? offset : self . _nextUnset ( self . _row ) ;
end = end || self . _row . length ;
counters [ counterPos ] = 0 ;
for ( i = offset ; i < end ; i ++ ) {
if ( self . _row [ i ] ^ isWhite ) {
counters [ counterPos ] ++ ;
} else {
counterPos ++ ;
counters [ counterPos ] = 1 ;
isWhite = ! isWhite ;
}
}
return counters ;
} ;
Object . defineProperty ( BarcodeReader . prototype , "FORMAT" , {
value : 'unknown' ,
writeable : false
} ) ;
BarcodeReader . DIRECTION = {
FORWARD : 1 ,
REVERSE : - 1
} ;
BarcodeReader . Exception = {
StartNotFoundException : "Start-Info was not found!" ,
CodeNotFoundException : "Code could not be found!" ,
PatternNotFoundException : "Pattern could not be found!"
} ;
BarcodeReader . CONFIG _KEYS = { } ;
exports [ 'default' ] = BarcodeReader ;
module . exports = exports [ 'default' ] ;
/***/ } ,
/* 18 */
/***/ function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
function _interopRequireDefault ( obj ) { return obj && obj . _ _esModule ? obj : { "default" : obj } ; }
var _barcode _reader = _ _webpack _require _ _ ( 17 ) ;
var _barcode _reader2 = _interopRequireDefault ( _barcode _reader ) ;
function EANReader ( opts ) {
_barcode _reader2 [ "default" ] . call ( this , opts ) ;
}
var properties = {
CODE _L _START : { value : 0 } ,
MODULO : { value : 7 } ,
CODE _G _START : { value : 10 } ,
START _PATTERN : { value : [ 1 / 3 * 7 , 1 / 3 * 7 , 1 / 3 * 7 ] } ,
STOP _PATTERN : { value : [ 1 / 3 * 7 , 1 / 3 * 7 , 1 / 3 * 7 ] } ,
MIDDLE _PATTERN : { value : [ 1 / 5 * 7 , 1 / 5 * 7 , 1 / 5 * 7 , 1 / 5 * 7 , 1 / 5 * 7 ] } ,
CODE _PATTERN : { value : [ [ 3 , 2 , 1 , 1 ] , [ 2 , 2 , 2 , 1 ] , [ 2 , 1 , 2 , 2 ] , [ 1 , 4 , 1 , 1 ] , [ 1 , 1 , 3 , 2 ] , [ 1 , 2 , 3 , 1 ] , [ 1 , 1 , 1 , 4 ] , [ 1 , 3 , 1 , 2 ] , [ 1 , 2 , 1 , 3 ] , [ 3 , 1 , 1 , 2 ] , [ 1 , 1 , 2 , 3 ] , [ 1 , 2 , 2 , 2 ] , [ 2 , 2 , 1 , 2 ] , [ 1 , 1 , 4 , 1 ] , [ 2 , 3 , 1 , 1 ] , [ 1 , 3 , 2 , 1 ] , [ 4 , 1 , 1 , 1 ] , [ 2 , 1 , 3 , 1 ] , [ 3 , 1 , 2 , 1 ] , [ 2 , 1 , 1 , 3 ] ] } ,
CODE _FREQUENCY : { value : [ 0 , 11 , 13 , 14 , 19 , 25 , 28 , 21 , 22 , 26 ] } ,
SINGLE _CODE _ERROR : { value : 0.67 } ,
AVG _CODE _ERROR : { value : 0.27 } ,
FORMAT : { value : "ean_13" , writeable : false }
} ;
EANReader . prototype = Object . create ( _barcode _reader2 [ "default" ] . prototype , properties ) ;
EANReader . prototype . constructor = EANReader ;
EANReader . prototype . _decodeCode = function ( start , coderange ) {
var counter = [ 0 , 0 , 0 , 0 ] ,
i ,
self = this ,
offset = start ,
isWhite = ! self . _row [ offset ] ,
counterPos = 0 ,
bestMatch = {
error : Number . MAX _VALUE ,
code : - 1 ,
start : start ,
end : start
} ,
code ,
error ,
normalized ;
if ( ! coderange ) {
coderange = self . CODE _PATTERN . length ;
}
for ( i = offset ; i < self . _row . length ; i ++ ) {
if ( self . _row [ i ] ^ isWhite ) {
counter [ counterPos ] ++ ;
} else {
if ( counterPos === counter . length - 1 ) {
normalized = self . _normalize ( counter ) ;
if ( normalized ) {
for ( code = 0 ; code < coderange ; code ++ ) {
error = self . _matchPattern ( normalized , self . CODE _PATTERN [ code ] ) ;
if ( error < bestMatch . error ) {
bestMatch . code = code ;
bestMatch . error = error ;
}
}
bestMatch . end = i ;
if ( bestMatch . error > self . AVG _CODE _ERROR ) {
return null ;
}
return bestMatch ;
}
} else {
counterPos ++ ;
}
counter [ counterPos ] = 1 ;
isWhite = ! isWhite ;
}
}
return null ;
} ;
EANReader . prototype . _findPattern = function ( pattern , offset , isWhite , tryHarder , epsilon ) {
var counter = [ ] ,
self = this ,
i ,
counterPos = 0 ,
bestMatch = {
error : Number . MAX _VALUE ,
code : - 1 ,
start : 0 ,
end : 0
} ,
error ,
j ,
sum ,
normalized ;
if ( ! offset ) {
offset = self . _nextSet ( self . _row ) ;
}
if ( isWhite === undefined ) {
isWhite = false ;
}
if ( tryHarder === undefined ) {
tryHarder = true ;
}
if ( epsilon === undefined ) {
epsilon = self . AVG _CODE _ERROR ;
}
for ( i = 0 ; i < pattern . length ; i ++ ) {
counter [ i ] = 0 ;
}
for ( i = offset ; i < self . _row . length ; i ++ ) {
if ( self . _row [ i ] ^ isWhite ) {
counter [ counterPos ] ++ ;
} else {
if ( counterPos === counter . length - 1 ) {
sum = 0 ;
for ( j = 0 ; j < counter . length ; j ++ ) {
sum += counter [ j ] ;
}
normalized = self . _normalize ( counter ) ;
if ( normalized ) {
error = self . _matchPattern ( normalized , pattern ) ;
if ( error < epsilon ) {
bestMatch . error = error ;
bestMatch . start = i - sum ;
bestMatch . end = i ;
return bestMatch ;
}
}
if ( tryHarder ) {
for ( j = 0 ; j < counter . length - 2 ; j ++ ) {
counter [ j ] = counter [ j + 2 ] ;
}
counter [ counter . length - 2 ] = 0 ;
counter [ counter . length - 1 ] = 0 ;
counterPos -- ;
} else {
return null ;
}
} else {
counterPos ++ ;
}
counter [ counterPos ] = 1 ;
isWhite = ! isWhite ;
}
}
return null ;
} ;
EANReader . prototype . _findStart = function ( ) {
var self = this ,
leadingWhitespaceStart ,
offset = self . _nextSet ( self . _row ) ,
startInfo ;
while ( ! startInfo ) {
startInfo = self . _findPattern ( self . START _PATTERN , offset ) ;
if ( ! startInfo ) {
return null ;
}
leadingWhitespaceStart = startInfo . start - ( startInfo . end - startInfo . start ) ;
if ( leadingWhitespaceStart >= 0 ) {
if ( self . _matchRange ( leadingWhitespaceStart , startInfo . start , 0 ) ) {
return startInfo ;
}
}
offset = startInfo . end ;
startInfo = null ;
}
} ;
EANReader . prototype . _verifyTrailingWhitespace = function ( endInfo ) {
var self = this ,
trailingWhitespaceEnd ;
trailingWhitespaceEnd = endInfo . end + ( endInfo . end - endInfo . start ) ;
if ( trailingWhitespaceEnd < self . _row . length ) {
if ( self . _matchRange ( endInfo . end , trailingWhitespaceEnd , 0 ) ) {
return endInfo ;
}
}
return null ;
} ;
EANReader . prototype . _findEnd = function ( offset , isWhite ) {
var self = this ,
endInfo = self . _findPattern ( self . STOP _PATTERN , offset , isWhite , false ) ;
return endInfo !== null ? self . _verifyTrailingWhitespace ( endInfo ) : null ;
} ;
EANReader . prototype . _calculateFirstDigit = function ( codeFrequency ) {
var i ,
self = this ;
for ( i = 0 ; i < self . CODE _FREQUENCY . length ; i ++ ) {
if ( codeFrequency === self . CODE _FREQUENCY [ i ] ) {
return i ;
}
}
return null ;
} ;
EANReader . prototype . _decodePayload = function ( code , result , decodedCodes ) {
var i ,
self = this ,
codeFrequency = 0x0 ,
firstDigit ;
for ( i = 0 ; i < 6 ; i ++ ) {
code = self . _decodeCode ( code . end ) ;
if ( ! code ) {
return null ;
}
if ( code . code >= self . CODE _G _START ) {
code . code = code . code - self . CODE _G _START ;
codeFrequency |= 1 << 5 - i ;
} else {
codeFrequency |= 0 << 5 - i ;
}
result . push ( code . code ) ;
decodedCodes . push ( code ) ;
}
firstDigit = self . _calculateFirstDigit ( codeFrequency ) ;
if ( firstDigit === null ) {
return null ;
}
result . unshift ( firstDigit ) ;
code = self . _findPattern ( self . MIDDLE _PATTERN , code . end , true , false ) ;
if ( code === null ) {
return null ;
}
decodedCodes . push ( code ) ;
for ( i = 0 ; i < 6 ; i ++ ) {
code = self . _decodeCode ( code . end , self . CODE _G _START ) ;
if ( ! code ) {
return null ;
}
decodedCodes . push ( code ) ;
result . push ( code . code ) ;
}
return code ;
} ;
EANReader . prototype . _decode = function ( ) {
var startInfo ,
self = this ,
code ,
result = [ ] ,
decodedCodes = [ ] ;
startInfo = self . _findStart ( ) ;
if ( ! startInfo ) {
return null ;
}
code = {
code : startInfo . code ,
start : startInfo . start ,
end : startInfo . end
} ;
decodedCodes . push ( code ) ;
code = self . _decodePayload ( code , result , decodedCodes ) ;
if ( ! code ) {
return null ;
}
code = self . _findEnd ( code . end , false ) ;
if ( ! code ) {
return null ;
}
decodedCodes . push ( code ) ;
// Checksum
if ( ! self . _checksum ( result ) ) {
return null ;
}
return {
code : result . join ( "" ) ,
start : startInfo . start ,
end : code . end ,
codeset : "" ,
startInfo : startInfo ,
decodedCodes : decodedCodes
} ;
} ;
EANReader . prototype . _checksum = function ( result ) {
var sum = 0 ,
i ;
for ( i = result . length - 2 ; i >= 0 ; i -= 2 ) {
sum += result [ i ] ;
}
sum *= 3 ;
for ( i = result . length - 1 ; i >= 0 ; i -= 2 ) {
sum += result [ i ] ;
}
return sum % 10 === 0 ;
} ;
exports [ "default" ] = EANReader ;
module . exports = exports [ "default" ] ;
/***/ } ,
/* 19 */
/***/ function ( module , exports , _ _webpack _require _ _ ) {
'use strict' ;
Object . defineProperty ( exports , '__esModule' , {
value : true
} ) ;
function _interopRequireDefault ( obj ) { return obj && obj . _ _esModule ? obj : { 'default' : obj } ; }
var _barcode _reader = _ _webpack _require _ _ ( 17 ) ;
var _barcode _reader2 = _interopRequireDefault ( _barcode _reader ) ;
var _array _helper = _ _webpack _require _ _ ( 8 ) ;
var _array _helper2 = _interopRequireDefault ( _array _helper ) ;
function Code39Reader ( ) {
_barcode _reader2 [ 'default' ] . call ( this ) ;
}
var properties = {
ALPHABETH _STRING : { value : "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. *$/+%" } ,
ALPHABET : { value : [ 48 , 49 , 50 , 51 , 52 , 53 , 54 , 55 , 56 , 57 , 65 , 66 , 67 , 68 , 69 , 70 , 71 , 72 , 73 , 74 , 75 , 76 , 77 , 78 , 79 , 80 , 81 , 82 , 83 , 84 , 85 , 86 , 87 , 88 , 89 , 90 , 45 , 46 , 32 , 42 , 36 , 47 , 43 , 37 ] } ,
CHARACTER _ENCODINGS : { value : [ 0x034 , 0x121 , 0x061 , 0x160 , 0x031 , 0x130 , 0x070 , 0x025 , 0x124 , 0x064 , 0x109 , 0x049 , 0x148 , 0x019 , 0x118 , 0x058 , 0x00D , 0x10C , 0x04C , 0x01C , 0x103 , 0x043 , 0x142 , 0x013 , 0x112 , 0x052 , 0x007 , 0x106 , 0x046 , 0x016 , 0x181 , 0x0C1 , 0x1C0 , 0x091 , 0x190 , 0x0D0 , 0x085 , 0x184 , 0x0C4 , 0x094 , 0x0A8 , 0x0A2 , 0x08A , 0x02A ] } ,
ASTERISK : { value : 0x094 } ,
FORMAT : { value : "code_39" , writeable : false }
} ;
Code39Reader . prototype = Object . create ( _barcode _reader2 [ 'default' ] . prototype , properties ) ;
Code39Reader . prototype . constructor = Code39Reader ;
Code39Reader . prototype . _toCounters = function ( start , counter ) {
var self = this ,
numCounters = counter . length ,
end = self . _row . length ,
isWhite = ! self . _row [ start ] ,
i ,
counterPos = 0 ;
_array _helper2 [ 'default' ] . init ( counter , 0 ) ;
for ( i = start ; i < end ; i ++ ) {
if ( self . _row [ i ] ^ isWhite ) {
counter [ counterPos ] ++ ;
} else {
counterPos ++ ;
if ( counterPos === numCounters ) {
break ;
} else {
counter [ counterPos ] = 1 ;
isWhite = ! isWhite ;
}
}
}
return counter ;
} ;
Code39Reader . prototype . _decode = function ( ) {
var self = this ,
counters = [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ,
result = [ ] ,
start = self . _findStart ( ) ,
decodedChar ,
lastStart ,
pattern ,
nextStart ;
if ( ! start ) {
return null ;
}
nextStart = self . _nextSet ( self . _row , start . end ) ;
do {
counters = self . _toCounters ( nextStart , counters ) ;
pattern = self . _toPattern ( counters ) ;
if ( pattern < 0 ) {
return null ;
}
decodedChar = self . _patternToChar ( pattern ) ;
if ( decodedChar < 0 ) {
return null ;
}
result . push ( decodedChar ) ;
lastStart = nextStart ;
nextStart += _array _helper2 [ 'default' ] . sum ( counters ) ;
nextStart = self . _nextSet ( self . _row , nextStart ) ;
} while ( decodedChar !== '*' ) ;
result . pop ( ) ;
if ( ! result . length ) {
return null ;
}
if ( ! self . _verifyTrailingWhitespace ( lastStart , nextStart , counters ) ) {
return null ;
}
return {
code : result . join ( "" ) ,
start : start . start ,
end : nextStart ,
startInfo : start ,
decodedCodes : result
} ;
} ;
Code39Reader . prototype . _verifyTrailingWhitespace = function ( lastStart , nextStart , counters ) {
var trailingWhitespaceEnd ,
patternSize = _array _helper2 [ 'default' ] . sum ( counters ) ;
trailingWhitespaceEnd = nextStart - lastStart - patternSize ;
if ( trailingWhitespaceEnd * 3 >= patternSize ) {
return true ;
}
return false ;
} ;
Code39Reader . prototype . _patternToChar = function ( pattern ) {
var i ,
self = this ;
for ( i = 0 ; i < self . CHARACTER _ENCODINGS . length ; i ++ ) {
if ( self . CHARACTER _ENCODINGS [ i ] === pattern ) {
return String . fromCharCode ( self . ALPHABET [ i ] ) ;
}
}
return - 1 ;
} ;
Code39Reader . prototype . _findNextWidth = function ( counters , current ) {
var i ,
minWidth = Number . MAX _VALUE ;
for ( i = 0 ; i < counters . length ; i ++ ) {
if ( counters [ i ] < minWidth && counters [ i ] > current ) {
minWidth = counters [ i ] ;
}
}
return minWidth ;
} ;
Code39Reader . prototype . _toPattern = function ( counters ) {
var numCounters = counters . length ,
maxNarrowWidth = 0 ,
numWideBars = numCounters ,
wideBarWidth = 0 ,
self = this ,
pattern ,
i ;
while ( numWideBars > 3 ) {
maxNarrowWidth = self . _findNextWidth ( counters , maxNarrowWidth ) ;
numWideBars = 0 ;
pattern = 0 ;
for ( i = 0 ; i < numCounters ; i ++ ) {
if ( counters [ i ] > maxNarrowWidth ) {
pattern |= 1 << numCounters - 1 - i ;
numWideBars ++ ;
wideBarWidth += counters [ i ] ;
}
}
if ( numWideBars === 3 ) {
for ( i = 0 ; i < numCounters && numWideBars > 0 ; i ++ ) {
if ( counters [ i ] > maxNarrowWidth ) {
numWideBars -- ;
if ( counters [ i ] * 2 >= wideBarWidth ) {
return - 1 ;
}
}
}
return pattern ;
}
}
return - 1 ;
} ;
Code39Reader . prototype . _findStart = function ( ) {
var self = this ,
offset = self . _nextSet ( self . _row ) ,
patternStart = offset ,
counter = [ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ] ,
counterPos = 0 ,
isWhite = false ,
i ,
j ,
whiteSpaceMustStart ;
for ( i = offset ; i < self . _row . length ; i ++ ) {
if ( self . _row [ i ] ^ isWhite ) {
counter [ counterPos ] ++ ;
} else {
if ( counterPos === counter . length - 1 ) {
// find start pattern
if ( self . _toPattern ( counter ) === self . ASTERISK ) {
whiteSpaceMustStart = Math . floor ( Math . max ( 0 , patternStart - ( i - patternStart ) / 4 ) ) ;
if ( self . _matchRange ( whiteSpaceMustStart , patternStart , 0 ) ) {
return {
start : patternStart ,
end : i
} ;
}
}
patternStart += counter [ 0 ] + counter [ 1 ] ;
for ( j = 0 ; j < 7 ; j ++ ) {
counter [ j ] = counter [ j + 2 ] ;
}
counter [ 7 ] = 0 ;
counter [ 8 ] = 0 ;
counterPos -- ;
} else {
counterPos ++ ;
}
counter [ counterPos ] = 1 ;
isWhite = ! isWhite ;
}
}
return null ;
} ;
exports [ 'default' ] = Code39Reader ;
module . exports = exports [ 'default' ] ;
/***/ } ,
/* 20 */
/***/ function ( module , exports , _ _webpack _require _ _ ) {
'use strict' ;
Object . defineProperty ( exports , '__esModule' , {
value : true
} ) ;
function _interopRequireDefault ( obj ) { return obj && obj . _ _esModule ? obj : { 'default' : obj } ; }
var _code _39 _reader = _ _webpack _require _ _ ( 19 ) ;
var _code _39 _reader2 = _interopRequireDefault ( _code _39 _reader ) ;
function Code39VINReader ( ) {
_code _39 _reader2 [ 'default' ] . call ( this ) ;
}
var patterns = {
IOQ : /[IOQ]/g ,
AZ09 : /[A-Z0-9]{17}/
} ;
Code39VINReader . prototype = Object . create ( _code _39 _reader2 [ 'default' ] . prototype ) ;
Code39VINReader . prototype . constructor = Code39VINReader ;
// Cribbed from:
// https://github.com/zxing/zxing/blob/master/core/src/main/java/com/google/zxing/client/result/VINResultParser.java
Code39VINReader . prototype . _decode = function ( ) {
var result = _code _39 _reader2 [ 'default' ] . prototype . _decode . apply ( this ) ;
if ( ! result ) {
return null ;
}
var code = result . code ;
if ( ! code ) {
return null ;
}
code = code . replace ( patterns . IOQ , '' ) ;
if ( ! code . match ( patterns . AZ09 ) ) {
console . log ( 'Failed AZ09 pattern code:' , code ) ;
return null ;
}
if ( ! this . _checkChecksum ( code ) ) {
return null ;
}
result . code = code ;
return result ;
} ;
Code39VINReader . prototype . _checkChecksum = function ( code ) {
// TODO
return ! ! code ;
} ;
exports [ 'default' ] = Code39VINReader ;
module . exports = exports [ 'default' ] ;
/***/ } ,
/* 21 */
/***/ function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
function _interopRequireDefault ( obj ) { return obj && obj . _ _esModule ? obj : { "default" : obj } ; }
var _barcode _reader = _ _webpack _require _ _ ( 17 ) ;
var _barcode _reader2 = _interopRequireDefault ( _barcode _reader ) ;
function CodabarReader ( ) {
_barcode _reader2 [ "default" ] . call ( this ) ;
this . _counters = [ ] ;
}
var properties = {
ALPHABETH _STRING : { value : "0123456789-$:/.+ABCD" } ,
ALPHABET : { value : [ 48 , 49 , 50 , 51 , 52 , 53 , 54 , 55 , 56 , 57 , 45 , 36 , 58 , 47 , 46 , 43 , 65 , 66 , 67 , 68 ] } ,
CHARACTER _ENCODINGS : { value : [ 0x003 , 0x006 , 0x009 , 0x060 , 0x012 , 0x042 , 0x021 , 0x024 , 0x030 , 0x048 , 0x00c , 0x018 , 0x045 , 0x051 , 0x054 , 0x015 , 0x01A , 0x029 , 0x00B , 0x00E ] } ,
START _END : { value : [ 0x01A , 0x029 , 0x00B , 0x00E ] } ,
MIN _ENCODED _CHARS : { value : 4 } ,
MAX _ACCEPTABLE : { value : 2.0 } ,
PADDING : { value : 1.5 } ,
FORMAT : { value : "codabar" , writeable : false }
} ;
CodabarReader . prototype = Object . create ( _barcode _reader2 [ "default" ] . prototype , properties ) ;
CodabarReader . prototype . constructor = CodabarReader ;
CodabarReader . prototype . _decode = function ( ) {
var self = this ,
result = [ ] ,
start ,
decodedChar ,
pattern ,
nextStart ,
end ;
this . _counters = self . _fillCounters ( ) ;
start = self . _findStart ( ) ;
if ( ! start ) {
return null ;
}
nextStart = start . startCounter ;
do {
pattern = self . _toPattern ( nextStart ) ;
if ( pattern < 0 ) {
return null ;
}
decodedChar = self . _patternToChar ( pattern ) ;
if ( decodedChar < 0 ) {
return null ;
}
result . push ( decodedChar ) ;
nextStart += 8 ;
if ( result . length > 1 && self . _isStartEnd ( pattern ) ) {
break ;
}
} while ( nextStart < self . _counters . length ) ;
// verify end
if ( result . length - 2 < self . MIN _ENCODED _CHARS || ! self . _isStartEnd ( pattern ) ) {
return null ;
}
// verify end white space
if ( ! self . _verifyWhitespace ( start . startCounter , nextStart - 8 ) ) {
return null ;
}
if ( ! self . _validateResult ( result , start . startCounter ) ) {
return null ;
}
nextStart = nextStart > self . _counters . length ? self . _counters . length : nextStart ;
end = start . start + self . _sumCounters ( start . startCounter , nextStart - 8 ) ;
return {
code : result . join ( "" ) ,
start : start . start ,
end : end ,
startInfo : start ,
decodedCodes : result
} ;
} ;
CodabarReader . prototype . _verifyWhitespace = function ( startCounter , endCounter ) {
if ( startCounter - 1 <= 0 || this . _counters [ startCounter - 1 ] >= this . _calculatePatternLength ( startCounter ) / 2.0 ) {
if ( endCounter + 8 >= this . _counters . length || this . _counters [ endCounter + 7 ] >= this . _calculatePatternLength ( endCounter ) / 2.0 ) {
return true ;
}
}
return false ;
} ;
CodabarReader . prototype . _calculatePatternLength = function ( offset ) {
var i ,
sum = 0 ;
for ( i = offset ; i < offset + 7 ; i ++ ) {
sum += this . _counters [ i ] ;
}
return sum ;
} ;
CodabarReader . prototype . _thresholdResultPattern = function ( result , startCounter ) {
var self = this ,
categorization = {
space : {
narrow : { size : 0 , counts : 0 , min : 0 , max : Number . MAX _VALUE } ,
wide : { size : 0 , counts : 0 , min : 0 , max : Number . MAX _VALUE }
} ,
bar : {
narrow : { size : 0 , counts : 0 , min : 0 , max : Number . MAX _VALUE } ,
wide : { size : 0 , counts : 0 , min : 0 , max : Number . MAX _VALUE }
}
} ,
kind ,
cat ,
i ,
j ,
pos = startCounter ,
pattern ;
for ( i = 0 ; i < result . length ; i ++ ) {
pattern = self . _charToPattern ( result [ i ] ) ;
for ( j = 6 ; j >= 0 ; j -- ) {
kind = ( j & 1 ) === 2 ? categorization . bar : categorization . space ;
cat = ( pattern & 1 ) === 1 ? kind . wide : kind . narrow ;
cat . size += self . _counters [ pos + j ] ;
cat . counts ++ ;
pattern >>= 1 ;
}
pos += 8 ;
}
[ "space" , "bar" ] . forEach ( function ( key ) {
var newkind = categorization [ key ] ;
newkind . wide . min = Math . floor ( ( newkind . narrow . size / newkind . narrow . counts + newkind . wide . size / newkind . wide . counts ) / 2 ) ;
newkind . narrow . max = Math . ceil ( newkind . wide . min ) ;
newkind . wide . max = Math . ceil ( ( newkind . wide . size * self . MAX _ACCEPTABLE + self . PADDING ) / newkind . wide . counts ) ;
} ) ;
return categorization ;
} ;
CodabarReader . prototype . _charToPattern = function ( char ) {
var self = this ,
charCode = char . charCodeAt ( 0 ) ,
i ;
for ( i = 0 ; i < self . ALPHABET . length ; i ++ ) {
if ( self . ALPHABET [ i ] === charCode ) {
return self . CHARACTER _ENCODINGS [ i ] ;
}
}
return 0x0 ;
} ;
CodabarReader . prototype . _validateResult = function ( result , startCounter ) {
var self = this ,
thresholds = self . _thresholdResultPattern ( result , startCounter ) ,
i ,
j ,
kind ,
cat ,
size ,
pos = startCounter ,
pattern ;
for ( i = 0 ; i < result . length ; i ++ ) {
pattern = self . _charToPattern ( result [ i ] ) ;
for ( j = 6 ; j >= 0 ; j -- ) {
kind = ( j & 1 ) === 0 ? thresholds . bar : thresholds . space ;
cat = ( pattern & 1 ) === 1 ? kind . wide : kind . narrow ;
size = self . _counters [ pos + j ] ;
if ( size < cat . min || size > cat . max ) {
return false ;
}
pattern >>= 1 ;
}
pos += 8 ;
}
return true ;
} ;
CodabarReader . prototype . _patternToChar = function ( pattern ) {
var i ,
self = this ;
for ( i = 0 ; i < self . CHARACTER _ENCODINGS . length ; i ++ ) {
if ( self . CHARACTER _ENCODINGS [ i ] === pattern ) {
return String . fromCharCode ( self . ALPHABET [ i ] ) ;
}
}
return - 1 ;
} ;
CodabarReader . prototype . _computeAlternatingThreshold = function ( offset , end ) {
var i ,
min = Number . MAX _VALUE ,
max = 0 ,
counter ;
for ( i = offset ; i < end ; i += 2 ) {
counter = this . _counters [ i ] ;
if ( counter > max ) {
max = counter ;
}
if ( counter < min ) {
min = counter ;
}
}
return ( min + max ) / 2.0 | 0 ;
} ;
CodabarReader . prototype . _toPattern = function ( offset ) {
var numCounters = 7 ,
end = offset + numCounters ,
barThreshold ,
spaceThreshold ,
bitmask = 1 << numCounters - 1 ,
pattern = 0 ,
i ,
threshold ;
if ( end > this . _counters . length ) {
return - 1 ;
}
barThreshold = this . _computeAlternatingThreshold ( offset , end ) ;
spaceThreshold = this . _computeAlternatingThreshold ( offset + 1 , end ) ;
for ( i = 0 ; i < numCounters ; i ++ ) {
threshold = ( i & 1 ) === 0 ? barThreshold : spaceThreshold ;
if ( this . _counters [ offset + i ] > threshold ) {
pattern |= bitmask ;
}
bitmask >>= 1 ;
}
return pattern ;
} ;
CodabarReader . prototype . _isStartEnd = function ( pattern ) {
var i ;
for ( i = 0 ; i < this . START _END . length ; i ++ ) {
if ( this . START _END [ i ] === pattern ) {
return true ;
}
}
return false ;
} ;
CodabarReader . prototype . _sumCounters = function ( start , end ) {
var i ,
sum = 0 ;
for ( i = start ; i < end ; i ++ ) {
sum += this . _counters [ i ] ;
}
return sum ;
} ;
CodabarReader . prototype . _findStart = function ( ) {
var self = this ,
i ,
pattern ,
start = self . _nextUnset ( self . _row ) ,
end ;
for ( i = 1 ; i < this . _counters . length ; i ++ ) {
pattern = self . _toPattern ( i ) ;
if ( pattern !== - 1 && self . _isStartEnd ( pattern ) ) {
// TODO: Look for whitespace ahead
start += self . _sumCounters ( 0 , i ) ;
end = start + self . _sumCounters ( i , i + 8 ) ;
return {
start : start ,
end : end ,
startCounter : i ,
endCounter : i + 8
} ;
}
}
} ;
exports [ "default" ] = CodabarReader ;
module . exports = exports [ "default" ] ;
/***/ } ,
/* 22 */
/***/ function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
function _interopRequireDefault ( obj ) { return obj && obj . _ _esModule ? obj : { "default" : obj } ; }
var _ean _reader = _ _webpack _require _ _ ( 18 ) ;
var _ean _reader2 = _interopRequireDefault ( _ean _reader ) ;
function UPCReader ( ) {
_ean _reader2 [ "default" ] . call ( this ) ;
}
var properties = {
FORMAT : { value : "upc_a" , writeable : false }
} ;
UPCReader . prototype = Object . create ( _ean _reader2 [ "default" ] . prototype , properties ) ;
UPCReader . prototype . constructor = UPCReader ;
UPCReader . prototype . _decode = function ( ) {
var result = _ean _reader2 [ "default" ] . prototype . _decode . call ( this ) ;
if ( result && result . code && result . code . length === 13 && result . code . charAt ( 0 ) === "0" ) {
result . code = result . code . substring ( 1 ) ;
return result ;
}
return null ;
} ;
exports [ "default" ] = UPCReader ;
module . exports = exports [ "default" ] ;
/***/ } ,
/* 23 */
/***/ function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
function _interopRequireDefault ( obj ) { return obj && obj . _ _esModule ? obj : { "default" : obj } ; }
var _ean _reader = _ _webpack _require _ _ ( 18 ) ;
var _ean _reader2 = _interopRequireDefault ( _ean _reader ) ;
function EAN8Reader ( ) {
_ean _reader2 [ "default" ] . call ( this ) ;
}
var properties = {
FORMAT : { value : "ean_8" , writeable : false }
} ;
EAN8Reader . prototype = Object . create ( _ean _reader2 [ "default" ] . prototype , properties ) ;
EAN8Reader . prototype . constructor = EAN8Reader ;
EAN8Reader . prototype . _decodePayload = function ( code , result , decodedCodes ) {
var i ,
self = this ;
for ( i = 0 ; i < 4 ; i ++ ) {
code = self . _decodeCode ( code . end , self . CODE _G _START ) ;
if ( ! code ) {
return null ;
}
result . push ( code . code ) ;
decodedCodes . push ( code ) ;
}
code = self . _findPattern ( self . MIDDLE _PATTERN , code . end , true , false ) ;
if ( code === null ) {
return null ;
}
decodedCodes . push ( code ) ;
for ( i = 0 ; i < 4 ; i ++ ) {
code = self . _decodeCode ( code . end , self . CODE _G _START ) ;
if ( ! code ) {
return null ;
}
decodedCodes . push ( code ) ;
result . push ( code . code ) ;
}
return code ;
} ;
exports [ "default" ] = EAN8Reader ;
module . exports = exports [ "default" ] ;
/***/ } ,
/* 24 */
/***/ function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
function _interopRequireDefault ( obj ) { return obj && obj . _ _esModule ? obj : { "default" : obj } ; }
var _ean _reader = _ _webpack _require _ _ ( 18 ) ;
var _ean _reader2 = _interopRequireDefault ( _ean _reader ) ;
function UPCEReader ( ) {
_ean _reader2 [ "default" ] . call ( this ) ;
}
var properties = {
CODE _FREQUENCY : { value : [ [ 56 , 52 , 50 , 49 , 44 , 38 , 35 , 42 , 41 , 37 ] , [ 7 , 11 , 13 , 14 , 19 , 25 , 28 , 21 , 22 , 26 ] ] } ,
STOP _PATTERN : { value : [ 1 / 6 * 7 , 1 / 6 * 7 , 1 / 6 * 7 , 1 / 6 * 7 , 1 / 6 * 7 , 1 / 6 * 7 ] } ,
FORMAT : { value : "upc_e" , writeable : false }
} ;
UPCEReader . prototype = Object . create ( _ean _reader2 [ "default" ] . prototype , properties ) ;
UPCEReader . prototype . constructor = UPCEReader ;
UPCEReader . prototype . _decodePayload = function ( code , result , decodedCodes ) {
var i ,
self = this ,
codeFrequency = 0x0 ;
for ( i = 0 ; i < 6 ; i ++ ) {
code = self . _decodeCode ( code . end ) ;
if ( ! code ) {
return null ;
}
if ( code . code >= self . CODE _G _START ) {
code . code = code . code - self . CODE _G _START ;
codeFrequency |= 1 << 5 - i ;
}
result . push ( code . code ) ;
decodedCodes . push ( code ) ;
}
if ( ! self . _determineParity ( codeFrequency , result ) ) {
return null ;
}
return code ;
} ;
UPCEReader . prototype . _determineParity = function ( codeFrequency , result ) {
var i , nrSystem ;
for ( nrSystem = 0 ; nrSystem < this . CODE _FREQUENCY . length ; nrSystem ++ ) {
for ( i = 0 ; i < this . CODE _FREQUENCY [ nrSystem ] . length ; i ++ ) {
if ( codeFrequency === this . CODE _FREQUENCY [ nrSystem ] [ i ] ) {
result . unshift ( nrSystem ) ;
result . push ( i ) ;
return true ;
}
}
}
return false ;
} ;
UPCEReader . prototype . _convertToUPCA = function ( result ) {
var upca = [ result [ 0 ] ] ,
lastDigit = result [ result . length - 2 ] ;
if ( lastDigit <= 2 ) {
upca = upca . concat ( result . slice ( 1 , 3 ) ) . concat ( [ lastDigit , 0 , 0 , 0 , 0 ] ) . concat ( result . slice ( 3 , 6 ) ) ;
} else if ( lastDigit === 3 ) {
upca = upca . concat ( result . slice ( 1 , 4 ) ) . concat ( [ 0 , 0 , 0 , 0 , 0 ] ) . concat ( result . slice ( 4 , 6 ) ) ;
} else if ( lastDigit === 4 ) {
upca = upca . concat ( result . slice ( 1 , 5 ) ) . concat ( [ 0 , 0 , 0 , 0 , 0 , result [ 5 ] ] ) ;
} else {
upca = upca . concat ( result . slice ( 1 , 6 ) ) . concat ( [ 0 , 0 , 0 , 0 , lastDigit ] ) ;
}
upca . push ( result [ result . length - 1 ] ) ;
return upca ;
} ;
UPCEReader . prototype . _checksum = function ( result ) {
return _ean _reader2 [ "default" ] . prototype . _checksum . call ( this , this . _convertToUPCA ( result ) ) ;
} ;
UPCEReader . prototype . _findEnd = function ( offset , isWhite ) {
isWhite = true ;
return _ean _reader2 [ "default" ] . prototype . _findEnd . call ( this , offset , isWhite ) ;
} ;
UPCEReader . prototype . _verifyTrailingWhitespace = function ( endInfo ) {
var self = this ,
trailingWhitespaceEnd ;
trailingWhitespaceEnd = endInfo . end + ( endInfo . end - endInfo . start ) / 2 ;
if ( trailingWhitespaceEnd < self . _row . length ) {
if ( self . _matchRange ( endInfo . end , trailingWhitespaceEnd , 0 ) ) {
return endInfo ;
}
}
} ;
exports [ "default" ] = UPCEReader ;
module . exports = exports [ "default" ] ;
/***/ } ,
/* 25 */
/***/ function ( module , exports , _ _webpack _require _ _ ) {
'use strict' ;
Object . defineProperty ( exports , '__esModule' , {
value : true
} ) ;
function _interopRequireDefault ( obj ) { return obj && obj . _ _esModule ? obj : { 'default' : obj } ; }
var _barcode _reader = _ _webpack _require _ _ ( 17 ) ;
var _barcode _reader2 = _interopRequireDefault ( _barcode _reader ) ;
var merge = _ _webpack _require _ _ ( 26 ) ;
function I2of5Reader ( opts ) {
opts = merge ( getDefaulConfig ( ) , opts ) ;
_barcode _reader2 [ 'default' ] . call ( this , opts ) ;
this . barSpaceRatio = [ 1 , 1 ] ;
if ( opts . normalizeBarSpaceWidth ) {
this . SINGLE _CODE _ERROR = 0.38 ;
this . AVG _CODE _ERROR = 0.09 ;
}
}
function getDefaulConfig ( ) {
var config = { } ;
Object . keys ( I2of5Reader . CONFIG _KEYS ) . forEach ( function ( key ) {
config [ key ] = I2of5Reader . CONFIG _KEYS [ key ] [ 'default' ] ;
} ) ;
return config ;
}
var N = 1 ,
W = 3 ,
properties = {
MODULO : { value : 10 } ,
START _PATTERN : { value : [ N * 2.5 , N * 2.5 , N * 2.5 , N * 2.5 ] } ,
STOP _PATTERN : { value : [ N * 2 , N * 2 , W * 2 ] } ,
CODE _PATTERN : { value : [ [ N , N , W , W , N ] , [ W , N , N , N , W ] , [ N , W , N , N , W ] , [ W , W , N , N , N ] , [ N , N , W , N , W ] , [ W , N , W , N , N ] , [ N , W , W , N , N ] , [ N , N , N , W , W ] , [ W , N , N , W , N ] , [ N , W , N , W , N ] ] } ,
SINGLE _CODE _ERROR : { value : 0.78 , writable : true } ,
AVG _CODE _ERROR : { value : 0.38 , writable : true } ,
MAX _CORRECTION _FACTOR : { value : 5 } ,
FORMAT : { value : "i2of5" }
} ;
I2of5Reader . prototype = Object . create ( _barcode _reader2 [ 'default' ] . prototype , properties ) ;
I2of5Reader . prototype . constructor = I2of5Reader ;
I2of5Reader . prototype . _matchPattern = function ( counter , code ) {
if ( this . config . normalizeBarSpaceWidth ) {
var i ,
counterSum = [ 0 , 0 ] ,
codeSum = [ 0 , 0 ] ,
correction = [ 0 , 0 ] ,
correctionRatio = this . MAX _CORRECTION _FACTOR ,
correctionRatioInverse = 1 / correctionRatio ;
for ( i = 0 ; i < counter . length ; i ++ ) {
counterSum [ i % 2 ] += counter [ i ] ;
codeSum [ i % 2 ] += code [ i ] ;
}
correction [ 0 ] = codeSum [ 0 ] / counterSum [ 0 ] ;
correction [ 1 ] = codeSum [ 1 ] / counterSum [ 1 ] ;
correction [ 0 ] = Math . max ( Math . min ( correction [ 0 ] , correctionRatio ) , correctionRatioInverse ) ;
correction [ 1 ] = Math . max ( Math . min ( correction [ 1 ] , correctionRatio ) , correctionRatioInverse ) ;
this . barSpaceRatio = correction ;
for ( i = 0 ; i < counter . length ; i ++ ) {
counter [ i ] *= this . barSpaceRatio [ i % 2 ] ;
}
}
return _barcode _reader2 [ 'default' ] . prototype . _matchPattern . call ( this , counter , code ) ;
} ;
I2of5Reader . prototype . _findPattern = function ( pattern , offset , isWhite , tryHarder ) {
var counter = [ ] ,
self = this ,
i ,
counterPos = 0 ,
bestMatch = {
error : Number . MAX _VALUE ,
code : - 1 ,
start : 0 ,
end : 0
} ,
error ,
j ,
sum ,
normalized ,
epsilon = self . AVG _CODE _ERROR ;
isWhite = isWhite || false ;
tryHarder = tryHarder || false ;
if ( ! offset ) {
offset = self . _nextSet ( self . _row ) ;
}
for ( i = 0 ; i < pattern . length ; i ++ ) {
counter [ i ] = 0 ;
}
for ( i = offset ; i < self . _row . length ; i ++ ) {
if ( self . _row [ i ] ^ isWhite ) {
counter [ counterPos ] ++ ;
} else {
if ( counterPos === counter . length - 1 ) {
sum = 0 ;
for ( j = 0 ; j < counter . length ; j ++ ) {
sum += counter [ j ] ;
}
normalized = self . _normalize ( counter ) ;
if ( normalized ) {
error = self . _matchPattern ( normalized , pattern ) ;
if ( error < epsilon ) {
bestMatch . error = error ;
bestMatch . start = i - sum ;
bestMatch . end = i ;
return bestMatch ;
}
}
if ( tryHarder ) {
for ( j = 0 ; j < counter . length - 2 ; j ++ ) {
counter [ j ] = counter [ j + 2 ] ;
}
counter [ counter . length - 2 ] = 0 ;
counter [ counter . length - 1 ] = 0 ;
counterPos -- ;
} else {
return null ;
}
} else {
counterPos ++ ;
}
counter [ counterPos ] = 1 ;
isWhite = ! isWhite ;
}
}
return null ;
} ;
I2of5Reader . prototype . _findStart = function ( ) {
var self = this ,
leadingWhitespaceStart ,
offset = self . _nextSet ( self . _row ) ,
startInfo ,
narrowBarWidth = 1 ;
while ( ! startInfo ) {
startInfo = self . _findPattern ( self . START _PATTERN , offset , false , true ) ;
if ( ! startInfo ) {
return null ;
}
narrowBarWidth = Math . floor ( ( startInfo . end - startInfo . start ) / 4 ) ;
leadingWhitespaceStart = startInfo . start - narrowBarWidth * 10 ;
if ( leadingWhitespaceStart >= 0 ) {
if ( self . _matchRange ( leadingWhitespaceStart , startInfo . start , 0 ) ) {
return startInfo ;
}
}
offset = startInfo . end ;
startInfo = null ;
}
} ;
I2of5Reader . prototype . _verifyTrailingWhitespace = function ( endInfo ) {
var self = this ,
trailingWhitespaceEnd ;
trailingWhitespaceEnd = endInfo . end + ( endInfo . end - endInfo . start ) / 2 ;
if ( trailingWhitespaceEnd < self . _row . length ) {
if ( self . _matchRange ( endInfo . end , trailingWhitespaceEnd , 0 ) ) {
return endInfo ;
}
}
return null ;
} ;
I2of5Reader . prototype . _findEnd = function ( ) {
var self = this ,
endInfo ,
tmp ;
self . _row . reverse ( ) ;
endInfo = self . _findPattern ( self . STOP _PATTERN ) ;
self . _row . reverse ( ) ;
if ( endInfo === null ) {
return null ;
}
// reverse numbers
tmp = endInfo . start ;
endInfo . start = self . _row . length - endInfo . end ;
endInfo . end = self . _row . length - tmp ;
return endInfo !== null ? self . _verifyTrailingWhitespace ( endInfo ) : null ;
} ;
I2of5Reader . prototype . _decodePair = function ( counterPair ) {
var i ,
code ,
codes = [ ] ,
self = this ;
for ( i = 0 ; i < counterPair . length ; i ++ ) {
code = self . _decodeCode ( counterPair [ i ] ) ;
if ( ! code ) {
return null ;
}
codes . push ( code ) ;
}
return codes ;
} ;
I2of5Reader . prototype . _decodeCode = function ( counter ) {
var j ,
self = this ,
sum = 0 ,
normalized ,
error ,
epsilon = self . AVG _CODE _ERROR ,
code ,
bestMatch = {
error : Number . MAX _VALUE ,
code : - 1 ,
start : 0 ,
end : 0
} ;
for ( j = 0 ; j < counter . length ; j ++ ) {
sum += counter [ j ] ;
}
normalized = self . _normalize ( counter ) ;
if ( normalized ) {
for ( code = 0 ; code < self . CODE _PATTERN . length ; code ++ ) {
error = self . _matchPattern ( normalized , self . CODE _PATTERN [ code ] ) ;
if ( error < bestMatch . error ) {
bestMatch . code = code ;
bestMatch . error = error ;
}
}
if ( bestMatch . error < epsilon ) {
return bestMatch ;
}
}
return null ;
} ;
I2of5Reader . prototype . _decodePayload = function ( counters , result , decodedCodes ) {
var i ,
self = this ,
pos = 0 ,
counterLength = counters . length ,
counterPair = [ [ 0 , 0 , 0 , 0 , 0 ] , [ 0 , 0 , 0 , 0 , 0 ] ] ,
codes ;
while ( pos < counterLength ) {
for ( i = 0 ; i < 5 ; i ++ ) {
counterPair [ 0 ] [ i ] = counters [ pos ] * this . barSpaceRatio [ 0 ] ;
counterPair [ 1 ] [ i ] = counters [ pos + 1 ] * this . barSpaceRatio [ 1 ] ;
pos += 2 ;
}
codes = self . _decodePair ( counterPair ) ;
if ( ! codes ) {
return null ;
}
for ( i = 0 ; i < codes . length ; i ++ ) {
result . push ( codes [ i ] . code + "" ) ;
decodedCodes . push ( codes [ i ] ) ;
}
}
return codes ;
} ;
I2of5Reader . prototype . _verifyCounterLength = function ( counters ) {
return counters . length % 10 === 0 ;
} ;
I2of5Reader . prototype . _decode = function ( ) {
var startInfo ,
endInfo ,
self = this ,
code ,
result = [ ] ,
decodedCodes = [ ] ,
counters ;
startInfo = self . _findStart ( ) ;
if ( ! startInfo ) {
return null ;
}
decodedCodes . push ( startInfo ) ;
endInfo = self . _findEnd ( ) ;
if ( ! endInfo ) {
return null ;
}
counters = self . _fillCounters ( startInfo . end , endInfo . start , false ) ;
if ( ! self . _verifyCounterLength ( counters ) ) {
return null ;
}
code = self . _decodePayload ( counters , result , decodedCodes ) ;
if ( ! code ) {
return null ;
}
if ( result . length % 2 !== 0 || result . length < 6 ) {
return null ;
}
decodedCodes . push ( endInfo ) ;
return {
code : result . join ( "" ) ,
start : startInfo . start ,
end : endInfo . end ,
startInfo : startInfo ,
decodedCodes : decodedCodes
} ;
} ;
I2of5Reader . CONFIG _KEYS = {
normalizeBarSpaceWidth : {
'type' : 'boolean' ,
'default' : false ,
'description' : 'If true, the reader tries to normalize the' + 'width-difference between bars and spaces'
}
} ;
exports [ 'default' ] = I2of5Reader ;
module . exports = exports [ 'default' ] ;
/***/ } ,
/* 26 */
/***/ function ( module , exports , _ _webpack _require _ _ ) {
var baseMerge = _ _webpack _require _ _ ( 27 ) ,
createAssigner = _ _webpack _require _ _ ( 54 ) ;
/ * *
* Recursively merges own enumerable properties of the source object ( s ) , that
* don ' t resolve to ` undefined ` into the destination object . Subsequent sources
* overwrite property assignments of previous sources . If ` customizer ` is
* provided it ' s invoked to produce the merged values of the destination and
* source properties . If ` customizer ` returns ` undefined ` merging is handled
* by the method instead . The ` customizer ` is bound to ` thisArg ` and invoked
* with five arguments : ( objectValue , sourceValue , key , object , source ) .
*
* @ static
* @ memberOf _
* @ category Object
* @ param { Object } object The destination object .
* @ param { ... Object } [ sources ] The source objects .
* @ param { Function } [ customizer ] The function to customize assigned values .
* @ param { * } [ thisArg ] The ` this ` binding of ` customizer ` .
* @ returns { Object } Returns ` object ` .
* @ example
*
* var users = {
* 'data' : [ { 'user' : 'barney' } , { 'user' : 'fred' } ]
* } ;
*
* var ages = {
* 'data' : [ { 'age' : 36 } , { 'age' : 40 } ]
* } ;
*
* _ . merge ( users , ages ) ;
* // => { 'data': [{ 'user': 'barney', 'age': 36 }, { 'user': 'fred', 'age': 40 }] }
*
* // using a customizer callback
* var object = {
* 'fruits' : [ 'apple' ] ,
* 'vegetables' : [ 'beet' ]
* } ;
*
* var other = {
* 'fruits' : [ 'banana' ] ,
* 'vegetables' : [ 'carrot' ]
* } ;
*
* _ . merge ( object , other , function ( a , b ) {
* if ( _ . isArray ( a ) ) {
* return a . concat ( b ) ;
* }
* } ) ;
* // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot'] }
* /
var merge = createAssigner ( baseMerge ) ;
module . exports = merge ;
/***/ } ,
/* 27 */
/***/ function ( module , exports , _ _webpack _require _ _ ) {
var arrayEach = _ _webpack _require _ _ ( 28 ) ,
baseMergeDeep = _ _webpack _require _ _ ( 29 ) ,
isArray = _ _webpack _require _ _ ( 37 ) ,
isArrayLike = _ _webpack _require _ _ ( 32 ) ,
isObject = _ _webpack _require _ _ ( 41 ) ,
isObjectLike = _ _webpack _require _ _ ( 36 ) ,
isTypedArray = _ _webpack _require _ _ ( 49 ) ,
keys = _ _webpack _require _ _ ( 52 ) ;
/ * *
* The base implementation of ` _.merge ` without support for argument juggling ,
* multiple sources , and ` this ` binding ` customizer ` functions .
*
* @ private
* @ param { Object } object The destination object .
* @ param { Object } source The source object .
* @ param { Function } [ customizer ] The function to customize merged values .
* @ param { Array } [ stackA = [ ] ] Tracks traversed source objects .
* @ param { Array } [ stackB = [ ] ] Associates values with source counterparts .
* @ returns { Object } Returns ` object ` .
* /
function baseMerge ( object , source , customizer , stackA , stackB ) {
if ( ! isObject ( object ) ) {
return object ;
}
var isSrcArr = isArrayLike ( source ) && ( isArray ( source ) || isTypedArray ( source ) ) ,
props = isSrcArr ? undefined : keys ( source ) ;
arrayEach ( props || source , function ( srcValue , key ) {
if ( props ) {
key = srcValue ;
srcValue = source [ key ] ;
}
if ( isObjectLike ( srcValue ) ) {
stackA || ( stackA = [ ] ) ;
stackB || ( stackB = [ ] ) ;
baseMergeDeep ( object , source , key , baseMerge , customizer , stackA , stackB ) ;
}
else {
var value = object [ key ] ,
result = customizer ? customizer ( value , srcValue , key , object , source ) : undefined ,
isCommon = result === undefined ;
if ( isCommon ) {
result = srcValue ;
}
if ( ( result !== undefined || ( isSrcArr && ! ( key in object ) ) ) &&
( isCommon || ( result === result ? ( result !== value ) : ( value === value ) ) ) ) {
object [ key ] = result ;
}
}
} ) ;
return object ;
}
module . exports = baseMerge ;
/***/ } ,
/* 28 */
/***/ function ( module , exports ) {
/ * *
* A specialized version of ` _.forEach ` for arrays without support for callback
* shorthands and ` this ` binding .
*
* @ private
* @ param { Array } array The array to iterate over .
* @ param { Function } iteratee The function invoked per iteration .
* @ returns { Array } Returns ` array ` .
* /
function arrayEach ( array , iteratee ) {
var index = - 1 ,
length = array . length ;
while ( ++ index < length ) {
if ( iteratee ( array [ index ] , index , array ) === false ) {
break ;
}
}
return array ;
}
module . exports = arrayEach ;
/***/ } ,
/* 29 */
/***/ function ( module , exports , _ _webpack _require _ _ ) {
var arrayCopy = _ _webpack _require _ _ ( 30 ) ,
isArguments = _ _webpack _require _ _ ( 31 ) ,
isArray = _ _webpack _require _ _ ( 37 ) ,
isArrayLike = _ _webpack _require _ _ ( 32 ) ,
isPlainObject = _ _webpack _require _ _ ( 42 ) ,
isTypedArray = _ _webpack _require _ _ ( 49 ) ,
toPlainObject = _ _webpack _require _ _ ( 50 ) ;
/ * *
* A specialized version of ` baseMerge ` for arrays and objects which performs
* deep merges and tracks traversed objects enabling objects with circular
* references to be merged .
*
* @ private
* @ param { Object } object The destination object .
* @ param { Object } source The source object .
* @ param { string } key The key of the value to merge .
* @ param { Function } mergeFunc The function to merge values .
* @ param { Function } [ customizer ] The function to customize merged values .
* @ param { Array } [ stackA = [ ] ] Tracks traversed source objects .
* @ param { Array } [ stackB = [ ] ] Associates values with source counterparts .
* @ returns { boolean } Returns ` true ` if the objects are equivalent , else ` false ` .
* /
function baseMergeDeep ( object , source , key , mergeFunc , customizer , stackA , stackB ) {
var length = stackA . length ,
srcValue = source [ key ] ;
while ( length -- ) {
if ( stackA [ length ] == srcValue ) {
object [ key ] = stackB [ length ] ;
return ;
}
}
var value = object [ key ] ,
result = customizer ? customizer ( value , srcValue , key , object , source ) : undefined ,
isCommon = result === undefined ;
if ( isCommon ) {
result = srcValue ;
if ( isArrayLike ( srcValue ) && ( isArray ( srcValue ) || isTypedArray ( srcValue ) ) ) {
result = isArray ( value )
? value
: ( isArrayLike ( value ) ? arrayCopy ( value ) : [ ] ) ;
}
else if ( isPlainObject ( srcValue ) || isArguments ( srcValue ) ) {
result = isArguments ( value )
? toPlainObject ( value )
: ( isPlainObject ( value ) ? value : { } ) ;
}
else {
isCommon = false ;
}
}
// Add the source value to the stack of traversed objects and associate
// it with its merged value.
stackA . push ( srcValue ) ;
stackB . push ( result ) ;
if ( isCommon ) {
// Recursively merge objects and arrays (susceptible to call stack limits).
object [ key ] = mergeFunc ( result , srcValue , customizer , stackA , stackB ) ;
} else if ( result === result ? ( result !== value ) : ( value === value ) ) {
object [ key ] = result ;
}
}
module . exports = baseMergeDeep ;
/***/ } ,
/* 30 */
/***/ function ( module , exports ) {
/ * *
* Copies the values of ` source ` to ` array ` .
*
* @ private
* @ param { Array } source The array to copy values from .
* @ param { Array } [ array = [ ] ] The array to copy values to .
* @ returns { Array } Returns ` array ` .
* /
function arrayCopy ( source , array ) {
var index = - 1 ,
length = source . length ;
array || ( array = Array ( length ) ) ;
while ( ++ index < length ) {
array [ index ] = source [ index ] ;
}
return array ;
}
module . exports = arrayCopy ;
/***/ } ,
/* 31 */
/***/ function ( module , exports , _ _webpack _require _ _ ) {
var isArrayLike = _ _webpack _require _ _ ( 32 ) ,
isObjectLike = _ _webpack _require _ _ ( 36 ) ;
/** Used for native method references. */
var objectProto = Object . prototype ;
/** Used to check objects for own properties. */
var hasOwnProperty = objectProto . hasOwnProperty ;
/** Native method references. */
var propertyIsEnumerable = objectProto . propertyIsEnumerable ;
/ * *
* Checks if ` value ` is classified as an ` arguments ` object .
*
* @ static
* @ memberOf _
* @ category Lang
* @ param { * } value The value to check .
* @ returns { boolean } Returns ` true ` if ` value ` is correctly classified , else ` false ` .
* @ example
*
* _ . isArguments ( function ( ) { return arguments ; } ( ) ) ;
* // => true
*
* _ . isArguments ( [ 1 , 2 , 3 ] ) ;
* // => false
* /
function isArguments ( value ) {
return isObjectLike ( value ) && isArrayLike ( value ) &&
hasOwnProperty . call ( value , 'callee' ) && ! propertyIsEnumerable . call ( value , 'callee' ) ;
}
module . exports = isArguments ;
/***/ } ,
/* 32 */
/***/ function ( module , exports , _ _webpack _require _ _ ) {
var getLength = _ _webpack _require _ _ ( 33 ) ,
isLength = _ _webpack _require _ _ ( 35 ) ;
/ * *
* Checks if ` value ` is array - like .
*
* @ private
* @ param { * } value The value to check .
* @ returns { boolean } Returns ` true ` if ` value ` is array - like , else ` false ` .
* /
function isArrayLike ( value ) {
return value != null && isLength ( getLength ( value ) ) ;
}
module . exports = isArrayLike ;
/***/ } ,
/* 33 */
/***/ function ( module , exports , _ _webpack _require _ _ ) {
var baseProperty = _ _webpack _require _ _ ( 34 ) ;
/ * *
* Gets the "length" property value of ` object ` .
*
* * * Note : * * This function is used to avoid a [ JIT bug ] ( https : //bugs.webkit.org/show_bug.cgi?id=142792)
* that affects Safari on at least iOS 8.1 - 8.3 ARM64 .
*
* @ private
* @ param { Object } object The object to query .
* @ returns { * } Returns the "length" value .
* /
var getLength = baseProperty ( 'length' ) ;
module . exports = getLength ;
/***/ } ,
/* 34 */
/***/ function ( module , exports ) {
/ * *
* The base implementation of ` _.property ` without support for deep paths .
*
* @ private
* @ param { string } key The key of the property to get .
* @ returns { Function } Returns the new function .
* /
function baseProperty ( key ) {
return function ( object ) {
return object == null ? undefined : object [ key ] ;
} ;
}
module . exports = baseProperty ;
/***/ } ,
/* 35 */
/***/ function ( module , exports ) {
/ * *
* Used as the [ maximum length ] ( http : //ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer)
* of an array - like value .
* /
var MAX _SAFE _INTEGER = 9007199254740991 ;
/ * *
* Checks if ` value ` is a valid array - like length .
*
* * * Note : * * This function is based on [ ` ToLength ` ] ( http : //ecma-international.org/ecma-262/6.0/#sec-tolength).
*
* @ private
* @ param { * } value The value to check .
* @ returns { boolean } Returns ` true ` if ` value ` is a valid length , else ` false ` .
* /
function isLength ( value ) {
return typeof value == 'number' && value > - 1 && value % 1 == 0 && value <= MAX _SAFE _INTEGER ;
}
module . exports = isLength ;
/***/ } ,
/* 36 */
/***/ function ( module , exports ) {
/ * *
* Checks if ` value ` is object - like .
*
* @ private
* @ param { * } value The value to check .
* @ returns { boolean } Returns ` true ` if ` value ` is object - like , else ` false ` .
* /
function isObjectLike ( value ) {
return ! ! value && typeof value == 'object' ;
}
module . exports = isObjectLike ;
/***/ } ,
/* 37 */
/***/ function ( module , exports , _ _webpack _require _ _ ) {
var getNative = _ _webpack _require _ _ ( 38 ) ,
isLength = _ _webpack _require _ _ ( 35 ) ,
isObjectLike = _ _webpack _require _ _ ( 36 ) ;
/** `Object#toString` result references. */
var arrayTag = '[object Array]' ;
/** Used for native method references. */
var objectProto = Object . prototype ;
/ * *
* Used to resolve the [ ` toStringTag ` ] ( http : //ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
* of values .
* /
var objToString = objectProto . toString ;
/* Native method references for those with the same name as other `lodash` methods. */
var nativeIsArray = getNative ( Array , 'isArray' ) ;
/ * *
* Checks if ` value ` is classified as an ` Array ` object .
*
* @ static
* @ memberOf _
* @ category Lang
* @ param { * } value The value to check .
* @ returns { boolean } Returns ` true ` if ` value ` is correctly classified , else ` false ` .
* @ example
*
* _ . isArray ( [ 1 , 2 , 3 ] ) ;
* // => true
*
* _ . isArray ( function ( ) { return arguments ; } ( ) ) ;
* // => false
* /
var isArray = nativeIsArray || function ( value ) {
return isObjectLike ( value ) && isLength ( value . length ) && objToString . call ( value ) == arrayTag ;
} ;
module . exports = isArray ;
/***/ } ,
/* 38 */
/***/ function ( module , exports , _ _webpack _require _ _ ) {
var isNative = _ _webpack _require _ _ ( 39 ) ;
/ * *
* Gets the native function at ` key ` of ` object ` .
*
* @ private
* @ param { Object } object The object to query .
* @ param { string } key The key of the method to get .
* @ returns { * } Returns the function if it ' s native , else ` undefined ` .
* /
function getNative ( object , key ) {
var value = object == null ? undefined : object [ key ] ;
return isNative ( value ) ? value : undefined ;
}
module . exports = getNative ;
/***/ } ,
/* 39 */
/***/ function ( module , exports , _ _webpack _require _ _ ) {
var isFunction = _ _webpack _require _ _ ( 40 ) ,
isObjectLike = _ _webpack _require _ _ ( 36 ) ;
/** Used to detect host constructors (Safari > 5). */
var reIsHostCtor = /^\[object .+?Constructor\]$/ ;
/** Used for native method references. */
var objectProto = Object . prototype ;
/** Used to resolve the decompiled source of functions. */
var fnToString = Function . prototype . toString ;
/** Used to check objects for own properties. */
var hasOwnProperty = objectProto . hasOwnProperty ;
/** Used to detect if a method is native. */
var reIsNative = RegExp ( '^' +
fnToString . call ( hasOwnProperty ) . replace ( /[\\^$.*+?()[\]{}|]/g , '\\$&' )
. replace ( /hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g , '$1.*?' ) + '$'
) ;
/ * *
* Checks if ` value ` is a native function .
*
* @ static
* @ memberOf _
* @ category Lang
* @ param { * } value The value to check .
* @ returns { boolean } Returns ` true ` if ` value ` is a native function , else ` false ` .
* @ example
*
* _ . isNative ( Array . prototype . push ) ;
* // => true
*
* _ . isNative ( _ ) ;
* // => false
* /
function isNative ( value ) {
if ( value == null ) {
return false ;
}
if ( isFunction ( value ) ) {
return reIsNative . test ( fnToString . call ( value ) ) ;
}
return isObjectLike ( value ) && reIsHostCtor . test ( value ) ;
}
module . exports = isNative ;
/***/ } ,
/* 40 */
/***/ function ( module , exports , _ _webpack _require _ _ ) {
var isObject = _ _webpack _require _ _ ( 41 ) ;
/** `Object#toString` result references. */
var funcTag = '[object Function]' ;
/** Used for native method references. */
var objectProto = Object . prototype ;
/ * *
* Used to resolve the [ ` toStringTag ` ] ( http : //ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
* of values .
* /
var objToString = objectProto . toString ;
/ * *
* Checks if ` value ` is classified as a ` Function ` object .
*
* @ static
* @ memberOf _
* @ category Lang
* @ param { * } value The value to check .
* @ returns { boolean } Returns ` true ` if ` value ` is correctly classified , else ` false ` .
* @ example
*
* _ . isFunction ( _ ) ;
* // => true
*
* _ . isFunction ( /abc/ ) ;
* // => false
* /
function isFunction ( value ) {
// The use of `Object#toString` avoids issues with the `typeof` operator
// in older versions of Chrome and Safari which return 'function' for regexes
// and Safari 8 which returns 'object' for typed array constructors.
return isObject ( value ) && objToString . call ( value ) == funcTag ;
}
module . exports = isFunction ;
/***/ } ,
/* 41 */
/***/ function ( module , exports ) {
/ * *
* Checks if ` value ` is the [ language type ] ( https : //es5.github.io/#x8) of `Object`.
* ( e . g . arrays , functions , objects , regexes , ` new Number(0) ` , and ` new String('') ` )
*
* @ static
* @ memberOf _
* @ category Lang
* @ param { * } value The value to check .
* @ returns { boolean } Returns ` true ` if ` value ` is an object , else ` false ` .
* @ example
*
* _ . isObject ( { } ) ;
* // => true
*
* _ . isObject ( [ 1 , 2 , 3 ] ) ;
* // => true
*
* _ . isObject ( 1 ) ;
* // => false
* /
function isObject ( value ) {
// Avoid a V8 JIT bug in Chrome 19-20.
// See https://code.google.com/p/v8/issues/detail?id=2291 for more details.
var type = typeof value ;
return ! ! value && ( type == 'object' || type == 'function' ) ;
}
module . exports = isObject ;
/***/ } ,
/* 42 */
/***/ function ( module , exports , _ _webpack _require _ _ ) {
var baseForIn = _ _webpack _require _ _ ( 43 ) ,
isArguments = _ _webpack _require _ _ ( 31 ) ,
isObjectLike = _ _webpack _require _ _ ( 36 ) ;
/** `Object#toString` result references. */
var objectTag = '[object Object]' ;
/** Used for native method references. */
var objectProto = Object . prototype ;
/** Used to check objects for own properties. */
var hasOwnProperty = objectProto . hasOwnProperty ;
/ * *
* Used to resolve the [ ` toStringTag ` ] ( http : //ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
* of values .
* /
var objToString = objectProto . toString ;
/ * *
* Checks if ` value ` is a plain object , that is , an object created by the
* ` Object ` constructor or one with a ` [[Prototype]] ` of ` null ` .
*
* * * Note : * * This method assumes objects created by the ` Object ` constructor
* have no inherited enumerable properties .
*
* @ static
* @ memberOf _
* @ category Lang
* @ param { * } value The value to check .
* @ returns { boolean } Returns ` true ` if ` value ` is a plain object , else ` false ` .
* @ example
*
* function Foo ( ) {
* this . a = 1 ;
* }
*
* _ . isPlainObject ( new Foo ) ;
* // => false
*
* _ . isPlainObject ( [ 1 , 2 , 3 ] ) ;
* // => false
*
* _ . isPlainObject ( { 'x' : 0 , 'y' : 0 } ) ;
* // => true
*
* _ . isPlainObject ( Object . create ( null ) ) ;
* // => true
* /
function isPlainObject ( value ) {
var Ctor ;
// Exit early for non `Object` objects.
if ( ! ( isObjectLike ( value ) && objToString . call ( value ) == objectTag && ! isArguments ( value ) ) ||
( ! hasOwnProperty . call ( value , 'constructor' ) && ( Ctor = value . constructor , typeof Ctor == 'function' && ! ( Ctor instanceof Ctor ) ) ) ) {
return false ;
}
// IE < 9 iterates inherited properties before own properties. If the first
// iterated property is an object's own property then there are no inherited
// enumerable properties.
var result ;
// In most environments an object's own properties are iterated before
// its inherited properties. If the last iterated property is an object's
// own property then there are no inherited enumerable properties.
baseForIn ( value , function ( subValue , key ) {
result = key ;
} ) ;
return result === undefined || hasOwnProperty . call ( value , result ) ;
}
module . exports = isPlainObject ;
/***/ } ,
/* 43 */
/***/ function ( module , exports , _ _webpack _require _ _ ) {
var baseFor = _ _webpack _require _ _ ( 44 ) ,
keysIn = _ _webpack _require _ _ ( 47 ) ;
/ * *
* The base implementation of ` _.forIn ` without support for callback
* shorthands and ` this ` binding .
*
* @ private
* @ param { Object } object The object to iterate over .
* @ param { Function } iteratee The function invoked per iteration .
* @ returns { Object } Returns ` object ` .
* /
function baseForIn ( object , iteratee ) {
return baseFor ( object , iteratee , keysIn ) ;
}
module . exports = baseForIn ;
/***/ } ,
/* 44 */
/***/ function ( module , exports , _ _webpack _require _ _ ) {
var createBaseFor = _ _webpack _require _ _ ( 45 ) ;
/ * *
* The base implementation of ` baseForIn ` and ` baseForOwn ` which iterates
* over ` object ` properties returned by ` keysFunc ` invoking ` iteratee ` for
* each property . Iteratee functions may exit iteration early by explicitly
* returning ` false ` .
*
* @ private
* @ param { Object } object The object to iterate over .
* @ param { Function } iteratee The function invoked per iteration .
* @ param { Function } keysFunc The function to get the keys of ` object ` .
* @ returns { Object } Returns ` object ` .
* /
var baseFor = createBaseFor ( ) ;
module . exports = baseFor ;
/***/ } ,
/* 45 */
/***/ function ( module , exports , _ _webpack _require _ _ ) {
var toObject = _ _webpack _require _ _ ( 46 ) ;
/ * *
* Creates a base function for ` _.forIn ` or ` _.forInRight ` .
*
* @ private
* @ param { boolean } [ fromRight ] Specify iterating from right to left .
* @ returns { Function } Returns the new base function .
* /
function createBaseFor ( fromRight ) {
return function ( object , iteratee , keysFunc ) {
var iterable = toObject ( object ) ,
props = keysFunc ( object ) ,
length = props . length ,
index = fromRight ? length : - 1 ;
while ( ( fromRight ? index -- : ++ index < length ) ) {
var key = props [ index ] ;
if ( iteratee ( iterable [ key ] , key , iterable ) === false ) {
break ;
}
}
return object ;
} ;
}
module . exports = createBaseFor ;
/***/ } ,
/* 46 */
/***/ function ( module , exports , _ _webpack _require _ _ ) {
var isObject = _ _webpack _require _ _ ( 41 ) ;
/ * *
* Converts ` value ` to an object if it ' s not one .
*
* @ private
* @ param { * } value The value to process .
* @ returns { Object } Returns the object .
* /
function toObject ( value ) {
return isObject ( value ) ? value : Object ( value ) ;
}
module . exports = toObject ;
/***/ } ,
/* 47 */
/***/ function ( module , exports , _ _webpack _require _ _ ) {
var isArguments = _ _webpack _require _ _ ( 31 ) ,
isArray = _ _webpack _require _ _ ( 37 ) ,
isIndex = _ _webpack _require _ _ ( 48 ) ,
isLength = _ _webpack _require _ _ ( 35 ) ,
isObject = _ _webpack _require _ _ ( 41 ) ;
/** Used for native method references. */
var objectProto = Object . prototype ;
/** Used to check objects for own properties. */
var hasOwnProperty = objectProto . hasOwnProperty ;
/ * *
* Creates an array of the own and inherited enumerable property names of ` object ` .
*
* * * Note : * * Non - object values are coerced to objects .
*
* @ static
* @ memberOf _
* @ category Object
* @ param { Object } object The object to query .
* @ returns { Array } Returns the array of property names .
* @ example
*
* function Foo ( ) {
* this . a = 1 ;
* this . b = 2 ;
* }
*
* Foo . prototype . c = 3 ;
*
* _ . keysIn ( new Foo ) ;
* // => ['a', 'b', 'c'] (iteration order is not guaranteed)
* /
function keysIn ( object ) {
if ( object == null ) {
return [ ] ;
}
if ( ! isObject ( object ) ) {
object = Object ( object ) ;
}
var length = object . length ;
length = ( length && isLength ( length ) &&
( isArray ( object ) || isArguments ( object ) ) && length ) || 0 ;
var Ctor = object . constructor ,
index = - 1 ,
isProto = typeof Ctor == 'function' && Ctor . prototype === object ,
result = Array ( length ) ,
skipIndexes = length > 0 ;
while ( ++ index < length ) {
result [ index ] = ( index + '' ) ;
}
for ( var key in object ) {
if ( ! ( skipIndexes && isIndex ( key , length ) ) &&
! ( key == 'constructor' && ( isProto || ! hasOwnProperty . call ( object , key ) ) ) ) {
result . push ( key ) ;
}
}
return result ;
}
module . exports = keysIn ;
/***/ } ,
/* 48 */
/***/ function ( module , exports ) {
/** Used to detect unsigned integer values. */
var reIsUint = /^\d+$/ ;
/ * *
* Used as the [ maximum length ] ( http : //ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer)
* of an array - like value .
* /
var MAX _SAFE _INTEGER = 9007199254740991 ;
/ * *
* Checks if ` value ` is a valid array - like index .
*
* @ private
* @ param { * } value The value to check .
* @ param { number } [ length = MAX _SAFE _INTEGER ] The upper bounds of a valid index .
* @ returns { boolean } Returns ` true ` if ` value ` is a valid index , else ` false ` .
* /
function isIndex ( value , length ) {
value = ( typeof value == 'number' || reIsUint . test ( value ) ) ? + value : - 1 ;
length = length == null ? MAX _SAFE _INTEGER : length ;
return value > - 1 && value % 1 == 0 && value < length ;
}
module . exports = isIndex ;
/***/ } ,
/* 49 */
/***/ function ( module , exports , _ _webpack _require _ _ ) {
var isLength = _ _webpack _require _ _ ( 35 ) ,
isObjectLike = _ _webpack _require _ _ ( 36 ) ;
/** `Object#toString` result references. */
var argsTag = '[object Arguments]' ,
arrayTag = '[object Array]' ,
boolTag = '[object Boolean]' ,
dateTag = '[object Date]' ,
errorTag = '[object Error]' ,
funcTag = '[object Function]' ,
mapTag = '[object Map]' ,
numberTag = '[object Number]' ,
objectTag = '[object Object]' ,
regexpTag = '[object RegExp]' ,
setTag = '[object Set]' ,
stringTag = '[object String]' ,
weakMapTag = '[object WeakMap]' ;
var arrayBufferTag = '[object ArrayBuffer]' ,
float32Tag = '[object Float32Array]' ,
float64Tag = '[object Float64Array]' ,
int8Tag = '[object Int8Array]' ,
int16Tag = '[object Int16Array]' ,
int32Tag = '[object Int32Array]' ,
uint8Tag = '[object Uint8Array]' ,
uint8ClampedTag = '[object Uint8ClampedArray]' ,
uint16Tag = '[object Uint16Array]' ,
uint32Tag = '[object Uint32Array]' ;
/** Used to identify `toStringTag` values of typed arrays. */
var typedArrayTags = { } ;
typedArrayTags [ float32Tag ] = typedArrayTags [ float64Tag ] =
typedArrayTags [ int8Tag ] = typedArrayTags [ int16Tag ] =
typedArrayTags [ int32Tag ] = typedArrayTags [ uint8Tag ] =
typedArrayTags [ uint8ClampedTag ] = typedArrayTags [ uint16Tag ] =
typedArrayTags [ uint32Tag ] = true ;
typedArrayTags [ argsTag ] = typedArrayTags [ arrayTag ] =
typedArrayTags [ arrayBufferTag ] = typedArrayTags [ boolTag ] =
typedArrayTags [ dateTag ] = typedArrayTags [ errorTag ] =
typedArrayTags [ funcTag ] = typedArrayTags [ mapTag ] =
typedArrayTags [ numberTag ] = typedArrayTags [ objectTag ] =
typedArrayTags [ regexpTag ] = typedArrayTags [ setTag ] =
typedArrayTags [ stringTag ] = typedArrayTags [ weakMapTag ] = false ;
/** Used for native method references. */
var objectProto = Object . prototype ;
/ * *
* Used to resolve the [ ` toStringTag ` ] ( http : //ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
* of values .
* /
var objToString = objectProto . toString ;
/ * *
* Checks if ` value ` is classified as a typed array .
*
* @ static
* @ memberOf _
* @ category Lang
* @ param { * } value The value to check .
* @ returns { boolean } Returns ` true ` if ` value ` is correctly classified , else ` false ` .
* @ example
*
* _ . isTypedArray ( new Uint8Array ) ;
* // => true
*
* _ . isTypedArray ( [ ] ) ;
* // => false
* /
function isTypedArray ( value ) {
return isObjectLike ( value ) && isLength ( value . length ) && ! ! typedArrayTags [ objToString . call ( value ) ] ;
}
module . exports = isTypedArray ;
/***/ } ,
/* 50 */
/***/ function ( module , exports , _ _webpack _require _ _ ) {
var baseCopy = _ _webpack _require _ _ ( 51 ) ,
keysIn = _ _webpack _require _ _ ( 47 ) ;
/ * *
* Converts ` value ` to a plain object flattening inherited enumerable
* properties of ` value ` to own properties of the plain object .
*
* @ static
* @ memberOf _
* @ category Lang
* @ param { * } value The value to convert .
* @ returns { Object } Returns the converted plain object .
* @ example
*
* function Foo ( ) {
* this . b = 2 ;
* }
*
* Foo . prototype . c = 3 ;
*
* _ . assign ( { 'a' : 1 } , new Foo ) ;
* // => { 'a': 1, 'b': 2 }
*
* _ . assign ( { 'a' : 1 } , _ . toPlainObject ( new Foo ) ) ;
* // => { 'a': 1, 'b': 2, 'c': 3 }
* /
function toPlainObject ( value ) {
return baseCopy ( value , keysIn ( value ) ) ;
}
module . exports = toPlainObject ;
/***/ } ,
/* 51 */
/***/ function ( module , exports ) {
/ * *
* Copies properties of ` source ` to ` object ` .
*
* @ private
* @ param { Object } source The object to copy properties from .
* @ param { Array } props The property names to copy .
* @ param { Object } [ object = { } ] The object to copy properties to .
* @ returns { Object } Returns ` object ` .
* /
function baseCopy ( source , props , object ) {
object || ( object = { } ) ;
var index = - 1 ,
length = props . length ;
while ( ++ index < length ) {
var key = props [ index ] ;
object [ key ] = source [ key ] ;
}
return object ;
}
module . exports = baseCopy ;
/***/ } ,
/* 52 */
/***/ function ( module , exports , _ _webpack _require _ _ ) {
var getNative = _ _webpack _require _ _ ( 38 ) ,
isArrayLike = _ _webpack _require _ _ ( 32 ) ,
isObject = _ _webpack _require _ _ ( 41 ) ,
shimKeys = _ _webpack _require _ _ ( 53 ) ;
/* Native method references for those with the same name as other `lodash` methods. */
var nativeKeys = getNative ( Object , 'keys' ) ;
/ * *
* Creates an array of the own enumerable property names of ` object ` .
*
* * * Note : * * Non - object values are coerced to objects . See the
* [ ES spec ] ( http : //ecma-international.org/ecma-262/6.0/#sec-object.keys)
* for more details .
*
* @ static
* @ memberOf _
* @ category Object
* @ param { Object } object The object to query .
* @ returns { Array } Returns the array of property names .
* @ example
*
* function Foo ( ) {
* this . a = 1 ;
* this . b = 2 ;
* }
*
* Foo . prototype . c = 3 ;
*
* _ . keys ( new Foo ) ;
* // => ['a', 'b'] (iteration order is not guaranteed)
*
* _ . keys ( 'hi' ) ;
* // => ['0', '1']
* /
var keys = ! nativeKeys ? shimKeys : function ( object ) {
var Ctor = object == null ? undefined : object . constructor ;
if ( ( typeof Ctor == 'function' && Ctor . prototype === object ) ||
( typeof object != 'function' && isArrayLike ( object ) ) ) {
return shimKeys ( object ) ;
}
return isObject ( object ) ? nativeKeys ( object ) : [ ] ;
} ;
module . exports = keys ;
/***/ } ,
/* 53 */
/***/ function ( module , exports , _ _webpack _require _ _ ) {
var isArguments = _ _webpack _require _ _ ( 31 ) ,
isArray = _ _webpack _require _ _ ( 37 ) ,
isIndex = _ _webpack _require _ _ ( 48 ) ,
isLength = _ _webpack _require _ _ ( 35 ) ,
keysIn = _ _webpack _require _ _ ( 47 ) ;
/** Used for native method references. */
var objectProto = Object . prototype ;
/** Used to check objects for own properties. */
var hasOwnProperty = objectProto . hasOwnProperty ;
/ * *
* A fallback implementation of ` Object.keys ` which creates an array of the
* own enumerable property names of ` object ` .
*
* @ private
* @ param { Object } object The object to query .
* @ returns { Array } Returns the array of property names .
* /
function shimKeys ( object ) {
var props = keysIn ( object ) ,
propsLength = props . length ,
length = propsLength && object . length ;
var allowIndexes = ! ! length && isLength ( length ) &&
( isArray ( object ) || isArguments ( object ) ) ;
var index = - 1 ,
result = [ ] ;
while ( ++ index < propsLength ) {
var key = props [ index ] ;
if ( ( allowIndexes && isIndex ( key , length ) ) || hasOwnProperty . call ( object , key ) ) {
result . push ( key ) ;
}
}
return result ;
}
module . exports = shimKeys ;
/***/ } ,
/* 54 */
/***/ function ( module , exports , _ _webpack _require _ _ ) {
var bindCallback = _ _webpack _require _ _ ( 55 ) ,
isIterateeCall = _ _webpack _require _ _ ( 57 ) ,
restParam = _ _webpack _require _ _ ( 58 ) ;
/ * *
* Creates a ` _.assign ` , ` _.defaults ` , or ` _.merge ` function .
*
* @ private
* @ param { Function } assigner The function to assign values .
* @ returns { Function } Returns the new assigner function .
* /
function createAssigner ( assigner ) {
return restParam ( function ( object , sources ) {
var index = - 1 ,
length = object == null ? 0 : sources . length ,
customizer = length > 2 ? sources [ length - 2 ] : undefined ,
guard = length > 2 ? sources [ 2 ] : undefined ,
thisArg = length > 1 ? sources [ length - 1 ] : undefined ;
if ( typeof customizer == 'function' ) {
customizer = bindCallback ( customizer , thisArg , 5 ) ;
length -= 2 ;
} else {
customizer = typeof thisArg == 'function' ? thisArg : undefined ;
length -= ( customizer ? 1 : 0 ) ;
}
if ( guard && isIterateeCall ( sources [ 0 ] , sources [ 1 ] , guard ) ) {
customizer = length < 3 ? undefined : customizer ;
length = 1 ;
}
while ( ++ index < length ) {
var source = sources [ index ] ;
if ( source ) {
assigner ( object , source , customizer ) ;
}
}
return object ;
} ) ;
}
module . exports = createAssigner ;
/***/ } ,
/* 55 */
/***/ function ( module , exports , _ _webpack _require _ _ ) {
var identity = _ _webpack _require _ _ ( 56 ) ;
/ * *
* A specialized version of ` baseCallback ` which only supports ` this ` binding
* and specifying the number of arguments to provide to ` func ` .
*
* @ private
* @ param { Function } func The function to bind .
* @ param { * } thisArg The ` this ` binding of ` func ` .
* @ param { number } [ argCount ] The number of arguments to provide to ` func ` .
* @ returns { Function } Returns the callback .
* /
function bindCallback ( func , thisArg , argCount ) {
if ( typeof func != 'function' ) {
return identity ;
}
if ( thisArg === undefined ) {
return func ;
}
switch ( argCount ) {
case 1 : return function ( value ) {
return func . call ( thisArg , value ) ;
} ;
case 3 : return function ( value , index , collection ) {
return func . call ( thisArg , value , index , collection ) ;
} ;
case 4 : return function ( accumulator , value , index , collection ) {
return func . call ( thisArg , accumulator , value , index , collection ) ;
} ;
case 5 : return function ( value , other , key , object , source ) {
return func . call ( thisArg , value , other , key , object , source ) ;
} ;
}
return function ( ) {
return func . apply ( thisArg , arguments ) ;
} ;
}
module . exports = bindCallback ;
/***/ } ,
/* 56 */
/***/ function ( module , exports ) {
/ * *
* This method returns the first argument provided to it .
*
* @ static
* @ memberOf _
* @ category Utility
* @ param { * } value Any value .
* @ returns { * } Returns ` value ` .
* @ example
*
* var object = { 'user' : 'fred' } ;
*
* _ . identity ( object ) === object ;
* // => true
* /
function identity ( value ) {
return value ;
}
module . exports = identity ;
/***/ } ,
/* 57 */
/***/ function ( module , exports , _ _webpack _require _ _ ) {
var isArrayLike = _ _webpack _require _ _ ( 32 ) ,
isIndex = _ _webpack _require _ _ ( 48 ) ,
isObject = _ _webpack _require _ _ ( 41 ) ;
/ * *
* Checks if the provided arguments are from an iteratee call .
*
* @ private
* @ param { * } value The potential iteratee value argument .
* @ param { * } index The potential iteratee index or key argument .
* @ param { * } object The potential iteratee object argument .
* @ returns { boolean } Returns ` true ` if the arguments are from an iteratee call , else ` false ` .
* /
function isIterateeCall ( value , index , object ) {
if ( ! isObject ( object ) ) {
return false ;
}
var type = typeof index ;
if ( type == 'number'
? ( isArrayLike ( object ) && isIndex ( index , object . length ) )
: ( type == 'string' && index in object ) ) {
var other = object [ index ] ;
return value === value ? ( value === other ) : ( other !== other ) ;
}
return false ;
}
module . exports = isIterateeCall ;
/***/ } ,
/* 58 */
/***/ function ( module , exports ) {
/** Used as the `TypeError` message for "Functions" methods. */
var FUNC _ERROR _TEXT = 'Expected a function' ;
/* Native method references for those with the same name as other `lodash` methods. */
var nativeMax = Math . max ;
/ * *
* Creates a function that invokes ` func ` with the ` this ` binding of the
* created function and arguments from ` start ` and beyond provided as an array .
*
* * * Note : * * This method is based on the [ rest parameter ] ( https : //developer.mozilla.org/Web/JavaScript/Reference/Functions/rest_parameters).
*
* @ static
* @ memberOf _
* @ category Function
* @ param { Function } func The function to apply a rest parameter to .
* @ param { number } [ start = func . length - 1 ] The start position of the rest parameter .
* @ returns { Function } Returns the new function .
* @ example
*
* var say = _ . restParam ( function ( what , names ) {
* return what + ' ' + _ . initial ( names ) . join ( ', ' ) +
* ( _ . size ( names ) > 1 ? ', & ' : '' ) + _ . last ( names ) ;
* } ) ;
*
* say ( 'hello' , 'fred' , 'barney' , 'pebbles' ) ;
* // => 'hello fred, barney, & pebbles'
* /
function restParam ( func , start ) {
if ( typeof func != 'function' ) {
throw new TypeError ( FUNC _ERROR _TEXT ) ;
}
start = nativeMax ( start === undefined ? ( func . length - 1 ) : ( + start || 0 ) , 0 ) ;
return function ( ) {
var args = arguments ,
index = - 1 ,
length = nativeMax ( args . length - start , 0 ) ,
rest = Array ( length ) ;
while ( ++ index < length ) {
rest [ index ] = args [ start + index ] ;
}
switch ( start ) {
case 0 : return func . call ( this , rest ) ;
case 1 : return func . call ( this , args [ 0 ] , rest ) ;
case 2 : return func . call ( this , args [ 0 ] , args [ 1 ] , rest ) ;
}
var otherArgs = Array ( start + 1 ) ;
index = - 1 ;
while ( ++ index < start ) {
otherArgs [ index ] = args [ index ] ;
}
otherArgs [ start ] = rest ;
return func . apply ( this , otherArgs ) ;
} ;
}
module . exports = restParam ;
/***/ } ,
/* 59 */
/***/ function ( module , exports ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
exports [ "default" ] = {
inputStream : {
name : "Live" ,
type : "LiveStream" ,
constraints : {
width : 640 ,
height : 480 ,
minAspectRatio : 0 ,
maxAspectRatio : 100 ,
facing : "environment" // or user
} ,
area : {
top : "0%" ,
right : "0%" ,
left : "0%" ,
bottom : "0%"
} ,
singleChannel : false // true: only the red color-channel is read
} ,
debug : false ,
locate : true ,
numOfWorkers : 4 ,
decoder : {
drawBoundingBox : false ,
showFrequency : false ,
drawScanline : false ,
showPattern : false ,
readers : [ 'code_128_reader' ]
} ,
locator : {
halfSample : true ,
patchSize : "medium" , // x-small, small, medium, large, x-large
showCanvas : false ,
showPatches : false ,
showFoundPatches : false ,
showSkeleton : false ,
showLabels : false ,
showPatchLabels : false ,
showRemainingPatchLabels : false ,
boxFromPatches : {
showTransformed : false ,
showTransformedBox : false ,
showBB : false
}
}
} ;
module . exports = exports [ "default" ] ;
/***/ } ,
/* 60 */
/***/ function ( module , exports ) {
"use strict" ;
Object . defineProperty ( exports , "__esModule" , {
value : true
} ) ;
exports [ "default" ] = ( function ( ) {
var events = { } ;
function getEvent ( eventName ) {
if ( ! events [ eventName ] ) {
events [ eventName ] = {
subscribers : [ ]
} ;
}
return events [ eventName ] ;
}
function clearEvents ( ) {
events = { } ;
}
function publishSubscription ( subscription , data ) {
if ( subscription . async ) {
setTimeout ( function ( ) {
subscription . callback ( data ) ;
} , 4 ) ;
} else {
subscription . callback ( data ) ;
}
}
function _subscribe ( event , callback , async ) {
var subscription ;
if ( typeof callback === "function" ) {
subscription = {
callback : callback ,
async : async
} ;
} else {
subscription = callback ;
if ( ! subscription . callback ) {
throw "Callback was not specified on options" ;
}
}
getEvent ( event ) . subscribers . push ( subscription ) ;
}
return {
subscribe : function subscribe ( event , callback , async ) {
return _subscribe ( event , callback , async ) ;
} ,
publish : function publish ( eventName , data ) {
var event = getEvent ( eventName ) ,
subscribers = event . subscribers ;
event . subscribers = subscribers . filter ( function ( subscriber ) {
publishSubscription ( subscriber , data ) ;
return ! subscriber . once ;
} ) ;
} ,
once : function once ( event , callback , async ) {
_subscribe ( event , {
callback : callback ,
async : async ,
once : true
} ) ;
} ,
unsubscribe : function unsubscribe ( eventName , callback ) {
var event ;
if ( eventName ) {
event = getEvent ( eventName ) ;
if ( event && callback ) {
event . subscribers = event . subscribers . filter ( function ( subscriber ) {
return subscriber . callback !== callback ;
} ) ;
} else {
event . subscribers = [ ] ;
}
} else {
clearEvents ( ) ;
}
}
} ;
} ) ( ) ;
module . exports = exports [ "default" ] ;
/***/ } ,
/* 61 */
/***/ function ( module , exports , _ _webpack _require _ _ ) {
'use strict' ;
Object . defineProperty ( exports , '__esModule' , {
value : true
} ) ;
var merge = _ _webpack _require _ _ ( 26 ) ;
var streamRef , loadedDataHandler ;
/ * *
* Wraps browser - specific getUserMedia
* @ param { Object } constraints
* @ param { Object } success Callback
* @ param { Object } failure Callback
* /
function getUserMedia ( constraints , success , failure ) {
if ( typeof navigator . getUserMedia !== 'undefined' ) {
navigator . getUserMedia ( constraints , function ( stream ) {
streamRef = stream ;
var videoSrc = window . URL && window . URL . createObjectURL ( stream ) || stream ;
success . apply ( null , [ videoSrc ] ) ;
} , failure ) ;
} else {
failure ( new TypeError ( "getUserMedia not available" ) ) ;
}
}
function loadedData ( video , callback ) {
var attempts = 10 ;
function checkVideo ( ) {
if ( attempts > 0 ) {
if ( video . videoWidth > 0 && video . videoHeight > 0 ) {
console . log ( video . videoWidth + "px x " + video . videoHeight + "px" ) ;
callback ( ) ;
} else {
window . setTimeout ( checkVideo , 500 ) ;
}
} else {
callback ( 'Unable to play video stream. Is webcam working?' ) ;
}
attempts -- ;
}
checkVideo ( ) ;
}
/ * *
* Tries to attach the camera - stream to a given video - element
* and calls the callback function when the content is ready
* @ param { Object } constraints
* @ param { Object } video
* @ param { Object } callback
* /
function initCamera ( constraints , video , callback ) {
getUserMedia ( constraints , function ( src ) {
video . src = src ;
if ( loadedDataHandler ) {
video . removeEventListener ( "loadeddata" , loadedDataHandler , false ) ;
}
loadedDataHandler = loadedData . bind ( null , video , callback ) ;
video . addEventListener ( 'loadeddata' , loadedDataHandler , false ) ;
video . play ( ) ;
} , function ( e ) {
callback ( e ) ;
} ) ;
}
/ * *
* Normalizes the incoming constraints to satisfy the current browser
* @ param config
* @ param cb Callback which is called whenever constraints are created
* @ returns { * }
* /
function normalizeConstraints ( config , cb ) {
var constraints = {
audio : false ,
video : true
} ,
videoConstraints = merge ( {
width : 640 ,
height : 480 ,
minAspectRatio : 0 ,
maxAspectRatio : 100 ,
facing : "environment"
} , config ) ;
if ( typeof MediaStreamTrack !== 'undefined' && typeof MediaStreamTrack . getSources !== 'undefined' ) {
MediaStreamTrack . getSources ( function ( sourceInfos ) {
var videoSourceId ;
for ( var i = 0 ; i < sourceInfos . length ; ++ i ) {
var sourceInfo = sourceInfos [ i ] ;
if ( sourceInfo . kind === "video" && sourceInfo . facing === videoConstraints . facing ) {
videoSourceId = sourceInfo . id ;
}
}
constraints . video = {
mandatory : {
minWidth : videoConstraints . width ,
minHeight : videoConstraints . height ,
minAspectRatio : videoConstraints . minAspectRatio ,
maxAspectRatio : videoConstraints . maxAspectRatio
} ,
optional : [ {
sourceId : videoSourceId
} ]
} ;
return cb ( constraints ) ;
} ) ;
} else {
constraints . video = {
mediaSource : "camera" ,
width : { min : videoConstraints . width , max : videoConstraints . width } ,
height : { min : videoConstraints . height , max : videoConstraints . height } ,
require : [ "width" , "height" ]
} ;
return cb ( constraints ) ;
}
}
/ * *
* Requests the back - facing camera of the user . The callback is called
* whenever the stream is ready to be consumed , or if an error occures .
* @ param { Object } video
* @ param { Object } callback
* /
function _request ( video , videoConstraints , callback ) {
normalizeConstraints ( videoConstraints , function ( constraints ) {
initCamera ( constraints , video , callback ) ;
} ) ;
}
exports [ 'default' ] = {
request : function request ( video , constraints , callback ) {
_request ( video , constraints , callback ) ;
} ,
release : function release ( ) {
var tracks = streamRef && streamRef . getVideoTracks ( ) ;
if ( tracks . length ) {
tracks [ 0 ] . stop ( ) ;
}
streamRef = null ;
}
} ;
module . exports = exports [ 'default' ] ;
/***/ } ,
/* 62 */
/***/ function ( module , exports , _ _webpack _require _ _ ) {
'use strict' ;
Object . defineProperty ( exports , '__esModule' , {
value : true
} ) ;
function _interopRequireDefault ( obj ) { return obj && obj . _ _esModule ? obj : { 'default' : obj } ; }
var _image _debug = _ _webpack _require _ _ ( 13 ) ;
var _image _debug2 = _interopRequireDefault ( _image _debug ) ;
function contains ( codeResult , list ) {
if ( list ) {
return list . some ( function ( item ) {
return Object . keys ( item ) . every ( function ( key ) {
return item [ key ] === codeResult [ key ] ;
} ) ;
} ) ;
}
return false ;
}
function passesFilter ( codeResult , filter ) {
if ( typeof filter === 'function' ) {
return filter ( codeResult ) ;
}
return true ;
}
exports [ 'default' ] = {
create : function create ( config ) {
var canvas = document . createElement ( "canvas" ) ,
ctx = canvas . getContext ( "2d" ) ,
results = [ ] ,
capacity = config . capacity || 20 ,
capture = config . capture === true ;
function matchesConstraints ( codeResult ) {
return capacity && codeResult && ! contains ( codeResult , config . blacklist ) && passesFilter ( codeResult , config . filter ) ;
}
return {
addResult : function addResult ( data , imageSize , codeResult ) {
var result = { } ;
if ( matchesConstraints ( codeResult ) ) {
capacity -- ;
result . codeResult = codeResult ;
if ( capture ) {
canvas . width = imageSize . x ;
canvas . height = imageSize . y ;
_image _debug2 [ 'default' ] . drawImage ( data , imageSize , ctx ) ;
result . frame = canvas . toDataURL ( ) ;
}
results . push ( result ) ;
}
} ,
getResults : function getResults ( ) {
return results ;
}
} ;
}
} ;
module . exports = exports [ 'default' ] ;
/***/ } ,
/* 63 */
/***/ function ( module , exports , _ _webpack _require _ _ ) {
'use strict' ;
var GetPixels = _ _webpack _require _ _ ( 64 ) ;
var InputStream = { } ;
InputStream . createImageStream = function ( ) {
var that = { } ;
var _config = null ;
var width = 0 ,
height = 0 ,
frameIdx = 0 ,
paused = true ,
loaded = false ,
frame = null ,
baseUrl ,
ended = false ,
size ,
calculatedWidth ,
calculatedHeight ,
_eventNames = [ 'canrecord' , 'ended' ] ,
_eventHandlers = { } ,
_topRight = { x : 0 , y : 0 } ,
_canvasSize = { x : 0 , y : 0 } ;
function loadImages ( ) {
loaded = false ;
GetPixels ( baseUrl , function ( err , pixels ) {
if ( err ) {
console . log ( err ) ;
exit ( 1 ) ;
}
loaded = true ;
console . log ( pixels . shape ) ;
frame = pixels ;
width = pixels . shape [ 0 ] ;
height = pixels . shape [ 1 ] ;
calculatedWidth = _config . size ? width / height > 1 ? _config . size : Math . floor ( width / height * _config . size ) : width ;
calculatedHeight = _config . size ? width / height > 1 ? Math . floor ( height / width * _config . size ) : _config . size : height ;
_canvasSize . x = calculatedWidth ;
_canvasSize . y = calculatedHeight ;
setTimeout ( function ( ) {
publishEvent ( "canrecord" , [ ] ) ;
} , 0 ) ;
} ) ;
}
function publishEvent ( eventName , args ) {
var j ,
handlers = _eventHandlers [ eventName ] ;
if ( handlers && handlers . length > 0 ) {
for ( j = 0 ; j < handlers . length ; j ++ ) {
handlers [ j ] . apply ( that , args ) ;
}
}
}
that . trigger = publishEvent ;
that . getWidth = function ( ) {
return calculatedWidth ;
} ;
that . getHeight = function ( ) {
return calculatedHeight ;
} ;
that . setWidth = function ( width ) {
calculatedWidth = width ;
} ;
that . setHeight = function ( height ) {
calculatedHeight = height ;
} ;
that . getRealWidth = function ( ) {
return width ;
} ;
that . getRealHeight = function ( ) {
return height ;
} ;
that . setInputStream = function ( stream ) {
_config = stream ;
baseUrl = _config . src ;
size = 1 ;
loadImages ( ) ;
} ;
that . ended = function ( ) {
return ended ;
} ;
that . setAttribute = function ( ) { } ;
that . getConfig = function ( ) {
return _config ;
} ;
that . pause = function ( ) {
paused = true ;
} ;
that . play = function ( ) {
paused = false ;
} ;
that . setCurrentTime = function ( time ) {
frameIdx = time ;
} ;
that . addEventListener = function ( event , f ) {
if ( _eventNames . indexOf ( event ) !== - 1 ) {
if ( ! _eventHandlers [ event ] ) {
_eventHandlers [ event ] = [ ] ;
}
_eventHandlers [ event ] . push ( f ) ;
}
} ;
that . setTopRight = function ( topRight ) {
_topRight . x = topRight . x ;
_topRight . y = topRight . y ;
} ;
that . getTopRight = function ( ) {
return _topRight ;
} ;
that . setCanvasSize = function ( size ) {
_canvasSize . x = size . x ;
_canvasSize . y = size . y ;
} ;
that . getCanvasSize = function ( ) {
return _canvasSize ;
} ;
that . getFrame = function ( ) {
if ( ! loaded ) {
return null ;
}
return frame ;
} ;
return that ;
} ;
module . exports = InputStream ;
/***/ } ,
/* 64 */
/***/ function ( module , exports ) {
module . exports = require ( "get-pixels" ) ;
/***/ } ,
/* 65 */
/***/ function ( module , exports , _ _webpack _require _ _ ) {
"use strict" ;
var CVUtils = _ _webpack _require _ _ ( 5 ) ,
Ndarray = _ _webpack _require _ _ ( 66 ) ,
Interp2D = _ _webpack _require _ _ ( 67 ) . d2 ;
var FrameGrabber = { } ;
FrameGrabber . create = function ( inputStream ) {
var _that = { } ,
_streamConfig = inputStream . getConfig ( ) ,
_video _size = CVUtils . imageRef ( inputStream . getRealWidth ( ) , inputStream . getRealHeight ( ) ) ,
_canvasSize = inputStream . getCanvasSize ( ) ,
_size = CVUtils . imageRef ( inputStream . getWidth ( ) , inputStream . getHeight ( ) ) ,
_topRight = inputStream . getTopRight ( ) ,
_data = new Uint8Array ( _size . x * _size . y ) ,
_grayData = new Uint8Array ( _video _size . x * _video _size . y ) ,
_canvasData = new Uint8Array ( _canvasSize . x * _canvasSize . y ) ,
_grayImageArray = Ndarray ( _grayData , [ _video _size . y , _video _size . x ] ) . transpose ( 1 , 0 ) ,
_canvasImageArray = Ndarray ( _canvasData , [ _canvasSize . y , _canvasSize . x ] ) . transpose ( 1 , 0 ) ,
_targetImageArray = _canvasImageArray . hi ( _topRight . x + _size . x , _topRight . y + _size . y ) . lo ( _topRight . x , _topRight . y ) ,
_stepSizeX = _video _size . x / _canvasSize . x ,
_stepSizeY = _video _size . y / _canvasSize . y ;
console . log ( "FrameGrabber" , JSON . stringify ( {
videoSize : _grayImageArray . shape ,
canvasSize : _canvasImageArray . shape ,
stepSize : [ _stepSizeX , _stepSizeY ] ,
size : _targetImageArray . shape ,
topRight : _topRight
} ) ) ;
/ * *
* Uses the given array as frame - buffer
* /
_that . attachData = function ( data ) {
_data = data ;
} ;
/ * *
* Returns the used frame - buffer
* /
_that . getData = function ( ) {
return _data ;
} ;
/ * *
* Fetches a frame from the input - stream and puts into the frame - buffer .
* The image - data is converted to gray - scale and then half - sampled if configured .
* /
_that . grab = function ( ) {
var frame = inputStream . getFrame ( ) ;
if ( frame ) {
this . scaleAndCrop ( frame ) ;
return true ;
} else {
return false ;
}
} ;
_that . scaleAndCrop = function ( frame ) {
var x , y ;
// 1. compute full-sized gray image
CVUtils . computeGray ( frame . data , _grayData ) ;
// 2. interpolate
for ( y = 0 ; y < _canvasSize . y ; y ++ ) {
for ( x = 0 ; x < _canvasSize . x ; x ++ ) {
_canvasImageArray . set ( x , y , Interp2D ( _grayImageArray , x * _stepSizeX , y * _stepSizeY ) | 0 ) ;
}
}
// targetImageArray must be equal to targetSize
if ( _targetImageArray . shape [ 0 ] !== _size . x || _targetImageArray . shape [ 1 ] !== _size . y ) {
throw new Error ( "Shapes do not match!" ) ;
}
// 3. crop
for ( y = 0 ; y < _size . y ; y ++ ) {
for ( x = 0 ; x < _size . x ; x ++ ) {
_data [ y * _size . x + x ] = _targetImageArray . get ( x , y ) ;
}
}
} , _that . getSize = function ( ) {
return _size ;
} ;
return _that ;
} ;
module . exports = FrameGrabber ;
/***/ } ,
/* 66 */
/***/ function ( module , exports ) {
module . exports = require ( "ndarray" ) ;
/***/ } ,
/* 67 */
/***/ function ( module , exports ) {
module . exports = require ( "ndarray-linear-interpolate" ) ;
/***/ }
/******/ ] ) ;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgNDJiZDY4MzMyYTkwM2M0ZmY2NmYiLCJ3ZWJwYWNrOi8vLy4vc3JjL3F1YWdnYS5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvdHlwZWRlZnMuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2ltYWdlX3dyYXBwZXIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3N1YkltYWdlLmpzIiwid2VicGFjazovLy8uL3NyYy9jdl91dGlscy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvY2x1c3Rlci5qcyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJnbC1tYXRyaXhcIiIsIndlYnBhY2s6Ly8vLi9zcmMvYXJyYXlfaGVscGVyLmpzIiwid2VicGFjazovLy8uL3NyYy9iYXJjb2RlX2xvY2F0b3IuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3Jhc3Rlcml6ZXIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3RyYWNlci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvc2tlbGV0b25pemVyLmpzIiwid2VicGFjazovLy8uL3NyYy9pbWFnZV9kZWJ1Zy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvYmFyY29kZV9kZWNvZGVyLmpzIiwid2VicGFjazovLy8uL3NyYy9icmVzZW5oYW0uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvZGVfMTI4X3JlYWRlci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvYmFyY29kZV9yZWFkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2Vhbl9yZWFkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvZGVfMzlfcmVhZGVyLmpzIiwid2VicGFjazovLy8uL3NyYy9jb2RlXzM5X3Zpbl9yZWFkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvZGFiYXJfcmVhZGVyLmpzIiwid2VicGFjazovLy8uL3NyYy91cGNfcmVhZGVyLmpzIiwid2VicGFjazovLy8uL3NyYy9lYW5fOF9yZWFkZXIuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3VwY19lX3JlYWRlci5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvaTJvZjVfcmVhZGVyLmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoL29iamVjdC9tZXJnZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9pbnRlcm5hbC9iYXNlTWVyZ2UuanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvaW50ZXJuYWwvYXJyYXlFYWNoLmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoL2ludGVybmFsL2Jhc2VNZXJnZURlZXAuanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvaW50ZXJuYWwvYXJyYXlDb3B5LmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoL2xhbmcvaXNBcmd1bWVudHMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvaW50ZXJuYWwvaXNBcnJheUxpa2UuanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvaW50ZXJuYWwvZ2V0TGVuZ3RoLmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoL2ludGVybmFsL2Jhc2VQcm9wZXJ0eS5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9pbnRlcm5hbC9pc0xlbmd0aC5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9pbnRlcm5hbC9pc09iamVjdExpa2UuanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvbGFuZy9pc0FycmF5LmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoL2ludGVybmFsL2dldE5hdGl2ZS5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9sYW5nL2lzTmF0aXZlLmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoL2xhbmcvaXNGdW5jdGlvbi5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9sYW5nL2lzT2JqZWN0LmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoL2xhbmcvaXNQbGFpbk9iamVjdC5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9pbnRlcm5hbC9iYXNlRm9ySW4uanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvaW50ZXJuYWwvYmFzZUZvci5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9pbnRlcm5hbC9jcmVhdGVCYXNlRm9yLmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoL2ludGVybmFsL3RvT2JqZWN0LmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoL29iamVjdC9rZXlzSW4uanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvaW50ZXJuYWwvaXNJbmRleC5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9sYW5nL2lzVHlwZWRBcnJheS5qcyIsIndlYnBhY2s6Ly8vLi9+L2xvZGFzaC9sYW5nL3RvUGxhaW5PYmplY3QuanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvaW50ZXJuYWwvYmFzZUNvcHkuanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvb2JqZWN0L2tleXMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvaW50ZXJuYWwvc2hpbUtleXMuanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvaW50ZXJuYWwvY3JlYXRlQXNzaWduZXIuanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvaW50ZXJuYWwvYmluZENhbGxiYWNrLmpzIiwid2VicGFjazovLy8uL34vbG9kYXNoL3V0aWxpdHkvaWRlbnRpdHkuanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvaW50ZXJuYWwvaXNJdGVyYXRlZUNhbGwuanMiLCJ3ZWJwYWNrOi8vLy4vfi9sb2Rhc2gvZnVuY3Rpb24vcmVzdFBhcmFtLmpzIiwid2VicGFjazovLy8uL3NyYy9jb25maWcuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2V2ZW50cy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvY2FtZXJhX2FjY2Vzcy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvcmVzdWx0X2NvbGxlY3Rvci5qcyIsIndlYnBhY2s6Ly8vLi9saWIvaW5wdXRfc3RyZWFtLmpzIiwid2VicGFjazovLy9leHRlcm5hbCBcImdldC1waXhlbHNcIiIsIndlYnBhY2s6Ly8vLi9saWIvZnJhbWVfZ3JhYmJlci5qcyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJuZGFycmF5XCIiLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIFwibmRhcnJheS1saW5lYXItaW50ZXJwb2xhdGVcIiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHVCQUFlO0FBQ2Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7cUNDdENxQixDQUFZOzs7Ozs7MENBQ1IsQ0FBaUI7Ozs7NENBQ2YsQ0FBbUI7Ozs7NENBQ25CLEVBQW1COzs7O29DQUMzQ