cornerstoneTools.js 1.6 MB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363113641136511366113671136811369113701137111372113731137411375113761137711378113791138011381113821138311384113851138611387113881138911390113911139211393113941139511396113971139811399114001140111402114031140411405114061140711408114091141011411114121141311414114151141611417114181141911420114211142211423114241142511426114271142811429114301143111432114331143411435114361143711438114391144011441114421144311444114451144611447114481144911450114511145211453114541145511456114571145811459114601146111462114631146411465114661146711468114691147011471114721147311474114751147611477114781147911480114811148211483114841148511486114871148811489114901149111492114931149411495114961149711498114991150011501115021150311504115051150611507115081150911510115111151211513115141151511516115171151811519115201152111522115231152411525115261152711528115291153011531115321153311534115351153611537115381153911540115411154211543115441154511546115471154811549115501155111552115531155411555115561155711558115591156011561115621156311564115651156611567115681156911570115711157211573115741157511576115771157811579115801158111582115831158411585115861158711588115891159011591115921159311594115951159611597115981159911600116011160211603116041160511606116071160811609116101161111612116131161411615116161161711618116191162011621116221162311624116251162611627116281162911630116311163211633116341163511636116371163811639116401164111642116431164411645116461164711648116491165011651116521165311654116551165611657116581165911660116611166211663116641166511666116671166811669116701167111672116731167411675116761167711678116791168011681116821168311684116851168611687116881168911690116911169211693116941169511696116971169811699117001170111702117031170411705117061170711708117091171011711117121171311714117151171611717117181171911720117211172211723117241172511726117271172811729117301173111732117331173411735117361173711738117391174011741117421174311744117451174611747117481174911750117511175211753117541175511756117571175811759117601176111762117631176411765117661176711768117691177011771117721177311774117751177611777117781177911780117811178211783117841178511786117871178811789117901179111792117931179411795117961179711798117991180011801118021180311804118051180611807118081180911810118111181211813118141181511816118171181811819118201182111822118231182411825118261182711828118291183011831118321183311834118351183611837118381183911840118411184211843118441184511846118471184811849118501185111852118531185411855118561185711858118591186011861118621186311864118651186611867118681186911870118711187211873118741187511876118771187811879118801188111882118831188411885118861188711888118891189011891118921189311894118951189611897118981189911900119011190211903119041190511906119071190811909119101191111912119131191411915119161191711918119191192011921119221192311924119251192611927119281192911930119311193211933119341193511936119371193811939119401194111942119431194411945119461194711948119491195011951119521195311954119551195611957119581195911960119611196211963119641196511966119671196811969119701197111972119731197411975119761197711978119791198011981119821198311984119851198611987119881198911990119911199211993119941199511996119971199811999120001200112002120031200412005120061200712008120091201012011120121201312014120151201612017120181201912020120211202212023120241202512026120271202812029120301203112032120331203412035120361203712038120391204012041120421204312044120451204612047120481204912050120511205212053120541205512056120571205812059120601206112062120631206412065120661206712068120691207012071120721207312074120751207612077120781207912080120811208212083120841208512086120871208812089120901209112092120931209412095120961209712098120991210012101121021210312104121051210612107121081210912110121111211212113121141211512116121171211812119121201212112122121231212412125121261212712128121291213012131121321213312134121351213612137121381213912140121411214212143121441214512146121471214812149121501215112152121531215412155121561215712158121591216012161121621216312164121651216612167121681216912170121711217212173121741217512176121771217812179121801218112182121831218412185121861218712188121891219012191121921219312194121951219612197121981219912200122011220212203122041220512206122071220812209122101221112212122131221412215122161221712218122191222012221122221222312224122251222612227122281222912230122311223212233122341223512236122371223812239122401224112242122431224412245122461224712248122491225012251122521225312254122551225612257122581225912260122611226212263122641226512266122671226812269122701227112272122731227412275122761227712278122791228012281122821228312284122851228612287122881228912290122911229212293122941229512296122971229812299123001230112302123031230412305123061230712308123091231012311123121231312314123151231612317123181231912320123211232212323123241232512326123271232812329123301233112332123331233412335123361233712338123391234012341123421234312344123451234612347123481234912350123511235212353123541235512356123571235812359123601236112362123631236412365123661236712368123691237012371123721237312374123751237612377123781237912380123811238212383123841238512386123871238812389123901239112392123931239412395123961239712398123991240012401124021240312404124051240612407124081240912410124111241212413124141241512416124171241812419124201242112422124231242412425124261242712428124291243012431124321243312434124351243612437124381243912440124411244212443124441244512446124471244812449124501245112452124531245412455124561245712458124591246012461124621246312464124651246612467124681246912470124711247212473124741247512476124771247812479124801248112482124831248412485124861248712488124891249012491124921249312494124951249612497124981249912500125011250212503125041250512506125071250812509125101251112512125131251412515125161251712518125191252012521125221252312524125251252612527125281252912530125311253212533125341253512536125371253812539125401254112542125431254412545125461254712548125491255012551125521255312554125551255612557125581255912560125611256212563125641256512566125671256812569125701257112572125731257412575125761257712578125791258012581125821258312584125851258612587125881258912590125911259212593125941259512596125971259812599126001260112602126031260412605126061260712608126091261012611126121261312614126151261612617126181261912620126211262212623126241262512626126271262812629126301263112632126331263412635126361263712638126391264012641126421264312644126451264612647126481264912650126511265212653126541265512656126571265812659126601266112662126631266412665126661266712668126691267012671126721267312674126751267612677126781267912680126811268212683126841268512686126871268812689126901269112692126931269412695126961269712698126991270012701127021270312704127051270612707127081270912710127111271212713127141271512716127171271812719127201272112722127231272412725127261272712728127291273012731127321273312734127351273612737127381273912740127411274212743127441274512746127471274812749127501275112752127531275412755127561275712758127591276012761127621276312764127651276612767127681276912770127711277212773127741277512776127771277812779127801278112782127831278412785127861278712788127891279012791127921279312794127951279612797127981279912800128011280212803128041280512806128071280812809128101281112812128131281412815128161281712818128191282012821128221282312824128251282612827128281282912830128311283212833128341283512836128371283812839128401284112842128431284412845128461284712848128491285012851128521285312854128551285612857128581285912860128611286212863128641286512866128671286812869128701287112872128731287412875128761287712878128791288012881128821288312884128851288612887128881288912890128911289212893128941289512896128971289812899129001290112902129031290412905129061290712908129091291012911129121291312914129151291612917129181291912920129211292212923129241292512926129271292812929129301293112932129331293412935129361293712938129391294012941129421294312944129451294612947129481294912950129511295212953129541295512956129571295812959129601296112962129631296412965129661296712968129691297012971129721297312974129751297612977129781297912980129811298212983129841298512986129871298812989129901299112992129931299412995129961299712998129991300013001130021300313004130051300613007130081300913010130111301213013130141301513016130171301813019130201302113022130231302413025130261302713028130291303013031130321303313034130351303613037130381303913040130411304213043130441304513046130471304813049130501305113052130531305413055130561305713058130591306013061130621306313064130651306613067130681306913070130711307213073130741307513076130771307813079130801308113082130831308413085130861308713088130891309013091130921309313094130951309613097130981309913100131011310213103131041310513106131071310813109131101311113112131131311413115131161311713118131191312013121131221312313124131251312613127131281312913130131311313213133131341313513136131371313813139131401314113142131431314413145131461314713148131491315013151131521315313154131551315613157131581315913160131611316213163131641316513166131671316813169131701317113172131731317413175131761317713178131791318013181131821318313184131851318613187131881318913190131911319213193131941319513196131971319813199132001320113202132031320413205132061320713208132091321013211132121321313214132151321613217132181321913220132211322213223132241322513226132271322813229132301323113232132331323413235132361323713238132391324013241132421324313244132451324613247132481324913250132511325213253132541325513256132571325813259132601326113262132631326413265132661326713268132691327013271132721327313274132751327613277132781327913280132811328213283132841328513286132871328813289132901329113292132931329413295132961329713298132991330013301133021330313304133051330613307133081330913310133111331213313133141331513316133171331813319133201332113322133231332413325133261332713328133291333013331133321333313334133351333613337133381333913340133411334213343133441334513346133471334813349133501335113352133531335413355133561335713358133591336013361133621336313364133651336613367133681336913370133711337213373133741337513376133771337813379133801338113382133831338413385133861338713388133891339013391133921339313394133951339613397133981339913400134011340213403134041340513406134071340813409134101341113412134131341413415134161341713418134191342013421134221342313424134251342613427134281342913430134311343213433134341343513436134371343813439134401344113442134431344413445134461344713448134491345013451134521345313454134551345613457134581345913460134611346213463134641346513466134671346813469134701347113472134731347413475134761347713478134791348013481134821348313484134851348613487134881348913490134911349213493134941349513496134971349813499135001350113502135031350413505135061350713508135091351013511135121351313514135151351613517135181351913520135211352213523135241352513526135271352813529135301353113532135331353413535135361353713538135391354013541135421354313544135451354613547135481354913550135511355213553135541355513556135571355813559135601356113562135631356413565135661356713568135691357013571135721357313574135751357613577135781357913580135811358213583135841358513586135871358813589135901359113592135931359413595135961359713598135991360013601136021360313604136051360613607136081360913610136111361213613136141361513616136171361813619136201362113622136231362413625136261362713628136291363013631136321363313634136351363613637136381363913640136411364213643136441364513646136471364813649136501365113652136531365413655136561365713658136591366013661136621366313664136651366613667136681366913670136711367213673136741367513676136771367813679136801368113682136831368413685136861368713688136891369013691136921369313694136951369613697136981369913700137011370213703137041370513706137071370813709137101371113712137131371413715137161371713718137191372013721137221372313724137251372613727137281372913730137311373213733137341373513736137371373813739137401374113742137431374413745137461374713748137491375013751137521375313754137551375613757137581375913760137611376213763137641376513766137671376813769137701377113772137731377413775137761377713778137791378013781137821378313784137851378613787137881378913790137911379213793137941379513796137971379813799138001380113802138031380413805138061380713808138091381013811138121381313814138151381613817138181381913820138211382213823138241382513826138271382813829138301383113832138331383413835138361383713838138391384013841138421384313844138451384613847138481384913850138511385213853138541385513856138571385813859138601386113862138631386413865138661386713868138691387013871138721387313874138751387613877138781387913880138811388213883138841388513886138871388813889138901389113892138931389413895138961389713898138991390013901139021390313904139051390613907139081390913910139111391213913139141391513916139171391813919139201392113922139231392413925139261392713928139291393013931139321393313934139351393613937139381393913940139411394213943139441394513946139471394813949139501395113952139531395413955139561395713958139591396013961139621396313964139651396613967139681396913970139711397213973139741397513976139771397813979139801398113982139831398413985139861398713988139891399013991139921399313994139951399613997139981399914000140011400214003140041400514006140071400814009140101401114012140131401414015140161401714018140191402014021140221402314024140251402614027140281402914030140311403214033140341403514036140371403814039140401404114042140431404414045140461404714048140491405014051140521405314054140551405614057140581405914060140611406214063140641406514066140671406814069140701407114072140731407414075140761407714078140791408014081140821408314084140851408614087140881408914090140911409214093140941409514096140971409814099141001410114102141031410414105141061410714108141091411014111141121411314114141151411614117141181411914120141211412214123141241412514126141271412814129141301413114132141331413414135141361413714138141391414014141141421414314144141451414614147141481414914150141511415214153141541415514156141571415814159141601416114162141631416414165141661416714168141691417014171141721417314174141751417614177141781417914180141811418214183141841418514186141871418814189141901419114192141931419414195141961419714198141991420014201142021420314204142051420614207142081420914210142111421214213142141421514216142171421814219142201422114222142231422414225142261422714228142291423014231142321423314234142351423614237142381423914240142411424214243142441424514246142471424814249142501425114252142531425414255142561425714258142591426014261142621426314264142651426614267142681426914270142711427214273142741427514276142771427814279142801428114282142831428414285142861428714288142891429014291142921429314294142951429614297142981429914300143011430214303143041430514306143071430814309143101431114312143131431414315143161431714318143191432014321143221432314324143251432614327143281432914330143311433214333143341433514336143371433814339143401434114342143431434414345143461434714348143491435014351143521435314354143551435614357143581435914360143611436214363143641436514366143671436814369143701437114372143731437414375143761437714378143791438014381143821438314384143851438614387143881438914390143911439214393143941439514396143971439814399144001440114402144031440414405144061440714408144091441014411144121441314414144151441614417144181441914420144211442214423144241442514426144271442814429144301443114432144331443414435144361443714438144391444014441144421444314444144451444614447144481444914450144511445214453144541445514456144571445814459144601446114462144631446414465144661446714468144691447014471144721447314474144751447614477144781447914480144811448214483144841448514486144871448814489144901449114492144931449414495144961449714498144991450014501145021450314504145051450614507145081450914510145111451214513145141451514516145171451814519145201452114522145231452414525145261452714528145291453014531145321453314534145351453614537145381453914540145411454214543145441454514546145471454814549145501455114552145531455414555145561455714558145591456014561145621456314564145651456614567145681456914570145711457214573145741457514576145771457814579145801458114582145831458414585145861458714588145891459014591145921459314594145951459614597145981459914600146011460214603146041460514606146071460814609146101461114612146131461414615146161461714618146191462014621146221462314624146251462614627146281462914630146311463214633146341463514636146371463814639146401464114642146431464414645146461464714648146491465014651146521465314654146551465614657146581465914660146611466214663146641466514666146671466814669146701467114672146731467414675146761467714678146791468014681146821468314684146851468614687146881468914690146911469214693146941469514696146971469814699147001470114702147031470414705147061470714708147091471014711147121471314714147151471614717147181471914720147211472214723147241472514726147271472814729147301473114732147331473414735147361473714738147391474014741147421474314744147451474614747147481474914750147511475214753147541475514756147571475814759147601476114762147631476414765147661476714768147691477014771147721477314774147751477614777147781477914780147811478214783147841478514786147871478814789147901479114792147931479414795147961479714798147991480014801148021480314804148051480614807148081480914810148111481214813148141481514816148171481814819148201482114822148231482414825148261482714828148291483014831148321483314834148351483614837148381483914840148411484214843148441484514846148471484814849148501485114852148531485414855148561485714858148591486014861148621486314864148651486614867148681486914870148711487214873148741487514876148771487814879148801488114882148831488414885148861488714888148891489014891148921489314894148951489614897148981489914900149011490214903149041490514906149071490814909149101491114912149131491414915149161491714918149191492014921149221492314924149251492614927149281492914930149311493214933149341493514936149371493814939149401494114942149431494414945149461494714948149491495014951149521495314954149551495614957149581495914960149611496214963149641496514966149671496814969149701497114972149731497414975149761497714978149791498014981149821498314984149851498614987149881498914990149911499214993149941499514996149971499814999150001500115002150031500415005150061500715008150091501015011150121501315014150151501615017150181501915020150211502215023150241502515026150271502815029150301503115032150331503415035150361503715038150391504015041150421504315044150451504615047150481504915050150511505215053150541505515056150571505815059150601506115062150631506415065150661506715068150691507015071150721507315074150751507615077150781507915080150811508215083150841508515086150871508815089150901509115092150931509415095150961509715098150991510015101151021510315104151051510615107151081510915110151111511215113151141511515116151171511815119151201512115122151231512415125151261512715128151291513015131151321513315134151351513615137151381513915140151411514215143151441514515146151471514815149151501515115152151531515415155151561515715158151591516015161151621516315164151651516615167151681516915170151711517215173151741517515176151771517815179151801518115182151831518415185151861518715188151891519015191151921519315194151951519615197151981519915200152011520215203152041520515206152071520815209152101521115212152131521415215152161521715218152191522015221152221522315224152251522615227152281522915230152311523215233152341523515236152371523815239152401524115242152431524415245152461524715248152491525015251152521525315254152551525615257152581525915260152611526215263152641526515266152671526815269152701527115272152731527415275152761527715278152791528015281152821528315284152851528615287152881528915290152911529215293152941529515296152971529815299153001530115302153031530415305153061530715308153091531015311153121531315314153151531615317153181531915320153211532215323153241532515326153271532815329153301533115332153331533415335153361533715338153391534015341153421534315344153451534615347153481534915350153511535215353153541535515356153571535815359153601536115362153631536415365153661536715368153691537015371153721537315374153751537615377153781537915380153811538215383153841538515386153871538815389153901539115392153931539415395153961539715398153991540015401154021540315404154051540615407154081540915410154111541215413154141541515416154171541815419154201542115422154231542415425154261542715428154291543015431154321543315434154351543615437154381543915440154411544215443154441544515446154471544815449154501545115452154531545415455154561545715458154591546015461154621546315464154651546615467154681546915470154711547215473154741547515476154771547815479154801548115482154831548415485154861548715488154891549015491154921549315494154951549615497154981549915500155011550215503155041550515506155071550815509155101551115512155131551415515155161551715518155191552015521155221552315524155251552615527155281552915530155311553215533155341553515536155371553815539155401554115542155431554415545155461554715548155491555015551155521555315554155551555615557155581555915560155611556215563155641556515566155671556815569155701557115572155731557415575155761557715578155791558015581155821558315584155851558615587155881558915590155911559215593155941559515596155971559815599156001560115602156031560415605156061560715608156091561015611156121561315614156151561615617156181561915620156211562215623156241562515626156271562815629156301563115632156331563415635156361563715638156391564015641156421564315644156451564615647156481564915650156511565215653156541565515656156571565815659156601566115662156631566415665156661566715668156691567015671156721567315674156751567615677156781567915680156811568215683156841568515686156871568815689156901569115692156931569415695156961569715698156991570015701157021570315704157051570615707157081570915710157111571215713157141571515716157171571815719157201572115722157231572415725157261572715728157291573015731157321573315734157351573615737157381573915740157411574215743157441574515746157471574815749157501575115752157531575415755157561575715758157591576015761157621576315764157651576615767157681576915770157711577215773157741577515776157771577815779157801578115782157831578415785157861578715788157891579015791157921579315794157951579615797157981579915800158011580215803158041580515806158071580815809158101581115812158131581415815158161581715818158191582015821158221582315824158251582615827158281582915830158311583215833158341583515836158371583815839158401584115842158431584415845158461584715848158491585015851158521585315854158551585615857158581585915860158611586215863158641586515866158671586815869158701587115872158731587415875158761587715878158791588015881158821588315884158851588615887158881588915890158911589215893158941589515896158971589815899159001590115902159031590415905159061590715908159091591015911159121591315914159151591615917159181591915920159211592215923159241592515926159271592815929159301593115932159331593415935159361593715938159391594015941159421594315944159451594615947159481594915950159511595215953159541595515956159571595815959159601596115962159631596415965159661596715968159691597015971159721597315974159751597615977159781597915980159811598215983159841598515986159871598815989159901599115992159931599415995159961599715998159991600016001160021600316004160051600616007160081600916010160111601216013160141601516016160171601816019160201602116022160231602416025160261602716028160291603016031160321603316034160351603616037160381603916040160411604216043160441604516046160471604816049160501605116052160531605416055160561605716058160591606016061160621606316064160651606616067160681606916070160711607216073160741607516076160771607816079160801608116082160831608416085160861608716088160891609016091160921609316094160951609616097160981609916100161011610216103161041610516106161071610816109161101611116112161131611416115161161611716118161191612016121161221612316124161251612616127161281612916130161311613216133161341613516136161371613816139161401614116142161431614416145161461614716148161491615016151161521615316154161551615616157161581615916160161611616216163161641616516166161671616816169161701617116172161731617416175161761617716178161791618016181161821618316184161851618616187161881618916190161911619216193161941619516196161971619816199162001620116202162031620416205162061620716208162091621016211162121621316214162151621616217162181621916220162211622216223162241622516226162271622816229162301623116232162331623416235162361623716238162391624016241162421624316244162451624616247162481624916250162511625216253162541625516256162571625816259162601626116262162631626416265162661626716268162691627016271162721627316274162751627616277162781627916280162811628216283162841628516286162871628816289162901629116292162931629416295162961629716298162991630016301163021630316304163051630616307163081630916310163111631216313163141631516316163171631816319163201632116322163231632416325163261632716328163291633016331163321633316334163351633616337163381633916340163411634216343163441634516346163471634816349163501635116352163531635416355163561635716358163591636016361163621636316364163651636616367163681636916370163711637216373163741637516376163771637816379163801638116382163831638416385163861638716388163891639016391163921639316394163951639616397163981639916400164011640216403164041640516406164071640816409164101641116412164131641416415164161641716418164191642016421164221642316424164251642616427164281642916430164311643216433164341643516436164371643816439164401644116442164431644416445164461644716448164491645016451164521645316454164551645616457164581645916460164611646216463164641646516466164671646816469164701647116472164731647416475164761647716478164791648016481164821648316484164851648616487164881648916490164911649216493164941649516496164971649816499165001650116502165031650416505165061650716508165091651016511165121651316514165151651616517165181651916520165211652216523165241652516526165271652816529165301653116532165331653416535165361653716538165391654016541165421654316544165451654616547165481654916550165511655216553165541655516556165571655816559165601656116562165631656416565165661656716568165691657016571165721657316574165751657616577165781657916580165811658216583165841658516586165871658816589165901659116592165931659416595165961659716598165991660016601166021660316604166051660616607166081660916610166111661216613166141661516616166171661816619166201662116622166231662416625166261662716628166291663016631166321663316634166351663616637166381663916640166411664216643166441664516646166471664816649166501665116652166531665416655166561665716658166591666016661166621666316664166651666616667166681666916670166711667216673166741667516676166771667816679166801668116682166831668416685166861668716688166891669016691166921669316694166951669616697166981669916700167011670216703167041670516706167071670816709167101671116712167131671416715167161671716718167191672016721167221672316724167251672616727167281672916730167311673216733167341673516736167371673816739167401674116742167431674416745167461674716748167491675016751167521675316754167551675616757167581675916760167611676216763167641676516766167671676816769167701677116772167731677416775167761677716778167791678016781167821678316784167851678616787167881678916790167911679216793167941679516796167971679816799168001680116802168031680416805168061680716808168091681016811168121681316814168151681616817168181681916820168211682216823168241682516826168271682816829168301683116832168331683416835168361683716838168391684016841168421684316844168451684616847168481684916850168511685216853168541685516856168571685816859168601686116862168631686416865168661686716868168691687016871168721687316874168751687616877168781687916880168811688216883168841688516886168871688816889168901689116892168931689416895168961689716898168991690016901169021690316904169051690616907169081690916910169111691216913169141691516916169171691816919169201692116922169231692416925169261692716928169291693016931169321693316934169351693616937169381693916940169411694216943169441694516946169471694816949169501695116952169531695416955169561695716958169591696016961169621696316964169651696616967169681696916970169711697216973169741697516976169771697816979169801698116982169831698416985169861698716988169891699016991169921699316994169951699616997169981699917000170011700217003170041700517006170071700817009170101701117012170131701417015170161701717018170191702017021170221702317024170251702617027170281702917030170311703217033170341703517036170371703817039170401704117042170431704417045170461704717048170491705017051170521705317054170551705617057170581705917060170611706217063170641706517066170671706817069170701707117072170731707417075170761707717078170791708017081170821708317084170851708617087170881708917090170911709217093170941709517096170971709817099171001710117102171031710417105171061710717108171091711017111171121711317114171151711617117171181711917120171211712217123171241712517126171271712817129171301713117132171331713417135171361713717138171391714017141171421714317144171451714617147171481714917150171511715217153171541715517156171571715817159171601716117162171631716417165171661716717168171691717017171171721717317174171751717617177171781717917180171811718217183171841718517186171871718817189171901719117192171931719417195171961719717198171991720017201172021720317204172051720617207172081720917210172111721217213172141721517216172171721817219172201722117222172231722417225172261722717228172291723017231172321723317234172351723617237172381723917240172411724217243172441724517246172471724817249172501725117252172531725417255172561725717258172591726017261172621726317264172651726617267172681726917270172711727217273172741727517276172771727817279172801728117282172831728417285172861728717288172891729017291172921729317294172951729617297172981729917300173011730217303173041730517306173071730817309173101731117312173131731417315173161731717318173191732017321173221732317324173251732617327173281732917330173311733217333173341733517336173371733817339173401734117342173431734417345173461734717348173491735017351173521735317354173551735617357173581735917360173611736217363173641736517366173671736817369173701737117372173731737417375173761737717378173791738017381173821738317384173851738617387173881738917390173911739217393173941739517396173971739817399174001740117402174031740417405174061740717408174091741017411174121741317414174151741617417174181741917420174211742217423174241742517426174271742817429174301743117432174331743417435174361743717438174391744017441174421744317444174451744617447174481744917450174511745217453174541745517456174571745817459174601746117462174631746417465174661746717468174691747017471174721747317474174751747617477174781747917480174811748217483174841748517486174871748817489174901749117492174931749417495174961749717498174991750017501175021750317504175051750617507175081750917510175111751217513175141751517516175171751817519175201752117522175231752417525175261752717528175291753017531175321753317534175351753617537175381753917540175411754217543175441754517546175471754817549175501755117552175531755417555175561755717558175591756017561175621756317564175651756617567175681756917570175711757217573175741757517576175771757817579175801758117582175831758417585175861758717588175891759017591175921759317594175951759617597175981759917600176011760217603176041760517606176071760817609176101761117612176131761417615176161761717618176191762017621176221762317624176251762617627176281762917630176311763217633176341763517636176371763817639176401764117642176431764417645176461764717648176491765017651176521765317654176551765617657176581765917660176611766217663176641766517666176671766817669176701767117672176731767417675176761767717678176791768017681176821768317684176851768617687176881768917690176911769217693176941769517696176971769817699177001770117702177031770417705177061770717708177091771017711177121771317714177151771617717177181771917720177211772217723177241772517726177271772817729177301773117732177331773417735177361773717738177391774017741177421774317744177451774617747177481774917750177511775217753177541775517756177571775817759177601776117762177631776417765177661776717768177691777017771177721777317774177751777617777177781777917780177811778217783177841778517786177871778817789177901779117792177931779417795177961779717798177991780017801178021780317804178051780617807178081780917810178111781217813178141781517816178171781817819178201782117822178231782417825178261782717828178291783017831178321783317834178351783617837178381783917840178411784217843178441784517846178471784817849178501785117852178531785417855178561785717858178591786017861178621786317864178651786617867178681786917870178711787217873178741787517876178771787817879178801788117882178831788417885178861788717888178891789017891178921789317894178951789617897178981789917900179011790217903179041790517906179071790817909179101791117912179131791417915179161791717918179191792017921179221792317924179251792617927179281792917930179311793217933179341793517936179371793817939179401794117942179431794417945179461794717948179491795017951179521795317954179551795617957179581795917960179611796217963179641796517966179671796817969179701797117972179731797417975179761797717978179791798017981179821798317984179851798617987179881798917990179911799217993179941799517996179971799817999180001800118002180031800418005180061800718008180091801018011180121801318014180151801618017180181801918020180211802218023180241802518026180271802818029180301803118032180331803418035180361803718038180391804018041180421804318044180451804618047180481804918050180511805218053180541805518056180571805818059180601806118062180631806418065180661806718068180691807018071180721807318074180751807618077180781807918080180811808218083180841808518086180871808818089180901809118092180931809418095180961809718098180991810018101181021810318104181051810618107181081810918110181111811218113181141811518116181171811818119181201812118122181231812418125181261812718128181291813018131181321813318134181351813618137181381813918140181411814218143181441814518146181471814818149181501815118152181531815418155181561815718158181591816018161181621816318164181651816618167181681816918170181711817218173181741817518176181771817818179181801818118182181831818418185181861818718188181891819018191181921819318194181951819618197181981819918200182011820218203182041820518206182071820818209182101821118212182131821418215182161821718218182191822018221182221822318224182251822618227182281822918230182311823218233182341823518236182371823818239182401824118242182431824418245182461824718248182491825018251182521825318254182551825618257182581825918260182611826218263182641826518266182671826818269182701827118272182731827418275182761827718278182791828018281182821828318284182851828618287182881828918290182911829218293182941829518296182971829818299183001830118302183031830418305183061830718308183091831018311183121831318314183151831618317183181831918320183211832218323183241832518326183271832818329183301833118332183331833418335183361833718338183391834018341183421834318344183451834618347183481834918350183511835218353183541835518356183571835818359183601836118362183631836418365183661836718368183691837018371183721837318374183751837618377183781837918380183811838218383183841838518386183871838818389183901839118392183931839418395183961839718398183991840018401184021840318404184051840618407184081840918410184111841218413184141841518416184171841818419184201842118422184231842418425184261842718428184291843018431184321843318434184351843618437184381843918440184411844218443184441844518446184471844818449184501845118452184531845418455184561845718458184591846018461184621846318464184651846618467184681846918470184711847218473184741847518476184771847818479184801848118482184831848418485184861848718488184891849018491184921849318494184951849618497184981849918500185011850218503185041850518506185071850818509185101851118512185131851418515185161851718518185191852018521185221852318524185251852618527185281852918530185311853218533185341853518536185371853818539185401854118542185431854418545185461854718548185491855018551185521855318554185551855618557185581855918560185611856218563185641856518566185671856818569185701857118572185731857418575185761857718578185791858018581185821858318584185851858618587185881858918590185911859218593185941859518596185971859818599186001860118602186031860418605186061860718608186091861018611186121861318614186151861618617186181861918620186211862218623186241862518626186271862818629186301863118632186331863418635186361863718638186391864018641186421864318644186451864618647186481864918650186511865218653186541865518656186571865818659186601866118662186631866418665186661866718668186691867018671186721867318674186751867618677186781867918680186811868218683186841868518686186871868818689186901869118692186931869418695186961869718698186991870018701187021870318704187051870618707187081870918710187111871218713187141871518716187171871818719187201872118722187231872418725187261872718728187291873018731187321873318734187351873618737187381873918740187411874218743187441874518746187471874818749187501875118752187531875418755187561875718758187591876018761187621876318764187651876618767187681876918770187711877218773187741877518776187771877818779187801878118782187831878418785187861878718788187891879018791187921879318794187951879618797187981879918800188011880218803188041880518806188071880818809188101881118812188131881418815188161881718818188191882018821188221882318824188251882618827188281882918830188311883218833188341883518836188371883818839188401884118842188431884418845188461884718848188491885018851188521885318854188551885618857188581885918860188611886218863188641886518866188671886818869188701887118872188731887418875188761887718878188791888018881188821888318884188851888618887188881888918890188911889218893188941889518896188971889818899189001890118902189031890418905189061890718908189091891018911189121891318914189151891618917189181891918920189211892218923189241892518926189271892818929189301893118932189331893418935189361893718938189391894018941189421894318944189451894618947189481894918950189511895218953189541895518956189571895818959189601896118962189631896418965189661896718968189691897018971189721897318974189751897618977189781897918980189811898218983189841898518986189871898818989189901899118992189931899418995189961899718998189991900019001190021900319004190051900619007190081900919010190111901219013190141901519016190171901819019190201902119022190231902419025190261902719028190291903019031190321903319034190351903619037190381903919040190411904219043190441904519046190471904819049190501905119052190531905419055190561905719058190591906019061190621906319064190651906619067190681906919070190711907219073190741907519076190771907819079190801908119082190831908419085190861908719088190891909019091190921909319094190951909619097190981909919100191011910219103191041910519106191071910819109191101911119112191131911419115191161911719118191191912019121191221912319124191251912619127191281912919130191311913219133191341913519136191371913819139191401914119142191431914419145191461914719148191491915019151191521915319154191551915619157191581915919160191611916219163191641916519166191671916819169191701917119172191731917419175191761917719178191791918019181191821918319184191851918619187191881918919190191911919219193191941919519196191971919819199192001920119202192031920419205192061920719208192091921019211192121921319214192151921619217192181921919220192211922219223192241922519226192271922819229192301923119232192331923419235192361923719238192391924019241192421924319244192451924619247192481924919250192511925219253192541925519256192571925819259192601926119262192631926419265192661926719268192691927019271192721927319274192751927619277192781927919280192811928219283192841928519286192871928819289192901929119292192931929419295192961929719298192991930019301193021930319304193051930619307193081930919310193111931219313193141931519316193171931819319193201932119322193231932419325193261932719328193291933019331193321933319334193351933619337193381933919340193411934219343193441934519346193471934819349193501935119352193531935419355193561935719358193591936019361193621936319364193651936619367193681936919370193711937219373193741937519376193771937819379193801938119382193831938419385193861938719388193891939019391193921939319394193951939619397193981939919400194011940219403194041940519406194071940819409194101941119412194131941419415194161941719418194191942019421194221942319424194251942619427194281942919430194311943219433194341943519436194371943819439194401944119442194431944419445194461944719448194491945019451194521945319454194551945619457194581945919460194611946219463194641946519466194671946819469194701947119472194731947419475194761947719478194791948019481194821948319484194851948619487194881948919490194911949219493194941949519496194971949819499195001950119502195031950419505195061950719508195091951019511195121951319514195151951619517195181951919520195211952219523195241952519526195271952819529195301953119532195331953419535195361953719538195391954019541195421954319544195451954619547195481954919550195511955219553195541955519556195571955819559195601956119562195631956419565195661956719568195691957019571195721957319574195751957619577195781957919580195811958219583195841958519586195871958819589195901959119592195931959419595195961959719598195991960019601196021960319604196051960619607196081960919610196111961219613196141961519616196171961819619196201962119622196231962419625196261962719628196291963019631196321963319634196351963619637196381963919640196411964219643196441964519646196471964819649196501965119652196531965419655196561965719658196591966019661196621966319664196651966619667196681966919670196711967219673196741967519676196771967819679196801968119682196831968419685196861968719688196891969019691196921969319694196951969619697196981969919700197011970219703197041970519706197071970819709197101971119712197131971419715197161971719718197191972019721197221972319724197251972619727197281972919730197311973219733197341973519736197371973819739197401974119742197431974419745197461974719748197491975019751197521975319754197551975619757197581975919760197611976219763197641976519766197671976819769197701977119772197731977419775197761977719778197791978019781197821978319784197851978619787197881978919790197911979219793197941979519796197971979819799198001980119802198031980419805198061980719808198091981019811198121981319814198151981619817198181981919820198211982219823198241982519826198271982819829198301983119832198331983419835198361983719838198391984019841198421984319844198451984619847198481984919850198511985219853198541985519856198571985819859198601986119862198631986419865198661986719868198691987019871198721987319874198751987619877198781987919880198811988219883198841988519886198871988819889198901989119892198931989419895198961989719898198991990019901199021990319904199051990619907199081990919910199111991219913199141991519916199171991819919199201992119922199231992419925199261992719928199291993019931199321993319934199351993619937199381993919940199411994219943199441994519946199471994819949199501995119952199531995419955199561995719958199591996019961199621996319964199651996619967199681996919970199711997219973199741997519976199771997819979199801998119982199831998419985199861998719988199891999019991199921999319994199951999619997199981999920000200012000220003200042000520006200072000820009200102001120012200132001420015200162001720018200192002020021200222002320024200252002620027200282002920030200312003220033200342003520036200372003820039200402004120042200432004420045200462004720048200492005020051200522005320054200552005620057200582005920060200612006220063200642006520066200672006820069200702007120072200732007420075200762007720078200792008020081200822008320084200852008620087200882008920090200912009220093200942009520096200972009820099201002010120102201032010420105201062010720108201092011020111201122011320114201152011620117201182011920120201212012220123201242012520126201272012820129201302013120132201332013420135201362013720138201392014020141201422014320144201452014620147201482014920150201512015220153201542015520156201572015820159201602016120162201632016420165201662016720168201692017020171201722017320174201752017620177201782017920180201812018220183201842018520186201872018820189201902019120192201932019420195201962019720198201992020020201202022020320204202052020620207202082020920210202112021220213202142021520216202172021820219202202022120222202232022420225202262022720228202292023020231202322023320234202352023620237202382023920240202412024220243202442024520246202472024820249202502025120252202532025420255202562025720258202592026020261202622026320264202652026620267202682026920270202712027220273202742027520276202772027820279202802028120282202832028420285202862028720288202892029020291202922029320294202952029620297202982029920300203012030220303203042030520306203072030820309203102031120312203132031420315203162031720318203192032020321203222032320324203252032620327203282032920330203312033220333203342033520336203372033820339203402034120342203432034420345203462034720348203492035020351203522035320354203552035620357203582035920360203612036220363203642036520366203672036820369203702037120372203732037420375203762037720378203792038020381203822038320384203852038620387203882038920390203912039220393203942039520396203972039820399204002040120402204032040420405204062040720408204092041020411204122041320414204152041620417204182041920420204212042220423204242042520426204272042820429204302043120432204332043420435204362043720438204392044020441204422044320444204452044620447204482044920450204512045220453204542045520456204572045820459204602046120462204632046420465204662046720468204692047020471204722047320474204752047620477204782047920480204812048220483204842048520486204872048820489204902049120492204932049420495204962049720498204992050020501205022050320504205052050620507205082050920510205112051220513205142051520516205172051820519205202052120522205232052420525205262052720528205292053020531205322053320534205352053620537205382053920540205412054220543205442054520546205472054820549205502055120552205532055420555205562055720558205592056020561205622056320564205652056620567205682056920570205712057220573205742057520576205772057820579205802058120582205832058420585205862058720588205892059020591205922059320594205952059620597205982059920600206012060220603206042060520606206072060820609206102061120612206132061420615206162061720618206192062020621206222062320624206252062620627206282062920630206312063220633206342063520636206372063820639206402064120642206432064420645206462064720648206492065020651206522065320654206552065620657206582065920660206612066220663206642066520666206672066820669206702067120672206732067420675206762067720678206792068020681206822068320684206852068620687206882068920690206912069220693206942069520696206972069820699207002070120702207032070420705207062070720708207092071020711207122071320714207152071620717207182071920720207212072220723207242072520726207272072820729207302073120732207332073420735207362073720738207392074020741207422074320744207452074620747207482074920750207512075220753207542075520756207572075820759207602076120762207632076420765207662076720768207692077020771207722077320774207752077620777207782077920780207812078220783207842078520786207872078820789207902079120792207932079420795207962079720798207992080020801208022080320804208052080620807208082080920810208112081220813208142081520816208172081820819208202082120822208232082420825208262082720828208292083020831208322083320834208352083620837208382083920840208412084220843208442084520846208472084820849208502085120852208532085420855208562085720858208592086020861208622086320864208652086620867208682086920870208712087220873208742087520876208772087820879208802088120882208832088420885208862088720888208892089020891208922089320894208952089620897208982089920900209012090220903209042090520906209072090820909209102091120912209132091420915209162091720918209192092020921209222092320924209252092620927209282092920930209312093220933209342093520936209372093820939209402094120942209432094420945209462094720948209492095020951209522095320954209552095620957209582095920960209612096220963209642096520966209672096820969209702097120972209732097420975209762097720978209792098020981209822098320984209852098620987209882098920990209912099220993209942099520996209972099820999210002100121002210032100421005210062100721008210092101021011210122101321014210152101621017210182101921020210212102221023210242102521026210272102821029210302103121032210332103421035210362103721038210392104021041210422104321044210452104621047210482104921050210512105221053210542105521056210572105821059210602106121062210632106421065210662106721068210692107021071210722107321074210752107621077210782107921080210812108221083210842108521086210872108821089210902109121092210932109421095210962109721098210992110021101211022110321104211052110621107211082110921110211112111221113211142111521116211172111821119211202112121122211232112421125211262112721128211292113021131211322113321134211352113621137211382113921140211412114221143211442114521146211472114821149211502115121152211532115421155211562115721158211592116021161211622116321164211652116621167211682116921170211712117221173211742117521176211772117821179211802118121182211832118421185211862118721188211892119021191211922119321194211952119621197211982119921200212012120221203212042120521206212072120821209212102121121212212132121421215212162121721218212192122021221212222122321224212252122621227212282122921230212312123221233212342123521236212372123821239212402124121242212432124421245212462124721248212492125021251212522125321254212552125621257212582125921260212612126221263212642126521266212672126821269212702127121272212732127421275212762127721278212792128021281212822128321284212852128621287212882128921290212912129221293212942129521296212972129821299213002130121302213032130421305213062130721308213092131021311213122131321314213152131621317213182131921320213212132221323213242132521326213272132821329213302133121332213332133421335213362133721338213392134021341213422134321344213452134621347213482134921350213512135221353213542135521356213572135821359213602136121362213632136421365213662136721368213692137021371213722137321374213752137621377213782137921380213812138221383213842138521386213872138821389213902139121392213932139421395213962139721398213992140021401214022140321404214052140621407214082140921410214112141221413214142141521416214172141821419214202142121422214232142421425214262142721428214292143021431214322143321434214352143621437214382143921440214412144221443214442144521446214472144821449214502145121452214532145421455214562145721458214592146021461214622146321464214652146621467214682146921470214712147221473214742147521476214772147821479214802148121482214832148421485214862148721488214892149021491214922149321494214952149621497214982149921500215012150221503215042150521506215072150821509215102151121512215132151421515215162151721518215192152021521215222152321524215252152621527215282152921530215312153221533215342153521536215372153821539215402154121542215432154421545215462154721548215492155021551215522155321554215552155621557215582155921560215612156221563215642156521566215672156821569215702157121572215732157421575215762157721578215792158021581215822158321584215852158621587215882158921590215912159221593215942159521596215972159821599216002160121602216032160421605216062160721608216092161021611216122161321614216152161621617216182161921620216212162221623216242162521626216272162821629216302163121632216332163421635216362163721638216392164021641216422164321644216452164621647216482164921650216512165221653216542165521656216572165821659216602166121662216632166421665216662166721668216692167021671216722167321674216752167621677216782167921680216812168221683216842168521686216872168821689216902169121692216932169421695216962169721698216992170021701217022170321704217052170621707217082170921710217112171221713217142171521716217172171821719217202172121722217232172421725217262172721728217292173021731217322173321734217352173621737217382173921740217412174221743217442174521746217472174821749217502175121752217532175421755217562175721758217592176021761217622176321764217652176621767217682176921770217712177221773217742177521776217772177821779217802178121782217832178421785217862178721788217892179021791217922179321794217952179621797217982179921800218012180221803218042180521806218072180821809218102181121812218132181421815218162181721818218192182021821218222182321824218252182621827218282182921830218312183221833218342183521836218372183821839218402184121842218432184421845218462184721848218492185021851218522185321854218552185621857218582185921860218612186221863218642186521866218672186821869218702187121872218732187421875218762187721878218792188021881218822188321884218852188621887218882188921890218912189221893218942189521896218972189821899219002190121902219032190421905219062190721908219092191021911219122191321914219152191621917219182191921920219212192221923219242192521926219272192821929219302193121932219332193421935219362193721938219392194021941219422194321944219452194621947219482194921950219512195221953219542195521956219572195821959219602196121962219632196421965219662196721968219692197021971219722197321974219752197621977219782197921980219812198221983219842198521986219872198821989219902199121992219932199421995219962199721998219992200022001220022200322004220052200622007220082200922010220112201222013220142201522016220172201822019220202202122022220232202422025220262202722028220292203022031220322203322034220352203622037220382203922040220412204222043220442204522046220472204822049220502205122052220532205422055220562205722058220592206022061220622206322064220652206622067220682206922070220712207222073220742207522076220772207822079220802208122082220832208422085220862208722088220892209022091220922209322094220952209622097220982209922100221012210222103221042210522106221072210822109221102211122112221132211422115221162211722118221192212022121221222212322124221252212622127221282212922130221312213222133221342213522136221372213822139221402214122142221432214422145221462214722148221492215022151221522215322154221552215622157221582215922160221612216222163221642216522166221672216822169221702217122172221732217422175221762217722178221792218022181221822218322184221852218622187221882218922190221912219222193221942219522196221972219822199222002220122202222032220422205222062220722208222092221022211222122221322214222152221622217222182221922220222212222222223222242222522226222272222822229222302223122232222332223422235222362223722238222392224022241222422224322244222452224622247222482224922250222512225222253222542225522256222572225822259222602226122262222632226422265222662226722268222692227022271222722227322274222752227622277222782227922280222812228222283222842228522286222872228822289222902229122292222932229422295222962229722298222992230022301223022230322304223052230622307223082230922310223112231222313223142231522316223172231822319223202232122322223232232422325223262232722328223292233022331223322233322334223352233622337223382233922340223412234222343223442234522346223472234822349223502235122352223532235422355223562235722358223592236022361223622236322364223652236622367223682236922370223712237222373223742237522376223772237822379223802238122382223832238422385223862238722388223892239022391223922239322394223952239622397223982239922400224012240222403224042240522406224072240822409224102241122412224132241422415224162241722418224192242022421224222242322424224252242622427224282242922430224312243222433224342243522436224372243822439224402244122442224432244422445224462244722448224492245022451224522245322454224552245622457224582245922460224612246222463224642246522466224672246822469224702247122472224732247422475224762247722478224792248022481224822248322484224852248622487224882248922490224912249222493224942249522496224972249822499225002250122502225032250422505225062250722508225092251022511225122251322514225152251622517225182251922520225212252222523225242252522526225272252822529225302253122532225332253422535225362253722538225392254022541225422254322544225452254622547225482254922550225512255222553225542255522556225572255822559225602256122562225632256422565225662256722568225692257022571225722257322574225752257622577225782257922580225812258222583225842258522586225872258822589225902259122592225932259422595225962259722598225992260022601226022260322604226052260622607226082260922610226112261222613226142261522616226172261822619226202262122622226232262422625226262262722628226292263022631226322263322634226352263622637226382263922640226412264222643226442264522646226472264822649226502265122652226532265422655226562265722658226592266022661226622266322664226652266622667226682266922670226712267222673226742267522676226772267822679226802268122682226832268422685226862268722688226892269022691226922269322694226952269622697226982269922700227012270222703227042270522706227072270822709227102271122712227132271422715227162271722718227192272022721227222272322724227252272622727227282272922730227312273222733227342273522736227372273822739227402274122742227432274422745227462274722748227492275022751227522275322754227552275622757227582275922760227612276222763227642276522766227672276822769227702277122772227732277422775227762277722778227792278022781227822278322784227852278622787227882278922790227912279222793227942279522796227972279822799228002280122802228032280422805228062280722808228092281022811228122281322814228152281622817228182281922820228212282222823228242282522826228272282822829228302283122832228332283422835228362283722838228392284022841228422284322844228452284622847228482284922850228512285222853228542285522856228572285822859228602286122862228632286422865228662286722868228692287022871228722287322874228752287622877228782287922880228812288222883228842288522886228872288822889228902289122892228932289422895228962289722898228992290022901229022290322904229052290622907229082290922910229112291222913229142291522916229172291822919229202292122922229232292422925229262292722928229292293022931229322293322934229352293622937229382293922940229412294222943229442294522946229472294822949229502295122952229532295422955229562295722958229592296022961229622296322964229652296622967229682296922970229712297222973229742297522976229772297822979229802298122982229832298422985229862298722988229892299022991229922299322994229952299622997229982299923000230012300223003230042300523006230072300823009230102301123012230132301423015230162301723018230192302023021230222302323024230252302623027230282302923030230312303223033230342303523036230372303823039230402304123042230432304423045230462304723048230492305023051230522305323054230552305623057230582305923060230612306223063230642306523066230672306823069230702307123072230732307423075230762307723078230792308023081230822308323084230852308623087230882308923090230912309223093230942309523096230972309823099231002310123102231032310423105231062310723108231092311023111231122311323114231152311623117231182311923120231212312223123231242312523126231272312823129231302313123132231332313423135231362313723138231392314023141231422314323144231452314623147231482314923150231512315223153231542315523156231572315823159231602316123162231632316423165231662316723168231692317023171231722317323174231752317623177231782317923180231812318223183231842318523186231872318823189231902319123192231932319423195231962319723198231992320023201232022320323204232052320623207232082320923210232112321223213232142321523216232172321823219232202322123222232232322423225232262322723228232292323023231232322323323234232352323623237232382323923240232412324223243232442324523246232472324823249232502325123252232532325423255232562325723258232592326023261232622326323264232652326623267232682326923270232712327223273232742327523276232772327823279232802328123282232832328423285232862328723288232892329023291232922329323294232952329623297232982329923300233012330223303233042330523306233072330823309233102331123312233132331423315233162331723318233192332023321233222332323324233252332623327233282332923330233312333223333233342333523336233372333823339233402334123342233432334423345233462334723348233492335023351233522335323354233552335623357233582335923360233612336223363233642336523366233672336823369233702337123372233732337423375233762337723378233792338023381233822338323384233852338623387233882338923390233912339223393233942339523396233972339823399234002340123402234032340423405234062340723408234092341023411234122341323414234152341623417234182341923420234212342223423234242342523426234272342823429234302343123432234332343423435234362343723438234392344023441234422344323444234452344623447234482344923450234512345223453234542345523456234572345823459234602346123462234632346423465234662346723468234692347023471234722347323474234752347623477234782347923480234812348223483234842348523486234872348823489234902349123492234932349423495234962349723498234992350023501235022350323504235052350623507235082350923510235112351223513235142351523516235172351823519235202352123522235232352423525235262352723528235292353023531235322353323534235352353623537235382353923540235412354223543235442354523546235472354823549235502355123552235532355423555235562355723558235592356023561235622356323564235652356623567235682356923570235712357223573235742357523576235772357823579235802358123582235832358423585235862358723588235892359023591235922359323594235952359623597235982359923600236012360223603236042360523606236072360823609236102361123612236132361423615236162361723618236192362023621236222362323624236252362623627236282362923630236312363223633236342363523636236372363823639236402364123642236432364423645236462364723648236492365023651236522365323654236552365623657236582365923660236612366223663236642366523666236672366823669236702367123672236732367423675236762367723678236792368023681236822368323684236852368623687236882368923690236912369223693236942369523696236972369823699237002370123702237032370423705237062370723708237092371023711237122371323714237152371623717237182371923720237212372223723237242372523726237272372823729237302373123732237332373423735237362373723738237392374023741237422374323744237452374623747237482374923750237512375223753237542375523756237572375823759237602376123762237632376423765237662376723768237692377023771237722377323774237752377623777237782377923780237812378223783237842378523786237872378823789237902379123792237932379423795237962379723798237992380023801238022380323804238052380623807238082380923810238112381223813238142381523816238172381823819238202382123822238232382423825238262382723828238292383023831238322383323834238352383623837238382383923840238412384223843238442384523846238472384823849238502385123852238532385423855238562385723858238592386023861238622386323864238652386623867238682386923870238712387223873238742387523876238772387823879238802388123882238832388423885238862388723888238892389023891238922389323894238952389623897238982389923900239012390223903239042390523906239072390823909239102391123912239132391423915239162391723918239192392023921239222392323924239252392623927239282392923930239312393223933239342393523936239372393823939239402394123942239432394423945239462394723948239492395023951239522395323954239552395623957239582395923960239612396223963239642396523966239672396823969239702397123972239732397423975239762397723978239792398023981239822398323984239852398623987239882398923990239912399223993239942399523996239972399823999240002400124002240032400424005240062400724008240092401024011240122401324014240152401624017240182401924020240212402224023240242402524026240272402824029240302403124032240332403424035240362403724038240392404024041240422404324044240452404624047240482404924050240512405224053240542405524056240572405824059240602406124062240632406424065240662406724068240692407024071240722407324074240752407624077240782407924080240812408224083240842408524086240872408824089240902409124092240932409424095240962409724098240992410024101241022410324104241052410624107241082410924110241112411224113241142411524116241172411824119241202412124122241232412424125241262412724128241292413024131241322413324134241352413624137241382413924140241412414224143241442414524146241472414824149241502415124152241532415424155241562415724158241592416024161241622416324164241652416624167241682416924170241712417224173241742417524176241772417824179241802418124182241832418424185241862418724188241892419024191241922419324194241952419624197241982419924200242012420224203242042420524206242072420824209242102421124212242132421424215242162421724218242192422024221242222422324224242252422624227242282422924230242312423224233242342423524236242372423824239242402424124242242432424424245242462424724248242492425024251242522425324254242552425624257242582425924260242612426224263242642426524266242672426824269242702427124272242732427424275242762427724278242792428024281242822428324284242852428624287242882428924290242912429224293242942429524296242972429824299243002430124302243032430424305243062430724308243092431024311243122431324314243152431624317243182431924320243212432224323243242432524326243272432824329243302433124332243332433424335243362433724338243392434024341243422434324344243452434624347243482434924350243512435224353243542435524356243572435824359243602436124362243632436424365243662436724368243692437024371243722437324374243752437624377243782437924380243812438224383243842438524386243872438824389243902439124392243932439424395243962439724398243992440024401244022440324404244052440624407244082440924410244112441224413244142441524416244172441824419244202442124422244232442424425244262442724428244292443024431244322443324434244352443624437244382443924440244412444224443244442444524446244472444824449244502445124452244532445424455244562445724458244592446024461244622446324464244652446624467244682446924470244712447224473244742447524476244772447824479244802448124482244832448424485244862448724488244892449024491244922449324494244952449624497244982449924500245012450224503245042450524506245072450824509245102451124512245132451424515245162451724518245192452024521245222452324524245252452624527245282452924530245312453224533245342453524536245372453824539245402454124542245432454424545245462454724548245492455024551245522455324554245552455624557245582455924560245612456224563245642456524566245672456824569245702457124572245732457424575245762457724578245792458024581245822458324584245852458624587245882458924590245912459224593245942459524596245972459824599246002460124602246032460424605246062460724608246092461024611246122461324614246152461624617246182461924620246212462224623246242462524626246272462824629246302463124632246332463424635246362463724638246392464024641246422464324644246452464624647246482464924650246512465224653246542465524656246572465824659246602466124662246632466424665246662466724668246692467024671246722467324674246752467624677246782467924680246812468224683246842468524686246872468824689246902469124692246932469424695246962469724698246992470024701247022470324704247052470624707247082470924710247112471224713247142471524716247172471824719247202472124722247232472424725247262472724728247292473024731247322473324734247352473624737247382473924740247412474224743247442474524746247472474824749247502475124752247532475424755247562475724758247592476024761247622476324764247652476624767247682476924770247712477224773247742477524776247772477824779247802478124782247832478424785247862478724788247892479024791247922479324794247952479624797247982479924800248012480224803248042480524806248072480824809248102481124812248132481424815248162481724818248192482024821248222482324824248252482624827248282482924830248312483224833248342483524836248372483824839248402484124842248432484424845248462484724848248492485024851248522485324854248552485624857248582485924860248612486224863248642486524866248672486824869248702487124872248732487424875248762487724878248792488024881248822488324884248852488624887248882488924890248912489224893248942489524896248972489824899249002490124902249032490424905249062490724908249092491024911249122491324914249152491624917249182491924920249212492224923249242492524926249272492824929249302493124932249332493424935249362493724938249392494024941249422494324944249452494624947249482494924950249512495224953249542495524956249572495824959249602496124962249632496424965249662496724968249692497024971249722497324974249752497624977249782497924980249812498224983249842498524986249872498824989249902499124992249932499424995249962499724998249992500025001250022500325004250052500625007250082500925010250112501225013250142501525016250172501825019250202502125022250232502425025250262502725028250292503025031250322503325034250352503625037250382503925040250412504225043250442504525046250472504825049250502505125052250532505425055250562505725058250592506025061250622506325064250652506625067250682506925070250712507225073250742507525076250772507825079250802508125082250832508425085250862508725088250892509025091250922509325094250952509625097250982509925100251012510225103251042510525106251072510825109251102511125112251132511425115251162511725118251192512025121251222512325124251252512625127251282512925130251312513225133251342513525136251372513825139251402514125142251432514425145251462514725148251492515025151251522515325154251552515625157251582515925160251612516225163251642516525166251672516825169251702517125172251732517425175251762517725178251792518025181251822518325184251852518625187251882518925190251912519225193251942519525196251972519825199252002520125202252032520425205252062520725208252092521025211252122521325214252152521625217252182521925220252212522225223252242522525226252272522825229252302523125232252332523425235252362523725238252392524025241252422524325244252452524625247252482524925250252512525225253252542525525256252572525825259252602526125262252632526425265252662526725268252692527025271252722527325274252752527625277252782527925280252812528225283252842528525286252872528825289252902529125292252932529425295252962529725298252992530025301253022530325304253052530625307253082530925310253112531225313253142531525316253172531825319253202532125322253232532425325253262532725328253292533025331253322533325334253352533625337253382533925340253412534225343253442534525346253472534825349253502535125352253532535425355253562535725358253592536025361253622536325364253652536625367253682536925370253712537225373253742537525376253772537825379253802538125382253832538425385253862538725388253892539025391253922539325394253952539625397253982539925400254012540225403254042540525406254072540825409254102541125412254132541425415254162541725418254192542025421254222542325424254252542625427254282542925430254312543225433254342543525436254372543825439254402544125442254432544425445254462544725448254492545025451254522545325454254552545625457254582545925460254612546225463254642546525466254672546825469254702547125472254732547425475254762547725478254792548025481254822548325484254852548625487254882548925490254912549225493254942549525496254972549825499255002550125502255032550425505255062550725508255092551025511255122551325514255152551625517255182551925520255212552225523255242552525526255272552825529255302553125532255332553425535255362553725538255392554025541255422554325544255452554625547255482554925550255512555225553255542555525556255572555825559255602556125562255632556425565255662556725568255692557025571255722557325574255752557625577255782557925580255812558225583255842558525586255872558825589255902559125592255932559425595255962559725598255992560025601256022560325604256052560625607256082560925610256112561225613256142561525616256172561825619256202562125622256232562425625256262562725628256292563025631256322563325634256352563625637256382563925640256412564225643256442564525646256472564825649256502565125652256532565425655256562565725658256592566025661256622566325664256652566625667256682566925670256712567225673256742567525676256772567825679256802568125682256832568425685256862568725688256892569025691256922569325694256952569625697256982569925700257012570225703257042570525706257072570825709257102571125712257132571425715257162571725718257192572025721257222572325724257252572625727257282572925730257312573225733257342573525736257372573825739257402574125742257432574425745257462574725748257492575025751257522575325754257552575625757257582575925760257612576225763257642576525766257672576825769257702577125772257732577425775257762577725778257792578025781257822578325784257852578625787257882578925790257912579225793257942579525796257972579825799258002580125802258032580425805258062580725808258092581025811258122581325814258152581625817258182581925820258212582225823258242582525826258272582825829258302583125832258332583425835258362583725838258392584025841258422584325844258452584625847258482584925850258512585225853258542585525856258572585825859258602586125862258632586425865258662586725868258692587025871258722587325874258752587625877258782587925880258812588225883258842588525886258872588825889258902589125892258932589425895258962589725898258992590025901259022590325904259052590625907259082590925910259112591225913259142591525916259172591825919259202592125922259232592425925259262592725928259292593025931259322593325934259352593625937259382593925940259412594225943259442594525946259472594825949259502595125952259532595425955259562595725958259592596025961259622596325964259652596625967259682596925970259712597225973259742597525976259772597825979259802598125982259832598425985259862598725988259892599025991259922599325994259952599625997259982599926000260012600226003260042600526006260072600826009260102601126012260132601426015260162601726018260192602026021260222602326024260252602626027260282602926030260312603226033260342603526036260372603826039260402604126042260432604426045260462604726048260492605026051260522605326054260552605626057260582605926060260612606226063260642606526066260672606826069260702607126072260732607426075260762607726078260792608026081260822608326084260852608626087260882608926090260912609226093260942609526096260972609826099261002610126102261032610426105261062610726108261092611026111261122611326114261152611626117261182611926120261212612226123261242612526126261272612826129261302613126132261332613426135261362613726138261392614026141261422614326144261452614626147261482614926150261512615226153261542615526156261572615826159261602616126162261632616426165261662616726168261692617026171261722617326174261752617626177261782617926180261812618226183261842618526186261872618826189261902619126192261932619426195261962619726198261992620026201262022620326204262052620626207262082620926210262112621226213262142621526216262172621826219262202622126222262232622426225262262622726228262292623026231262322623326234262352623626237262382623926240262412624226243262442624526246262472624826249262502625126252262532625426255262562625726258262592626026261262622626326264262652626626267262682626926270262712627226273262742627526276262772627826279262802628126282262832628426285262862628726288262892629026291262922629326294262952629626297262982629926300263012630226303263042630526306263072630826309263102631126312263132631426315263162631726318263192632026321263222632326324263252632626327263282632926330263312633226333263342633526336263372633826339263402634126342263432634426345263462634726348263492635026351263522635326354263552635626357263582635926360263612636226363263642636526366263672636826369263702637126372263732637426375263762637726378263792638026381263822638326384263852638626387263882638926390263912639226393263942639526396263972639826399264002640126402264032640426405264062640726408264092641026411264122641326414264152641626417264182641926420264212642226423264242642526426264272642826429264302643126432264332643426435264362643726438264392644026441264422644326444264452644626447264482644926450264512645226453264542645526456264572645826459264602646126462264632646426465264662646726468264692647026471264722647326474264752647626477264782647926480264812648226483264842648526486264872648826489264902649126492264932649426495264962649726498264992650026501265022650326504265052650626507265082650926510265112651226513265142651526516265172651826519265202652126522265232652426525265262652726528265292653026531265322653326534265352653626537265382653926540265412654226543265442654526546265472654826549265502655126552265532655426555265562655726558265592656026561265622656326564265652656626567265682656926570265712657226573265742657526576265772657826579265802658126582265832658426585265862658726588265892659026591265922659326594265952659626597265982659926600266012660226603266042660526606266072660826609266102661126612266132661426615266162661726618266192662026621266222662326624266252662626627266282662926630266312663226633266342663526636266372663826639266402664126642266432664426645266462664726648266492665026651266522665326654266552665626657266582665926660266612666226663266642666526666266672666826669266702667126672266732667426675266762667726678266792668026681266822668326684266852668626687266882668926690266912669226693266942669526696266972669826699267002670126702267032670426705267062670726708267092671026711267122671326714267152671626717267182671926720267212672226723267242672526726267272672826729267302673126732267332673426735267362673726738267392674026741267422674326744267452674626747267482674926750267512675226753267542675526756267572675826759267602676126762267632676426765267662676726768267692677026771267722677326774267752677626777267782677926780267812678226783267842678526786267872678826789267902679126792267932679426795267962679726798267992680026801268022680326804268052680626807268082680926810268112681226813268142681526816268172681826819268202682126822268232682426825268262682726828268292683026831268322683326834268352683626837268382683926840268412684226843268442684526846268472684826849268502685126852268532685426855268562685726858268592686026861268622686326864268652686626867268682686926870268712687226873268742687526876268772687826879268802688126882268832688426885268862688726888268892689026891268922689326894268952689626897268982689926900269012690226903269042690526906269072690826909269102691126912269132691426915269162691726918269192692026921269222692326924269252692626927269282692926930269312693226933269342693526936269372693826939269402694126942269432694426945269462694726948269492695026951269522695326954269552695626957269582695926960269612696226963269642696526966269672696826969269702697126972269732697426975269762697726978269792698026981269822698326984269852698626987269882698926990269912699226993269942699526996269972699826999270002700127002270032700427005270062700727008270092701027011270122701327014270152701627017270182701927020270212702227023270242702527026270272702827029270302703127032270332703427035270362703727038270392704027041270422704327044270452704627047270482704927050270512705227053270542705527056270572705827059270602706127062270632706427065270662706727068270692707027071270722707327074270752707627077270782707927080270812708227083270842708527086270872708827089270902709127092270932709427095270962709727098270992710027101271022710327104271052710627107271082710927110271112711227113271142711527116271172711827119271202712127122271232712427125271262712727128271292713027131271322713327134271352713627137271382713927140271412714227143271442714527146271472714827149271502715127152271532715427155271562715727158271592716027161271622716327164271652716627167271682716927170271712717227173271742717527176271772717827179271802718127182271832718427185271862718727188271892719027191271922719327194271952719627197271982719927200272012720227203272042720527206272072720827209272102721127212272132721427215272162721727218272192722027221272222722327224272252722627227272282722927230272312723227233272342723527236272372723827239272402724127242272432724427245272462724727248272492725027251272522725327254272552725627257272582725927260272612726227263272642726527266272672726827269272702727127272272732727427275272762727727278272792728027281272822728327284272852728627287272882728927290272912729227293272942729527296272972729827299273002730127302273032730427305273062730727308273092731027311273122731327314273152731627317273182731927320273212732227323273242732527326273272732827329273302733127332273332733427335273362733727338273392734027341273422734327344273452734627347273482734927350273512735227353273542735527356273572735827359273602736127362273632736427365273662736727368273692737027371273722737327374273752737627377273782737927380273812738227383273842738527386273872738827389273902739127392273932739427395273962739727398273992740027401274022740327404274052740627407274082740927410274112741227413274142741527416274172741827419274202742127422274232742427425274262742727428274292743027431274322743327434274352743627437274382743927440274412744227443274442744527446274472744827449274502745127452274532745427455274562745727458274592746027461274622746327464274652746627467274682746927470274712747227473274742747527476274772747827479274802748127482274832748427485274862748727488274892749027491274922749327494274952749627497274982749927500275012750227503275042750527506275072750827509275102751127512275132751427515275162751727518275192752027521275222752327524275252752627527275282752927530275312753227533275342753527536275372753827539275402754127542275432754427545275462754727548275492755027551275522755327554275552755627557275582755927560275612756227563275642756527566275672756827569275702757127572275732757427575275762757727578275792758027581275822758327584275852758627587275882758927590275912759227593275942759527596275972759827599276002760127602276032760427605276062760727608276092761027611276122761327614276152761627617276182761927620276212762227623276242762527626276272762827629276302763127632276332763427635276362763727638276392764027641276422764327644276452764627647276482764927650276512765227653276542765527656276572765827659276602766127662276632766427665276662766727668276692767027671276722767327674276752767627677276782767927680276812768227683276842768527686276872768827689276902769127692276932769427695276962769727698276992770027701277022770327704277052770627707277082770927710277112771227713277142771527716277172771827719277202772127722277232772427725277262772727728277292773027731277322773327734277352773627737277382773927740277412774227743277442774527746277472774827749277502775127752277532775427755277562775727758277592776027761277622776327764277652776627767277682776927770277712777227773277742777527776277772777827779277802778127782277832778427785277862778727788277892779027791277922779327794277952779627797277982779927800278012780227803278042780527806278072780827809278102781127812278132781427815278162781727818278192782027821278222782327824278252782627827278282782927830278312783227833278342783527836278372783827839278402784127842278432784427845278462784727848278492785027851278522785327854278552785627857278582785927860278612786227863278642786527866278672786827869278702787127872278732787427875278762787727878278792788027881278822788327884278852788627887278882788927890278912789227893278942789527896278972789827899279002790127902279032790427905279062790727908279092791027911279122791327914279152791627917279182791927920279212792227923279242792527926279272792827929279302793127932279332793427935279362793727938279392794027941279422794327944279452794627947279482794927950279512795227953279542795527956279572795827959279602796127962279632796427965279662796727968279692797027971279722797327974279752797627977279782797927980279812798227983279842798527986279872798827989279902799127992279932799427995279962799727998279992800028001280022800328004280052800628007280082800928010280112801228013280142801528016280172801828019280202802128022280232802428025280262802728028280292803028031280322803328034280352803628037280382803928040280412804228043280442804528046280472804828049280502805128052280532805428055280562805728058280592806028061280622806328064280652806628067280682806928070280712807228073280742807528076280772807828079280802808128082280832808428085280862808728088280892809028091280922809328094280952809628097280982809928100281012810228103281042810528106281072810828109281102811128112281132811428115281162811728118281192812028121281222812328124281252812628127281282812928130281312813228133281342813528136281372813828139281402814128142281432814428145281462814728148281492815028151281522815328154281552815628157281582815928160281612816228163281642816528166281672816828169281702817128172281732817428175281762817728178281792818028181281822818328184281852818628187281882818928190281912819228193281942819528196281972819828199282002820128202282032820428205282062820728208282092821028211282122821328214282152821628217282182821928220282212822228223282242822528226282272822828229282302823128232282332823428235282362823728238282392824028241282422824328244282452824628247282482824928250282512825228253282542825528256282572825828259282602826128262282632826428265282662826728268282692827028271282722827328274282752827628277282782827928280282812828228283282842828528286282872828828289282902829128292282932829428295282962829728298282992830028301283022830328304283052830628307283082830928310283112831228313283142831528316283172831828319283202832128322283232832428325283262832728328283292833028331283322833328334283352833628337283382833928340283412834228343283442834528346283472834828349283502835128352283532835428355283562835728358283592836028361283622836328364283652836628367283682836928370283712837228373283742837528376283772837828379283802838128382283832838428385283862838728388283892839028391283922839328394283952839628397283982839928400284012840228403284042840528406284072840828409284102841128412284132841428415284162841728418284192842028421284222842328424284252842628427284282842928430284312843228433284342843528436284372843828439284402844128442284432844428445284462844728448284492845028451284522845328454284552845628457284582845928460284612846228463284642846528466284672846828469284702847128472284732847428475284762847728478284792848028481284822848328484284852848628487284882848928490284912849228493284942849528496284972849828499285002850128502285032850428505285062850728508285092851028511285122851328514285152851628517285182851928520285212852228523285242852528526285272852828529285302853128532285332853428535285362853728538285392854028541285422854328544285452854628547285482854928550285512855228553285542855528556285572855828559285602856128562285632856428565285662856728568285692857028571285722857328574285752857628577285782857928580285812858228583285842858528586285872858828589285902859128592285932859428595285962859728598285992860028601286022860328604286052860628607286082860928610286112861228613286142861528616286172861828619286202862128622286232862428625286262862728628286292863028631286322863328634286352863628637286382863928640286412864228643286442864528646286472864828649286502865128652286532865428655286562865728658286592866028661286622866328664286652866628667286682866928670286712867228673286742867528676286772867828679286802868128682286832868428685286862868728688286892869028691286922869328694286952869628697286982869928700287012870228703287042870528706287072870828709287102871128712287132871428715287162871728718287192872028721287222872328724287252872628727287282872928730287312873228733287342873528736287372873828739287402874128742287432874428745287462874728748287492875028751287522875328754287552875628757287582875928760287612876228763287642876528766287672876828769287702877128772287732877428775287762877728778287792878028781287822878328784287852878628787287882878928790287912879228793287942879528796287972879828799288002880128802288032880428805288062880728808288092881028811288122881328814288152881628817288182881928820288212882228823288242882528826288272882828829288302883128832288332883428835288362883728838288392884028841288422884328844288452884628847288482884928850288512885228853288542885528856288572885828859288602886128862288632886428865288662886728868288692887028871288722887328874288752887628877288782887928880288812888228883288842888528886288872888828889288902889128892288932889428895288962889728898288992890028901289022890328904289052890628907289082890928910289112891228913289142891528916289172891828919289202892128922289232892428925289262892728928289292893028931289322893328934289352893628937289382893928940289412894228943289442894528946289472894828949289502895128952289532895428955289562895728958289592896028961289622896328964289652896628967289682896928970289712897228973289742897528976289772897828979289802898128982289832898428985289862898728988289892899028991289922899328994289952899628997289982899929000290012900229003290042900529006290072900829009290102901129012290132901429015290162901729018290192902029021290222902329024290252902629027290282902929030290312903229033290342903529036290372903829039290402904129042290432904429045290462904729048290492905029051290522905329054290552905629057290582905929060290612906229063290642906529066290672906829069290702907129072290732907429075290762907729078290792908029081290822908329084290852908629087290882908929090290912909229093290942909529096290972909829099291002910129102291032910429105291062910729108291092911029111291122911329114291152911629117291182911929120291212912229123291242912529126291272912829129291302913129132291332913429135291362913729138291392914029141291422914329144291452914629147291482914929150291512915229153291542915529156291572915829159291602916129162291632916429165291662916729168291692917029171291722917329174291752917629177291782917929180291812918229183291842918529186291872918829189291902919129192291932919429195291962919729198291992920029201292022920329204292052920629207292082920929210292112921229213292142921529216292172921829219292202922129222292232922429225292262922729228292292923029231292322923329234292352923629237292382923929240292412924229243292442924529246292472924829249292502925129252292532925429255292562925729258292592926029261292622926329264292652926629267292682926929270292712927229273292742927529276292772927829279292802928129282292832928429285292862928729288292892929029291292922929329294292952929629297292982929929300293012930229303293042930529306293072930829309293102931129312293132931429315293162931729318293192932029321293222932329324293252932629327293282932929330293312933229333293342933529336293372933829339293402934129342293432934429345293462934729348293492935029351293522935329354293552935629357293582935929360293612936229363293642936529366293672936829369293702937129372293732937429375293762937729378293792938029381293822938329384293852938629387293882938929390293912939229393293942939529396293972939829399294002940129402294032940429405294062940729408294092941029411294122941329414294152941629417294182941929420294212942229423294242942529426294272942829429294302943129432294332943429435294362943729438294392944029441294422944329444294452944629447294482944929450294512945229453294542945529456294572945829459294602946129462294632946429465294662946729468294692947029471294722947329474294752947629477294782947929480294812948229483294842948529486294872948829489294902949129492294932949429495294962949729498294992950029501295022950329504295052950629507295082950929510295112951229513295142951529516295172951829519295202952129522295232952429525295262952729528295292953029531295322953329534295352953629537295382953929540295412954229543295442954529546295472954829549295502955129552295532955429555295562955729558295592956029561295622956329564295652956629567295682956929570295712957229573295742957529576295772957829579295802958129582295832958429585295862958729588295892959029591295922959329594295952959629597295982959929600296012960229603296042960529606296072960829609296102961129612296132961429615296162961729618296192962029621296222962329624296252962629627296282962929630296312963229633296342963529636296372963829639296402964129642296432964429645296462964729648296492965029651296522965329654296552965629657296582965929660296612966229663296642966529666296672966829669296702967129672296732967429675296762967729678296792968029681296822968329684296852968629687296882968929690296912969229693296942969529696296972969829699297002970129702297032970429705297062970729708297092971029711297122971329714297152971629717297182971929720297212972229723297242972529726297272972829729297302973129732297332973429735297362973729738297392974029741297422974329744297452974629747297482974929750297512975229753297542975529756297572975829759297602976129762297632976429765297662976729768297692977029771297722977329774297752977629777297782977929780297812978229783297842978529786297872978829789297902979129792297932979429795297962979729798297992980029801298022980329804298052980629807298082980929810298112981229813298142981529816298172981829819298202982129822298232982429825298262982729828298292983029831298322983329834298352983629837298382983929840298412984229843298442984529846298472984829849298502985129852298532985429855298562985729858298592986029861298622986329864298652986629867298682986929870298712987229873298742987529876298772987829879298802988129882298832988429885298862988729888298892989029891298922989329894298952989629897298982989929900299012990229903299042990529906299072990829909299102991129912299132991429915299162991729918299192992029921299222992329924299252992629927299282992929930299312993229933299342993529936299372993829939299402994129942299432994429945299462994729948299492995029951299522995329954299552995629957299582995929960299612996229963299642996529966299672996829969299702997129972299732997429975299762997729978299792998029981299822998329984299852998629987299882998929990299912999229993299942999529996299972999829999300003000130002300033000430005300063000730008300093001030011300123001330014300153001630017300183001930020300213002230023300243002530026300273002830029300303003130032300333003430035300363003730038300393004030041300423004330044300453004630047300483004930050300513005230053300543005530056300573005830059300603006130062300633006430065300663006730068300693007030071300723007330074300753007630077300783007930080300813008230083300843008530086300873008830089300903009130092300933009430095300963009730098300993010030101301023010330104301053010630107301083010930110301113011230113301143011530116301173011830119301203012130122301233012430125301263012730128301293013030131301323013330134301353013630137301383013930140301413014230143301443014530146301473014830149301503015130152301533015430155301563015730158301593016030161301623016330164301653016630167301683016930170301713017230173301743017530176301773017830179301803018130182301833018430185301863018730188301893019030191301923019330194301953019630197301983019930200302013020230203302043020530206302073020830209302103021130212302133021430215302163021730218302193022030221302223022330224302253022630227302283022930230302313023230233302343023530236302373023830239302403024130242302433024430245302463024730248302493025030251302523025330254302553025630257302583025930260302613026230263302643026530266302673026830269302703027130272302733027430275302763027730278302793028030281302823028330284302853028630287302883028930290302913029230293302943029530296302973029830299303003030130302303033030430305303063030730308303093031030311303123031330314303153031630317303183031930320303213032230323303243032530326303273032830329303303033130332303333033430335303363033730338303393034030341303423034330344303453034630347303483034930350303513035230353303543035530356303573035830359303603036130362303633036430365303663036730368303693037030371303723037330374303753037630377303783037930380303813038230383303843038530386303873038830389303903039130392303933039430395303963039730398303993040030401304023040330404304053040630407304083040930410304113041230413304143041530416304173041830419304203042130422304233042430425304263042730428304293043030431304323043330434304353043630437304383043930440304413044230443304443044530446304473044830449304503045130452304533045430455304563045730458304593046030461304623046330464304653046630467304683046930470304713047230473304743047530476304773047830479304803048130482304833048430485304863048730488304893049030491304923049330494304953049630497304983049930500305013050230503305043050530506305073050830509305103051130512305133051430515305163051730518305193052030521305223052330524305253052630527305283052930530305313053230533305343053530536305373053830539305403054130542305433054430545305463054730548305493055030551305523055330554305553055630557305583055930560305613056230563305643056530566305673056830569305703057130572305733057430575305763057730578305793058030581305823058330584305853058630587305883058930590305913059230593305943059530596305973059830599306003060130602306033060430605306063060730608306093061030611306123061330614306153061630617306183061930620306213062230623306243062530626306273062830629306303063130632306333063430635306363063730638306393064030641306423064330644306453064630647306483064930650306513065230653306543065530656306573065830659306603066130662306633066430665306663066730668306693067030671306723067330674306753067630677306783067930680306813068230683306843068530686306873068830689306903069130692306933069430695306963069730698306993070030701307023070330704307053070630707307083070930710307113071230713307143071530716307173071830719307203072130722307233072430725307263072730728307293073030731307323073330734307353073630737307383073930740307413074230743307443074530746307473074830749307503075130752307533075430755307563075730758307593076030761307623076330764307653076630767307683076930770307713077230773307743077530776307773077830779307803078130782307833078430785307863078730788307893079030791307923079330794307953079630797307983079930800308013080230803308043080530806308073080830809308103081130812308133081430815308163081730818308193082030821308223082330824308253082630827308283082930830308313083230833308343083530836308373083830839308403084130842308433084430845308463084730848308493085030851308523085330854308553085630857308583085930860308613086230863308643086530866308673086830869308703087130872308733087430875308763087730878308793088030881308823088330884308853088630887308883088930890308913089230893308943089530896308973089830899309003090130902309033090430905309063090730908309093091030911309123091330914309153091630917309183091930920309213092230923309243092530926309273092830929309303093130932309333093430935309363093730938309393094030941309423094330944309453094630947309483094930950309513095230953309543095530956309573095830959309603096130962309633096430965309663096730968309693097030971309723097330974309753097630977309783097930980309813098230983309843098530986309873098830989309903099130992309933099430995309963099730998309993100031001310023100331004310053100631007310083100931010310113101231013310143101531016310173101831019310203102131022310233102431025310263102731028310293103031031310323103331034310353103631037310383103931040310413104231043310443104531046310473104831049310503105131052310533105431055310563105731058310593106031061310623106331064310653106631067310683106931070310713107231073310743107531076310773107831079310803108131082310833108431085310863108731088310893109031091310923109331094310953109631097310983109931100311013110231103311043110531106311073110831109311103111131112311133111431115311163111731118311193112031121311223112331124311253112631127311283112931130311313113231133311343113531136311373113831139311403114131142311433114431145311463114731148311493115031151311523115331154311553115631157311583115931160311613116231163311643116531166311673116831169311703117131172311733117431175311763117731178311793118031181311823118331184311853118631187311883118931190311913119231193311943119531196311973119831199312003120131202312033120431205312063120731208312093121031211312123121331214312153121631217312183121931220312213122231223312243122531226312273122831229312303123131232312333123431235312363123731238312393124031241312423124331244312453124631247312483124931250312513125231253312543125531256312573125831259312603126131262312633126431265312663126731268312693127031271312723127331274312753127631277312783127931280312813128231283312843128531286312873128831289312903129131292312933129431295312963129731298312993130031301313023130331304313053130631307313083130931310313113131231313313143131531316313173131831319313203132131322313233132431325313263132731328313293133031331313323133331334313353133631337313383133931340313413134231343313443134531346313473134831349313503135131352313533135431355313563135731358313593136031361313623136331364313653136631367313683136931370313713137231373313743137531376313773137831379313803138131382313833138431385313863138731388313893139031391313923139331394313953139631397313983139931400314013140231403314043140531406314073140831409314103141131412314133141431415314163141731418314193142031421314223142331424314253142631427314283142931430314313143231433314343143531436314373143831439314403144131442314433144431445314463144731448314493145031451314523145331454314553145631457314583145931460314613146231463314643146531466314673146831469314703147131472314733147431475314763147731478314793148031481314823148331484314853148631487314883148931490314913149231493314943149531496314973149831499315003150131502315033150431505315063150731508315093151031511315123151331514315153151631517315183151931520315213152231523315243152531526315273152831529315303153131532315333153431535315363153731538315393154031541315423154331544315453154631547315483154931550315513155231553315543155531556315573155831559315603156131562315633156431565315663156731568315693157031571315723157331574315753157631577315783157931580315813158231583315843158531586315873158831589315903159131592315933159431595315963159731598315993160031601316023160331604316053160631607316083160931610316113161231613316143161531616316173161831619316203162131622316233162431625316263162731628316293163031631316323163331634316353163631637316383163931640316413164231643316443164531646316473164831649316503165131652316533165431655316563165731658316593166031661316623166331664316653166631667316683166931670316713167231673316743167531676316773167831679316803168131682316833168431685316863168731688316893169031691316923169331694316953169631697316983169931700317013170231703317043170531706317073170831709317103171131712317133171431715317163171731718317193172031721317223172331724317253172631727317283172931730317313173231733317343173531736317373173831739317403174131742317433174431745317463174731748317493175031751317523175331754317553175631757317583175931760317613176231763317643176531766317673176831769317703177131772317733177431775317763177731778317793178031781317823178331784317853178631787317883178931790317913179231793317943179531796317973179831799318003180131802318033180431805318063180731808318093181031811318123181331814318153181631817318183181931820318213182231823318243182531826318273182831829318303183131832318333183431835318363183731838318393184031841318423184331844318453184631847318483184931850318513185231853318543185531856318573185831859318603186131862318633186431865318663186731868318693187031871318723187331874318753187631877318783187931880318813188231883318843188531886318873188831889318903189131892318933189431895318963189731898318993190031901319023190331904319053190631907319083190931910319113191231913319143191531916319173191831919319203192131922319233192431925319263192731928319293193031931319323193331934319353193631937319383193931940319413194231943319443194531946319473194831949319503195131952319533195431955319563195731958319593196031961319623196331964319653196631967319683196931970319713197231973319743197531976319773197831979319803198131982319833198431985319863198731988319893199031991319923199331994319953199631997319983199932000320013200232003320043200532006320073200832009320103201132012320133201432015320163201732018320193202032021320223202332024320253202632027320283202932030320313203232033320343203532036320373203832039320403204132042320433204432045320463204732048320493205032051320523205332054320553205632057320583205932060320613206232063320643206532066320673206832069320703207132072320733207432075320763207732078320793208032081320823208332084320853208632087320883208932090320913209232093320943209532096320973209832099321003210132102321033210432105321063210732108321093211032111321123211332114321153211632117321183211932120321213212232123321243212532126321273212832129321303213132132321333213432135321363213732138321393214032141321423214332144321453214632147321483214932150321513215232153321543215532156321573215832159321603216132162321633216432165321663216732168321693217032171321723217332174321753217632177321783217932180321813218232183321843218532186321873218832189321903219132192321933219432195321963219732198321993220032201322023220332204322053220632207322083220932210322113221232213322143221532216322173221832219322203222132222322233222432225322263222732228322293223032231322323223332234322353223632237322383223932240322413224232243322443224532246322473224832249322503225132252322533225432255322563225732258322593226032261322623226332264322653226632267322683226932270322713227232273322743227532276322773227832279322803228132282322833228432285322863228732288322893229032291322923229332294322953229632297322983229932300323013230232303323043230532306323073230832309323103231132312323133231432315323163231732318323193232032321323223232332324323253232632327323283232932330323313233232333323343233532336323373233832339323403234132342323433234432345323463234732348323493235032351323523235332354323553235632357323583235932360323613236232363323643236532366323673236832369323703237132372323733237432375323763237732378323793238032381323823238332384323853238632387323883238932390323913239232393323943239532396323973239832399324003240132402324033240432405324063240732408324093241032411324123241332414324153241632417324183241932420324213242232423324243242532426324273242832429324303243132432324333243432435324363243732438324393244032441324423244332444324453244632447324483244932450324513245232453324543245532456324573245832459324603246132462324633246432465324663246732468324693247032471324723247332474324753247632477324783247932480324813248232483324843248532486324873248832489324903249132492324933249432495324963249732498324993250032501325023250332504325053250632507325083250932510325113251232513325143251532516325173251832519325203252132522325233252432525325263252732528325293253032531325323253332534325353253632537325383253932540325413254232543325443254532546325473254832549325503255132552325533255432555325563255732558325593256032561325623256332564325653256632567325683256932570325713257232573325743257532576325773257832579325803258132582325833258432585325863258732588325893259032591325923259332594325953259632597325983259932600326013260232603326043260532606326073260832609326103261132612326133261432615326163261732618326193262032621326223262332624326253262632627326283262932630326313263232633326343263532636326373263832639326403264132642326433264432645326463264732648326493265032651326523265332654326553265632657326583265932660326613266232663326643266532666326673266832669326703267132672326733267432675326763267732678326793268032681326823268332684326853268632687326883268932690326913269232693326943269532696326973269832699327003270132702327033270432705327063270732708327093271032711327123271332714327153271632717327183271932720327213272232723327243272532726327273272832729327303273132732327333273432735327363273732738327393274032741327423274332744327453274632747327483274932750327513275232753327543275532756327573275832759327603276132762327633276432765327663276732768327693277032771327723277332774327753277632777327783277932780327813278232783327843278532786327873278832789327903279132792327933279432795327963279732798327993280032801328023280332804328053280632807328083280932810328113281232813328143281532816328173281832819328203282132822328233282432825328263282732828328293283032831328323283332834328353283632837328383283932840328413284232843328443284532846328473284832849328503285132852328533285432855328563285732858328593286032861328623286332864328653286632867328683286932870328713287232873328743287532876328773287832879328803288132882328833288432885328863288732888328893289032891328923289332894328953289632897328983289932900329013290232903329043290532906329073290832909329103291132912329133291432915329163291732918329193292032921329223292332924329253292632927329283292932930329313293232933329343293532936329373293832939329403294132942329433294432945329463294732948329493295032951329523295332954329553295632957329583295932960329613296232963329643296532966329673296832969329703297132972329733297432975329763297732978329793298032981329823298332984329853298632987329883298932990329913299232993329943299532996329973299832999330003300133002330033300433005330063300733008330093301033011330123301333014330153301633017330183301933020330213302233023330243302533026330273302833029330303303133032330333303433035330363303733038330393304033041330423304333044330453304633047330483304933050330513305233053330543305533056330573305833059330603306133062330633306433065330663306733068330693307033071330723307333074330753307633077330783307933080330813308233083330843308533086330873308833089330903309133092330933309433095330963309733098330993310033101331023310333104331053310633107331083310933110331113311233113331143311533116331173311833119331203312133122331233312433125331263312733128331293313033131331323313333134331353313633137331383313933140331413314233143331443314533146331473314833149331503315133152331533315433155331563315733158331593316033161331623316333164331653316633167331683316933170331713317233173331743317533176331773317833179331803318133182331833318433185331863318733188331893319033191331923319333194331953319633197331983319933200332013320233203332043320533206332073320833209332103321133212332133321433215332163321733218332193322033221332223322333224332253322633227332283322933230332313323233233332343323533236332373323833239332403324133242332433324433245332463324733248332493325033251332523325333254332553325633257332583325933260332613326233263332643326533266332673326833269332703327133272332733327433275332763327733278332793328033281332823328333284332853328633287332883328933290332913329233293332943329533296332973329833299333003330133302333033330433305333063330733308333093331033311333123331333314333153331633317333183331933320333213332233323333243332533326333273332833329333303333133332333333333433335333363333733338333393334033341333423334333344333453334633347333483334933350333513335233353333543335533356333573335833359333603336133362333633336433365333663336733368333693337033371333723337333374333753337633377333783337933380333813338233383333843338533386333873338833389333903339133392333933339433395333963339733398333993340033401334023340333404334053340633407334083340933410334113341233413334143341533416334173341833419334203342133422334233342433425334263342733428334293343033431334323343333434334353343633437334383343933440334413344233443334443344533446334473344833449334503345133452334533345433455334563345733458334593346033461334623346333464334653346633467334683346933470334713347233473334743347533476334773347833479334803348133482334833348433485334863348733488334893349033491334923349333494334953349633497334983349933500335013350233503335043350533506335073350833509335103351133512335133351433515335163351733518335193352033521335223352333524335253352633527335283352933530335313353233533335343353533536335373353833539335403354133542335433354433545335463354733548335493355033551335523355333554335553355633557335583355933560335613356233563335643356533566335673356833569335703357133572335733357433575335763357733578335793358033581335823358333584335853358633587335883358933590335913359233593335943359533596335973359833599336003360133602336033360433605336063360733608336093361033611336123361333614336153361633617336183361933620336213362233623336243362533626336273362833629336303363133632336333363433635336363363733638336393364033641336423364333644336453364633647336483364933650336513365233653336543365533656336573365833659336603366133662336633366433665336663366733668336693367033671336723367333674336753367633677336783367933680336813368233683336843368533686336873368833689336903369133692336933369433695336963369733698336993370033701337023370333704337053370633707337083370933710337113371233713337143371533716337173371833719337203372133722337233372433725337263372733728337293373033731337323373333734337353373633737337383373933740337413374233743337443374533746337473374833749337503375133752337533375433755337563375733758337593376033761337623376333764337653376633767337683376933770337713377233773337743377533776337773377833779337803378133782337833378433785337863378733788337893379033791337923379333794337953379633797337983379933800338013380233803338043380533806338073380833809338103381133812338133381433815338163381733818338193382033821338223382333824338253382633827338283382933830338313383233833338343383533836338373383833839338403384133842338433384433845338463384733848338493385033851338523385333854338553385633857338583385933860338613386233863338643386533866338673386833869338703387133872338733387433875338763387733878338793388033881338823388333884338853388633887338883388933890338913389233893338943389533896338973389833899339003390133902339033390433905339063390733908339093391033911339123391333914339153391633917339183391933920339213392233923339243392533926339273392833929339303393133932339333393433935339363393733938339393394033941339423394333944339453394633947339483394933950339513395233953339543395533956339573395833959339603396133962339633396433965339663396733968339693397033971339723397333974339753397633977339783397933980339813398233983339843398533986339873398833989339903399133992339933399433995339963399733998339993400034001340023400334004340053400634007340083400934010340113401234013340143401534016340173401834019340203402134022340233402434025340263402734028340293403034031340323403334034340353403634037340383403934040340413404234043340443404534046340473404834049340503405134052340533405434055340563405734058340593406034061340623406334064340653406634067340683406934070340713407234073340743407534076340773407834079340803408134082340833408434085340863408734088340893409034091340923409334094340953409634097340983409934100341013410234103341043410534106341073410834109341103411134112341133411434115341163411734118341193412034121341223412334124341253412634127341283412934130341313413234133341343413534136341373413834139341403414134142341433414434145341463414734148341493415034151341523415334154341553415634157341583415934160341613416234163341643416534166341673416834169341703417134172341733417434175341763417734178341793418034181341823418334184341853418634187341883418934190341913419234193341943419534196341973419834199342003420134202342033420434205342063420734208342093421034211342123421334214342153421634217342183421934220342213422234223342243422534226342273422834229342303423134232342333423434235342363423734238342393424034241342423424334244342453424634247342483424934250342513425234253342543425534256342573425834259342603426134262342633426434265342663426734268342693427034271342723427334274342753427634277342783427934280342813428234283342843428534286342873428834289342903429134292342933429434295342963429734298342993430034301343023430334304343053430634307343083430934310343113431234313343143431534316343173431834319343203432134322343233432434325343263432734328343293433034331343323433334334343353433634337343383433934340343413434234343343443434534346343473434834349343503435134352343533435434355343563435734358343593436034361343623436334364343653436634367343683436934370343713437234373343743437534376343773437834379343803438134382343833438434385343863438734388343893439034391343923439334394343953439634397343983439934400344013440234403344043440534406344073440834409344103441134412344133441434415344163441734418344193442034421344223442334424344253442634427344283442934430344313443234433344343443534436344373443834439344403444134442344433444434445344463444734448344493445034451344523445334454344553445634457344583445934460344613446234463344643446534466344673446834469344703447134472344733447434475344763447734478344793448034481344823448334484344853448634487344883448934490344913449234493344943449534496344973449834499345003450134502345033450434505345063450734508345093451034511345123451334514345153451634517345183451934520345213452234523345243452534526345273452834529345303453134532345333453434535345363453734538345393454034541345423454334544345453454634547345483454934550345513455234553345543455534556345573455834559345603456134562345633456434565345663456734568345693457034571345723457334574345753457634577345783457934580345813458234583345843458534586345873458834589345903459134592345933459434595345963459734598345993460034601346023460334604346053460634607346083460934610346113461234613346143461534616346173461834619346203462134622346233462434625346263462734628346293463034631346323463334634346353463634637346383463934640346413464234643346443464534646346473464834649346503465134652346533465434655346563465734658346593466034661346623466334664346653466634667346683466934670346713467234673346743467534676346773467834679346803468134682346833468434685346863468734688346893469034691346923469334694346953469634697346983469934700347013470234703347043470534706347073470834709347103471134712347133471434715347163471734718347193472034721347223472334724347253472634727347283472934730347313473234733347343473534736347373473834739347403474134742347433474434745347463474734748347493475034751347523475334754347553475634757347583475934760347613476234763347643476534766347673476834769347703477134772347733477434775347763477734778347793478034781347823478334784347853478634787347883478934790347913479234793347943479534796347973479834799348003480134802348033480434805348063480734808348093481034811348123481334814348153481634817348183481934820348213482234823348243482534826348273482834829348303483134832348333483434835348363483734838348393484034841348423484334844348453484634847348483484934850348513485234853348543485534856348573485834859348603486134862348633486434865348663486734868348693487034871348723487334874348753487634877348783487934880348813488234883348843488534886348873488834889348903489134892348933489434895348963489734898348993490034901349023490334904349053490634907349083490934910349113491234913349143491534916349173491834919349203492134922349233492434925349263492734928349293493034931349323493334934349353493634937349383493934940349413494234943349443494534946349473494834949349503495134952349533495434955349563495734958349593496034961349623496334964349653496634967349683496934970349713497234973349743497534976349773497834979349803498134982349833498434985349863498734988349893499034991349923499334994349953499634997349983499935000350013500235003350043500535006350073500835009350103501135012350133501435015350163501735018350193502035021350223502335024350253502635027350283502935030350313503235033350343503535036350373503835039350403504135042350433504435045350463504735048350493505035051350523505335054350553505635057350583505935060350613506235063350643506535066350673506835069350703507135072350733507435075350763507735078350793508035081350823508335084350853508635087350883508935090350913509235093350943509535096350973509835099351003510135102351033510435105351063510735108351093511035111351123511335114351153511635117351183511935120351213512235123351243512535126351273512835129351303513135132351333513435135351363513735138351393514035141351423514335144351453514635147351483514935150351513515235153351543515535156351573515835159351603516135162351633516435165351663516735168351693517035171351723517335174351753517635177351783517935180351813518235183351843518535186351873518835189351903519135192351933519435195351963519735198351993520035201352023520335204352053520635207352083520935210352113521235213352143521535216352173521835219352203522135222352233522435225352263522735228352293523035231352323523335234352353523635237352383523935240352413524235243352443524535246352473524835249352503525135252352533525435255352563525735258352593526035261352623526335264352653526635267352683526935270352713527235273352743527535276352773527835279352803528135282352833528435285352863528735288352893529035291352923529335294352953529635297352983529935300353013530235303353043530535306353073530835309353103531135312353133531435315353163531735318353193532035321353223532335324353253532635327353283532935330353313533235333353343533535336353373533835339353403534135342353433534435345353463534735348353493535035351353523535335354353553535635357353583535935360353613536235363353643536535366353673536835369353703537135372353733537435375353763537735378353793538035381353823538335384353853538635387353883538935390353913539235393353943539535396353973539835399354003540135402354033540435405354063540735408354093541035411354123541335414354153541635417354183541935420354213542235423354243542535426354273542835429354303543135432354333543435435354363543735438354393544035441354423544335444354453544635447354483544935450354513545235453354543545535456354573545835459354603546135462354633546435465354663546735468354693547035471354723547335474354753547635477354783547935480354813548235483354843548535486354873548835489354903549135492354933549435495354963549735498354993550035501355023550335504355053550635507355083550935510355113551235513355143551535516355173551835519355203552135522355233552435525355263552735528355293553035531355323553335534355353553635537355383553935540355413554235543355443554535546355473554835549355503555135552355533555435555355563555735558355593556035561355623556335564355653556635567355683556935570355713557235573355743557535576355773557835579355803558135582355833558435585355863558735588355893559035591355923559335594355953559635597355983559935600356013560235603356043560535606356073560835609356103561135612356133561435615356163561735618356193562035621356223562335624356253562635627356283562935630356313563235633356343563535636356373563835639356403564135642356433564435645356463564735648356493565035651356523565335654356553565635657356583565935660356613566235663356643566535666356673566835669356703567135672356733567435675356763567735678356793568035681356823568335684356853568635687356883568935690356913569235693356943569535696356973569835699357003570135702357033570435705357063570735708357093571035711357123571335714357153571635717357183571935720357213572235723357243572535726357273572835729357303573135732357333573435735357363573735738357393574035741357423574335744357453574635747357483574935750357513575235753357543575535756357573575835759357603576135762357633576435765357663576735768357693577035771357723577335774357753577635777357783577935780357813578235783357843578535786357873578835789357903579135792357933579435795357963579735798357993580035801358023580335804358053580635807358083580935810358113581235813358143581535816358173581835819358203582135822358233582435825358263582735828358293583035831358323583335834358353583635837358383583935840358413584235843358443584535846358473584835849358503585135852358533585435855358563585735858358593586035861358623586335864358653586635867358683586935870358713587235873358743587535876358773587835879358803588135882358833588435885358863588735888358893589035891358923589335894358953589635897358983589935900359013590235903359043590535906359073590835909359103591135912359133591435915359163591735918359193592035921359223592335924359253592635927359283592935930359313593235933359343593535936359373593835939359403594135942359433594435945359463594735948359493595035951359523595335954359553595635957359583595935960359613596235963359643596535966359673596835969359703597135972359733597435975359763597735978359793598035981359823598335984359853598635987359883598935990359913599235993359943599535996359973599835999360003600136002360033600436005360063600736008360093601036011360123601336014360153601636017360183601936020360213602236023360243602536026360273602836029360303603136032360333603436035360363603736038360393604036041360423604336044360453604636047360483604936050360513605236053360543605536056360573605836059360603606136062360633606436065360663606736068360693607036071360723607336074360753607636077360783607936080360813608236083360843608536086360873608836089360903609136092360933609436095360963609736098360993610036101361023610336104361053610636107361083610936110361113611236113361143611536116361173611836119361203612136122361233612436125361263612736128361293613036131361323613336134361353613636137361383613936140361413614236143361443614536146361473614836149361503615136152361533615436155361563615736158361593616036161361623616336164361653616636167361683616936170361713617236173361743617536176361773617836179361803618136182361833618436185361863618736188361893619036191361923619336194361953619636197361983619936200362013620236203362043620536206362073620836209362103621136212362133621436215362163621736218362193622036221362223622336224362253622636227362283622936230362313623236233362343623536236362373623836239362403624136242362433624436245362463624736248362493625036251362523625336254362553625636257362583625936260362613626236263362643626536266362673626836269362703627136272362733627436275362763627736278362793628036281362823628336284362853628636287362883628936290362913629236293362943629536296362973629836299363003630136302363033630436305363063630736308363093631036311363123631336314363153631636317363183631936320363213632236323363243632536326363273632836329363303633136332363333633436335363363633736338363393634036341363423634336344363453634636347363483634936350363513635236353363543635536356363573635836359363603636136362363633636436365363663636736368363693637036371363723637336374363753637636377363783637936380363813638236383363843638536386363873638836389363903639136392363933639436395363963639736398363993640036401364023640336404364053640636407364083640936410364113641236413364143641536416364173641836419364203642136422364233642436425364263642736428364293643036431364323643336434364353643636437364383643936440364413644236443364443644536446364473644836449364503645136452364533645436455364563645736458364593646036461364623646336464364653646636467364683646936470364713647236473364743647536476364773647836479364803648136482364833648436485364863648736488364893649036491364923649336494364953649636497364983649936500365013650236503365043650536506365073650836509365103651136512365133651436515365163651736518365193652036521365223652336524365253652636527365283652936530365313653236533365343653536536365373653836539365403654136542365433654436545365463654736548365493655036551365523655336554365553655636557365583655936560365613656236563365643656536566365673656836569365703657136572365733657436575365763657736578365793658036581365823658336584365853658636587365883658936590365913659236593365943659536596365973659836599366003660136602366033660436605366063660736608366093661036611366123661336614366153661636617366183661936620366213662236623366243662536626366273662836629366303663136632366333663436635366363663736638366393664036641366423664336644366453664636647366483664936650366513665236653366543665536656366573665836659366603666136662366633666436665366663666736668366693667036671366723667336674366753667636677366783667936680366813668236683366843668536686366873668836689366903669136692366933669436695366963669736698366993670036701367023670336704367053670636707367083670936710367113671236713367143671536716367173671836719367203672136722367233672436725367263672736728367293673036731367323673336734367353673636737367383673936740367413674236743367443674536746367473674836749367503675136752367533675436755367563675736758367593676036761367623676336764367653676636767367683676936770367713677236773367743677536776367773677836779367803678136782367833678436785367863678736788367893679036791367923679336794367953679636797367983679936800368013680236803368043680536806368073680836809368103681136812368133681436815368163681736818368193682036821368223682336824368253682636827368283682936830368313683236833368343683536836368373683836839368403684136842368433684436845368463684736848368493685036851368523685336854368553685636857368583685936860368613686236863368643686536866368673686836869368703687136872368733687436875368763687736878368793688036881368823688336884368853688636887368883688936890368913689236893368943689536896368973689836899369003690136902369033690436905369063690736908369093691036911369123691336914369153691636917369183691936920369213692236923369243692536926369273692836929369303693136932369333693436935369363693736938369393694036941369423694336944369453694636947369483694936950369513695236953369543695536956369573695836959369603696136962369633696436965369663696736968369693697036971369723697336974369753697636977369783697936980369813698236983369843698536986369873698836989369903699136992369933699436995369963699736998369993700037001370023700337004370053700637007370083700937010370113701237013370143701537016370173701837019370203702137022370233702437025370263702737028370293703037031370323703337034370353703637037370383703937040370413704237043370443704537046370473704837049370503705137052370533705437055370563705737058370593706037061370623706337064370653706637067370683706937070370713707237073370743707537076370773707837079370803708137082370833708437085370863708737088370893709037091370923709337094370953709637097370983709937100371013710237103371043710537106371073710837109371103711137112371133711437115371163711737118371193712037121371223712337124371253712637127371283712937130371313713237133371343713537136371373713837139371403714137142371433714437145371463714737148371493715037151371523715337154371553715637157371583715937160371613716237163371643716537166371673716837169371703717137172371733717437175371763717737178371793718037181371823718337184371853718637187371883718937190371913719237193371943719537196371973719837199372003720137202372033720437205372063720737208372093721037211372123721337214372153721637217372183721937220372213722237223372243722537226372273722837229372303723137232372333723437235372363723737238372393724037241372423724337244372453724637247372483724937250372513725237253372543725537256372573725837259372603726137262372633726437265372663726737268372693727037271372723727337274372753727637277372783727937280372813728237283372843728537286372873728837289372903729137292372933729437295372963729737298372993730037301373023730337304373053730637307373083730937310373113731237313373143731537316373173731837319373203732137322373233732437325373263732737328373293733037331373323733337334373353733637337373383733937340373413734237343373443734537346373473734837349373503735137352373533735437355373563735737358373593736037361373623736337364373653736637367373683736937370373713737237373373743737537376373773737837379373803738137382373833738437385373863738737388373893739037391373923739337394373953739637397373983739937400374013740237403374043740537406374073740837409374103741137412374133741437415374163741737418374193742037421374223742337424374253742637427374283742937430374313743237433374343743537436374373743837439374403744137442374433744437445374463744737448374493745037451374523745337454374553745637457374583745937460374613746237463374643746537466374673746837469374703747137472374733747437475374763747737478374793748037481374823748337484374853748637487374883748937490374913749237493374943749537496374973749837499375003750137502375033750437505375063750737508375093751037511375123751337514375153751637517375183751937520375213752237523375243752537526375273752837529375303753137532375333753437535375363753737538375393754037541375423754337544375453754637547375483754937550375513755237553375543755537556375573755837559375603756137562375633756437565375663756737568375693757037571375723757337574375753757637577375783757937580375813758237583375843758537586375873758837589375903759137592375933759437595375963759737598375993760037601376023760337604376053760637607376083760937610376113761237613376143761537616376173761837619376203762137622376233762437625376263762737628376293763037631376323763337634376353763637637376383763937640376413764237643376443764537646376473764837649376503765137652376533765437655376563765737658376593766037661376623766337664376653766637667376683766937670376713767237673376743767537676376773767837679376803768137682376833768437685376863768737688376893769037691376923769337694376953769637697376983769937700377013770237703377043770537706377073770837709377103771137712377133771437715377163771737718377193772037721377223772337724377253772637727377283772937730377313773237733377343773537736377373773837739377403774137742377433774437745377463774737748377493775037751377523775337754377553775637757377583775937760377613776237763377643776537766377673776837769377703777137772377733777437775377763777737778377793778037781377823778337784377853778637787377883778937790377913779237793377943779537796377973779837799378003780137802378033780437805378063780737808378093781037811378123781337814378153781637817378183781937820378213782237823378243782537826378273782837829378303783137832378333783437835378363783737838378393784037841378423784337844378453784637847378483784937850378513785237853378543785537856378573785837859378603786137862378633786437865378663786737868378693787037871378723787337874378753787637877378783787937880378813788237883378843788537886378873788837889378903789137892378933789437895378963789737898378993790037901379023790337904379053790637907379083790937910379113791237913379143791537916379173791837919379203792137922379233792437925379263792737928379293793037931379323793337934379353793637937379383793937940379413794237943379443794537946379473794837949379503795137952379533795437955379563795737958379593796037961379623796337964379653796637967379683796937970379713797237973379743797537976379773797837979379803798137982379833798437985379863798737988379893799037991379923799337994379953799637997379983799938000380013800238003380043800538006380073800838009380103801138012380133801438015380163801738018380193802038021380223802338024380253802638027380283802938030380313803238033380343803538036380373803838039380403804138042380433804438045380463804738048380493805038051380523805338054380553805638057380583805938060380613806238063380643806538066380673806838069380703807138072380733807438075380763807738078380793808038081380823808338084380853808638087380883808938090380913809238093380943809538096380973809838099381003810138102381033810438105381063810738108381093811038111381123811338114381153811638117381183811938120381213812238123381243812538126381273812838129381303813138132381333813438135381363813738138381393814038141381423814338144381453814638147381483814938150381513815238153381543815538156381573815838159381603816138162381633816438165381663816738168381693817038171381723817338174381753817638177381783817938180381813818238183381843818538186381873818838189381903819138192381933819438195381963819738198381993820038201382023820338204382053820638207382083820938210382113821238213382143821538216382173821838219382203822138222382233822438225382263822738228382293823038231382323823338234382353823638237382383823938240382413824238243382443824538246382473824838249382503825138252382533825438255382563825738258382593826038261382623826338264382653826638267382683826938270382713827238273382743827538276382773827838279382803828138282382833828438285382863828738288382893829038291382923829338294382953829638297382983829938300383013830238303383043830538306383073830838309383103831138312383133831438315383163831738318383193832038321383223832338324383253832638327383283832938330383313833238333383343833538336383373833838339383403834138342383433834438345383463834738348383493835038351383523835338354383553835638357383583835938360383613836238363383643836538366383673836838369383703837138372383733837438375383763837738378383793838038381383823838338384383853838638387383883838938390383913839238393383943839538396383973839838399384003840138402384033840438405384063840738408384093841038411384123841338414384153841638417384183841938420384213842238423384243842538426384273842838429384303843138432384333843438435
  1. /*! cornerstone-tools - 6.0.9 - 2023-03-27 | (c) 2017 Chris Hafey | https://github.com/cornerstonejs/cornerstoneTools */
  2. (function webpackUniversalModuleDefinition(root, factory) {
  3. if(typeof exports === 'object' && typeof module === 'object')
  4. module.exports = factory();
  5. else if(typeof define === 'function' && define.amd)
  6. define("cornerstone-tools", [], factory);
  7. else if(typeof exports === 'object')
  8. exports["cornerstone-tools"] = factory();
  9. else
  10. root["cornerstoneTools"] = factory();
  11. })(window, function() {
  12. return /******/ (function(modules) { // webpackBootstrap
  13. /******/ function hotDisposeChunk(chunkId) {
  14. /******/ delete installedChunks[chunkId];
  15. /******/ }
  16. /******/ var parentHotUpdateCallback = window["webpackHotUpdate"];
  17. /******/ window["webpackHotUpdate"] = // eslint-disable-next-line no-unused-vars
  18. /******/ function webpackHotUpdateCallback(chunkId, moreModules) {
  19. /******/ hotAddUpdateChunk(chunkId, moreModules);
  20. /******/ if (parentHotUpdateCallback) parentHotUpdateCallback(chunkId, moreModules);
  21. /******/ } ;
  22. /******/
  23. /******/ // eslint-disable-next-line no-unused-vars
  24. /******/ function hotDownloadUpdateChunk(chunkId) {
  25. /******/ var script = document.createElement("script");
  26. /******/ script.charset = "utf-8";
  27. /******/ script.src = __webpack_require__.p + "" + chunkId + "." + hotCurrentHash + ".hot-update.js";
  28. /******/ if (null) script.crossOrigin = null;
  29. /******/ document.head.appendChild(script);
  30. /******/ }
  31. /******/
  32. /******/ // eslint-disable-next-line no-unused-vars
  33. /******/ function hotDownloadManifest(requestTimeout) {
  34. /******/ requestTimeout = requestTimeout || 10000;
  35. /******/ return new Promise(function(resolve, reject) {
  36. /******/ if (typeof XMLHttpRequest === "undefined") {
  37. /******/ return reject(new Error("No browser support"));
  38. /******/ }
  39. /******/ try {
  40. /******/ var request = new XMLHttpRequest();
  41. /******/ var requestPath = __webpack_require__.p + "" + hotCurrentHash + ".hot-update.json";
  42. /******/ request.open("GET", requestPath, true);
  43. /******/ request.timeout = requestTimeout;
  44. /******/ request.send(null);
  45. /******/ } catch (err) {
  46. /******/ return reject(err);
  47. /******/ }
  48. /******/ request.onreadystatechange = function() {
  49. /******/ if (request.readyState !== 4) return;
  50. /******/ if (request.status === 0) {
  51. /******/ // timeout
  52. /******/ reject(
  53. /******/ new Error("Manifest request to " + requestPath + " timed out.")
  54. /******/ );
  55. /******/ } else if (request.status === 404) {
  56. /******/ // no update available
  57. /******/ resolve();
  58. /******/ } else if (request.status !== 200 && request.status !== 304) {
  59. /******/ // other failure
  60. /******/ reject(new Error("Manifest request to " + requestPath + " failed."));
  61. /******/ } else {
  62. /******/ // success
  63. /******/ try {
  64. /******/ var update = JSON.parse(request.responseText);
  65. /******/ } catch (e) {
  66. /******/ reject(e);
  67. /******/ return;
  68. /******/ }
  69. /******/ resolve(update);
  70. /******/ }
  71. /******/ };
  72. /******/ });
  73. /******/ }
  74. /******/
  75. /******/ var hotApplyOnUpdate = true;
  76. /******/ // eslint-disable-next-line no-unused-vars
  77. /******/ var hotCurrentHash = "1df8937449c88a7d5c59";
  78. /******/ var hotRequestTimeout = 10000;
  79. /******/ var hotCurrentModuleData = {};
  80. /******/ var hotCurrentChildModule;
  81. /******/ // eslint-disable-next-line no-unused-vars
  82. /******/ var hotCurrentParents = [];
  83. /******/ // eslint-disable-next-line no-unused-vars
  84. /******/ var hotCurrentParentsTemp = [];
  85. /******/
  86. /******/ // eslint-disable-next-line no-unused-vars
  87. /******/ function hotCreateRequire(moduleId) {
  88. /******/ var me = installedModules[moduleId];
  89. /******/ if (!me) return __webpack_require__;
  90. /******/ var fn = function(request) {
  91. /******/ if (me.hot.active) {
  92. /******/ if (installedModules[request]) {
  93. /******/ if (installedModules[request].parents.indexOf(moduleId) === -1) {
  94. /******/ installedModules[request].parents.push(moduleId);
  95. /******/ }
  96. /******/ } else {
  97. /******/ hotCurrentParents = [moduleId];
  98. /******/ hotCurrentChildModule = request;
  99. /******/ }
  100. /******/ if (me.children.indexOf(request) === -1) {
  101. /******/ me.children.push(request);
  102. /******/ }
  103. /******/ } else {
  104. /******/ console.warn(
  105. /******/ "[HMR] unexpected require(" +
  106. /******/ request +
  107. /******/ ") from disposed module " +
  108. /******/ moduleId
  109. /******/ );
  110. /******/ hotCurrentParents = [];
  111. /******/ }
  112. /******/ return __webpack_require__(request);
  113. /******/ };
  114. /******/ var ObjectFactory = function ObjectFactory(name) {
  115. /******/ return {
  116. /******/ configurable: true,
  117. /******/ enumerable: true,
  118. /******/ get: function() {
  119. /******/ return __webpack_require__[name];
  120. /******/ },
  121. /******/ set: function(value) {
  122. /******/ __webpack_require__[name] = value;
  123. /******/ }
  124. /******/ };
  125. /******/ };
  126. /******/ for (var name in __webpack_require__) {
  127. /******/ if (
  128. /******/ Object.prototype.hasOwnProperty.call(__webpack_require__, name) &&
  129. /******/ name !== "e" &&
  130. /******/ name !== "t"
  131. /******/ ) {
  132. /******/ Object.defineProperty(fn, name, ObjectFactory(name));
  133. /******/ }
  134. /******/ }
  135. /******/ fn.e = function(chunkId) {
  136. /******/ if (hotStatus === "ready") hotSetStatus("prepare");
  137. /******/ hotChunksLoading++;
  138. /******/ return __webpack_require__.e(chunkId).then(finishChunkLoading, function(err) {
  139. /******/ finishChunkLoading();
  140. /******/ throw err;
  141. /******/ });
  142. /******/
  143. /******/ function finishChunkLoading() {
  144. /******/ hotChunksLoading--;
  145. /******/ if (hotStatus === "prepare") {
  146. /******/ if (!hotWaitingFilesMap[chunkId]) {
  147. /******/ hotEnsureUpdateChunk(chunkId);
  148. /******/ }
  149. /******/ if (hotChunksLoading === 0 && hotWaitingFiles === 0) {
  150. /******/ hotUpdateDownloaded();
  151. /******/ }
  152. /******/ }
  153. /******/ }
  154. /******/ };
  155. /******/ fn.t = function(value, mode) {
  156. /******/ if (mode & 1) value = fn(value);
  157. /******/ return __webpack_require__.t(value, mode & ~1);
  158. /******/ };
  159. /******/ return fn;
  160. /******/ }
  161. /******/
  162. /******/ // eslint-disable-next-line no-unused-vars
  163. /******/ function hotCreateModule(moduleId) {
  164. /******/ var hot = {
  165. /******/ // private stuff
  166. /******/ _acceptedDependencies: {},
  167. /******/ _declinedDependencies: {},
  168. /******/ _selfAccepted: false,
  169. /******/ _selfDeclined: false,
  170. /******/ _disposeHandlers: [],
  171. /******/ _main: hotCurrentChildModule !== moduleId,
  172. /******/
  173. /******/ // Module API
  174. /******/ active: true,
  175. /******/ accept: function(dep, callback) {
  176. /******/ if (dep === undefined) hot._selfAccepted = true;
  177. /******/ else if (typeof dep === "function") hot._selfAccepted = dep;
  178. /******/ else if (typeof dep === "object")
  179. /******/ for (var i = 0; i < dep.length; i++)
  180. /******/ hot._acceptedDependencies[dep[i]] = callback || function() {};
  181. /******/ else hot._acceptedDependencies[dep] = callback || function() {};
  182. /******/ },
  183. /******/ decline: function(dep) {
  184. /******/ if (dep === undefined) hot._selfDeclined = true;
  185. /******/ else if (typeof dep === "object")
  186. /******/ for (var i = 0; i < dep.length; i++)
  187. /******/ hot._declinedDependencies[dep[i]] = true;
  188. /******/ else hot._declinedDependencies[dep] = true;
  189. /******/ },
  190. /******/ dispose: function(callback) {
  191. /******/ hot._disposeHandlers.push(callback);
  192. /******/ },
  193. /******/ addDisposeHandler: function(callback) {
  194. /******/ hot._disposeHandlers.push(callback);
  195. /******/ },
  196. /******/ removeDisposeHandler: function(callback) {
  197. /******/ var idx = hot._disposeHandlers.indexOf(callback);
  198. /******/ if (idx >= 0) hot._disposeHandlers.splice(idx, 1);
  199. /******/ },
  200. /******/
  201. /******/ // Management API
  202. /******/ check: hotCheck,
  203. /******/ apply: hotApply,
  204. /******/ status: function(l) {
  205. /******/ if (!l) return hotStatus;
  206. /******/ hotStatusHandlers.push(l);
  207. /******/ },
  208. /******/ addStatusHandler: function(l) {
  209. /******/ hotStatusHandlers.push(l);
  210. /******/ },
  211. /******/ removeStatusHandler: function(l) {
  212. /******/ var idx = hotStatusHandlers.indexOf(l);
  213. /******/ if (idx >= 0) hotStatusHandlers.splice(idx, 1);
  214. /******/ },
  215. /******/
  216. /******/ //inherit from previous dispose call
  217. /******/ data: hotCurrentModuleData[moduleId]
  218. /******/ };
  219. /******/ hotCurrentChildModule = undefined;
  220. /******/ return hot;
  221. /******/ }
  222. /******/
  223. /******/ var hotStatusHandlers = [];
  224. /******/ var hotStatus = "idle";
  225. /******/
  226. /******/ function hotSetStatus(newStatus) {
  227. /******/ hotStatus = newStatus;
  228. /******/ for (var i = 0; i < hotStatusHandlers.length; i++)
  229. /******/ hotStatusHandlers[i].call(null, newStatus);
  230. /******/ }
  231. /******/
  232. /******/ // while downloading
  233. /******/ var hotWaitingFiles = 0;
  234. /******/ var hotChunksLoading = 0;
  235. /******/ var hotWaitingFilesMap = {};
  236. /******/ var hotRequestedFilesMap = {};
  237. /******/ var hotAvailableFilesMap = {};
  238. /******/ var hotDeferred;
  239. /******/
  240. /******/ // The update info
  241. /******/ var hotUpdate, hotUpdateNewHash;
  242. /******/
  243. /******/ function toModuleId(id) {
  244. /******/ var isNumber = +id + "" === id;
  245. /******/ return isNumber ? +id : id;
  246. /******/ }
  247. /******/
  248. /******/ function hotCheck(apply) {
  249. /******/ if (hotStatus !== "idle") {
  250. /******/ throw new Error("check() is only allowed in idle status");
  251. /******/ }
  252. /******/ hotApplyOnUpdate = apply;
  253. /******/ hotSetStatus("check");
  254. /******/ return hotDownloadManifest(hotRequestTimeout).then(function(update) {
  255. /******/ if (!update) {
  256. /******/ hotSetStatus("idle");
  257. /******/ return null;
  258. /******/ }
  259. /******/ hotRequestedFilesMap = {};
  260. /******/ hotWaitingFilesMap = {};
  261. /******/ hotAvailableFilesMap = update.c;
  262. /******/ hotUpdateNewHash = update.h;
  263. /******/
  264. /******/ hotSetStatus("prepare");
  265. /******/ var promise = new Promise(function(resolve, reject) {
  266. /******/ hotDeferred = {
  267. /******/ resolve: resolve,
  268. /******/ reject: reject
  269. /******/ };
  270. /******/ });
  271. /******/ hotUpdate = {};
  272. /******/ var chunkId = "cornerstoneTools";
  273. /******/ // eslint-disable-next-line no-lone-blocks
  274. /******/ {
  275. /******/ /*globals chunkId */
  276. /******/ hotEnsureUpdateChunk(chunkId);
  277. /******/ }
  278. /******/ if (
  279. /******/ hotStatus === "prepare" &&
  280. /******/ hotChunksLoading === 0 &&
  281. /******/ hotWaitingFiles === 0
  282. /******/ ) {
  283. /******/ hotUpdateDownloaded();
  284. /******/ }
  285. /******/ return promise;
  286. /******/ });
  287. /******/ }
  288. /******/
  289. /******/ // eslint-disable-next-line no-unused-vars
  290. /******/ function hotAddUpdateChunk(chunkId, moreModules) {
  291. /******/ if (!hotAvailableFilesMap[chunkId] || !hotRequestedFilesMap[chunkId])
  292. /******/ return;
  293. /******/ hotRequestedFilesMap[chunkId] = false;
  294. /******/ for (var moduleId in moreModules) {
  295. /******/ if (Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {
  296. /******/ hotUpdate[moduleId] = moreModules[moduleId];
  297. /******/ }
  298. /******/ }
  299. /******/ if (--hotWaitingFiles === 0 && hotChunksLoading === 0) {
  300. /******/ hotUpdateDownloaded();
  301. /******/ }
  302. /******/ }
  303. /******/
  304. /******/ function hotEnsureUpdateChunk(chunkId) {
  305. /******/ if (!hotAvailableFilesMap[chunkId]) {
  306. /******/ hotWaitingFilesMap[chunkId] = true;
  307. /******/ } else {
  308. /******/ hotRequestedFilesMap[chunkId] = true;
  309. /******/ hotWaitingFiles++;
  310. /******/ hotDownloadUpdateChunk(chunkId);
  311. /******/ }
  312. /******/ }
  313. /******/
  314. /******/ function hotUpdateDownloaded() {
  315. /******/ hotSetStatus("ready");
  316. /******/ var deferred = hotDeferred;
  317. /******/ hotDeferred = null;
  318. /******/ if (!deferred) return;
  319. /******/ if (hotApplyOnUpdate) {
  320. /******/ // Wrap deferred object in Promise to mark it as a well-handled Promise to
  321. /******/ // avoid triggering uncaught exception warning in Chrome.
  322. /******/ // See https://bugs.chromium.org/p/chromium/issues/detail?id=465666
  323. /******/ Promise.resolve()
  324. /******/ .then(function() {
  325. /******/ return hotApply(hotApplyOnUpdate);
  326. /******/ })
  327. /******/ .then(
  328. /******/ function(result) {
  329. /******/ deferred.resolve(result);
  330. /******/ },
  331. /******/ function(err) {
  332. /******/ deferred.reject(err);
  333. /******/ }
  334. /******/ );
  335. /******/ } else {
  336. /******/ var outdatedModules = [];
  337. /******/ for (var id in hotUpdate) {
  338. /******/ if (Object.prototype.hasOwnProperty.call(hotUpdate, id)) {
  339. /******/ outdatedModules.push(toModuleId(id));
  340. /******/ }
  341. /******/ }
  342. /******/ deferred.resolve(outdatedModules);
  343. /******/ }
  344. /******/ }
  345. /******/
  346. /******/ function hotApply(options) {
  347. /******/ if (hotStatus !== "ready")
  348. /******/ throw new Error("apply() is only allowed in ready status");
  349. /******/ options = options || {};
  350. /******/
  351. /******/ var cb;
  352. /******/ var i;
  353. /******/ var j;
  354. /******/ var module;
  355. /******/ var moduleId;
  356. /******/
  357. /******/ function getAffectedStuff(updateModuleId) {
  358. /******/ var outdatedModules = [updateModuleId];
  359. /******/ var outdatedDependencies = {};
  360. /******/
  361. /******/ var queue = outdatedModules.map(function(id) {
  362. /******/ return {
  363. /******/ chain: [id],
  364. /******/ id: id
  365. /******/ };
  366. /******/ });
  367. /******/ while (queue.length > 0) {
  368. /******/ var queueItem = queue.pop();
  369. /******/ var moduleId = queueItem.id;
  370. /******/ var chain = queueItem.chain;
  371. /******/ module = installedModules[moduleId];
  372. /******/ if (!module || module.hot._selfAccepted) continue;
  373. /******/ if (module.hot._selfDeclined) {
  374. /******/ return {
  375. /******/ type: "self-declined",
  376. /******/ chain: chain,
  377. /******/ moduleId: moduleId
  378. /******/ };
  379. /******/ }
  380. /******/ if (module.hot._main) {
  381. /******/ return {
  382. /******/ type: "unaccepted",
  383. /******/ chain: chain,
  384. /******/ moduleId: moduleId
  385. /******/ };
  386. /******/ }
  387. /******/ for (var i = 0; i < module.parents.length; i++) {
  388. /******/ var parentId = module.parents[i];
  389. /******/ var parent = installedModules[parentId];
  390. /******/ if (!parent) continue;
  391. /******/ if (parent.hot._declinedDependencies[moduleId]) {
  392. /******/ return {
  393. /******/ type: "declined",
  394. /******/ chain: chain.concat([parentId]),
  395. /******/ moduleId: moduleId,
  396. /******/ parentId: parentId
  397. /******/ };
  398. /******/ }
  399. /******/ if (outdatedModules.indexOf(parentId) !== -1) continue;
  400. /******/ if (parent.hot._acceptedDependencies[moduleId]) {
  401. /******/ if (!outdatedDependencies[parentId])
  402. /******/ outdatedDependencies[parentId] = [];
  403. /******/ addAllToSet(outdatedDependencies[parentId], [moduleId]);
  404. /******/ continue;
  405. /******/ }
  406. /******/ delete outdatedDependencies[parentId];
  407. /******/ outdatedModules.push(parentId);
  408. /******/ queue.push({
  409. /******/ chain: chain.concat([parentId]),
  410. /******/ id: parentId
  411. /******/ });
  412. /******/ }
  413. /******/ }
  414. /******/
  415. /******/ return {
  416. /******/ type: "accepted",
  417. /******/ moduleId: updateModuleId,
  418. /******/ outdatedModules: outdatedModules,
  419. /******/ outdatedDependencies: outdatedDependencies
  420. /******/ };
  421. /******/ }
  422. /******/
  423. /******/ function addAllToSet(a, b) {
  424. /******/ for (var i = 0; i < b.length; i++) {
  425. /******/ var item = b[i];
  426. /******/ if (a.indexOf(item) === -1) a.push(item);
  427. /******/ }
  428. /******/ }
  429. /******/
  430. /******/ // at begin all updates modules are outdated
  431. /******/ // the "outdated" status can propagate to parents if they don't accept the children
  432. /******/ var outdatedDependencies = {};
  433. /******/ var outdatedModules = [];
  434. /******/ var appliedUpdate = {};
  435. /******/
  436. /******/ var warnUnexpectedRequire = function warnUnexpectedRequire() {
  437. /******/ console.warn(
  438. /******/ "[HMR] unexpected require(" + result.moduleId + ") to disposed module"
  439. /******/ );
  440. /******/ };
  441. /******/
  442. /******/ for (var id in hotUpdate) {
  443. /******/ if (Object.prototype.hasOwnProperty.call(hotUpdate, id)) {
  444. /******/ moduleId = toModuleId(id);
  445. /******/ /** @type {TODO} */
  446. /******/ var result;
  447. /******/ if (hotUpdate[id]) {
  448. /******/ result = getAffectedStuff(moduleId);
  449. /******/ } else {
  450. /******/ result = {
  451. /******/ type: "disposed",
  452. /******/ moduleId: id
  453. /******/ };
  454. /******/ }
  455. /******/ /** @type {Error|false} */
  456. /******/ var abortError = false;
  457. /******/ var doApply = false;
  458. /******/ var doDispose = false;
  459. /******/ var chainInfo = "";
  460. /******/ if (result.chain) {
  461. /******/ chainInfo = "\nUpdate propagation: " + result.chain.join(" -> ");
  462. /******/ }
  463. /******/ switch (result.type) {
  464. /******/ case "self-declined":
  465. /******/ if (options.onDeclined) options.onDeclined(result);
  466. /******/ if (!options.ignoreDeclined)
  467. /******/ abortError = new Error(
  468. /******/ "Aborted because of self decline: " +
  469. /******/ result.moduleId +
  470. /******/ chainInfo
  471. /******/ );
  472. /******/ break;
  473. /******/ case "declined":
  474. /******/ if (options.onDeclined) options.onDeclined(result);
  475. /******/ if (!options.ignoreDeclined)
  476. /******/ abortError = new Error(
  477. /******/ "Aborted because of declined dependency: " +
  478. /******/ result.moduleId +
  479. /******/ " in " +
  480. /******/ result.parentId +
  481. /******/ chainInfo
  482. /******/ );
  483. /******/ break;
  484. /******/ case "unaccepted":
  485. /******/ if (options.onUnaccepted) options.onUnaccepted(result);
  486. /******/ if (!options.ignoreUnaccepted)
  487. /******/ abortError = new Error(
  488. /******/ "Aborted because " + moduleId + " is not accepted" + chainInfo
  489. /******/ );
  490. /******/ break;
  491. /******/ case "accepted":
  492. /******/ if (options.onAccepted) options.onAccepted(result);
  493. /******/ doApply = true;
  494. /******/ break;
  495. /******/ case "disposed":
  496. /******/ if (options.onDisposed) options.onDisposed(result);
  497. /******/ doDispose = true;
  498. /******/ break;
  499. /******/ default:
  500. /******/ throw new Error("Unexception type " + result.type);
  501. /******/ }
  502. /******/ if (abortError) {
  503. /******/ hotSetStatus("abort");
  504. /******/ return Promise.reject(abortError);
  505. /******/ }
  506. /******/ if (doApply) {
  507. /******/ appliedUpdate[moduleId] = hotUpdate[moduleId];
  508. /******/ addAllToSet(outdatedModules, result.outdatedModules);
  509. /******/ for (moduleId in result.outdatedDependencies) {
  510. /******/ if (
  511. /******/ Object.prototype.hasOwnProperty.call(
  512. /******/ result.outdatedDependencies,
  513. /******/ moduleId
  514. /******/ )
  515. /******/ ) {
  516. /******/ if (!outdatedDependencies[moduleId])
  517. /******/ outdatedDependencies[moduleId] = [];
  518. /******/ addAllToSet(
  519. /******/ outdatedDependencies[moduleId],
  520. /******/ result.outdatedDependencies[moduleId]
  521. /******/ );
  522. /******/ }
  523. /******/ }
  524. /******/ }
  525. /******/ if (doDispose) {
  526. /******/ addAllToSet(outdatedModules, [result.moduleId]);
  527. /******/ appliedUpdate[moduleId] = warnUnexpectedRequire;
  528. /******/ }
  529. /******/ }
  530. /******/ }
  531. /******/
  532. /******/ // Store self accepted outdated modules to require them later by the module system
  533. /******/ var outdatedSelfAcceptedModules = [];
  534. /******/ for (i = 0; i < outdatedModules.length; i++) {
  535. /******/ moduleId = outdatedModules[i];
  536. /******/ if (
  537. /******/ installedModules[moduleId] &&
  538. /******/ installedModules[moduleId].hot._selfAccepted &&
  539. /******/ // removed self-accepted modules should not be required
  540. /******/ appliedUpdate[moduleId] !== warnUnexpectedRequire
  541. /******/ ) {
  542. /******/ outdatedSelfAcceptedModules.push({
  543. /******/ module: moduleId,
  544. /******/ errorHandler: installedModules[moduleId].hot._selfAccepted
  545. /******/ });
  546. /******/ }
  547. /******/ }
  548. /******/
  549. /******/ // Now in "dispose" phase
  550. /******/ hotSetStatus("dispose");
  551. /******/ Object.keys(hotAvailableFilesMap).forEach(function(chunkId) {
  552. /******/ if (hotAvailableFilesMap[chunkId] === false) {
  553. /******/ hotDisposeChunk(chunkId);
  554. /******/ }
  555. /******/ });
  556. /******/
  557. /******/ var idx;
  558. /******/ var queue = outdatedModules.slice();
  559. /******/ while (queue.length > 0) {
  560. /******/ moduleId = queue.pop();
  561. /******/ module = installedModules[moduleId];
  562. /******/ if (!module) continue;
  563. /******/
  564. /******/ var data = {};
  565. /******/
  566. /******/ // Call dispose handlers
  567. /******/ var disposeHandlers = module.hot._disposeHandlers;
  568. /******/ for (j = 0; j < disposeHandlers.length; j++) {
  569. /******/ cb = disposeHandlers[j];
  570. /******/ cb(data);
  571. /******/ }
  572. /******/ hotCurrentModuleData[moduleId] = data;
  573. /******/
  574. /******/ // disable module (this disables requires from this module)
  575. /******/ module.hot.active = false;
  576. /******/
  577. /******/ // remove module from cache
  578. /******/ delete installedModules[moduleId];
  579. /******/
  580. /******/ // when disposing there is no need to call dispose handler
  581. /******/ delete outdatedDependencies[moduleId];
  582. /******/
  583. /******/ // remove "parents" references from all children
  584. /******/ for (j = 0; j < module.children.length; j++) {
  585. /******/ var child = installedModules[module.children[j]];
  586. /******/ if (!child) continue;
  587. /******/ idx = child.parents.indexOf(moduleId);
  588. /******/ if (idx >= 0) {
  589. /******/ child.parents.splice(idx, 1);
  590. /******/ }
  591. /******/ }
  592. /******/ }
  593. /******/
  594. /******/ // remove outdated dependency from module children
  595. /******/ var dependency;
  596. /******/ var moduleOutdatedDependencies;
  597. /******/ for (moduleId in outdatedDependencies) {
  598. /******/ if (
  599. /******/ Object.prototype.hasOwnProperty.call(outdatedDependencies, moduleId)
  600. /******/ ) {
  601. /******/ module = installedModules[moduleId];
  602. /******/ if (module) {
  603. /******/ moduleOutdatedDependencies = outdatedDependencies[moduleId];
  604. /******/ for (j = 0; j < moduleOutdatedDependencies.length; j++) {
  605. /******/ dependency = moduleOutdatedDependencies[j];
  606. /******/ idx = module.children.indexOf(dependency);
  607. /******/ if (idx >= 0) module.children.splice(idx, 1);
  608. /******/ }
  609. /******/ }
  610. /******/ }
  611. /******/ }
  612. /******/
  613. /******/ // Now in "apply" phase
  614. /******/ hotSetStatus("apply");
  615. /******/
  616. /******/ hotCurrentHash = hotUpdateNewHash;
  617. /******/
  618. /******/ // insert new code
  619. /******/ for (moduleId in appliedUpdate) {
  620. /******/ if (Object.prototype.hasOwnProperty.call(appliedUpdate, moduleId)) {
  621. /******/ modules[moduleId] = appliedUpdate[moduleId];
  622. /******/ }
  623. /******/ }
  624. /******/
  625. /******/ // call accept handlers
  626. /******/ var error = null;
  627. /******/ for (moduleId in outdatedDependencies) {
  628. /******/ if (
  629. /******/ Object.prototype.hasOwnProperty.call(outdatedDependencies, moduleId)
  630. /******/ ) {
  631. /******/ module = installedModules[moduleId];
  632. /******/ if (module) {
  633. /******/ moduleOutdatedDependencies = outdatedDependencies[moduleId];
  634. /******/ var callbacks = [];
  635. /******/ for (i = 0; i < moduleOutdatedDependencies.length; i++) {
  636. /******/ dependency = moduleOutdatedDependencies[i];
  637. /******/ cb = module.hot._acceptedDependencies[dependency];
  638. /******/ if (cb) {
  639. /******/ if (callbacks.indexOf(cb) !== -1) continue;
  640. /******/ callbacks.push(cb);
  641. /******/ }
  642. /******/ }
  643. /******/ for (i = 0; i < callbacks.length; i++) {
  644. /******/ cb = callbacks[i];
  645. /******/ try {
  646. /******/ cb(moduleOutdatedDependencies);
  647. /******/ } catch (err) {
  648. /******/ if (options.onErrored) {
  649. /******/ options.onErrored({
  650. /******/ type: "accept-errored",
  651. /******/ moduleId: moduleId,
  652. /******/ dependencyId: moduleOutdatedDependencies[i],
  653. /******/ error: err
  654. /******/ });
  655. /******/ }
  656. /******/ if (!options.ignoreErrored) {
  657. /******/ if (!error) error = err;
  658. /******/ }
  659. /******/ }
  660. /******/ }
  661. /******/ }
  662. /******/ }
  663. /******/ }
  664. /******/
  665. /******/ // Load self accepted modules
  666. /******/ for (i = 0; i < outdatedSelfAcceptedModules.length; i++) {
  667. /******/ var item = outdatedSelfAcceptedModules[i];
  668. /******/ moduleId = item.module;
  669. /******/ hotCurrentParents = [moduleId];
  670. /******/ try {
  671. /******/ __webpack_require__(moduleId);
  672. /******/ } catch (err) {
  673. /******/ if (typeof item.errorHandler === "function") {
  674. /******/ try {
  675. /******/ item.errorHandler(err);
  676. /******/ } catch (err2) {
  677. /******/ if (options.onErrored) {
  678. /******/ options.onErrored({
  679. /******/ type: "self-accept-error-handler-errored",
  680. /******/ moduleId: moduleId,
  681. /******/ error: err2,
  682. /******/ originalError: err
  683. /******/ });
  684. /******/ }
  685. /******/ if (!options.ignoreErrored) {
  686. /******/ if (!error) error = err2;
  687. /******/ }
  688. /******/ if (!error) error = err;
  689. /******/ }
  690. /******/ } else {
  691. /******/ if (options.onErrored) {
  692. /******/ options.onErrored({
  693. /******/ type: "self-accept-errored",
  694. /******/ moduleId: moduleId,
  695. /******/ error: err
  696. /******/ });
  697. /******/ }
  698. /******/ if (!options.ignoreErrored) {
  699. /******/ if (!error) error = err;
  700. /******/ }
  701. /******/ }
  702. /******/ }
  703. /******/ }
  704. /******/
  705. /******/ // handle errors in accept handlers and self accepted module load
  706. /******/ if (error) {
  707. /******/ hotSetStatus("fail");
  708. /******/ return Promise.reject(error);
  709. /******/ }
  710. /******/
  711. /******/ hotSetStatus("idle");
  712. /******/ return new Promise(function(resolve) {
  713. /******/ resolve(outdatedModules);
  714. /******/ });
  715. /******/ }
  716. /******/
  717. /******/ // The module cache
  718. /******/ var installedModules = {};
  719. /******/
  720. /******/ // The require function
  721. /******/ function __webpack_require__(moduleId) {
  722. /******/
  723. /******/ // Check if module is in cache
  724. /******/ if(installedModules[moduleId]) {
  725. /******/ return installedModules[moduleId].exports;
  726. /******/ }
  727. /******/ // Create a new module (and put it into the cache)
  728. /******/ var module = installedModules[moduleId] = {
  729. /******/ i: moduleId,
  730. /******/ l: false,
  731. /******/ exports: {},
  732. /******/ hot: hotCreateModule(moduleId),
  733. /******/ parents: (hotCurrentParentsTemp = hotCurrentParents, hotCurrentParents = [], hotCurrentParentsTemp),
  734. /******/ children: []
  735. /******/ };
  736. /******/
  737. /******/ // Execute the module function
  738. /******/ modules[moduleId].call(module.exports, module, module.exports, hotCreateRequire(moduleId));
  739. /******/
  740. /******/ // Flag the module as loaded
  741. /******/ module.l = true;
  742. /******/
  743. /******/ // Return the exports of the module
  744. /******/ return module.exports;
  745. /******/ }
  746. /******/
  747. /******/
  748. /******/ // expose the modules object (__webpack_modules__)
  749. /******/ __webpack_require__.m = modules;
  750. /******/
  751. /******/ // expose the module cache
  752. /******/ __webpack_require__.c = installedModules;
  753. /******/
  754. /******/ // define getter function for harmony exports
  755. /******/ __webpack_require__.d = function(exports, name, getter) {
  756. /******/ if(!__webpack_require__.o(exports, name)) {
  757. /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
  758. /******/ }
  759. /******/ };
  760. /******/
  761. /******/ // define __esModule on exports
  762. /******/ __webpack_require__.r = function(exports) {
  763. /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
  764. /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
  765. /******/ }
  766. /******/ Object.defineProperty(exports, '__esModule', { value: true });
  767. /******/ };
  768. /******/
  769. /******/ // create a fake namespace object
  770. /******/ // mode & 1: value is a module id, require it
  771. /******/ // mode & 2: merge all properties of value into the ns
  772. /******/ // mode & 4: return value when already ns object
  773. /******/ // mode & 8|1: behave like require
  774. /******/ __webpack_require__.t = function(value, mode) {
  775. /******/ if(mode & 1) value = __webpack_require__(value);
  776. /******/ if(mode & 8) return value;
  777. /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
  778. /******/ var ns = Object.create(null);
  779. /******/ __webpack_require__.r(ns);
  780. /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
  781. /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
  782. /******/ return ns;
  783. /******/ };
  784. /******/
  785. /******/ // getDefaultExport function for compatibility with non-harmony modules
  786. /******/ __webpack_require__.n = function(module) {
  787. /******/ var getter = module && module.__esModule ?
  788. /******/ function getDefault() { return module['default']; } :
  789. /******/ function getModuleExports() { return module; };
  790. /******/ __webpack_require__.d(getter, 'a', getter);
  791. /******/ return getter;
  792. /******/ };
  793. /******/
  794. /******/ // Object.prototype.hasOwnProperty.call
  795. /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
  796. /******/
  797. /******/ // __webpack_public_path__
  798. /******/ __webpack_require__.p = "";
  799. /******/
  800. /******/ // __webpack_hash__
  801. /******/ __webpack_require__.h = function() { return hotCurrentHash; };
  802. /******/
  803. /******/
  804. /******/ // Load entry module and return exports
  805. /******/ return hotCreateRequire("./index.js")(__webpack_require__.s = "./index.js");
  806. /******/ })
  807. /************************************************************************/
  808. /******/ ({
  809. /***/ "../node_modules/@babel/runtime/helpers/arrayWithHoles.js":
  810. /*!****************************************************************!*\
  811. !*** ../node_modules/@babel/runtime/helpers/arrayWithHoles.js ***!
  812. \****************************************************************/
  813. /*! no static exports found */
  814. /***/ (function(module, exports) {
  815. function _arrayWithHoles(arr) {
  816. if (Array.isArray(arr)) return arr;
  817. }
  818. module.exports = _arrayWithHoles;
  819. /***/ }),
  820. /***/ "../node_modules/@babel/runtime/helpers/arrayWithoutHoles.js":
  821. /*!*******************************************************************!*\
  822. !*** ../node_modules/@babel/runtime/helpers/arrayWithoutHoles.js ***!
  823. \*******************************************************************/
  824. /*! no static exports found */
  825. /***/ (function(module, exports) {
  826. function _arrayWithoutHoles(arr) {
  827. if (Array.isArray(arr)) {
  828. for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) {
  829. arr2[i] = arr[i];
  830. }
  831. return arr2;
  832. }
  833. }
  834. module.exports = _arrayWithoutHoles;
  835. /***/ }),
  836. /***/ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js":
  837. /*!***********************************************************************!*\
  838. !*** ../node_modules/@babel/runtime/helpers/assertThisInitialized.js ***!
  839. \***********************************************************************/
  840. /*! no static exports found */
  841. /***/ (function(module, exports) {
  842. function _assertThisInitialized(self) {
  843. if (self === void 0) {
  844. throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
  845. }
  846. return self;
  847. }
  848. module.exports = _assertThisInitialized;
  849. /***/ }),
  850. /***/ "../node_modules/@babel/runtime/helpers/asyncToGenerator.js":
  851. /*!******************************************************************!*\
  852. !*** ../node_modules/@babel/runtime/helpers/asyncToGenerator.js ***!
  853. \******************************************************************/
  854. /*! no static exports found */
  855. /***/ (function(module, exports) {
  856. function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
  857. try {
  858. var info = gen[key](arg);
  859. var value = info.value;
  860. } catch (error) {
  861. reject(error);
  862. return;
  863. }
  864. if (info.done) {
  865. resolve(value);
  866. } else {
  867. Promise.resolve(value).then(_next, _throw);
  868. }
  869. }
  870. function _asyncToGenerator(fn) {
  871. return function () {
  872. var self = this,
  873. args = arguments;
  874. return new Promise(function (resolve, reject) {
  875. var gen = fn.apply(self, args);
  876. function _next(value) {
  877. asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
  878. }
  879. function _throw(err) {
  880. asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
  881. }
  882. _next(undefined);
  883. });
  884. };
  885. }
  886. module.exports = _asyncToGenerator;
  887. /***/ }),
  888. /***/ "../node_modules/@babel/runtime/helpers/classCallCheck.js":
  889. /*!****************************************************************!*\
  890. !*** ../node_modules/@babel/runtime/helpers/classCallCheck.js ***!
  891. \****************************************************************/
  892. /*! no static exports found */
  893. /***/ (function(module, exports) {
  894. function _classCallCheck(instance, Constructor) {
  895. if (!(instance instanceof Constructor)) {
  896. throw new TypeError("Cannot call a class as a function");
  897. }
  898. }
  899. module.exports = _classCallCheck;
  900. /***/ }),
  901. /***/ "../node_modules/@babel/runtime/helpers/createClass.js":
  902. /*!*************************************************************!*\
  903. !*** ../node_modules/@babel/runtime/helpers/createClass.js ***!
  904. \*************************************************************/
  905. /*! no static exports found */
  906. /***/ (function(module, exports) {
  907. function _defineProperties(target, props) {
  908. for (var i = 0; i < props.length; i++) {
  909. var descriptor = props[i];
  910. descriptor.enumerable = descriptor.enumerable || false;
  911. descriptor.configurable = true;
  912. if ("value" in descriptor) descriptor.writable = true;
  913. Object.defineProperty(target, descriptor.key, descriptor);
  914. }
  915. }
  916. function _createClass(Constructor, protoProps, staticProps) {
  917. if (protoProps) _defineProperties(Constructor.prototype, protoProps);
  918. if (staticProps) _defineProperties(Constructor, staticProps);
  919. return Constructor;
  920. }
  921. module.exports = _createClass;
  922. /***/ }),
  923. /***/ "../node_modules/@babel/runtime/helpers/defineProperty.js":
  924. /*!****************************************************************!*\
  925. !*** ../node_modules/@babel/runtime/helpers/defineProperty.js ***!
  926. \****************************************************************/
  927. /*! no static exports found */
  928. /***/ (function(module, exports) {
  929. function _defineProperty(obj, key, value) {
  930. if (key in obj) {
  931. Object.defineProperty(obj, key, {
  932. value: value,
  933. enumerable: true,
  934. configurable: true,
  935. writable: true
  936. });
  937. } else {
  938. obj[key] = value;
  939. }
  940. return obj;
  941. }
  942. module.exports = _defineProperty;
  943. /***/ }),
  944. /***/ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js":
  945. /*!****************************************************************!*\
  946. !*** ../node_modules/@babel/runtime/helpers/getPrototypeOf.js ***!
  947. \****************************************************************/
  948. /*! no static exports found */
  949. /***/ (function(module, exports) {
  950. function _getPrototypeOf(o) {
  951. module.exports = _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
  952. return o.__proto__ || Object.getPrototypeOf(o);
  953. };
  954. return _getPrototypeOf(o);
  955. }
  956. module.exports = _getPrototypeOf;
  957. /***/ }),
  958. /***/ "../node_modules/@babel/runtime/helpers/inherits.js":
  959. /*!**********************************************************!*\
  960. !*** ../node_modules/@babel/runtime/helpers/inherits.js ***!
  961. \**********************************************************/
  962. /*! no static exports found */
  963. /***/ (function(module, exports, __webpack_require__) {
  964. var setPrototypeOf = __webpack_require__(/*! ./setPrototypeOf */ "../node_modules/@babel/runtime/helpers/setPrototypeOf.js");
  965. function _inherits(subClass, superClass) {
  966. if (typeof superClass !== "function" && superClass !== null) {
  967. throw new TypeError("Super expression must either be null or a function");
  968. }
  969. subClass.prototype = Object.create(superClass && superClass.prototype, {
  970. constructor: {
  971. value: subClass,
  972. writable: true,
  973. configurable: true
  974. }
  975. });
  976. if (superClass) setPrototypeOf(subClass, superClass);
  977. }
  978. module.exports = _inherits;
  979. /***/ }),
  980. /***/ "../node_modules/@babel/runtime/helpers/iterableToArray.js":
  981. /*!*****************************************************************!*\
  982. !*** ../node_modules/@babel/runtime/helpers/iterableToArray.js ***!
  983. \*****************************************************************/
  984. /*! no static exports found */
  985. /***/ (function(module, exports) {
  986. function _iterableToArray(iter) {
  987. if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter);
  988. }
  989. module.exports = _iterableToArray;
  990. /***/ }),
  991. /***/ "../node_modules/@babel/runtime/helpers/iterableToArrayLimit.js":
  992. /*!**********************************************************************!*\
  993. !*** ../node_modules/@babel/runtime/helpers/iterableToArrayLimit.js ***!
  994. \**********************************************************************/
  995. /*! no static exports found */
  996. /***/ (function(module, exports) {
  997. function _iterableToArrayLimit(arr, i) {
  998. var _arr = [];
  999. var _n = true;
  1000. var _d = false;
  1001. var _e = undefined;
  1002. try {
  1003. for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
  1004. _arr.push(_s.value);
  1005. if (i && _arr.length === i) break;
  1006. }
  1007. } catch (err) {
  1008. _d = true;
  1009. _e = err;
  1010. } finally {
  1011. try {
  1012. if (!_n && _i["return"] != null) _i["return"]();
  1013. } finally {
  1014. if (_d) throw _e;
  1015. }
  1016. }
  1017. return _arr;
  1018. }
  1019. module.exports = _iterableToArrayLimit;
  1020. /***/ }),
  1021. /***/ "../node_modules/@babel/runtime/helpers/nonIterableRest.js":
  1022. /*!*****************************************************************!*\
  1023. !*** ../node_modules/@babel/runtime/helpers/nonIterableRest.js ***!
  1024. \*****************************************************************/
  1025. /*! no static exports found */
  1026. /***/ (function(module, exports) {
  1027. function _nonIterableRest() {
  1028. throw new TypeError("Invalid attempt to destructure non-iterable instance");
  1029. }
  1030. module.exports = _nonIterableRest;
  1031. /***/ }),
  1032. /***/ "../node_modules/@babel/runtime/helpers/nonIterableSpread.js":
  1033. /*!*******************************************************************!*\
  1034. !*** ../node_modules/@babel/runtime/helpers/nonIterableSpread.js ***!
  1035. \*******************************************************************/
  1036. /*! no static exports found */
  1037. /***/ (function(module, exports) {
  1038. function _nonIterableSpread() {
  1039. throw new TypeError("Invalid attempt to spread non-iterable instance");
  1040. }
  1041. module.exports = _nonIterableSpread;
  1042. /***/ }),
  1043. /***/ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js":
  1044. /*!***************************************************************************!*\
  1045. !*** ../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js ***!
  1046. \***************************************************************************/
  1047. /*! no static exports found */
  1048. /***/ (function(module, exports, __webpack_require__) {
  1049. var _typeof = __webpack_require__(/*! ../helpers/typeof */ "../node_modules/@babel/runtime/helpers/typeof.js");
  1050. var assertThisInitialized = __webpack_require__(/*! ./assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js");
  1051. function _possibleConstructorReturn(self, call) {
  1052. if (call && (_typeof(call) === "object" || typeof call === "function")) {
  1053. return call;
  1054. }
  1055. return assertThisInitialized(self);
  1056. }
  1057. module.exports = _possibleConstructorReturn;
  1058. /***/ }),
  1059. /***/ "../node_modules/@babel/runtime/helpers/setPrototypeOf.js":
  1060. /*!****************************************************************!*\
  1061. !*** ../node_modules/@babel/runtime/helpers/setPrototypeOf.js ***!
  1062. \****************************************************************/
  1063. /*! no static exports found */
  1064. /***/ (function(module, exports) {
  1065. function _setPrototypeOf(o, p) {
  1066. module.exports = _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
  1067. o.__proto__ = p;
  1068. return o;
  1069. };
  1070. return _setPrototypeOf(o, p);
  1071. }
  1072. module.exports = _setPrototypeOf;
  1073. /***/ }),
  1074. /***/ "../node_modules/@babel/runtime/helpers/slicedToArray.js":
  1075. /*!***************************************************************!*\
  1076. !*** ../node_modules/@babel/runtime/helpers/slicedToArray.js ***!
  1077. \***************************************************************/
  1078. /*! no static exports found */
  1079. /***/ (function(module, exports, __webpack_require__) {
  1080. var arrayWithHoles = __webpack_require__(/*! ./arrayWithHoles */ "../node_modules/@babel/runtime/helpers/arrayWithHoles.js");
  1081. var iterableToArrayLimit = __webpack_require__(/*! ./iterableToArrayLimit */ "../node_modules/@babel/runtime/helpers/iterableToArrayLimit.js");
  1082. var nonIterableRest = __webpack_require__(/*! ./nonIterableRest */ "../node_modules/@babel/runtime/helpers/nonIterableRest.js");
  1083. function _slicedToArray(arr, i) {
  1084. return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || nonIterableRest();
  1085. }
  1086. module.exports = _slicedToArray;
  1087. /***/ }),
  1088. /***/ "../node_modules/@babel/runtime/helpers/toConsumableArray.js":
  1089. /*!*******************************************************************!*\
  1090. !*** ../node_modules/@babel/runtime/helpers/toConsumableArray.js ***!
  1091. \*******************************************************************/
  1092. /*! no static exports found */
  1093. /***/ (function(module, exports, __webpack_require__) {
  1094. var arrayWithoutHoles = __webpack_require__(/*! ./arrayWithoutHoles */ "../node_modules/@babel/runtime/helpers/arrayWithoutHoles.js");
  1095. var iterableToArray = __webpack_require__(/*! ./iterableToArray */ "../node_modules/@babel/runtime/helpers/iterableToArray.js");
  1096. var nonIterableSpread = __webpack_require__(/*! ./nonIterableSpread */ "../node_modules/@babel/runtime/helpers/nonIterableSpread.js");
  1097. function _toConsumableArray(arr) {
  1098. return arrayWithoutHoles(arr) || iterableToArray(arr) || nonIterableSpread();
  1099. }
  1100. module.exports = _toConsumableArray;
  1101. /***/ }),
  1102. /***/ "../node_modules/@babel/runtime/helpers/typeof.js":
  1103. /*!********************************************************!*\
  1104. !*** ../node_modules/@babel/runtime/helpers/typeof.js ***!
  1105. \********************************************************/
  1106. /*! no static exports found */
  1107. /***/ (function(module, exports) {
  1108. function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof2 = function _typeof2(obj) { return typeof obj; }; } else { _typeof2 = function _typeof2(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof2(obj); }
  1109. function _typeof(obj) {
  1110. if (typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol") {
  1111. module.exports = _typeof = function _typeof(obj) {
  1112. return _typeof2(obj);
  1113. };
  1114. } else {
  1115. module.exports = _typeof = function _typeof(obj) {
  1116. return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : _typeof2(obj);
  1117. };
  1118. }
  1119. return _typeof(obj);
  1120. }
  1121. module.exports = _typeof;
  1122. /***/ }),
  1123. /***/ "../node_modules/@babel/runtime/regenerator/index.js":
  1124. /*!***********************************************************!*\
  1125. !*** ../node_modules/@babel/runtime/regenerator/index.js ***!
  1126. \***********************************************************/
  1127. /*! no static exports found */
  1128. /***/ (function(module, exports, __webpack_require__) {
  1129. module.exports = __webpack_require__(/*! regenerator-runtime */ "../node_modules/regenerator-runtime/runtime-module.js");
  1130. /***/ }),
  1131. /***/ "../node_modules/ms/index.js":
  1132. /*!***********************************!*\
  1133. !*** ../node_modules/ms/index.js ***!
  1134. \***********************************/
  1135. /*! no static exports found */
  1136. /***/ (function(module, exports) {
  1137. /**
  1138. * Helpers.
  1139. */
  1140. var s = 1000;
  1141. var m = s * 60;
  1142. var h = m * 60;
  1143. var d = h * 24;
  1144. var w = d * 7;
  1145. var y = d * 365.25;
  1146. /**
  1147. * Parse or format the given `val`.
  1148. *
  1149. * Options:
  1150. *
  1151. * - `long` verbose formatting [false]
  1152. *
  1153. * @param {String|Number} val
  1154. * @param {Object} [options]
  1155. * @throws {Error} throw an error if val is not a non-empty string or a number
  1156. * @return {String|Number}
  1157. * @api public
  1158. */
  1159. module.exports = function(val, options) {
  1160. options = options || {};
  1161. var type = typeof val;
  1162. if (type === 'string' && val.length > 0) {
  1163. return parse(val);
  1164. } else if (type === 'number' && isFinite(val)) {
  1165. return options.long ? fmtLong(val) : fmtShort(val);
  1166. }
  1167. throw new Error(
  1168. 'val is not a non-empty string or a valid number. val=' +
  1169. JSON.stringify(val)
  1170. );
  1171. };
  1172. /**
  1173. * Parse the given `str` and return milliseconds.
  1174. *
  1175. * @param {String} str
  1176. * @return {Number}
  1177. * @api private
  1178. */
  1179. function parse(str) {
  1180. str = String(str);
  1181. if (str.length > 100) {
  1182. return;
  1183. }
  1184. var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(
  1185. str
  1186. );
  1187. if (!match) {
  1188. return;
  1189. }
  1190. var n = parseFloat(match[1]);
  1191. var type = (match[2] || 'ms').toLowerCase();
  1192. switch (type) {
  1193. case 'years':
  1194. case 'year':
  1195. case 'yrs':
  1196. case 'yr':
  1197. case 'y':
  1198. return n * y;
  1199. case 'weeks':
  1200. case 'week':
  1201. case 'w':
  1202. return n * w;
  1203. case 'days':
  1204. case 'day':
  1205. case 'd':
  1206. return n * d;
  1207. case 'hours':
  1208. case 'hour':
  1209. case 'hrs':
  1210. case 'hr':
  1211. case 'h':
  1212. return n * h;
  1213. case 'minutes':
  1214. case 'minute':
  1215. case 'mins':
  1216. case 'min':
  1217. case 'm':
  1218. return n * m;
  1219. case 'seconds':
  1220. case 'second':
  1221. case 'secs':
  1222. case 'sec':
  1223. case 's':
  1224. return n * s;
  1225. case 'milliseconds':
  1226. case 'millisecond':
  1227. case 'msecs':
  1228. case 'msec':
  1229. case 'ms':
  1230. return n;
  1231. default:
  1232. return undefined;
  1233. }
  1234. }
  1235. /**
  1236. * Short format for `ms`.
  1237. *
  1238. * @param {Number} ms
  1239. * @return {String}
  1240. * @api private
  1241. */
  1242. function fmtShort(ms) {
  1243. var msAbs = Math.abs(ms);
  1244. if (msAbs >= d) {
  1245. return Math.round(ms / d) + 'd';
  1246. }
  1247. if (msAbs >= h) {
  1248. return Math.round(ms / h) + 'h';
  1249. }
  1250. if (msAbs >= m) {
  1251. return Math.round(ms / m) + 'm';
  1252. }
  1253. if (msAbs >= s) {
  1254. return Math.round(ms / s) + 's';
  1255. }
  1256. return ms + 'ms';
  1257. }
  1258. /**
  1259. * Long format for `ms`.
  1260. *
  1261. * @param {Number} ms
  1262. * @return {String}
  1263. * @api private
  1264. */
  1265. function fmtLong(ms) {
  1266. var msAbs = Math.abs(ms);
  1267. if (msAbs >= d) {
  1268. return plural(ms, msAbs, d, 'day');
  1269. }
  1270. if (msAbs >= h) {
  1271. return plural(ms, msAbs, h, 'hour');
  1272. }
  1273. if (msAbs >= m) {
  1274. return plural(ms, msAbs, m, 'minute');
  1275. }
  1276. if (msAbs >= s) {
  1277. return plural(ms, msAbs, s, 'second');
  1278. }
  1279. return ms + ' ms';
  1280. }
  1281. /**
  1282. * Pluralization helper.
  1283. */
  1284. function plural(ms, msAbs, n, name) {
  1285. var isPlural = msAbs >= n * 1.5;
  1286. return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');
  1287. }
  1288. /***/ }),
  1289. /***/ "../node_modules/process/browser.js":
  1290. /*!******************************************!*\
  1291. !*** ../node_modules/process/browser.js ***!
  1292. \******************************************/
  1293. /*! no static exports found */
  1294. /***/ (function(module, exports) {
  1295. // shim for using process in browser
  1296. var process = module.exports = {};
  1297. // cached from whatever global is present so that test runners that stub it
  1298. // don't break things. But we need to wrap it in a try catch in case it is
  1299. // wrapped in strict mode code which doesn't define any globals. It's inside a
  1300. // function because try/catches deoptimize in certain engines.
  1301. var cachedSetTimeout;
  1302. var cachedClearTimeout;
  1303. function defaultSetTimout() {
  1304. throw new Error('setTimeout has not been defined');
  1305. }
  1306. function defaultClearTimeout () {
  1307. throw new Error('clearTimeout has not been defined');
  1308. }
  1309. (function () {
  1310. try {
  1311. if (typeof setTimeout === 'function') {
  1312. cachedSetTimeout = setTimeout;
  1313. } else {
  1314. cachedSetTimeout = defaultSetTimout;
  1315. }
  1316. } catch (e) {
  1317. cachedSetTimeout = defaultSetTimout;
  1318. }
  1319. try {
  1320. if (typeof clearTimeout === 'function') {
  1321. cachedClearTimeout = clearTimeout;
  1322. } else {
  1323. cachedClearTimeout = defaultClearTimeout;
  1324. }
  1325. } catch (e) {
  1326. cachedClearTimeout = defaultClearTimeout;
  1327. }
  1328. } ())
  1329. function runTimeout(fun) {
  1330. if (cachedSetTimeout === setTimeout) {
  1331. //normal enviroments in sane situations
  1332. return setTimeout(fun, 0);
  1333. }
  1334. // if setTimeout wasn't available but was latter defined
  1335. if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
  1336. cachedSetTimeout = setTimeout;
  1337. return setTimeout(fun, 0);
  1338. }
  1339. try {
  1340. // when when somebody has screwed with setTimeout but no I.E. maddness
  1341. return cachedSetTimeout(fun, 0);
  1342. } catch(e){
  1343. try {
  1344. // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
  1345. return cachedSetTimeout.call(null, fun, 0);
  1346. } catch(e){
  1347. // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
  1348. return cachedSetTimeout.call(this, fun, 0);
  1349. }
  1350. }
  1351. }
  1352. function runClearTimeout(marker) {
  1353. if (cachedClearTimeout === clearTimeout) {
  1354. //normal enviroments in sane situations
  1355. return clearTimeout(marker);
  1356. }
  1357. // if clearTimeout wasn't available but was latter defined
  1358. if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
  1359. cachedClearTimeout = clearTimeout;
  1360. return clearTimeout(marker);
  1361. }
  1362. try {
  1363. // when when somebody has screwed with setTimeout but no I.E. maddness
  1364. return cachedClearTimeout(marker);
  1365. } catch (e){
  1366. try {
  1367. // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
  1368. return cachedClearTimeout.call(null, marker);
  1369. } catch (e){
  1370. // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
  1371. // Some versions of I.E. have different rules for clearTimeout vs setTimeout
  1372. return cachedClearTimeout.call(this, marker);
  1373. }
  1374. }
  1375. }
  1376. var queue = [];
  1377. var draining = false;
  1378. var currentQueue;
  1379. var queueIndex = -1;
  1380. function cleanUpNextTick() {
  1381. if (!draining || !currentQueue) {
  1382. return;
  1383. }
  1384. draining = false;
  1385. if (currentQueue.length) {
  1386. queue = currentQueue.concat(queue);
  1387. } else {
  1388. queueIndex = -1;
  1389. }
  1390. if (queue.length) {
  1391. drainQueue();
  1392. }
  1393. }
  1394. function drainQueue() {
  1395. if (draining) {
  1396. return;
  1397. }
  1398. var timeout = runTimeout(cleanUpNextTick);
  1399. draining = true;
  1400. var len = queue.length;
  1401. while(len) {
  1402. currentQueue = queue;
  1403. queue = [];
  1404. while (++queueIndex < len) {
  1405. if (currentQueue) {
  1406. currentQueue[queueIndex].run();
  1407. }
  1408. }
  1409. queueIndex = -1;
  1410. len = queue.length;
  1411. }
  1412. currentQueue = null;
  1413. draining = false;
  1414. runClearTimeout(timeout);
  1415. }
  1416. process.nextTick = function (fun) {
  1417. var args = new Array(arguments.length - 1);
  1418. if (arguments.length > 1) {
  1419. for (var i = 1; i < arguments.length; i++) {
  1420. args[i - 1] = arguments[i];
  1421. }
  1422. }
  1423. queue.push(new Item(fun, args));
  1424. if (queue.length === 1 && !draining) {
  1425. runTimeout(drainQueue);
  1426. }
  1427. };
  1428. // v8 likes predictible objects
  1429. function Item(fun, array) {
  1430. this.fun = fun;
  1431. this.array = array;
  1432. }
  1433. Item.prototype.run = function () {
  1434. this.fun.apply(null, this.array);
  1435. };
  1436. process.title = 'browser';
  1437. process.browser = true;
  1438. process.env = {};
  1439. process.argv = [];
  1440. process.version = ''; // empty string to avoid regexp issues
  1441. process.versions = {};
  1442. function noop() {}
  1443. process.on = noop;
  1444. process.addListener = noop;
  1445. process.once = noop;
  1446. process.off = noop;
  1447. process.removeListener = noop;
  1448. process.removeAllListeners = noop;
  1449. process.emit = noop;
  1450. process.prependListener = noop;
  1451. process.prependOnceListener = noop;
  1452. process.listeners = function (name) { return [] }
  1453. process.binding = function (name) {
  1454. throw new Error('process.binding is not supported');
  1455. };
  1456. process.cwd = function () { return '/' };
  1457. process.chdir = function (dir) {
  1458. throw new Error('process.chdir is not supported');
  1459. };
  1460. process.umask = function() { return 0; };
  1461. /***/ }),
  1462. /***/ "../node_modules/regenerator-runtime/runtime-module.js":
  1463. /*!*************************************************************!*\
  1464. !*** ../node_modules/regenerator-runtime/runtime-module.js ***!
  1465. \*************************************************************/
  1466. /*! no static exports found */
  1467. /***/ (function(module, exports, __webpack_require__) {
  1468. /**
  1469. * Copyright (c) 2014-present, Facebook, Inc.
  1470. *
  1471. * This source code is licensed under the MIT license found in the
  1472. * LICENSE file in the root directory of this source tree.
  1473. */
  1474. // This method of obtaining a reference to the global object needs to be
  1475. // kept identical to the way it is obtained in runtime.js
  1476. var g = (function() {
  1477. return this || (typeof self === "object" && self);
  1478. })() || Function("return this")();
  1479. // Use `getOwnPropertyNames` because not all browsers support calling
  1480. // `hasOwnProperty` on the global `self` object in a worker. See #183.
  1481. var hadRuntime = g.regeneratorRuntime &&
  1482. Object.getOwnPropertyNames(g).indexOf("regeneratorRuntime") >= 0;
  1483. // Save the old regeneratorRuntime in case it needs to be restored later.
  1484. var oldRuntime = hadRuntime && g.regeneratorRuntime;
  1485. // Force reevalutation of runtime.js.
  1486. g.regeneratorRuntime = undefined;
  1487. module.exports = __webpack_require__(/*! ./runtime */ "../node_modules/regenerator-runtime/runtime.js");
  1488. if (hadRuntime) {
  1489. // Restore the original runtime.
  1490. g.regeneratorRuntime = oldRuntime;
  1491. } else {
  1492. // Remove the global property added by runtime.js.
  1493. try {
  1494. delete g.regeneratorRuntime;
  1495. } catch(e) {
  1496. g.regeneratorRuntime = undefined;
  1497. }
  1498. }
  1499. /***/ }),
  1500. /***/ "../node_modules/regenerator-runtime/runtime.js":
  1501. /*!******************************************************!*\
  1502. !*** ../node_modules/regenerator-runtime/runtime.js ***!
  1503. \******************************************************/
  1504. /*! no static exports found */
  1505. /***/ (function(module, exports) {
  1506. /**
  1507. * Copyright (c) 2014-present, Facebook, Inc.
  1508. *
  1509. * This source code is licensed under the MIT license found in the
  1510. * LICENSE file in the root directory of this source tree.
  1511. */
  1512. !(function(global) {
  1513. "use strict";
  1514. var Op = Object.prototype;
  1515. var hasOwn = Op.hasOwnProperty;
  1516. var undefined; // More compressible than void 0.
  1517. var $Symbol = typeof Symbol === "function" ? Symbol : {};
  1518. var iteratorSymbol = $Symbol.iterator || "@@iterator";
  1519. var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator";
  1520. var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";
  1521. var inModule = typeof module === "object";
  1522. var runtime = global.regeneratorRuntime;
  1523. if (runtime) {
  1524. if (inModule) {
  1525. // If regeneratorRuntime is defined globally and we're in a module,
  1526. // make the exports object identical to regeneratorRuntime.
  1527. module.exports = runtime;
  1528. }
  1529. // Don't bother evaluating the rest of this file if the runtime was
  1530. // already defined globally.
  1531. return;
  1532. }
  1533. // Define the runtime globally (as expected by generated code) as either
  1534. // module.exports (if we're in a module) or a new, empty object.
  1535. runtime = global.regeneratorRuntime = inModule ? module.exports : {};
  1536. function wrap(innerFn, outerFn, self, tryLocsList) {
  1537. // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.
  1538. var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;
  1539. var generator = Object.create(protoGenerator.prototype);
  1540. var context = new Context(tryLocsList || []);
  1541. // The ._invoke method unifies the implementations of the .next,
  1542. // .throw, and .return methods.
  1543. generator._invoke = makeInvokeMethod(innerFn, self, context);
  1544. return generator;
  1545. }
  1546. runtime.wrap = wrap;
  1547. // Try/catch helper to minimize deoptimizations. Returns a completion
  1548. // record like context.tryEntries[i].completion. This interface could
  1549. // have been (and was previously) designed to take a closure to be
  1550. // invoked without arguments, but in all the cases we care about we
  1551. // already have an existing method we want to call, so there's no need
  1552. // to create a new function object. We can even get away with assuming
  1553. // the method takes exactly one argument, since that happens to be true
  1554. // in every case, so we don't have to touch the arguments object. The
  1555. // only additional allocation required is the completion record, which
  1556. // has a stable shape and so hopefully should be cheap to allocate.
  1557. function tryCatch(fn, obj, arg) {
  1558. try {
  1559. return { type: "normal", arg: fn.call(obj, arg) };
  1560. } catch (err) {
  1561. return { type: "throw", arg: err };
  1562. }
  1563. }
  1564. var GenStateSuspendedStart = "suspendedStart";
  1565. var GenStateSuspendedYield = "suspendedYield";
  1566. var GenStateExecuting = "executing";
  1567. var GenStateCompleted = "completed";
  1568. // Returning this object from the innerFn has the same effect as
  1569. // breaking out of the dispatch switch statement.
  1570. var ContinueSentinel = {};
  1571. // Dummy constructor functions that we use as the .constructor and
  1572. // .constructor.prototype properties for functions that return Generator
  1573. // objects. For full spec compliance, you may wish to configure your
  1574. // minifier not to mangle the names of these two functions.
  1575. function Generator() {}
  1576. function GeneratorFunction() {}
  1577. function GeneratorFunctionPrototype() {}
  1578. // This is a polyfill for %IteratorPrototype% for environments that
  1579. // don't natively support it.
  1580. var IteratorPrototype = {};
  1581. IteratorPrototype[iteratorSymbol] = function () {
  1582. return this;
  1583. };
  1584. var getProto = Object.getPrototypeOf;
  1585. var NativeIteratorPrototype = getProto && getProto(getProto(values([])));
  1586. if (NativeIteratorPrototype &&
  1587. NativeIteratorPrototype !== Op &&
  1588. hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {
  1589. // This environment has a native %IteratorPrototype%; use it instead
  1590. // of the polyfill.
  1591. IteratorPrototype = NativeIteratorPrototype;
  1592. }
  1593. var Gp = GeneratorFunctionPrototype.prototype =
  1594. Generator.prototype = Object.create(IteratorPrototype);
  1595. GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;
  1596. GeneratorFunctionPrototype.constructor = GeneratorFunction;
  1597. GeneratorFunctionPrototype[toStringTagSymbol] =
  1598. GeneratorFunction.displayName = "GeneratorFunction";
  1599. // Helper for defining the .next, .throw, and .return methods of the
  1600. // Iterator interface in terms of a single ._invoke method.
  1601. function defineIteratorMethods(prototype) {
  1602. ["next", "throw", "return"].forEach(function(method) {
  1603. prototype[method] = function(arg) {
  1604. return this._invoke(method, arg);
  1605. };
  1606. });
  1607. }
  1608. runtime.isGeneratorFunction = function(genFun) {
  1609. var ctor = typeof genFun === "function" && genFun.constructor;
  1610. return ctor
  1611. ? ctor === GeneratorFunction ||
  1612. // For the native GeneratorFunction constructor, the best we can
  1613. // do is to check its .name property.
  1614. (ctor.displayName || ctor.name) === "GeneratorFunction"
  1615. : false;
  1616. };
  1617. runtime.mark = function(genFun) {
  1618. if (Object.setPrototypeOf) {
  1619. Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);
  1620. } else {
  1621. genFun.__proto__ = GeneratorFunctionPrototype;
  1622. if (!(toStringTagSymbol in genFun)) {
  1623. genFun[toStringTagSymbol] = "GeneratorFunction";
  1624. }
  1625. }
  1626. genFun.prototype = Object.create(Gp);
  1627. return genFun;
  1628. };
  1629. // Within the body of any async function, `await x` is transformed to
  1630. // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test
  1631. // `hasOwn.call(value, "__await")` to determine if the yielded value is
  1632. // meant to be awaited.
  1633. runtime.awrap = function(arg) {
  1634. return { __await: arg };
  1635. };
  1636. function AsyncIterator(generator) {
  1637. function invoke(method, arg, resolve, reject) {
  1638. var record = tryCatch(generator[method], generator, arg);
  1639. if (record.type === "throw") {
  1640. reject(record.arg);
  1641. } else {
  1642. var result = record.arg;
  1643. var value = result.value;
  1644. if (value &&
  1645. typeof value === "object" &&
  1646. hasOwn.call(value, "__await")) {
  1647. return Promise.resolve(value.__await).then(function(value) {
  1648. invoke("next", value, resolve, reject);
  1649. }, function(err) {
  1650. invoke("throw", err, resolve, reject);
  1651. });
  1652. }
  1653. return Promise.resolve(value).then(function(unwrapped) {
  1654. // When a yielded Promise is resolved, its final value becomes
  1655. // the .value of the Promise<{value,done}> result for the
  1656. // current iteration.
  1657. result.value = unwrapped;
  1658. resolve(result);
  1659. }, function(error) {
  1660. // If a rejected Promise was yielded, throw the rejection back
  1661. // into the async generator function so it can be handled there.
  1662. return invoke("throw", error, resolve, reject);
  1663. });
  1664. }
  1665. }
  1666. var previousPromise;
  1667. function enqueue(method, arg) {
  1668. function callInvokeWithMethodAndArg() {
  1669. return new Promise(function(resolve, reject) {
  1670. invoke(method, arg, resolve, reject);
  1671. });
  1672. }
  1673. return previousPromise =
  1674. // If enqueue has been called before, then we want to wait until
  1675. // all previous Promises have been resolved before calling invoke,
  1676. // so that results are always delivered in the correct order. If
  1677. // enqueue has not been called before, then it is important to
  1678. // call invoke immediately, without waiting on a callback to fire,
  1679. // so that the async generator function has the opportunity to do
  1680. // any necessary setup in a predictable way. This predictability
  1681. // is why the Promise constructor synchronously invokes its
  1682. // executor callback, and why async functions synchronously
  1683. // execute code before the first await. Since we implement simple
  1684. // async functions in terms of async generators, it is especially
  1685. // important to get this right, even though it requires care.
  1686. previousPromise ? previousPromise.then(
  1687. callInvokeWithMethodAndArg,
  1688. // Avoid propagating failures to Promises returned by later
  1689. // invocations of the iterator.
  1690. callInvokeWithMethodAndArg
  1691. ) : callInvokeWithMethodAndArg();
  1692. }
  1693. // Define the unified helper method that is used to implement .next,
  1694. // .throw, and .return (see defineIteratorMethods).
  1695. this._invoke = enqueue;
  1696. }
  1697. defineIteratorMethods(AsyncIterator.prototype);
  1698. AsyncIterator.prototype[asyncIteratorSymbol] = function () {
  1699. return this;
  1700. };
  1701. runtime.AsyncIterator = AsyncIterator;
  1702. // Note that simple async functions are implemented on top of
  1703. // AsyncIterator objects; they just return a Promise for the value of
  1704. // the final result produced by the iterator.
  1705. runtime.async = function(innerFn, outerFn, self, tryLocsList) {
  1706. var iter = new AsyncIterator(
  1707. wrap(innerFn, outerFn, self, tryLocsList)
  1708. );
  1709. return runtime.isGeneratorFunction(outerFn)
  1710. ? iter // If outerFn is a generator, return the full iterator.
  1711. : iter.next().then(function(result) {
  1712. return result.done ? result.value : iter.next();
  1713. });
  1714. };
  1715. function makeInvokeMethod(innerFn, self, context) {
  1716. var state = GenStateSuspendedStart;
  1717. return function invoke(method, arg) {
  1718. if (state === GenStateExecuting) {
  1719. throw new Error("Generator is already running");
  1720. }
  1721. if (state === GenStateCompleted) {
  1722. if (method === "throw") {
  1723. throw arg;
  1724. }
  1725. // Be forgiving, per 25.3.3.3.3 of the spec:
  1726. // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume
  1727. return doneResult();
  1728. }
  1729. context.method = method;
  1730. context.arg = arg;
  1731. while (true) {
  1732. var delegate = context.delegate;
  1733. if (delegate) {
  1734. var delegateResult = maybeInvokeDelegate(delegate, context);
  1735. if (delegateResult) {
  1736. if (delegateResult === ContinueSentinel) continue;
  1737. return delegateResult;
  1738. }
  1739. }
  1740. if (context.method === "next") {
  1741. // Setting context._sent for legacy support of Babel's
  1742. // function.sent implementation.
  1743. context.sent = context._sent = context.arg;
  1744. } else if (context.method === "throw") {
  1745. if (state === GenStateSuspendedStart) {
  1746. state = GenStateCompleted;
  1747. throw context.arg;
  1748. }
  1749. context.dispatchException(context.arg);
  1750. } else if (context.method === "return") {
  1751. context.abrupt("return", context.arg);
  1752. }
  1753. state = GenStateExecuting;
  1754. var record = tryCatch(innerFn, self, context);
  1755. if (record.type === "normal") {
  1756. // If an exception is thrown from innerFn, we leave state ===
  1757. // GenStateExecuting and loop back for another invocation.
  1758. state = context.done
  1759. ? GenStateCompleted
  1760. : GenStateSuspendedYield;
  1761. if (record.arg === ContinueSentinel) {
  1762. continue;
  1763. }
  1764. return {
  1765. value: record.arg,
  1766. done: context.done
  1767. };
  1768. } else if (record.type === "throw") {
  1769. state = GenStateCompleted;
  1770. // Dispatch the exception by looping back around to the
  1771. // context.dispatchException(context.arg) call above.
  1772. context.method = "throw";
  1773. context.arg = record.arg;
  1774. }
  1775. }
  1776. };
  1777. }
  1778. // Call delegate.iterator[context.method](context.arg) and handle the
  1779. // result, either by returning a { value, done } result from the
  1780. // delegate iterator, or by modifying context.method and context.arg,
  1781. // setting context.delegate to null, and returning the ContinueSentinel.
  1782. function maybeInvokeDelegate(delegate, context) {
  1783. var method = delegate.iterator[context.method];
  1784. if (method === undefined) {
  1785. // A .throw or .return when the delegate iterator has no .throw
  1786. // method always terminates the yield* loop.
  1787. context.delegate = null;
  1788. if (context.method === "throw") {
  1789. if (delegate.iterator.return) {
  1790. // If the delegate iterator has a return method, give it a
  1791. // chance to clean up.
  1792. context.method = "return";
  1793. context.arg = undefined;
  1794. maybeInvokeDelegate(delegate, context);
  1795. if (context.method === "throw") {
  1796. // If maybeInvokeDelegate(context) changed context.method from
  1797. // "return" to "throw", let that override the TypeError below.
  1798. return ContinueSentinel;
  1799. }
  1800. }
  1801. context.method = "throw";
  1802. context.arg = new TypeError(
  1803. "The iterator does not provide a 'throw' method");
  1804. }
  1805. return ContinueSentinel;
  1806. }
  1807. var record = tryCatch(method, delegate.iterator, context.arg);
  1808. if (record.type === "throw") {
  1809. context.method = "throw";
  1810. context.arg = record.arg;
  1811. context.delegate = null;
  1812. return ContinueSentinel;
  1813. }
  1814. var info = record.arg;
  1815. if (! info) {
  1816. context.method = "throw";
  1817. context.arg = new TypeError("iterator result is not an object");
  1818. context.delegate = null;
  1819. return ContinueSentinel;
  1820. }
  1821. if (info.done) {
  1822. // Assign the result of the finished delegate to the temporary
  1823. // variable specified by delegate.resultName (see delegateYield).
  1824. context[delegate.resultName] = info.value;
  1825. // Resume execution at the desired location (see delegateYield).
  1826. context.next = delegate.nextLoc;
  1827. // If context.method was "throw" but the delegate handled the
  1828. // exception, let the outer generator proceed normally. If
  1829. // context.method was "next", forget context.arg since it has been
  1830. // "consumed" by the delegate iterator. If context.method was
  1831. // "return", allow the original .return call to continue in the
  1832. // outer generator.
  1833. if (context.method !== "return") {
  1834. context.method = "next";
  1835. context.arg = undefined;
  1836. }
  1837. } else {
  1838. // Re-yield the result returned by the delegate method.
  1839. return info;
  1840. }
  1841. // The delegate iterator is finished, so forget it and continue with
  1842. // the outer generator.
  1843. context.delegate = null;
  1844. return ContinueSentinel;
  1845. }
  1846. // Define Generator.prototype.{next,throw,return} in terms of the
  1847. // unified ._invoke helper method.
  1848. defineIteratorMethods(Gp);
  1849. Gp[toStringTagSymbol] = "Generator";
  1850. // A Generator should always return itself as the iterator object when the
  1851. // @@iterator function is called on it. Some browsers' implementations of the
  1852. // iterator prototype chain incorrectly implement this, causing the Generator
  1853. // object to not be returned from this call. This ensures that doesn't happen.
  1854. // See https://github.com/facebook/regenerator/issues/274 for more details.
  1855. Gp[iteratorSymbol] = function() {
  1856. return this;
  1857. };
  1858. Gp.toString = function() {
  1859. return "[object Generator]";
  1860. };
  1861. function pushTryEntry(locs) {
  1862. var entry = { tryLoc: locs[0] };
  1863. if (1 in locs) {
  1864. entry.catchLoc = locs[1];
  1865. }
  1866. if (2 in locs) {
  1867. entry.finallyLoc = locs[2];
  1868. entry.afterLoc = locs[3];
  1869. }
  1870. this.tryEntries.push(entry);
  1871. }
  1872. function resetTryEntry(entry) {
  1873. var record = entry.completion || {};
  1874. record.type = "normal";
  1875. delete record.arg;
  1876. entry.completion = record;
  1877. }
  1878. function Context(tryLocsList) {
  1879. // The root entry object (effectively a try statement without a catch
  1880. // or a finally block) gives us a place to store values thrown from
  1881. // locations where there is no enclosing try statement.
  1882. this.tryEntries = [{ tryLoc: "root" }];
  1883. tryLocsList.forEach(pushTryEntry, this);
  1884. this.reset(true);
  1885. }
  1886. runtime.keys = function(object) {
  1887. var keys = [];
  1888. for (var key in object) {
  1889. keys.push(key);
  1890. }
  1891. keys.reverse();
  1892. // Rather than returning an object with a next method, we keep
  1893. // things simple and return the next function itself.
  1894. return function next() {
  1895. while (keys.length) {
  1896. var key = keys.pop();
  1897. if (key in object) {
  1898. next.value = key;
  1899. next.done = false;
  1900. return next;
  1901. }
  1902. }
  1903. // To avoid creating an additional object, we just hang the .value
  1904. // and .done properties off the next function object itself. This
  1905. // also ensures that the minifier will not anonymize the function.
  1906. next.done = true;
  1907. return next;
  1908. };
  1909. };
  1910. function values(iterable) {
  1911. if (iterable) {
  1912. var iteratorMethod = iterable[iteratorSymbol];
  1913. if (iteratorMethod) {
  1914. return iteratorMethod.call(iterable);
  1915. }
  1916. if (typeof iterable.next === "function") {
  1917. return iterable;
  1918. }
  1919. if (!isNaN(iterable.length)) {
  1920. var i = -1, next = function next() {
  1921. while (++i < iterable.length) {
  1922. if (hasOwn.call(iterable, i)) {
  1923. next.value = iterable[i];
  1924. next.done = false;
  1925. return next;
  1926. }
  1927. }
  1928. next.value = undefined;
  1929. next.done = true;
  1930. return next;
  1931. };
  1932. return next.next = next;
  1933. }
  1934. }
  1935. // Return an iterator with no values.
  1936. return { next: doneResult };
  1937. }
  1938. runtime.values = values;
  1939. function doneResult() {
  1940. return { value: undefined, done: true };
  1941. }
  1942. Context.prototype = {
  1943. constructor: Context,
  1944. reset: function(skipTempReset) {
  1945. this.prev = 0;
  1946. this.next = 0;
  1947. // Resetting context._sent for legacy support of Babel's
  1948. // function.sent implementation.
  1949. this.sent = this._sent = undefined;
  1950. this.done = false;
  1951. this.delegate = null;
  1952. this.method = "next";
  1953. this.arg = undefined;
  1954. this.tryEntries.forEach(resetTryEntry);
  1955. if (!skipTempReset) {
  1956. for (var name in this) {
  1957. // Not sure about the optimal order of these conditions:
  1958. if (name.charAt(0) === "t" &&
  1959. hasOwn.call(this, name) &&
  1960. !isNaN(+name.slice(1))) {
  1961. this[name] = undefined;
  1962. }
  1963. }
  1964. }
  1965. },
  1966. stop: function() {
  1967. this.done = true;
  1968. var rootEntry = this.tryEntries[0];
  1969. var rootRecord = rootEntry.completion;
  1970. if (rootRecord.type === "throw") {
  1971. throw rootRecord.arg;
  1972. }
  1973. return this.rval;
  1974. },
  1975. dispatchException: function(exception) {
  1976. if (this.done) {
  1977. throw exception;
  1978. }
  1979. var context = this;
  1980. function handle(loc, caught) {
  1981. record.type = "throw";
  1982. record.arg = exception;
  1983. context.next = loc;
  1984. if (caught) {
  1985. // If the dispatched exception was caught by a catch block,
  1986. // then let that catch block handle the exception normally.
  1987. context.method = "next";
  1988. context.arg = undefined;
  1989. }
  1990. return !! caught;
  1991. }
  1992. for (var i = this.tryEntries.length - 1; i >= 0; --i) {
  1993. var entry = this.tryEntries[i];
  1994. var record = entry.completion;
  1995. if (entry.tryLoc === "root") {
  1996. // Exception thrown outside of any try block that could handle
  1997. // it, so set the completion value of the entire function to
  1998. // throw the exception.
  1999. return handle("end");
  2000. }
  2001. if (entry.tryLoc <= this.prev) {
  2002. var hasCatch = hasOwn.call(entry, "catchLoc");
  2003. var hasFinally = hasOwn.call(entry, "finallyLoc");
  2004. if (hasCatch && hasFinally) {
  2005. if (this.prev < entry.catchLoc) {
  2006. return handle(entry.catchLoc, true);
  2007. } else if (this.prev < entry.finallyLoc) {
  2008. return handle(entry.finallyLoc);
  2009. }
  2010. } else if (hasCatch) {
  2011. if (this.prev < entry.catchLoc) {
  2012. return handle(entry.catchLoc, true);
  2013. }
  2014. } else if (hasFinally) {
  2015. if (this.prev < entry.finallyLoc) {
  2016. return handle(entry.finallyLoc);
  2017. }
  2018. } else {
  2019. throw new Error("try statement without catch or finally");
  2020. }
  2021. }
  2022. }
  2023. },
  2024. abrupt: function(type, arg) {
  2025. for (var i = this.tryEntries.length - 1; i >= 0; --i) {
  2026. var entry = this.tryEntries[i];
  2027. if (entry.tryLoc <= this.prev &&
  2028. hasOwn.call(entry, "finallyLoc") &&
  2029. this.prev < entry.finallyLoc) {
  2030. var finallyEntry = entry;
  2031. break;
  2032. }
  2033. }
  2034. if (finallyEntry &&
  2035. (type === "break" ||
  2036. type === "continue") &&
  2037. finallyEntry.tryLoc <= arg &&
  2038. arg <= finallyEntry.finallyLoc) {
  2039. // Ignore the finally entry if control is not jumping to a
  2040. // location outside the try/catch block.
  2041. finallyEntry = null;
  2042. }
  2043. var record = finallyEntry ? finallyEntry.completion : {};
  2044. record.type = type;
  2045. record.arg = arg;
  2046. if (finallyEntry) {
  2047. this.method = "next";
  2048. this.next = finallyEntry.finallyLoc;
  2049. return ContinueSentinel;
  2050. }
  2051. return this.complete(record);
  2052. },
  2053. complete: function(record, afterLoc) {
  2054. if (record.type === "throw") {
  2055. throw record.arg;
  2056. }
  2057. if (record.type === "break" ||
  2058. record.type === "continue") {
  2059. this.next = record.arg;
  2060. } else if (record.type === "return") {
  2061. this.rval = this.arg = record.arg;
  2062. this.method = "return";
  2063. this.next = "end";
  2064. } else if (record.type === "normal" && afterLoc) {
  2065. this.next = afterLoc;
  2066. }
  2067. return ContinueSentinel;
  2068. },
  2069. finish: function(finallyLoc) {
  2070. for (var i = this.tryEntries.length - 1; i >= 0; --i) {
  2071. var entry = this.tryEntries[i];
  2072. if (entry.finallyLoc === finallyLoc) {
  2073. this.complete(entry.completion, entry.afterLoc);
  2074. resetTryEntry(entry);
  2075. return ContinueSentinel;
  2076. }
  2077. }
  2078. },
  2079. "catch": function(tryLoc) {
  2080. for (var i = this.tryEntries.length - 1; i >= 0; --i) {
  2081. var entry = this.tryEntries[i];
  2082. if (entry.tryLoc === tryLoc) {
  2083. var record = entry.completion;
  2084. if (record.type === "throw") {
  2085. var thrown = record.arg;
  2086. resetTryEntry(entry);
  2087. }
  2088. return thrown;
  2089. }
  2090. }
  2091. // The context.catch method must only be called with a location
  2092. // argument that corresponds to a known catch block.
  2093. throw new Error("illegal catch attempt");
  2094. },
  2095. delegateYield: function(iterable, resultName, nextLoc) {
  2096. this.delegate = {
  2097. iterator: values(iterable),
  2098. resultName: resultName,
  2099. nextLoc: nextLoc
  2100. };
  2101. if (this.method === "next") {
  2102. // Deliberately forget the last sent value so that we don't
  2103. // accidentally pass it on to the delegate.
  2104. this.arg = undefined;
  2105. }
  2106. return ContinueSentinel;
  2107. }
  2108. };
  2109. })(
  2110. // In sloppy mode, unbound `this` refers to the global object, fallback to
  2111. // Function constructor if we're in global strict mode. That is sadly a form
  2112. // of indirect eval which violates Content Security Policy.
  2113. (function() {
  2114. return this || (typeof self === "object" && self);
  2115. })() || Function("return this")()
  2116. );
  2117. /***/ }),
  2118. /***/ "./drawing/draw.js":
  2119. /*!*************************!*\
  2120. !*** ./drawing/draw.js ***!
  2121. \*************************/
  2122. /*! exports provided: default */
  2123. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  2124. "use strict";
  2125. __webpack_require__.r(__webpack_exports__);
  2126. /**
  2127. * This function manages the {@link https://www.w3.org/TR/2dcontext/#the-canvas-state|save/restore}
  2128. * pattern for working in a new context state stack. The parameter `fn` is passed the `context` and can
  2129. * execute any API calls in a clean stack.
  2130. * @public
  2131. * @method draw
  2132. * @memberof Drawing
  2133. *
  2134. * @param {CanvasRenderingContext2D} context - Target Canvas
  2135. * @param {ContextFn} fn - A function which performs drawing operations within the given context.
  2136. * @returns {undefined}
  2137. */
  2138. /* harmony default export */ __webpack_exports__["default"] = (function (context, fn) {
  2139. context.save();
  2140. fn(context);
  2141. context.restore();
  2142. });
  2143. /***/ }),
  2144. /***/ "./drawing/drawArrow.js":
  2145. /*!******************************!*\
  2146. !*** ./drawing/drawArrow.js ***!
  2147. \******************************/
  2148. /*! exports provided: default */
  2149. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  2150. "use strict";
  2151. __webpack_require__.r(__webpack_exports__);
  2152. /* harmony import */ var _drawLine_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./drawLine.js */ "./drawing/drawLine.js");
  2153. /* harmony import */ var _drawJoinedLines_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./drawJoinedLines.js */ "./drawing/drawJoinedLines.js");
  2154. /**
  2155. * Draw an arrow using the drawing API.
  2156. * @public
  2157. * @method drawArrow
  2158. * @memberof Drawing
  2159. *
  2160. * @param {Object} context The canvas context.
  2161. * @param {Object} start The start position.
  2162. * @param {Object} end The end position.
  2163. * @param {string} color The color of the arrow.
  2164. * @param {number} lineWidth The width of the arrow line.
  2165. * @param {number[] | undefined} [lineDash] The optional lineDash style.
  2166. * @returns {undefined}
  2167. */
  2168. /* harmony default export */ __webpack_exports__["default"] = (function (context, start, end, color, lineWidth, lineDash) {
  2169. // Variables to be used when creating the arrow
  2170. var headLength = 10;
  2171. var angle = Math.atan2(end.y - start.y, end.x - start.x); // Starting path of the arrow from the start square to the end square and drawing the stroke
  2172. var options = {
  2173. color: color,
  2174. lineWidth: lineWidth
  2175. };
  2176. if (lineDash) {
  2177. options.lineDash = lineDash;
  2178. }
  2179. Object(_drawLine_js__WEBPACK_IMPORTED_MODULE_0__["default"])(context, undefined, start, end, options, 'canvas');
  2180. options = {
  2181. color: color,
  2182. lineWidth: lineWidth,
  2183. fillStyle: color
  2184. };
  2185. var points = [{
  2186. x: end.x - headLength * Math.cos(angle - Math.PI / 7),
  2187. y: end.y - headLength * Math.sin(angle - Math.PI / 7)
  2188. }, {
  2189. x: end.x - headLength * Math.cos(angle + Math.PI / 7),
  2190. y: end.y - headLength * Math.sin(angle + Math.PI / 7)
  2191. }, end];
  2192. Object(_drawJoinedLines_js__WEBPACK_IMPORTED_MODULE_1__["default"])(context, undefined, end, points, options, 'canvas');
  2193. });
  2194. /***/ }),
  2195. /***/ "./drawing/drawCircle.js":
  2196. /*!*******************************!*\
  2197. !*** ./drawing/drawCircle.js ***!
  2198. \*******************************/
  2199. /*! exports provided: default */
  2200. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  2201. "use strict";
  2202. __webpack_require__.r(__webpack_exports__);
  2203. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js");
  2204. /* harmony import */ var _path_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./path.js */ "./drawing/path.js");
  2205. /**
  2206. * Draw a circle with given `center` and `radius`.
  2207. * @public
  2208. * @method drawCircle
  2209. * @memberof Drawing
  2210. *
  2211. * @param {CanvasRenderingContext2D} context - Target context
  2212. * @param {HTMLElement} element - The DOM Element to draw on
  2213. * @param {Object} center - `{ x, y }` in either pixel or canvas coordinates.
  2214. * @param {number} radius - The circle's radius in canvas units.
  2215. * @param {Object} options - See {@link path}
  2216. * @param {String} [coordSystem='pixel'] - Can be "pixel" (default) or "canvas". The coordinate
  2217. * system of the points passed in to the function. If "pixel" then cornerstone.pixelToCanvas
  2218. * is used to transform the points from pixel to canvas coordinates.
  2219. * @returns {undefined}
  2220. */
  2221. /* harmony default export */ __webpack_exports__["default"] = (function (context, element, center, radius, options) {
  2222. var coordSystem = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 'pixel';
  2223. if (coordSystem === 'pixel') {
  2224. center = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.pixelToCanvas(element, center);
  2225. }
  2226. Object(_path_js__WEBPACK_IMPORTED_MODULE_1__["default"])(context, options, function (context) {
  2227. context.arc(center.x, center.y, radius, 0, 2 * Math.PI);
  2228. });
  2229. });
  2230. /***/ }),
  2231. /***/ "./drawing/drawEllipse.js":
  2232. /*!********************************!*\
  2233. !*** ./drawing/drawEllipse.js ***!
  2234. \********************************/
  2235. /*! exports provided: default */
  2236. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  2237. "use strict";
  2238. __webpack_require__.r(__webpack_exports__);
  2239. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js");
  2240. /* harmony import */ var _path_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./path.js */ "./drawing/path.js");
  2241. /* harmony import */ var _util_pointProjector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../util/pointProjector.js */ "./util/pointProjector.js");
  2242. /**
  2243. * Draw an ellipse within the bounding box defined by `corner1` and `corner2`.
  2244. * @public
  2245. * @method drawEllipse
  2246. * @memberof Drawing
  2247. *
  2248. * @param {CanvasRenderingContext2D} context - Target context
  2249. * @param {HTMLElement} element - The DOM Element to draw on
  2250. * @param {Object} corner1 - `{ x, y }` in either pixel or canvas coordinates.
  2251. * @param {Object} corner2 - `{ x, y }` in either pixel or canvas coordinates.
  2252. * @param {Object} options - See {@link path}
  2253. * @param {String} [coordSystem='pixel'] - Can be "pixel" (default) or "canvas". The coordinate
  2254. * system of the points passed in to the function. If "pixel" then cornerstone.pixelToCanvas
  2255. * is used to transform the points from pixel to canvas coordinates.
  2256. * @param {Number} initialRotation - Ellipse initial rotation
  2257. * @returns {undefined}
  2258. */
  2259. /* harmony default export */ __webpack_exports__["default"] = (function (context, element, corner1, corner2, options) {
  2260. var coordSystem = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 'pixel';
  2261. var initialRotation = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : 0.0;
  2262. if (coordSystem === 'pixel') {
  2263. corner1 = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.pixelToCanvas(element, corner1);
  2264. corner2 = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.pixelToCanvas(element, corner2);
  2265. }
  2266. var viewport = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.getViewport(element); // Calculate the center of the image
  2267. var width = element.clientWidth,
  2268. height = element.clientHeight;
  2269. var scale = viewport.scale,
  2270. translation = viewport.translation;
  2271. var rotation = viewport.rotation - initialRotation;
  2272. var centerPoint = {
  2273. x: width / 2 + translation.x * scale,
  2274. y: height / 2 + translation.y * scale
  2275. };
  2276. if (Math.abs(rotation) > 0.05) {
  2277. corner1 = Object(_util_pointProjector_js__WEBPACK_IMPORTED_MODULE_2__["rotatePoint"])(corner1, centerPoint, -rotation);
  2278. corner2 = Object(_util_pointProjector_js__WEBPACK_IMPORTED_MODULE_2__["rotatePoint"])(corner2, centerPoint, -rotation);
  2279. }
  2280. var w = Math.abs(corner1.x - corner2.x);
  2281. var h = Math.abs(corner1.y - corner2.y);
  2282. var xMin = Math.min(corner1.x, corner2.x);
  2283. var yMin = Math.min(corner1.y, corner2.y);
  2284. var center = {
  2285. x: xMin + w / 2,
  2286. y: yMin + h / 2
  2287. };
  2288. if (Math.abs(rotation) > 0.05) {
  2289. center = Object(_util_pointProjector_js__WEBPACK_IMPORTED_MODULE_2__["rotatePoint"])(center, centerPoint, rotation);
  2290. }
  2291. var angle = rotation * Math.PI / 180;
  2292. Object(_path_js__WEBPACK_IMPORTED_MODULE_1__["default"])(context, options, function (context) {
  2293. context.ellipse(center.x, center.y, w / 2, h / 2, angle, 0, 2 * Math.PI);
  2294. context.closePath();
  2295. });
  2296. });
  2297. /***/ }),
  2298. /***/ "./drawing/drawHandles.js":
  2299. /*!********************************!*\
  2300. !*** ./drawing/drawHandles.js ***!
  2301. \********************************/
  2302. /*! exports provided: default */
  2303. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  2304. "use strict";
  2305. __webpack_require__.r(__webpack_exports__);
  2306. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js");
  2307. /* harmony import */ var _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../stateManagement/toolStyle.js */ "./stateManagement/toolStyle.js");
  2308. /* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./../stateManagement/toolColors.js */ "./stateManagement/toolColors.js");
  2309. /* harmony import */ var _path_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./path.js */ "./drawing/path.js");
  2310. /* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./../store/index.js */ "./store/index.js");
  2311. /**
  2312. * Draws proivded handles to the provided context
  2313. * @public
  2314. * @method drawHandles
  2315. * @memberof Drawing
  2316. *
  2317. * @param {CanvasRenderingContext2D} context - Target context
  2318. * @param {*} evtDetail - Cornerstone's 'cornerstoneimagerendered' event's `detail`
  2319. * @param {Object[]|Object} handles - An array of handle objects, or an object w/ named handle objects
  2320. * @param {Object} [options={}] - Options object
  2321. * @param {string} [options.color]
  2322. * @param {Boolean} [options.drawHandlesIfActive=false] - Whether the handles should only be drawn if Active (hovered/selected)
  2323. * @param {string} [options.fill]
  2324. * @param {Number} [options.handleRadius=6]
  2325. * @returns {undefined}
  2326. */
  2327. /* harmony default export */ __webpack_exports__["default"] = (function (context, evtDetail, handles) {
  2328. var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
  2329. var element = evtDetail.element;
  2330. var defaultColor = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_2__["default"].getToolColor();
  2331. context.strokeStyle = options.color || defaultColor;
  2332. var handleKeys = Object.keys(handles);
  2333. var _loop = function _loop(i) {
  2334. var handleKey = handleKeys[i];
  2335. var handle = handles[handleKey];
  2336. if (handle.drawnIndependently === true) {
  2337. return "continue";
  2338. }
  2339. if (options.drawHandlesIfActive === true && !handle.active) {
  2340. return "continue";
  2341. }
  2342. if (options.hideHandlesIfMoving && handle.moving) {
  2343. return "continue";
  2344. }
  2345. var lineWidth = handle.active ? _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_1__["default"].getActiveWidth() : _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_1__["default"].getToolWidth();
  2346. var fillStyle = options.fill;
  2347. var pathOptions = {
  2348. lineWidth: lineWidth,
  2349. fillStyle: fillStyle
  2350. };
  2351. if (options.lineDash) {
  2352. pathOptions.lineDash = options.lineDash;
  2353. }
  2354. Object(_path_js__WEBPACK_IMPORTED_MODULE_3__["default"])(context, pathOptions, function (context) {
  2355. var handleCanvasCoords = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.pixelToCanvas(element, handle); // Handle's radisu, then tool's radius, then default radius
  2356. var handleRadius = handle.radius || options.handleRadius || _store_index_js__WEBPACK_IMPORTED_MODULE_4__["state"].handleRadius;
  2357. context.arc(handleCanvasCoords.x, handleCanvasCoords.y, handleRadius, 0, 2 * Math.PI);
  2358. });
  2359. };
  2360. for (var i = 0; i < handleKeys.length; i++) {
  2361. var _ret = _loop(i);
  2362. if (_ret === "continue") continue;
  2363. }
  2364. });
  2365. /***/ }),
  2366. /***/ "./drawing/drawJoinedLines.js":
  2367. /*!************************************!*\
  2368. !*** ./drawing/drawJoinedLines.js ***!
  2369. \************************************/
  2370. /*! exports provided: default */
  2371. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  2372. "use strict";
  2373. __webpack_require__.r(__webpack_exports__);
  2374. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js");
  2375. /* harmony import */ var _path_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./path.js */ "./drawing/path.js");
  2376. /**
  2377. * Draw a series of joined lines, starting at `start` and then going to each point in `points`.
  2378. * @public
  2379. * @method drawJoinedLines
  2380. * @memberof Drawing
  2381. *
  2382. * @param {CanvasRenderingContext2D} context - Target context
  2383. * @param {HTMLElement} element - The DOM Element to draw on
  2384. * @param {Object} start - `{ x, y }` in either pixel or canvas coordinates.
  2385. * @param {Object[]} points - `[{ x, y }]` An array of points in either pixel or canvas coordinates.
  2386. * @param {Object} options - See {@link path}
  2387. * @param {String} [coordSystem='pixel'] - Can be "pixel" (default) or "canvas". The coordinate
  2388. * system of the points passed in to the function. If "pixel" then cornerstone.pixelToCanvas
  2389. * is used to transform the points from pixel to canvas coordinates.
  2390. * @returns {undefined}
  2391. */
  2392. /* harmony default export */ __webpack_exports__["default"] = (function (context, element, start, points, options) {
  2393. var coordSystem = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 'pixel';
  2394. Object(_path_js__WEBPACK_IMPORTED_MODULE_1__["default"])(context, options, function (context) {
  2395. if (coordSystem === 'pixel') {
  2396. start = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.pixelToCanvas(element, start);
  2397. points = points.map(function (p) {
  2398. return _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.pixelToCanvas(element, p);
  2399. });
  2400. }
  2401. context.moveTo(start.x, start.y);
  2402. points.forEach(function (_ref) {
  2403. var x = _ref.x,
  2404. y = _ref.y;
  2405. context.lineTo(x, y);
  2406. });
  2407. });
  2408. });
  2409. /***/ }),
  2410. /***/ "./drawing/drawLine.js":
  2411. /*!*****************************!*\
  2412. !*** ./drawing/drawLine.js ***!
  2413. \*****************************/
  2414. /*! exports provided: default */
  2415. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  2416. "use strict";
  2417. __webpack_require__.r(__webpack_exports__);
  2418. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return drawLine; });
  2419. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js");
  2420. /* harmony import */ var _path_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./path.js */ "./drawing/path.js");
  2421. /**
  2422. * Draw a line between `start` and `end`.
  2423. *
  2424. * @public
  2425. * @method drawLine
  2426. * @memberof Drawing
  2427. *
  2428. * @param {CanvasRenderingContext2D} context
  2429. * @param {HTMLElement} element - The DOM Element to draw on
  2430. * @param {Object} start - `{ x, y } in either pixel or canvas coordinates.
  2431. * @param {Object} end - `{ x, y }` in either pixel or canvas coordinates.
  2432. * @param {Object} options - See {@link path}
  2433. * @param {String} [coordSystem='pixel'] - Can be "pixel" (default) or "canvas". The coordinate
  2434. * system of the points passed in to the function. If "pixel" then cornerstone.pixelToCanvas
  2435. * is used to transform the points from pixel to canvas coordinates.
  2436. * @returns {undefined}
  2437. */
  2438. function drawLine(context, element, start, end, options) {
  2439. var coordSystem = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 'pixel';
  2440. Object(_path_js__WEBPACK_IMPORTED_MODULE_1__["default"])(context, options, function (context) {
  2441. if (coordSystem === 'pixel') {
  2442. start = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.pixelToCanvas(element, start);
  2443. end = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.pixelToCanvas(element, end);
  2444. }
  2445. context.moveTo(start.x, start.y);
  2446. context.lineTo(end.x, end.y);
  2447. });
  2448. }
  2449. /***/ }),
  2450. /***/ "./drawing/drawLines.js":
  2451. /*!******************************!*\
  2452. !*** ./drawing/drawLines.js ***!
  2453. \******************************/
  2454. /*! exports provided: default */
  2455. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  2456. "use strict";
  2457. __webpack_require__.r(__webpack_exports__);
  2458. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js");
  2459. /* harmony import */ var _path_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./path.js */ "./drawing/path.js");
  2460. /**
  2461. * Draw multiple lines.
  2462. * @public
  2463. * @method drawJoinedLines
  2464. * @memberof Drawing
  2465. *
  2466. * @param {CanvasRenderingContext2D} context - Target context
  2467. * @param {HTMLElement} element - The DOM Element to draw on
  2468. * @param {Object[]} lines - `[{ start: {x, y}, end: { x, y }]` An array of `start`, `end` pairs.
  2469. * Each point is `{ x, y }` in either pixel or canvas coordinates.
  2470. * @param {Object} options - See {@link path}
  2471. * @param {String} [coordSystem='pixel'] - Can be "pixel" (default) or "canvas". The coordinate
  2472. * system of the points passed in to the function. If "pixel" then cornerstone.pixelToCanvas
  2473. * is used to transform the points from pixel to canvas coordinates.
  2474. * @returns {undefined}
  2475. */
  2476. /* harmony default export */ __webpack_exports__["default"] = (function (context, element, lines, options) {
  2477. var coordSystem = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 'pixel';
  2478. Object(_path_js__WEBPACK_IMPORTED_MODULE_1__["default"])(context, options, function (context) {
  2479. lines.forEach(function (line) {
  2480. var start = line.start;
  2481. var end = line.end;
  2482. if (coordSystem === 'pixel') {
  2483. var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone;
  2484. start = cornerstone.pixelToCanvas(element, start);
  2485. end = cornerstone.pixelToCanvas(element, end);
  2486. }
  2487. context.moveTo(start.x, start.y);
  2488. context.lineTo(end.x, end.y);
  2489. });
  2490. });
  2491. });
  2492. /***/ }),
  2493. /***/ "./drawing/drawLink.js":
  2494. /*!*****************************!*\
  2495. !*** ./drawing/drawLink.js ***!
  2496. \*****************************/
  2497. /*! exports provided: default */
  2498. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  2499. "use strict";
  2500. __webpack_require__.r(__webpack_exports__);
  2501. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
  2502. /* harmony import */ var _drawLine_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./drawLine.js */ "./drawing/drawLine.js");
  2503. /**
  2504. * Draw a link between an annotation to a box.
  2505. * @public
  2506. * @method drawLink
  2507. * @memberof Drawing
  2508. *
  2509. * @param {Object[]} linkAnchorPoints An array of possible anchor points.
  2510. * @param {Object} refPoint A reference point to select the anchor point.
  2511. * @param {Object} boundingBox The bounding box to link.
  2512. * @param {Object} context The canvas context.
  2513. * @param {string} color The link color.
  2514. * @param {number} lineWidth The line width of the link.
  2515. * @returns {undefined}
  2516. */
  2517. /* harmony default export */ __webpack_exports__["default"] = (function (linkAnchorPoints, refPoint, boundingBox, context, color, lineWidth) {
  2518. // Draw a link from "the closest anchor point to refPoint" to "the nearest midpoint on the bounding box".
  2519. // Find the closest anchor point to RefPoint
  2520. var start = linkAnchorPoints.length > 0 ? _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.point.findClosestPoint(linkAnchorPoints, refPoint) : refPoint; // Calculate the midpoints of the bounding box
  2521. var boundingBoxPoints = [{
  2522. x: boundingBox.left + boundingBox.width / 2,
  2523. y: boundingBox.top
  2524. }, {
  2525. x: boundingBox.left,
  2526. y: boundingBox.top + boundingBox.height / 2
  2527. }, {
  2528. x: boundingBox.left + boundingBox.width / 2,
  2529. y: boundingBox.top + boundingBox.height
  2530. }, {
  2531. x: boundingBox.left + boundingBox.width,
  2532. y: boundingBox.top + boundingBox.height / 2
  2533. }]; // Calculate the link endpoint by identifying which midpoint of the bounding box
  2534. // Is closest to the start point.
  2535. var end = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.point.findClosestPoint(boundingBoxPoints, start); // Finally we draw the dashed linking line
  2536. var options = {
  2537. color: color,
  2538. lineWidth: lineWidth,
  2539. lineDash: [2, 3]
  2540. };
  2541. Object(_drawLine_js__WEBPACK_IMPORTED_MODULE_1__["default"])(context, undefined, start, end, options, 'canvas');
  2542. });
  2543. /***/ }),
  2544. /***/ "./drawing/drawLinkedTextBox.js":
  2545. /*!**************************************!*\
  2546. !*** ./drawing/drawLinkedTextBox.js ***!
  2547. \**************************************/
  2548. /*! exports provided: default */
  2549. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  2550. "use strict";
  2551. __webpack_require__.r(__webpack_exports__);
  2552. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
  2553. /* harmony import */ var _drawTextBox_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./drawTextBox.js */ "./drawing/drawTextBox.js");
  2554. /* harmony import */ var _drawLink_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./drawLink.js */ "./drawing/drawLink.js");
  2555. /* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./../store/index.js */ "./store/index.js");
  2556. /* harmony import */ var _util_clip_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/clip.js */ "./util/clip.js");
  2557. /**
  2558. * Draw a link between an annotation to a textBox.
  2559. * @public
  2560. * @method drawLinkedTextBox
  2561. * @memberof Drawing
  2562. *
  2563. * @param {Object} context - The canvas context.
  2564. * @param {HTMLElement} element - The element on which to draw the link.
  2565. * @param {Object} textBox - The textBox to link.
  2566. * @param {Object} text - The text to display in the textbox.
  2567. * @param {Object[]} handles - The handles of the annotation.
  2568. * @param {Object[]} textBoxAnchorPoints - An array of possible anchor points on the textBox.
  2569. * @param {string} color - The link color.
  2570. * @param {number} lineWidth - The line width of the link.
  2571. * @param {number} xOffset - The x offset of the textbox.
  2572. * @param {boolean} yCenter - Vertically centers the text if true.
  2573. * @returns {undefined}
  2574. */
  2575. /* harmony default export */ __webpack_exports__["default"] = (function (context, element, textBox, text, handles, textBoxAnchorPoints, color, lineWidth, xOffset, yCenter) {
  2576. var pixelToCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.pixelToCanvas; // Convert the textbox Image coordinates into Canvas coordinates
  2577. var textCoords = pixelToCanvas(element, textBox);
  2578. if (xOffset) {
  2579. textCoords.x += xOffset;
  2580. }
  2581. var options = {
  2582. centering: {
  2583. x: false,
  2584. y: yCenter
  2585. }
  2586. }; // Clip the bounding box to the displayed area of the image
  2587. if (_store_index_js__WEBPACK_IMPORTED_MODULE_3__["state"].preventTextBoxOutsideDisplayedArea) {
  2588. options.displacer = function (box) {
  2589. return Object(_util_clip_js__WEBPACK_IMPORTED_MODULE_4__["clipBoxToDisplayedArea"])(element, box);
  2590. };
  2591. } // Draw the text box
  2592. textBox.boundingBox = Object(_drawTextBox_js__WEBPACK_IMPORTED_MODULE_1__["default"])(context, text, textCoords.x, textCoords.y, color, options);
  2593. if (textBox.hasMoved) {
  2594. // Identify the possible anchor points for the tool -> text line
  2595. var linkAnchorPoints = textBoxAnchorPoints(handles).map(function (h) {
  2596. return pixelToCanvas(element, h);
  2597. }); // Draw dashed link line between tool and text
  2598. Object(_drawLink_js__WEBPACK_IMPORTED_MODULE_2__["default"])(linkAnchorPoints, textCoords, textBox.boundingBox, context, color, lineWidth);
  2599. }
  2600. });
  2601. /***/ }),
  2602. /***/ "./drawing/drawRect.js":
  2603. /*!*****************************!*\
  2604. !*** ./drawing/drawRect.js ***!
  2605. \*****************************/
  2606. /*! exports provided: default */
  2607. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  2608. "use strict";
  2609. __webpack_require__.r(__webpack_exports__);
  2610. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js");
  2611. /* harmony import */ var _path_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./path.js */ "./drawing/path.js");
  2612. /* harmony import */ var _util_pointProjector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../util/pointProjector.js */ "./util/pointProjector.js");
  2613. /**
  2614. * Draw a rectangle defined by `corner1` and `corner2`.
  2615. * @public
  2616. * @method drawRect
  2617. * @memberof Drawing
  2618. *
  2619. * @param {CanvasRenderingContext2D} context - Target context
  2620. * @param {HTMLElement} element - The DOM Element to draw on
  2621. * @param {Object} corner1 - `{ x, y }` in either pixel or canvas coordinates.
  2622. * @param {Object} corner2 - `{ x, y }` in either pixel or canvas coordinates.
  2623. * @param {Object} options - See {@link path}
  2624. * @param {String} [coordSystem='pixel'] - Can be "pixel" (default) or "canvas". The coordinate
  2625. * system of the points passed in to the function. If "pixel" then cornerstone.pixelToCanvas
  2626. * is used to transform the points from pixel to canvas coordinates.
  2627. * @param {Number} initialRotation - Rectangle initial rotation
  2628. * @returns {undefined}
  2629. */
  2630. /* harmony default export */ __webpack_exports__["default"] = (function (context, element, corner1, corner2, options) {
  2631. var coordSystem = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 'pixel';
  2632. var initialRotation = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : 0.0;
  2633. if (coordSystem === 'pixel') {
  2634. var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone;
  2635. corner1 = cornerstone.pixelToCanvas(element, corner1);
  2636. corner2 = cornerstone.pixelToCanvas(element, corner2);
  2637. }
  2638. var viewport = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.getViewport(element); // Calculate the center of the image
  2639. var width = element.clientWidth,
  2640. height = element.clientHeight;
  2641. var scale = viewport.scale,
  2642. translation = viewport.translation;
  2643. var rotation = viewport.rotation - initialRotation;
  2644. var centerPoint = {
  2645. x: width / 2 + translation.x * scale,
  2646. y: height / 2 + translation.y * scale
  2647. };
  2648. if (Math.abs(rotation) > 0.05) {
  2649. corner1 = Object(_util_pointProjector_js__WEBPACK_IMPORTED_MODULE_2__["rotatePoint"])(corner1, centerPoint, -rotation);
  2650. corner2 = Object(_util_pointProjector_js__WEBPACK_IMPORTED_MODULE_2__["rotatePoint"])(corner2, centerPoint, -rotation);
  2651. }
  2652. var w = Math.abs(corner1.x - corner2.x);
  2653. var h = Math.abs(corner1.y - corner2.y);
  2654. corner1 = {
  2655. x: Math.min(corner1.x, corner2.x),
  2656. y: Math.min(corner1.y, corner2.y)
  2657. };
  2658. corner2 = {
  2659. x: corner1.x + w,
  2660. y: corner1.y + h
  2661. };
  2662. var corner3 = {
  2663. x: corner1.x + w,
  2664. y: corner1.y
  2665. };
  2666. var corner4 = {
  2667. x: corner1.x,
  2668. y: corner1.y + h
  2669. };
  2670. if (Math.abs(rotation) > 0.05) {
  2671. corner1 = Object(_util_pointProjector_js__WEBPACK_IMPORTED_MODULE_2__["rotatePoint"])(corner1, centerPoint, rotation);
  2672. corner2 = Object(_util_pointProjector_js__WEBPACK_IMPORTED_MODULE_2__["rotatePoint"])(corner2, centerPoint, rotation);
  2673. corner3 = Object(_util_pointProjector_js__WEBPACK_IMPORTED_MODULE_2__["rotatePoint"])(corner3, centerPoint, rotation);
  2674. corner4 = Object(_util_pointProjector_js__WEBPACK_IMPORTED_MODULE_2__["rotatePoint"])(corner4, centerPoint, rotation);
  2675. }
  2676. Object(_path_js__WEBPACK_IMPORTED_MODULE_1__["default"])(context, options, function (context) {
  2677. context.moveTo(corner1.x, corner1.y);
  2678. context.lineTo(corner3.x, corner3.y);
  2679. context.lineTo(corner2.x, corner2.y);
  2680. context.lineTo(corner4.x, corner4.y);
  2681. context.lineTo(corner1.x, corner1.y);
  2682. });
  2683. });
  2684. /***/ }),
  2685. /***/ "./drawing/drawTextBox.js":
  2686. /*!********************************!*\
  2687. !*** ./drawing/drawTextBox.js ***!
  2688. \********************************/
  2689. /*! exports provided: textBoxWidth, default */
  2690. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  2691. "use strict";
  2692. __webpack_require__.r(__webpack_exports__);
  2693. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "textBoxWidth", function() { return textBoxWidth; });
  2694. /* harmony import */ var _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../stateManagement/textStyle.js */ "./stateManagement/textStyle.js");
  2695. /* harmony import */ var _draw_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./draw.js */ "./drawing/draw.js");
  2696. /* harmony import */ var _fillTextLines_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./fillTextLines.js */ "./drawing/fillTextLines.js");
  2697. /* harmony import */ var _fillBox_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./fillBox.js */ "./drawing/fillBox.js");
  2698. /**
  2699. * Compute the width of the box required to display the given `text` with a given `padding`.
  2700. * @public
  2701. * @function textBoxWidth
  2702. * @memberof Drawing
  2703. *
  2704. * @param {CanvasRenderingContext2D} context - Target context
  2705. * @param {String} text - The text to find the width of.
  2706. * @param {Number} padding - The padding to apply on either end of the text.
  2707. * @returns {Number} computed text box width
  2708. */
  2709. function textBoxWidth(context, text, padding) {
  2710. var font = _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_0__["default"].getFont();
  2711. var origFont = context.font;
  2712. if (font && font !== origFont) {
  2713. context.font = font;
  2714. }
  2715. var width = context.measureText(text).width;
  2716. if (font && font !== origFont) {
  2717. context.font = origFont;
  2718. }
  2719. return width + 2 * padding;
  2720. }
  2721. /**
  2722. * Draws a textBox.
  2723. * @public
  2724. * @function drawTextBox
  2725. * @memberof Drawing
  2726. *
  2727. * @param {CanvasRenderingContext2D} context The canvas context.
  2728. * @param {string} textLines The text to display.
  2729. * @param {number} x The x position of the textBox.
  2730. * @param {number} y The y position of the textBox.
  2731. * @param {string} color The color of the textBox.
  2732. * @param {Object} options Options for the textBox.
  2733. * @param {boolean} options.centering Option to center the textbox.
  2734. * @param {function} options.displacer displacer function.
  2735. * @returns {Object} {top, left, width, height} - Bounding box; can be used for pointNearTool
  2736. */
  2737. /* harmony default export */ __webpack_exports__["default"] = (function (context, textLines, x, y, color) {
  2738. var options = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};
  2739. if (Object.prototype.toString.call(textLines) !== '[object Array]') {
  2740. textLines = [textLines];
  2741. }
  2742. var padding = 5;
  2743. var fontSize = _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_0__["default"].getFontSize();
  2744. var backgroundColor = _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_0__["default"].getBackgroundColor(); // Find the longest text width in the array of text data
  2745. var maxWidth = 0;
  2746. textLines.forEach(function (text) {
  2747. // Get the text width in the current font
  2748. var width = textBoxWidth(context, text, padding); // Find the maximum with for all the text rows;
  2749. maxWidth = Math.max(maxWidth, width);
  2750. }); // Calculate the bounding box for this text box
  2751. var boundingBox = {
  2752. width: maxWidth,
  2753. height: padding + textLines.length * (fontSize + padding)
  2754. };
  2755. Object(_draw_js__WEBPACK_IMPORTED_MODULE_1__["default"])(context, function (context) {
  2756. context.strokeStyle = color; // Draw the background box with padding
  2757. if (options.centering) {
  2758. if (options.centering.x === true) {
  2759. x -= boundingBox.width / 2;
  2760. }
  2761. if (options.centering.y === true) {
  2762. y -= boundingBox.height / 2;
  2763. }
  2764. }
  2765. boundingBox.left = x;
  2766. boundingBox.top = y; // Check if a displacer function was provided
  2767. if (typeof options.displacer === 'function') {
  2768. options.displacer(boundingBox);
  2769. }
  2770. Object(_fillBox_js__WEBPACK_IMPORTED_MODULE_3__["default"])(context, boundingBox, backgroundColor); // Draw each of the text lines on top of the background box
  2771. Object(_fillTextLines_js__WEBPACK_IMPORTED_MODULE_2__["default"])(context, boundingBox, textLines, color, padding);
  2772. }); // Return the bounding box so it can be used for pointNearHandle
  2773. return boundingBox;
  2774. });
  2775. /***/ }),
  2776. /***/ "./drawing/fillBox.js":
  2777. /*!****************************!*\
  2778. !*** ./drawing/fillBox.js ***!
  2779. \****************************/
  2780. /*! exports provided: default */
  2781. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  2782. "use strict";
  2783. __webpack_require__.r(__webpack_exports__);
  2784. /**
  2785. * Draw a filled rectangle defined by `boundingBox` using the style defined by `fillStyle`.
  2786. * @public
  2787. * @method fillBox
  2788. * @memberof Drawing
  2789. *
  2790. * @param {CanvasRenderingContext2D} context - Target context
  2791. * @param {Object} boundingBox - `{ left, top, width, height }` in canvas coordinates.
  2792. * @param {FillStyle} fillStyle - The fillStyle to apply to the region.
  2793. * @returns {undefined}
  2794. */
  2795. /* harmony default export */ __webpack_exports__["default"] = (function (context, boundingBox, fillStyle) {
  2796. context.fillStyle = fillStyle;
  2797. context.fillRect(boundingBox.left, boundingBox.top, boundingBox.width, boundingBox.height);
  2798. });
  2799. /***/ }),
  2800. /***/ "./drawing/fillOutsideRect.js":
  2801. /*!************************************!*\
  2802. !*** ./drawing/fillOutsideRect.js ***!
  2803. \************************************/
  2804. /*! exports provided: default */
  2805. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  2806. "use strict";
  2807. __webpack_require__.r(__webpack_exports__);
  2808. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js");
  2809. /* harmony import */ var _path_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./path.js */ "./drawing/path.js");
  2810. /**
  2811. * Fill the region outside a rectangle defined by `corner1` and `corner2`.
  2812. * @public
  2813. * @method fillOutsideRect
  2814. * @memberof Drawing
  2815. *
  2816. * @param {CanvasRenderingContext2D} context - Target context
  2817. * @param {HTMLElement} element - The DOM Element to draw on
  2818. * @param {Object} corner1 - `{ x, y }` in either pixel or canvas coordinates.
  2819. * @param {Object} corner2 - `{ x, y }` in either pixel or canvas coordinates.
  2820. * @param {Object} options - See {@link path}
  2821. * @param {String} [coordSystem='pixel'] - Can be "pixel" (default) or "canvas". The coordinate
  2822. * system of the points passed in to the function. If "pixel" then cornerstone.pixelToCanvas
  2823. * is used to transform the points from pixel to canvas coordinates.
  2824. * @returns {undefined}
  2825. */
  2826. /* harmony default export */ __webpack_exports__["default"] = (function (context, element, corner1, corner2, options) {
  2827. var coordSystem = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 'pixel';
  2828. if (coordSystem === 'pixel') {
  2829. var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone;
  2830. corner1 = cornerstone.pixelToCanvas(element, corner1);
  2831. corner2 = cornerstone.pixelToCanvas(element, corner2);
  2832. }
  2833. var left = Math.min(corner1.x, corner2.x);
  2834. var top = Math.min(corner1.y, corner2.y);
  2835. var width = Math.abs(corner1.x - corner2.x);
  2836. var height = Math.abs(corner1.y - corner2.y);
  2837. Object(_path_js__WEBPACK_IMPORTED_MODULE_1__["default"])(context, options, function (context) {
  2838. context.rect(0, 0, context.canvas.clientWidth, context.canvas.clientHeight);
  2839. context.rect(left + width, top, -width, height);
  2840. });
  2841. });
  2842. /***/ }),
  2843. /***/ "./drawing/fillTextLines.js":
  2844. /*!**********************************!*\
  2845. !*** ./drawing/fillTextLines.js ***!
  2846. \**********************************/
  2847. /*! exports provided: default */
  2848. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  2849. "use strict";
  2850. __webpack_require__.r(__webpack_exports__);
  2851. /* harmony import */ var _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../stateManagement/textStyle.js */ "./stateManagement/textStyle.js");
  2852. /**
  2853. * Draw multiple lines of text within a bounding box.
  2854. * @public
  2855. * @method fillTextLines
  2856. * @memberof Drawing
  2857. *
  2858. * @param {CanvasRenderingContext2D} context - Target context
  2859. * @param {Object} boundingBox - `{ left, top }` in canvas coordinates. Only the top-left corner is specified, as the text will take up as much space as it needs.
  2860. * @param {String[]} textLines - The text to be displayed.
  2861. * @param {FillStyle} fillStyle - The fillStyle to apply to the text.
  2862. * @param {Number} padding - The amount of padding above/below each line in canvas units. Note this gives an inter-line spacing of `2*padding`.
  2863. * @returns {undefined}
  2864. */
  2865. /* harmony default export */ __webpack_exports__["default"] = (function (context, boundingBox, textLines, fillStyle, padding) {
  2866. var fontSize = _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_0__["default"].getFontSize();
  2867. context.font = _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_0__["default"].getFont();
  2868. context.textBaseline = 'top';
  2869. context.fillStyle = fillStyle;
  2870. textLines.forEach(function (text, index) {
  2871. context.fillText(text, boundingBox.left + padding, boundingBox.top + padding + index * (fontSize + padding));
  2872. });
  2873. });
  2874. /***/ }),
  2875. /***/ "./drawing/getNewContext.js":
  2876. /*!**********************************!*\
  2877. !*** ./drawing/getNewContext.js ***!
  2878. \**********************************/
  2879. /*! exports provided: default */
  2880. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  2881. "use strict";
  2882. __webpack_require__.r(__webpack_exports__);
  2883. /**
  2884. * Create a new {@link CanvasRenderingContext2D|context} object for the given {@link HTMLCanvasElement|canvas}
  2885. * and set the transform to the {@link https://www.w3.org/TR/2dcontext/#transformations|identity transform}.
  2886. *
  2887. * @public
  2888. * @function getNewContext
  2889. * @memberof Drawing
  2890. *
  2891. * @param {HTMLCanvasElement} canvas - Canvas you would like the context for
  2892. * @returns {CanvasRenderingContext2D} - The provided canvas's 2d context
  2893. */
  2894. /* harmony default export */ __webpack_exports__["default"] = (function (canvas) {
  2895. var context = canvas.getContext('2d');
  2896. context.setTransform(1, 0, 0, 1, 0, 0);
  2897. return context;
  2898. });
  2899. /***/ }),
  2900. /***/ "./drawing/index.js":
  2901. /*!**************************!*\
  2902. !*** ./drawing/index.js ***!
  2903. \**************************/
  2904. /*! exports provided: draw, drawArrow, drawCircle, drawEllipse, drawHandles, drawJoinedLines, drawLine, drawLines, drawLink, drawLinkedTextBox, drawRect, drawTextBox, fillBox, fillOutsideRect, fillTextLines, getNewContext, path, setShadow, transformCanvasContext, resetCanvasContextTransform */
  2905. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  2906. "use strict";
  2907. __webpack_require__.r(__webpack_exports__);
  2908. /* harmony import */ var _draw_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./draw.js */ "./drawing/draw.js");
  2909. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "draw", function() { return _draw_js__WEBPACK_IMPORTED_MODULE_0__["default"]; });
  2910. /* harmony import */ var _drawArrow_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./drawArrow.js */ "./drawing/drawArrow.js");
  2911. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "drawArrow", function() { return _drawArrow_js__WEBPACK_IMPORTED_MODULE_1__["default"]; });
  2912. /* harmony import */ var _drawCircle_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./drawCircle.js */ "./drawing/drawCircle.js");
  2913. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "drawCircle", function() { return _drawCircle_js__WEBPACK_IMPORTED_MODULE_2__["default"]; });
  2914. /* harmony import */ var _drawEllipse_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./drawEllipse.js */ "./drawing/drawEllipse.js");
  2915. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "drawEllipse", function() { return _drawEllipse_js__WEBPACK_IMPORTED_MODULE_3__["default"]; });
  2916. /* harmony import */ var _drawHandles_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./drawHandles.js */ "./drawing/drawHandles.js");
  2917. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "drawHandles", function() { return _drawHandles_js__WEBPACK_IMPORTED_MODULE_4__["default"]; });
  2918. /* harmony import */ var _drawJoinedLines_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./drawJoinedLines.js */ "./drawing/drawJoinedLines.js");
  2919. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "drawJoinedLines", function() { return _drawJoinedLines_js__WEBPACK_IMPORTED_MODULE_5__["default"]; });
  2920. /* harmony import */ var _drawLine_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./drawLine.js */ "./drawing/drawLine.js");
  2921. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "drawLine", function() { return _drawLine_js__WEBPACK_IMPORTED_MODULE_6__["default"]; });
  2922. /* harmony import */ var _drawLines_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./drawLines.js */ "./drawing/drawLines.js");
  2923. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "drawLines", function() { return _drawLines_js__WEBPACK_IMPORTED_MODULE_7__["default"]; });
  2924. /* harmony import */ var _drawLink_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./drawLink.js */ "./drawing/drawLink.js");
  2925. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "drawLink", function() { return _drawLink_js__WEBPACK_IMPORTED_MODULE_8__["default"]; });
  2926. /* harmony import */ var _drawLinkedTextBox_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./drawLinkedTextBox.js */ "./drawing/drawLinkedTextBox.js");
  2927. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "drawLinkedTextBox", function() { return _drawLinkedTextBox_js__WEBPACK_IMPORTED_MODULE_9__["default"]; });
  2928. /* harmony import */ var _drawRect_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./drawRect.js */ "./drawing/drawRect.js");
  2929. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "drawRect", function() { return _drawRect_js__WEBPACK_IMPORTED_MODULE_10__["default"]; });
  2930. /* harmony import */ var _drawTextBox_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./drawTextBox.js */ "./drawing/drawTextBox.js");
  2931. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "drawTextBox", function() { return _drawTextBox_js__WEBPACK_IMPORTED_MODULE_11__["default"]; });
  2932. /* harmony import */ var _fillBox_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./fillBox.js */ "./drawing/fillBox.js");
  2933. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "fillBox", function() { return _fillBox_js__WEBPACK_IMPORTED_MODULE_12__["default"]; });
  2934. /* harmony import */ var _fillOutsideRect_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./fillOutsideRect.js */ "./drawing/fillOutsideRect.js");
  2935. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "fillOutsideRect", function() { return _fillOutsideRect_js__WEBPACK_IMPORTED_MODULE_13__["default"]; });
  2936. /* harmony import */ var _fillTextLines_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./fillTextLines.js */ "./drawing/fillTextLines.js");
  2937. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "fillTextLines", function() { return _fillTextLines_js__WEBPACK_IMPORTED_MODULE_14__["default"]; });
  2938. /* harmony import */ var _getNewContext_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./getNewContext.js */ "./drawing/getNewContext.js");
  2939. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getNewContext", function() { return _getNewContext_js__WEBPACK_IMPORTED_MODULE_15__["default"]; });
  2940. /* harmony import */ var _path_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./path.js */ "./drawing/path.js");
  2941. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "path", function() { return _path_js__WEBPACK_IMPORTED_MODULE_16__["default"]; });
  2942. /* harmony import */ var _setShadow_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./setShadow.js */ "./drawing/setShadow.js");
  2943. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setShadow", function() { return _setShadow_js__WEBPACK_IMPORTED_MODULE_17__["default"]; });
  2944. /* harmony import */ var _transformCanvasContext_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./transformCanvasContext.js */ "./drawing/transformCanvasContext.js");
  2945. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "transformCanvasContext", function() { return _transformCanvasContext_js__WEBPACK_IMPORTED_MODULE_18__["default"]; });
  2946. /* harmony import */ var _resetCanvasContextTransform_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./resetCanvasContextTransform.js */ "./drawing/resetCanvasContextTransform.js");
  2947. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "resetCanvasContextTransform", function() { return _resetCanvasContextTransform_js__WEBPACK_IMPORTED_MODULE_19__["default"]; });
  2948. /**
  2949. * A {@link https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/fillStyle|color, gradient or pattern} to use inside shapes.
  2950. * @typedef {(String|CanvasGradient|CanvasPattern)} FillStyle
  2951. */
  2952. /**
  2953. * A {@link https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/strokeStyle|color, gradient or pattern} to use for the lines around shapes.
  2954. * @typedef {(String|CanvasGradient|CanvasPattern)} StrokeStyle
  2955. */
  2956. /**
  2957. * @callback ContextFn
  2958. * @param {CanvasRenderingContext2D} context
  2959. */
  2960. // Named exports
  2961. /***/ }),
  2962. /***/ "./drawing/path.js":
  2963. /*!*************************!*\
  2964. !*** ./drawing/path.js ***!
  2965. \*************************/
  2966. /*! exports provided: default */
  2967. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  2968. "use strict";
  2969. __webpack_require__.r(__webpack_exports__);
  2970. /* harmony import */ var _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../stateManagement/toolStyle.js */ "./stateManagement/toolStyle.js");
  2971. /**
  2972. * This function manages the beginPath/stroke pattern for working with
  2973. * {@link https://www.w3.org/TR/2dcontext/#drawing-paths-to-the-canvas|path objects}.
  2974. *
  2975. * @public
  2976. * @function path
  2977. * @memberof Drawing
  2978. *
  2979. * @param {CanvasRenderingContext2D} context - Context to add path to
  2980. * @param {Object} [options={}] - Drawing Options
  2981. * @param {StrokeStyle} [options.color] - The stroke style of the path.
  2982. * @param {number} [options.lineWidth] - The width of lines in the path. If null, no line width is set.
  2983. * If undefined then toolStyle.getToolWidth() is set.
  2984. * @param {FillStyle} [options.fillStyle] - The style to fill the path with. If undefined then no filling is done.
  2985. * @param {Number[]} [options.lineDash] - The {@link https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/setLineDash|dash pattern}
  2986. * to use on the lines.
  2987. * @param {boolean} [options.shouldDrawLines = true] Whether context.stroke should be evoked.
  2988. * @param {ContextFn} fn - A drawing function to execute with the provided stroke pattern.
  2989. * @returns {undefined}
  2990. */
  2991. /* harmony default export */ __webpack_exports__["default"] = (function (context) {
  2992. var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  2993. var fn = arguments.length > 2 ? arguments[2] : undefined;
  2994. var color = options.color,
  2995. lineWidth = options.lineWidth,
  2996. fillStyle = options.fillStyle,
  2997. lineDash = options.lineDash,
  2998. _options$shouldDrawLi = options.shouldDrawLines,
  2999. shouldDrawLines = _options$shouldDrawLi === void 0 ? true : _options$shouldDrawLi;
  3000. context.beginPath();
  3001. context.strokeStyle = color || context.strokeStyle;
  3002. context.lineWidth = lineWidth || lineWidth === undefined && _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_0__["default"].getToolWidth() || context.lineWidth;
  3003. if (lineDash) {
  3004. context.setLineDash(lineDash);
  3005. }
  3006. fn(context);
  3007. if (fillStyle) {
  3008. context.fillStyle = fillStyle;
  3009. context.fill();
  3010. }
  3011. if (shouldDrawLines) {
  3012. context.stroke();
  3013. }
  3014. if (lineDash) {
  3015. context.setLineDash([]);
  3016. }
  3017. });
  3018. /***/ }),
  3019. /***/ "./drawing/resetCanvasContextTransform.js":
  3020. /*!************************************************!*\
  3021. !*** ./drawing/resetCanvasContextTransform.js ***!
  3022. \************************************************/
  3023. /*! exports provided: default */
  3024. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  3025. "use strict";
  3026. __webpack_require__.r(__webpack_exports__);
  3027. /**
  3028. * Resets the canvas {@link CanvasRenderingContext2D|context} transform to the
  3029. * {@link https://www.w3.org/TR/2dcontext/#transformations|identity transform}.
  3030. *
  3031. * @public
  3032. * @function resetCanvasContextTransform
  3033. * @memberof Drawing
  3034. *
  3035. * @param {CanvasRenderingContext2D} context - context you wish to transform
  3036. * @returns {void}
  3037. */
  3038. /* harmony default export */ __webpack_exports__["default"] = (function (context) {
  3039. context.setTransform(1, 0, 0, 1, 0, 0);
  3040. });
  3041. /***/ }),
  3042. /***/ "./drawing/setShadow.js":
  3043. /*!******************************!*\
  3044. !*** ./drawing/setShadow.js ***!
  3045. \******************************/
  3046. /*! exports provided: default */
  3047. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  3048. "use strict";
  3049. __webpack_require__.r(__webpack_exports__);
  3050. /* harmony import */ var _util_getDefault_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../util/getDefault.js */ "./util/getDefault.js");
  3051. /**
  3052. * Set the {@link https://www.w3.org/TR/2dcontext/#shadows|shadow} properties of the context.
  3053. * Each property is set on the context object if defined, otherwise a default value is set.
  3054. *
  3055. * @public
  3056. * @method setShadow
  3057. * @memberof Drawing
  3058. *
  3059. * @param {CanvasRenderingContext2D} context - Context to apply shadow options on
  3060. * @param {Object} [options={}] - Options object
  3061. * @param {Boolean} [options.shadow=undefined] - Whether to set any shadow options
  3062. * @param {String} [options.shadowColor=#000000] - Default value: #000000
  3063. * @param {Number} [options.shadowBlur=0] - Default Value: 0
  3064. * @param {Number} [options.shadowOffsetX=1] - Default value: 1
  3065. * @param {Number} [options.shadowOffsetY=1] - Default value: 1
  3066. * @returns {undefined}
  3067. */
  3068. /* harmony default export */ __webpack_exports__["default"] = (function (context) {
  3069. var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  3070. if (options.shadow) {
  3071. context.shadowColor = Object(_util_getDefault_js__WEBPACK_IMPORTED_MODULE_0__["default"])(options.shadowColor, '#000000');
  3072. context.shadowBlur = Object(_util_getDefault_js__WEBPACK_IMPORTED_MODULE_0__["default"])(options.shadowBlur, 0);
  3073. context.shadowOffsetX = Object(_util_getDefault_js__WEBPACK_IMPORTED_MODULE_0__["default"])(options.shadowOffsetX, 1);
  3074. context.shadowOffsetY = Object(_util_getDefault_js__WEBPACK_IMPORTED_MODULE_0__["default"])(options.shadowOffsetY, 1);
  3075. }
  3076. });
  3077. /***/ }),
  3078. /***/ "./drawing/transformCanvasContext.js":
  3079. /*!*******************************************!*\
  3080. !*** ./drawing/transformCanvasContext.js ***!
  3081. \*******************************************/
  3082. /*! exports provided: default */
  3083. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  3084. "use strict";
  3085. __webpack_require__.r(__webpack_exports__);
  3086. /**
  3087. * Transform the canvas {@link CanvasRenderingContext2D|context} such that it
  3088. * coincides with the orientation of the viewport.
  3089. *
  3090. * @public
  3091. * @function transformCanvasContext
  3092. * @memberof Drawing
  3093. *
  3094. * @param {CanvasRenderingContext2D} context - Context you wish to transform.
  3095. * @param {HTMLCanvasElement} canvas - Canvas the context relates to.
  3096. * @param {*} viewport - The viewport you wish to map on to.
  3097. * @returns {void}
  3098. */
  3099. /* harmony default export */ __webpack_exports__["default"] = (function (context, canvas, viewport) {
  3100. if (!(viewport.hflip || viewport.vflip || viewport.rotation)) {
  3101. return;
  3102. }
  3103. var translation = {
  3104. x: canvas.width / 2 + viewport.translation.x * viewport.scale,
  3105. y: canvas.height / 2 + viewport.translation.y * viewport.scale
  3106. };
  3107. context.translate(translation.x, translation.y);
  3108. if (viewport.rotation) {
  3109. context.rotate(viewport.rotation * Math.PI / 180);
  3110. }
  3111. if (viewport.vflip) {
  3112. context.scale(1, -1);
  3113. }
  3114. if (viewport.hflip) {
  3115. context.scale(-1, 1);
  3116. }
  3117. context.translate(-translation.x, -translation.y);
  3118. });
  3119. /***/ }),
  3120. /***/ "./eventDispatchers/imageRenderedEventDispatcher.js":
  3121. /*!**********************************************************!*\
  3122. !*** ./eventDispatchers/imageRenderedEventDispatcher.js ***!
  3123. \**********************************************************/
  3124. /*! exports provided: default */
  3125. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  3126. "use strict";
  3127. __webpack_require__.r(__webpack_exports__);
  3128. /* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../store/index.js */ "./store/index.js");
  3129. /* harmony import */ var _stateManagement_toolState__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../stateManagement/toolState */ "./stateManagement/toolState.js");
  3130. /* harmony import */ var _eventListeners_onImageRenderedBrushEventHandler_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../eventListeners/onImageRenderedBrushEventHandler.js */ "./eventListeners/onImageRenderedBrushEventHandler.js");
  3131. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js");
  3132. var segmentationModule = Object(_store_index_js__WEBPACK_IMPORTED_MODULE_0__["getModule"])('segmentation');
  3133. var onImageRendered = function onImageRendered(evt) {
  3134. var eventData = evt.detail;
  3135. var element = eventData.element; // Render Annotation Tools
  3136. var toolsToRender = _store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].tools.filter(function (tool) {
  3137. return tool.element === element && (tool.mode === 'active' || tool.mode === 'passive' || tool.mode === 'enabled');
  3138. }); // Must be using stacks in order to use segmentation tools.
  3139. var stackToolState = Object(_stateManagement_toolState__WEBPACK_IMPORTED_MODULE_1__["getToolState"])(element, 'stack');
  3140. var segmentationConfiguration = segmentationModule.configuration;
  3141. if (stackToolState && (segmentationConfiguration.renderFill || segmentationConfiguration.renderOutline)) {
  3142. Object(_eventListeners_onImageRenderedBrushEventHandler_js__WEBPACK_IMPORTED_MODULE_2__["default"])(evt);
  3143. }
  3144. var context = eventData.canvasContext.canvas.getContext('2d');
  3145. toolsToRender.forEach(function (tool) {
  3146. if (tool.renderToolData) {
  3147. context.save();
  3148. tool.renderToolData(evt);
  3149. context.restore();
  3150. }
  3151. });
  3152. };
  3153. var enable = function enable(element) {
  3154. element.addEventListener(_externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstone.EVENTS.IMAGE_RENDERED, onImageRendered);
  3155. };
  3156. var disable = function disable(element) {
  3157. element.removeEventListener(_externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstone.EVENTS.IMAGE_RENDERED, onImageRendered);
  3158. };
  3159. /* harmony default export */ __webpack_exports__["default"] = ({
  3160. enable: enable,
  3161. disable: disable
  3162. });
  3163. /***/ }),
  3164. /***/ "./eventDispatchers/index.js":
  3165. /*!***********************************!*\
  3166. !*** ./eventDispatchers/index.js ***!
  3167. \***********************************/
  3168. /*! exports provided: imageRenderedEventDispatcher, mouseToolEventDispatcher, newImageEventDispatcher, touchToolEventDispatcher */
  3169. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  3170. "use strict";
  3171. __webpack_require__.r(__webpack_exports__);
  3172. /* harmony import */ var _imageRenderedEventDispatcher_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./imageRenderedEventDispatcher.js */ "./eventDispatchers/imageRenderedEventDispatcher.js");
  3173. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "imageRenderedEventDispatcher", function() { return _imageRenderedEventDispatcher_js__WEBPACK_IMPORTED_MODULE_0__["default"]; });
  3174. /* harmony import */ var _mouseToolEventDispatcher_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./mouseToolEventDispatcher.js */ "./eventDispatchers/mouseToolEventDispatcher.js");
  3175. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mouseToolEventDispatcher", function() { return _mouseToolEventDispatcher_js__WEBPACK_IMPORTED_MODULE_1__["default"]; });
  3176. /* harmony import */ var _newImageEventDispatcher_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./newImageEventDispatcher.js */ "./eventDispatchers/newImageEventDispatcher.js");
  3177. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "newImageEventDispatcher", function() { return _newImageEventDispatcher_js__WEBPACK_IMPORTED_MODULE_2__["default"]; });
  3178. /* harmony import */ var _touchToolEventDispatcher_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./touchToolEventDispatcher.js */ "./eventDispatchers/touchToolEventDispatcher.js");
  3179. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "touchToolEventDispatcher", function() { return _touchToolEventDispatcher_js__WEBPACK_IMPORTED_MODULE_3__["default"]; });
  3180. /***/ }),
  3181. /***/ "./eventDispatchers/mouseEventHandlers/addNewMeasurement.js":
  3182. /*!******************************************************************!*\
  3183. !*** ./eventDispatchers/mouseEventHandlers/addNewMeasurement.js ***!
  3184. \******************************************************************/
  3185. /*! exports provided: default */
  3186. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  3187. "use strict";
  3188. __webpack_require__.r(__webpack_exports__);
  3189. /* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../events.js */ "./events.js");
  3190. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../externalModules.js */ "./externalModules.js");
  3191. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  3192. /* harmony import */ var _manipulators_index_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../manipulators/index.js */ "./manipulators/index.js");
  3193. /* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../util/logger.js */ "./util/logger.js");
  3194. /* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../util/triggerEvent.js */ "./util/triggerEvent.js");
  3195. var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_4__["getLogger"])('eventDispatchers:mouseEventHandlers');
  3196. /* harmony default export */ __webpack_exports__["default"] = (function (evt, tool) {
  3197. logger.log('addNewMeasurement');
  3198. evt.preventDefault();
  3199. evt.stopPropagation();
  3200. var eventData = evt.detail;
  3201. var element = eventData.element;
  3202. var measurementData = tool.createNewMeasurement(eventData);
  3203. if (!measurementData) {
  3204. return;
  3205. }
  3206. Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_2__["addToolState"])(element, tool.name, measurementData);
  3207. _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.updateImage(element);
  3208. var handleMover = Object.keys(measurementData.handles).length === 1 ? _manipulators_index_js__WEBPACK_IMPORTED_MODULE_3__["moveHandle"] : _manipulators_index_js__WEBPACK_IMPORTED_MODULE_3__["moveNewHandle"];
  3209. var timestamp = new Date().getTime();
  3210. handleMover(eventData, tool.name, measurementData, measurementData.handles.end, tool.options, 'mouse', function (success) {
  3211. if (measurementData.cancelled) {
  3212. return;
  3213. }
  3214. var hasThreshold = tool.configuration && Object(tool.configuration).hasOwnProperty('measurementCreationThreshold');
  3215. var isTooFast = hasThreshold ? new Date().getTime() - timestamp < tool.configuration.measurementCreationThreshold : false;
  3216. if (success && isTooFast === false) {
  3217. var eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MEASUREMENT_COMPLETED;
  3218. var _eventData = {
  3219. toolName: tool.name,
  3220. toolType: tool.name,
  3221. // Deprecation notice: toolType will be replaced by toolName
  3222. element: element,
  3223. measurementData: measurementData
  3224. };
  3225. Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_5__["default"])(element, eventType, _eventData);
  3226. } else {
  3227. Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_2__["removeToolState"])(element, tool.name, measurementData);
  3228. }
  3229. });
  3230. });
  3231. /***/ }),
  3232. /***/ "./eventDispatchers/mouseEventHandlers/index.js":
  3233. /*!******************************************************!*\
  3234. !*** ./eventDispatchers/mouseEventHandlers/index.js ***!
  3235. \******************************************************/
  3236. /*! exports provided: mouseClick, mouseDown, mouseDownActivate, mouseDoubleClick, mouseDrag, mouseMove, mouseUp, mouseWheel */
  3237. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  3238. "use strict";
  3239. __webpack_require__.r(__webpack_exports__);
  3240. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mouseClick", function() { return mouseClick; });
  3241. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mouseDoubleClick", function() { return mouseDoubleClick; });
  3242. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mouseUp", function() { return mouseUp; });
  3243. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mouseWheel", function() { return mouseWheel; });
  3244. /* harmony import */ var _shared_customCallbackHandler_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../shared/customCallbackHandler.js */ "./eventDispatchers/shared/customCallbackHandler.js");
  3245. /* harmony import */ var _mouseDown_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./mouseDown.js */ "./eventDispatchers/mouseEventHandlers/mouseDown.js");
  3246. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mouseDown", function() { return _mouseDown_js__WEBPACK_IMPORTED_MODULE_1__["default"]; });
  3247. /* harmony import */ var _mouseDownActivate_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./mouseDownActivate.js */ "./eventDispatchers/mouseEventHandlers/mouseDownActivate.js");
  3248. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mouseDownActivate", function() { return _mouseDownActivate_js__WEBPACK_IMPORTED_MODULE_2__["default"]; });
  3249. /* harmony import */ var _mouseDrag_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./mouseDrag.js */ "./eventDispatchers/mouseEventHandlers/mouseDrag.js");
  3250. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mouseDrag", function() { return _mouseDrag_js__WEBPACK_IMPORTED_MODULE_3__["default"]; });
  3251. /* harmony import */ var _mouseMove_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./mouseMove.js */ "./eventDispatchers/mouseEventHandlers/mouseMove.js");
  3252. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mouseMove", function() { return _mouseMove_js__WEBPACK_IMPORTED_MODULE_4__["default"]; });
  3253. var mouseClick = _shared_customCallbackHandler_js__WEBPACK_IMPORTED_MODULE_0__["default"].bind(null, 'Mouse', 'mouseClickCallback');
  3254. var mouseDoubleClick = _shared_customCallbackHandler_js__WEBPACK_IMPORTED_MODULE_0__["default"].bind(null, 'Mouse', 'doubleClickCallback');
  3255. var mouseUp = _shared_customCallbackHandler_js__WEBPACK_IMPORTED_MODULE_0__["default"].bind(null, 'Mouse', 'mouseUpCallback');
  3256. var mouseWheel = _shared_customCallbackHandler_js__WEBPACK_IMPORTED_MODULE_0__["default"].bind(null, 'MouseWheel', 'mouseWheelCallback');
  3257. /***/ }),
  3258. /***/ "./eventDispatchers/mouseEventHandlers/mouseDown.js":
  3259. /*!**********************************************************!*\
  3260. !*** ./eventDispatchers/mouseEventHandlers/mouseDown.js ***!
  3261. \**********************************************************/
  3262. /*! exports provided: default */
  3263. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  3264. "use strict";
  3265. __webpack_require__.r(__webpack_exports__);
  3266. /* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../store/index.js */ "./store/index.js");
  3267. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  3268. /* harmony import */ var _store_getToolsWithMoveableHandles_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../store/getToolsWithMoveableHandles.js */ "./store/getToolsWithMoveableHandles.js");
  3269. /* harmony import */ var _util_findAndMoveHelpers_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../util/findAndMoveHelpers.js */ "./util/findAndMoveHelpers.js");
  3270. /* harmony import */ var _store_getInteractiveToolsForElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./../../store/getInteractiveToolsForElement.js */ "./store/getInteractiveToolsForElement.js");
  3271. /* harmony import */ var _store_getToolsWithDataForElement_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../../store/getToolsWithDataForElement.js */ "./store/getToolsWithDataForElement.js");
  3272. /* harmony import */ var _store_filterToolsUsableWithMultiPartTools_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./../../store/filterToolsUsableWithMultiPartTools.js */ "./store/filterToolsUsableWithMultiPartTools.js");
  3273. // State
  3274. // Util
  3275. /**
  3276. * MouseDown is called before MouseDownActivate. If MouseDown
  3277. * finds an existing tool to interact with, it can prevent the
  3278. * event from bubbling to MouseDownActivate.
  3279. *
  3280. * @private
  3281. * @param {mousedown} evt
  3282. * @listens {CornerstoneTools.event:cornerstonetoolsmousedown}
  3283. * @returns {undefined}
  3284. */
  3285. /* harmony default export */ __webpack_exports__["default"] = (function (evt) {
  3286. if (_store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isToolLocked) {
  3287. return;
  3288. }
  3289. var eventData = evt.detail;
  3290. var element = evt.detail.element;
  3291. var coords = evt.detail.currentPoints.canvas; // High level filtering
  3292. var activeAndPassiveTools = Object(_store_getInteractiveToolsForElement_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, _store_index_js__WEBPACK_IMPORTED_MODULE_0__["getters"].mouseTools()); // ACTIVE TOOL W/ PRE CALLBACK?
  3293. // Note: In theory, this should only ever be a single tool.
  3294. var activeTools = activeAndPassiveTools.filter(function (tool) {
  3295. return tool.mode === 'active' && Array.isArray(tool.options.mouseButtonMask) && tool.options.mouseButtonMask.includes(eventData.buttons) && tool.options.isMouseActive;
  3296. });
  3297. if (_store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isMultiPartToolActive) {
  3298. activeTools = Object(_store_filterToolsUsableWithMultiPartTools_js__WEBPACK_IMPORTED_MODULE_6__["default"])(activeTools);
  3299. } // If any tools are active, check if they have a special reason for dealing with the event.
  3300. if (activeTools.length > 0) {
  3301. // TODO: If length > 1, you could assess fitness and select the ideal tool
  3302. // TODO: But because we're locking this to 'active' tools, that should rarely be an issue
  3303. // Super-Meta-TODO: ^ I think we should just take the approach of one active tool per mouse button?
  3304. var firstActiveToolWithCallback = activeTools.find(function (tool) {
  3305. return typeof tool.preMouseDownCallback === 'function';
  3306. });
  3307. if (firstActiveToolWithCallback) {
  3308. var consumedEvent = firstActiveToolWithCallback.preMouseDownCallback(evt);
  3309. if (consumedEvent) {
  3310. return;
  3311. }
  3312. }
  3313. }
  3314. if (_store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isMultiPartToolActive) {
  3315. // Don't fire events to Annotation Tools during a multi part loop.
  3316. return;
  3317. } // Annotation tool specific
  3318. var annotationTools = Object(_store_getToolsWithDataForElement_js__WEBPACK_IMPORTED_MODULE_5__["default"])(element, activeAndPassiveTools); // NEAR HANDLES?
  3319. var annotationToolsWithMoveableHandles = Object(_store_getToolsWithMoveableHandles_js__WEBPACK_IMPORTED_MODULE_2__["default"])(element, annotationTools, coords, 'mouse');
  3320. if (annotationToolsWithMoveableHandles.length > 0) {
  3321. var firstToolWithMoveableHandles = annotationToolsWithMoveableHandles[0];
  3322. var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getToolState"])(element, firstToolWithMoveableHandles.name);
  3323. var _findHandleDataNearIm = Object(_util_findAndMoveHelpers_js__WEBPACK_IMPORTED_MODULE_3__["findHandleDataNearImagePoint"])(element, toolState, firstToolWithMoveableHandles.name, coords),
  3324. handle = _findHandleDataNearIm.handle,
  3325. data = _findHandleDataNearIm.data;
  3326. firstToolWithMoveableHandles.handleSelectedCallback(evt, data, handle, 'mouse');
  3327. return;
  3328. } // NEAR TOOL?
  3329. var annotationToolsWithPointNearClick = activeAndPassiveTools.filter(function (tool) {
  3330. var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getToolState"])(element, tool.name);
  3331. var isNearPoint = toolState && toolState.data && tool.pointNearTool && toolState.data.some(function (data) {
  3332. return tool.pointNearTool(element, data, coords, 'mouse');
  3333. });
  3334. return isNearPoint;
  3335. });
  3336. if (annotationToolsWithPointNearClick.length > 0) {
  3337. var firstToolNearPoint = annotationToolsWithPointNearClick[0];
  3338. var _toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getToolState"])(element, firstToolNearPoint.name);
  3339. var firstAnnotationNearPoint = _toolState.data.find(function (data) {
  3340. return firstToolNearPoint.pointNearTool(element, data, coords);
  3341. });
  3342. firstToolNearPoint.toolSelectedCallback(evt, firstAnnotationNearPoint, 'mouse');
  3343. return;
  3344. } // ACTIVE TOOL W/ POST CALLBACK?
  3345. // If any tools are active, check if they have a special reason for dealing with the event.
  3346. if (activeTools.length > 0) {
  3347. // TODO: If length > 1, you could assess fitness and select the ideal tool
  3348. // TODO: But because we're locking this to 'active' tools, that should rarely be an issue
  3349. // Super-Meta-TODO: ^ I think we should just take the approach of one active tool per mouse button?
  3350. var _firstActiveToolWithCallback = activeTools.find(function (tool) {
  3351. return typeof tool.postMouseDownCallback === 'function';
  3352. });
  3353. if (_firstActiveToolWithCallback) {
  3354. var _consumedEvent = _firstActiveToolWithCallback.postMouseDownCallback(evt);
  3355. if (_consumedEvent) {
  3356. return;
  3357. }
  3358. }
  3359. }
  3360. });
  3361. /***/ }),
  3362. /***/ "./eventDispatchers/mouseEventHandlers/mouseDownActivate.js":
  3363. /*!******************************************************************!*\
  3364. !*** ./eventDispatchers/mouseEventHandlers/mouseDownActivate.js ***!
  3365. \******************************************************************/
  3366. /*! exports provided: default */
  3367. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  3368. "use strict";
  3369. __webpack_require__.r(__webpack_exports__);
  3370. /* harmony import */ var _addNewMeasurement_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./addNewMeasurement.js */ "./eventDispatchers/mouseEventHandlers/addNewMeasurement.js");
  3371. /* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../../store/index.js */ "./store/index.js");
  3372. /* harmony import */ var _tools_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./../../tools/base/BaseAnnotationTool.js */ "./tools/base/BaseAnnotationTool.js");
  3373. /* harmony import */ var _util_getActiveTool__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../util/getActiveTool */ "./util/getActiveTool.js");
  3374. /* harmony default export */ __webpack_exports__["default"] = (function (evt) {
  3375. if (_store_index_js__WEBPACK_IMPORTED_MODULE_1__["state"].isToolLocked) {
  3376. return;
  3377. }
  3378. var _evt$detail = evt.detail,
  3379. element = _evt$detail.element,
  3380. buttons = _evt$detail.buttons;
  3381. var activeTool = Object(_util_getActiveTool__WEBPACK_IMPORTED_MODULE_3__["default"])(element, buttons, 'mouse');
  3382. if (!activeTool) {
  3383. return;
  3384. }
  3385. if (typeof activeTool.preMouseDownActivateCallback === 'function') {
  3386. var consumedEvent = activeTool.preMouseDownActivateCallback(evt);
  3387. if (consumedEvent) {
  3388. return;
  3389. }
  3390. }
  3391. if (_store_index_js__WEBPACK_IMPORTED_MODULE_1__["state"].isMultiPartToolActive) {
  3392. return;
  3393. } // Note: custom `addNewMeasurement` will need to prevent event bubbling
  3394. if (activeTool.addNewMeasurement) {
  3395. activeTool.addNewMeasurement(evt, 'mouse');
  3396. } else if (activeTool instanceof _tools_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_2__["default"]) {
  3397. Object(_addNewMeasurement_js__WEBPACK_IMPORTED_MODULE_0__["default"])(evt, activeTool);
  3398. }
  3399. });
  3400. /***/ }),
  3401. /***/ "./eventDispatchers/mouseEventHandlers/mouseDrag.js":
  3402. /*!**********************************************************!*\
  3403. !*** ./eventDispatchers/mouseEventHandlers/mouseDrag.js ***!
  3404. \**********************************************************/
  3405. /*! exports provided: default */
  3406. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  3407. "use strict";
  3408. __webpack_require__.r(__webpack_exports__);
  3409. /* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../store/index.js */ "./store/index.js");
  3410. /* harmony import */ var _store_getActiveToolsForElement_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../../store/getActiveToolsForElement.js */ "./store/getActiveToolsForElement.js");
  3411. /* harmony import */ var _store_filterToolsUsableWithMultiPartTools_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./../../store/filterToolsUsableWithMultiPartTools.js */ "./store/filterToolsUsableWithMultiPartTools.js");
  3412. // Tools like wwwc. Non-annotation tools w/ specific
  3413. // Down + mouse behavior
  3414. // TODO: I don't like filtering in drag because it's such
  3415. // A high frequency event. Anything we can do to reduce
  3416. // Repeat math here would be a big help
  3417. /* harmony default export */ __webpack_exports__["default"] = (function (evt) {
  3418. if (_store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isToolLocked) {
  3419. return;
  3420. }
  3421. var tools;
  3422. var eventData = evt.detail;
  3423. var element = eventData.element; // Filter out disabled, enabled, and passive
  3424. tools = Object(_store_getActiveToolsForElement_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element, _store_index_js__WEBPACK_IMPORTED_MODULE_0__["getters"].mouseTools());
  3425. tools = tools.filter(function (tool) {
  3426. return Array.isArray(tool.options.mouseButtonMask) && tool.options.mouseButtonMask.includes(eventData.buttons) && tool.options.isMouseActive;
  3427. });
  3428. tools = tools.filter(function (tool) {
  3429. return typeof tool.mouseDragCallback === 'function';
  3430. });
  3431. if (_store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isMultiPartToolActive) {
  3432. tools = Object(_store_filterToolsUsableWithMultiPartTools_js__WEBPACK_IMPORTED_MODULE_2__["default"])(tools);
  3433. }
  3434. if (tools.length === 0) {
  3435. return;
  3436. }
  3437. var activeTool = tools[0];
  3438. activeTool.mouseDragCallback(evt);
  3439. });
  3440. /***/ }),
  3441. /***/ "./eventDispatchers/mouseEventHandlers/mouseMove.js":
  3442. /*!**********************************************************!*\
  3443. !*** ./eventDispatchers/mouseEventHandlers/mouseMove.js ***!
  3444. \**********************************************************/
  3445. /*! exports provided: default */
  3446. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  3447. "use strict";
  3448. __webpack_require__.r(__webpack_exports__);
  3449. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../externalModules.js */ "./externalModules.js");
  3450. /* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../../store/index.js */ "./store/index.js");
  3451. /* harmony import */ var _store_getInteractiveToolsForElement_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./../../store/getInteractiveToolsForElement.js */ "./store/getInteractiveToolsForElement.js");
  3452. /* harmony import */ var _store_getToolsWithDataForElement_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./../../store/getToolsWithDataForElement.js */ "./store/getToolsWithDataForElement.js");
  3453. // State
  3454. /**
  3455. * This is mostly used to update the [un]hover state
  3456. * of a tool.
  3457. *
  3458. * @private
  3459. * @param {*} evt
  3460. * @returns {void}
  3461. */
  3462. /* harmony default export */ __webpack_exports__["default"] = (function (evt) {
  3463. if (_store_index_js__WEBPACK_IMPORTED_MODULE_1__["state"].isToolLocked || _store_index_js__WEBPACK_IMPORTED_MODULE_1__["state"].isMultiPartToolActive) {
  3464. return;
  3465. }
  3466. var tools;
  3467. var _evt$detail = evt.detail,
  3468. element = _evt$detail.element,
  3469. currentPoints = _evt$detail.currentPoints; // Set the mouse position incase any tool needs it.
  3470. _store_index_js__WEBPACK_IMPORTED_MODULE_1__["state"].mousePositionImage = currentPoints.image; // TODO: instead of filtering these for every interaction, we can change our
  3471. // TODO: State's structure to always know these values.
  3472. // Filter out disabled and enabled
  3473. tools = Object(_store_getInteractiveToolsForElement_js__WEBPACK_IMPORTED_MODULE_2__["default"])(element, _store_index_js__WEBPACK_IMPORTED_MODULE_1__["getters"].mouseTools());
  3474. var activeTools = tools.filter(function (tool) {
  3475. return tool.mode === 'active' && tool.options.isMouseActive;
  3476. });
  3477. var imageNeedsUpdate = false; // If any tools are active, check if they have a canvas cursor, and if so update image.
  3478. if (activeTools.length > 0) {
  3479. imageNeedsUpdate = activeTools.some(function (tool) {
  3480. return tool.updateOnMouseMove;
  3481. });
  3482. }
  3483. tools = Object(_store_getToolsWithDataForElement_js__WEBPACK_IMPORTED_MODULE_3__["default"])(element, tools); // Iterate over each tool, and each tool's data
  3484. // Activate any handles we're hovering over, or whole tools if we're near the tool
  3485. // If we've changed the state of anything, redrawn the image
  3486. for (var t = 0; t < tools.length; t++) {
  3487. var tool = tools[t];
  3488. if (typeof tool.mouseMoveCallback === 'function') {
  3489. imageNeedsUpdate = tool.mouseMoveCallback(evt) || imageNeedsUpdate;
  3490. }
  3491. } // Tool data activation status changed, redraw the image
  3492. if (imageNeedsUpdate === true) {
  3493. _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.updateImage(element);
  3494. }
  3495. });
  3496. /***/ }),
  3497. /***/ "./eventDispatchers/mouseToolEventDispatcher.js":
  3498. /*!******************************************************!*\
  3499. !*** ./eventDispatchers/mouseToolEventDispatcher.js ***!
  3500. \******************************************************/
  3501. /*! exports provided: default */
  3502. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  3503. "use strict";
  3504. __webpack_require__.r(__webpack_exports__);
  3505. /* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../events.js */ "./events.js");
  3506. /* harmony import */ var _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./mouseEventHandlers/index.js */ "./eventDispatchers/mouseEventHandlers/index.js");
  3507. /**
  3508. * These listeners are emitted in order, and can be cancelled/prevented from bubbling
  3509. * by any previous event.
  3510. * - mouseMove: used to update the [un]hover state of a tool (highlighting)
  3511. * - mouseDown: check to see if we are close to an existing annotation, grab it
  3512. * - mouseDownActivate: createNewMeasurement (usually)
  3513. * - mouseDrag: update measurement or apply strategy (wwwc)
  3514. * - mouseDoubleClick: usually a one-time apply specialty action
  3515. * - onImageRendered: redraw visible tool data
  3516. * @private
  3517. * @param {*} element
  3518. * @returns {undefined}
  3519. */
  3520. var enable = function enable(element) {
  3521. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_CLICK, _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseClick"]);
  3522. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DOWN, _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseDown"]);
  3523. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DOWN_ACTIVATE, _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseDownActivate"]);
  3524. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DOUBLE_CLICK, _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseDoubleClick"]);
  3525. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DRAG, _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseDrag"]);
  3526. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_MOVE, _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseMove"]);
  3527. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_UP, _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseUp"]);
  3528. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_WHEEL, _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseWheel"]);
  3529. };
  3530. var disable = function disable(element) {
  3531. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_CLICK, _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseClick"]);
  3532. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DOWN, _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseDown"]);
  3533. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DOWN_ACTIVATE, _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseDownActivate"]);
  3534. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DOUBLE_CLICK, _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseDoubleClick"]);
  3535. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DRAG, _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseDrag"]);
  3536. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_MOVE, _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseMove"]);
  3537. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_UP, _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseUp"]);
  3538. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_WHEEL, _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseWheel"]);
  3539. };
  3540. /* harmony default export */ __webpack_exports__["default"] = ({
  3541. enable: enable,
  3542. disable: disable
  3543. });
  3544. /***/ }),
  3545. /***/ "./eventDispatchers/newImageEventDispatcher.js":
  3546. /*!*****************************************************!*\
  3547. !*** ./eventDispatchers/newImageEventDispatcher.js ***!
  3548. \*****************************************************/
  3549. /*! exports provided: default */
  3550. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  3551. "use strict";
  3552. __webpack_require__.r(__webpack_exports__);
  3553. /* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../store/index.js */ "./store/index.js");
  3554. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js");
  3555. var onNewImage = function onNewImage(evt) {
  3556. if (_store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isToolLocked) {
  3557. return false;
  3558. }
  3559. var element = evt.detail.element;
  3560. var tools = _store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].tools.filter(function (tool) {
  3561. return tool.element === element && (tool.mode === 'active' || tool.mode === 'passive' || tool.mode === 'enabled');
  3562. });
  3563. if (tools.length === 0) {
  3564. return false;
  3565. }
  3566. tools.forEach(function (tool) {
  3567. if (tool.newImageCallback) {
  3568. tool.newImageCallback(evt);
  3569. }
  3570. });
  3571. };
  3572. var enable = function enable(element) {
  3573. element.addEventListener(_externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.EVENTS.NEW_IMAGE, onNewImage);
  3574. };
  3575. var disable = function disable(element) {
  3576. element.removeEventListener(_externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.EVENTS.NEW_IMAGE, onNewImage);
  3577. };
  3578. /* harmony default export */ __webpack_exports__["default"] = ({
  3579. enable: enable,
  3580. disable: disable
  3581. });
  3582. /***/ }),
  3583. /***/ "./eventDispatchers/shared/customCallbackHandler.js":
  3584. /*!**********************************************************!*\
  3585. !*** ./eventDispatchers/shared/customCallbackHandler.js ***!
  3586. \**********************************************************/
  3587. /*! exports provided: default */
  3588. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  3589. "use strict";
  3590. __webpack_require__.r(__webpack_exports__);
  3591. /* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../store/index.js */ "./store/index.js");
  3592. /* harmony import */ var _store_getActiveToolsForElement_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../../store/getActiveToolsForElement.js */ "./store/getActiveToolsForElement.js");
  3593. /* harmony import */ var _store_filterToolsUsableWithMultiPartTools_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./../../store/filterToolsUsableWithMultiPartTools.js */ "./store/filterToolsUsableWithMultiPartTools.js");
  3594. /* harmony default export */ __webpack_exports__["default"] = (function (handlerType, customFunction, evt) {
  3595. if (_store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isToolLocked) {
  3596. return false;
  3597. } // TODO: We sometimes see a null detail for TOUCH_PRESS
  3598. var element = evt.detail.element;
  3599. var tools = _store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].tools.filter(function (tool) {
  3600. return tool.supportedInteractionTypes.includes(handlerType);
  3601. }); // Tool is active, and specific callback is active
  3602. tools = Object(_store_getActiveToolsForElement_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element, tools, handlerType); // Tool has expected callback custom function
  3603. tools = tools.filter(function (tool) {
  3604. return typeof tool[customFunction] === 'function';
  3605. });
  3606. if (_store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isMultiPartToolActive) {
  3607. tools = Object(_store_filterToolsUsableWithMultiPartTools_js__WEBPACK_IMPORTED_MODULE_2__["default"])(tools);
  3608. }
  3609. if (tools.length === 0) {
  3610. return false;
  3611. }
  3612. tools[0][customFunction](evt);
  3613. });
  3614. /***/ }),
  3615. /***/ "./eventDispatchers/touchEventHandlers/addNewMeasurement.js":
  3616. /*!******************************************************************!*\
  3617. !*** ./eventDispatchers/touchEventHandlers/addNewMeasurement.js ***!
  3618. \******************************************************************/
  3619. /*! exports provided: default */
  3620. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  3621. "use strict";
  3622. __webpack_require__.r(__webpack_exports__);
  3623. /* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../events.js */ "./events.js");
  3624. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../externalModules.js */ "./externalModules.js");
  3625. /* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../store/index.js */ "./store/index.js");
  3626. /* harmony import */ var _manipulators_anyHandlesOutsideImage_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./../../manipulators/anyHandlesOutsideImage.js */ "./manipulators/anyHandlesOutsideImage.js");
  3627. /* harmony import */ var _manipulators_index_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../manipulators/index.js */ "./manipulators/index.js");
  3628. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  3629. /* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../util/triggerEvent.js */ "./util/triggerEvent.js");
  3630. /* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../util/logger.js */ "./util/logger.js");
  3631. var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_7__["getLogger"])('eventDispatchers:touchEventHandlers');
  3632. /* harmony default export */ __webpack_exports__["default"] = (function (evt, tool) {
  3633. logger.log('addNewMeasurement');
  3634. evt.preventDefault();
  3635. evt.stopPropagation();
  3636. var touchEventData = evt.detail;
  3637. var element = touchEventData.element;
  3638. var measurementData = tool.createNewMeasurement(touchEventData);
  3639. if (!measurementData) {
  3640. return;
  3641. }
  3642. Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_5__["addToolState"])(element, tool.name, measurementData); // Todo: Looks like we're handling the "up" of the tap?
  3643. if (Object.keys(measurementData.handles).length === 1 && touchEventData.type === _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TAP) {
  3644. // Todo: bold assumptions about measurement data for all tools?
  3645. measurementData.active = false;
  3646. measurementData.handles.end.active = false;
  3647. measurementData.handles.end.highlight = false;
  3648. measurementData.invalidated = true;
  3649. var deleteIfHandleOutsideImage = _store_index_js__WEBPACK_IMPORTED_MODULE_2__["state"].deleteIfHandleOutsideImage || tool.options.deleteIfHandleOutsideImage;
  3650. if (deleteIfHandleOutsideImage && Object(_manipulators_anyHandlesOutsideImage_js__WEBPACK_IMPORTED_MODULE_3__["default"])(touchEventData, measurementData.handles)) {
  3651. // Delete the measurement
  3652. Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_5__["removeToolState"])(element, tool.name, measurementData);
  3653. }
  3654. _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.updateImage(element);
  3655. return;
  3656. }
  3657. _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.updateImage(element);
  3658. Object(_manipulators_index_js__WEBPACK_IMPORTED_MODULE_4__["moveNewHandle"])(touchEventData, tool.name, measurementData, measurementData.handles.end, tool.options, 'touch', function () {
  3659. var eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MEASUREMENT_COMPLETED;
  3660. var eventData = {
  3661. toolName: tool.name,
  3662. toolType: tool.name,
  3663. // Deprecation notice: toolType will be replaced by toolName
  3664. element: element,
  3665. measurementData: measurementData
  3666. };
  3667. Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_6__["default"])(element, eventType, eventData);
  3668. });
  3669. });
  3670. /***/ }),
  3671. /***/ "./eventDispatchers/touchEventHandlers/index.js":
  3672. /*!******************************************************!*\
  3673. !*** ./eventDispatchers/touchEventHandlers/index.js ***!
  3674. \******************************************************/
  3675. /*! exports provided: doubleTap, multiTouchDrag, tap, touchDrag, touchEnd, touchPinch, touchPress, touchRotate, touchStart, touchStartActive */
  3676. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  3677. "use strict";
  3678. __webpack_require__.r(__webpack_exports__);
  3679. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "doubleTap", function() { return doubleTap; });
  3680. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "touchDrag", function() { return touchDrag; });
  3681. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "touchEnd", function() { return touchEnd; });
  3682. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "touchPinch", function() { return touchPinch; });
  3683. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "touchPress", function() { return touchPress; });
  3684. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "touchRotate", function() { return touchRotate; });
  3685. /* harmony import */ var _shared_customCallbackHandler_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../shared/customCallbackHandler.js */ "./eventDispatchers/shared/customCallbackHandler.js");
  3686. /* harmony import */ var _multiTouchDrag_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./multiTouchDrag.js */ "./eventDispatchers/touchEventHandlers/multiTouchDrag.js");
  3687. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "multiTouchDrag", function() { return _multiTouchDrag_js__WEBPACK_IMPORTED_MODULE_1__["default"]; });
  3688. /* harmony import */ var _tap_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tap.js */ "./eventDispatchers/touchEventHandlers/tap.js");
  3689. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tap", function() { return _tap_js__WEBPACK_IMPORTED_MODULE_2__["default"]; });
  3690. /* harmony import */ var _touchStart_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./touchStart.js */ "./eventDispatchers/touchEventHandlers/touchStart.js");
  3691. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "touchStart", function() { return _touchStart_js__WEBPACK_IMPORTED_MODULE_3__["default"]; });
  3692. /* harmony import */ var _touchStartActive_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./touchStartActive.js */ "./eventDispatchers/touchEventHandlers/touchStartActive.js");
  3693. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "touchStartActive", function() { return _touchStartActive_js__WEBPACK_IMPORTED_MODULE_4__["default"]; });
  3694. var doubleTap = _shared_customCallbackHandler_js__WEBPACK_IMPORTED_MODULE_0__["default"].bind(null, 'DoubleTap', 'doubleTapCallback'); // TODO: some touchDrag tools don't want to fire on touchStart
  3695. // TODO: Drag tools have an option `fireOnTouchStart` used to filter
  3696. // TODO: Them out of TOUCH_START handler
  3697. var touchDrag = _shared_customCallbackHandler_js__WEBPACK_IMPORTED_MODULE_0__["default"].bind(null, 'Touch', 'touchDragCallback');
  3698. var touchEnd = _shared_customCallbackHandler_js__WEBPACK_IMPORTED_MODULE_0__["default"].bind(null, 'Touch', 'touchEndCallback');
  3699. var touchPinch = _shared_customCallbackHandler_js__WEBPACK_IMPORTED_MODULE_0__["default"].bind(null, 'TouchPinch', 'touchPinchCallback');
  3700. var touchPress = _shared_customCallbackHandler_js__WEBPACK_IMPORTED_MODULE_0__["default"].bind(null, 'Touch', 'touchPressCallback');
  3701. var touchRotate = _shared_customCallbackHandler_js__WEBPACK_IMPORTED_MODULE_0__["default"].bind(null, 'TouchRotate', 'touchRotateCallback');
  3702. /***/ }),
  3703. /***/ "./eventDispatchers/touchEventHandlers/multiTouchDrag.js":
  3704. /*!***************************************************************!*\
  3705. !*** ./eventDispatchers/touchEventHandlers/multiTouchDrag.js ***!
  3706. \***************************************************************/
  3707. /*! exports provided: default */
  3708. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  3709. "use strict";
  3710. __webpack_require__.r(__webpack_exports__);
  3711. /* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../store/index.js */ "./store/index.js");
  3712. /* harmony import */ var _store_getActiveToolsForElement_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../store/getActiveToolsForElement.js */ "./store/getActiveToolsForElement.js");
  3713. /* harmony import */ var _store_filterToolsUsableWithMultiPartTools_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./../../store/filterToolsUsableWithMultiPartTools.js */ "./store/filterToolsUsableWithMultiPartTools.js");
  3714. /* harmony default export */ __webpack_exports__["default"] = (function (evt) {
  3715. if (_store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isToolLocked) {
  3716. return false;
  3717. } // TODO: We sometimes see a null detail for TOUCH_PRESS
  3718. var _evt$detail = evt.detail,
  3719. element = _evt$detail.element,
  3720. numPointers = _evt$detail.numPointers;
  3721. var tools = _store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].tools.filter(function (tool) {
  3722. return tool.supportedInteractionTypes.includes('MultiTouch');
  3723. }); // Tool is active, and specific callback is active
  3724. tools = Object(_store_getActiveToolsForElement_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element, tools, 'MultiTouch'); // Tool has expected callback custom function
  3725. tools = tools.filter(function (tool) {
  3726. return typeof tool.multiTouchDragCallback === 'function' && numPointers === tool.configuration.touchPointers;
  3727. });
  3728. if (_store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isMultiPartToolActive) {
  3729. tools = Object(_store_filterToolsUsableWithMultiPartTools_js__WEBPACK_IMPORTED_MODULE_2__["default"])(tools);
  3730. }
  3731. if (tools.length === 0) {
  3732. return false;
  3733. }
  3734. var activeTool = tools[0];
  3735. activeTool.multiTouchDragCallback(evt);
  3736. });
  3737. /***/ }),
  3738. /***/ "./eventDispatchers/touchEventHandlers/shared/deactivateAllToolInstances.js":
  3739. /*!**********************************************************************************!*\
  3740. !*** ./eventDispatchers/touchEventHandlers/shared/deactivateAllToolInstances.js ***!
  3741. \**********************************************************************************/
  3742. /*! exports provided: default */
  3743. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  3744. "use strict";
  3745. __webpack_require__.r(__webpack_exports__);
  3746. /* harmony default export */ __webpack_exports__["default"] = (function (toolData) {
  3747. if (!toolData) {
  3748. return;
  3749. }
  3750. for (var i = 0; i < toolData.data.length; i++) {
  3751. var data = toolData.data[i];
  3752. data.active = false;
  3753. if (!data.handles) {
  3754. continue;
  3755. }
  3756. deactivateAllHandles(data.handles);
  3757. }
  3758. });
  3759. function deactivateAllHandles(handles) {
  3760. Object.keys(handles).forEach(function (name) {
  3761. var handle = handles[name];
  3762. handle.active = false;
  3763. });
  3764. }
  3765. /***/ }),
  3766. /***/ "./eventDispatchers/touchEventHandlers/tap.js":
  3767. /*!****************************************************!*\
  3768. !*** ./eventDispatchers/touchEventHandlers/tap.js ***!
  3769. \****************************************************/
  3770. /*! exports provided: default */
  3771. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  3772. "use strict";
  3773. __webpack_require__.r(__webpack_exports__);
  3774. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../externalModules.js */ "./externalModules.js");
  3775. /* harmony import */ var _touchStartActive_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./touchStartActive.js */ "./eventDispatchers/touchEventHandlers/touchStartActive.js");
  3776. /* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../store/index.js */ "./store/index.js");
  3777. /* harmony import */ var _store_getActiveToolsForElement_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../store/getActiveToolsForElement.js */ "./store/getActiveToolsForElement.js");
  3778. /* harmony import */ var _store_getToolsWithDataForElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../store/getToolsWithDataForElement.js */ "./store/getToolsWithDataForElement.js");
  3779. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  3780. /* harmony import */ var _manipulators_getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../manipulators/getHandleNearImagePoint.js */ "./manipulators/getHandleNearImagePoint.js");
  3781. /* harmony import */ var _manipulators_index_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../manipulators/index.js */ "./manipulators/index.js");
  3782. /* harmony import */ var _shared_deactivateAllToolInstances_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./shared/deactivateAllToolInstances.js */ "./eventDispatchers/touchEventHandlers/shared/deactivateAllToolInstances.js");
  3783. // State
  3784. //
  3785. //
  3786. /* harmony default export */ __webpack_exports__["default"] = (function (evt) {
  3787. if (_store_index_js__WEBPACK_IMPORTED_MODULE_2__["state"].isToolLocked || _store_index_js__WEBPACK_IMPORTED_MODULE_2__["state"].isMultiPartToolActive) {
  3788. return;
  3789. }
  3790. var tools;
  3791. var distanceFromHandle = 28;
  3792. var element = evt.detail.element;
  3793. var coords = evt.detail.currentPoints.canvas;
  3794. tools = Object(_store_getActiveToolsForElement_js__WEBPACK_IMPORTED_MODULE_3__["default"])(element, _store_index_js__WEBPACK_IMPORTED_MODULE_2__["getters"].touchTools());
  3795. tools = Object(_store_getToolsWithDataForElement_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, tools); // Deactivate everything
  3796. // DeactivateAllToolInstances(toolData);
  3797. // Find all tools w/ handles that we are near
  3798. var toolsWithMoveableHandles = tools.filter(function (tool) {
  3799. var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_5__["getToolState"])(element, tool.name);
  3800. for (var i = 0; i < toolState.data.length; i++) {
  3801. if (Object(_manipulators_getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_6__["default"])(element, toolState.data[i].handles, coords, distanceFromHandle) !== undefined) {
  3802. return true;
  3803. }
  3804. }
  3805. return false;
  3806. }); // TODO: More than one? Which one was moved most recently?
  3807. // We'll just grab the first one we encounter for now
  3808. if (toolsWithMoveableHandles.length > 0) {
  3809. // Todo: ignore: touch_start, tap
  3810. var firstToolWithMoveableHandles = toolsWithMoveableHandles[0];
  3811. var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_5__["getToolState"])(element, firstToolWithMoveableHandles.name);
  3812. var moveableHandle = toolState.data.find(function (d) {
  3813. return Object(_manipulators_getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_6__["default"])(element, d.handles, coords, distanceFromHandle) !== undefined;
  3814. });
  3815. toolState.data.active = true;
  3816. moveableHandle.active = true; // Why here, but not touchStart?
  3817. _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.updateImage(element);
  3818. Object(_manipulators_index_js__WEBPACK_IMPORTED_MODULE_7__["moveHandle"])(evt.detail, firstToolWithMoveableHandles.name, toolState.data, moveableHandle, firstToolWithMoveableHandles.options, 'touch', function () {
  3819. return Object(_shared_deactivateAllToolInstances_js__WEBPACK_IMPORTED_MODULE_8__["default"])(toolState);
  3820. });
  3821. evt.stopImmediatePropagation();
  3822. evt.preventDefault(); // Why no stopPropagation?
  3823. return;
  3824. } // Find all tools near our point
  3825. var toolsNearPoint = tools.filter(function (tool) {
  3826. var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_5__["getToolState"])(element, tool.name);
  3827. var isNearPoint = toolState && toolState.data && tool.pointNearTool && toolState.data.some(function (data) {
  3828. return tool.pointNearTool(element, data, coords);
  3829. });
  3830. return isNearPoint;
  3831. }); // TODO: More than one? Which one was moved most recently?
  3832. // We'll just grab the first one we encounter for now
  3833. if (toolsNearPoint.length > 0) {
  3834. // Todo: Ignore: TAP, START, PRESS
  3835. var firstToolNearPoint = toolsNearPoint[0];
  3836. var _toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_5__["getToolState"])(element, firstToolNearPoint.name);
  3837. var firstAnnotationNearPoint = _toolState.data.find(function (data) {
  3838. return firstToolNearPoint.pointNearTool(element, data, coords);
  3839. }); // Todo: ignore: touch_start, tap
  3840. firstAnnotationNearPoint.active = true;
  3841. _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.updateImage(element);
  3842. Object(_manipulators_index_js__WEBPACK_IMPORTED_MODULE_7__["moveAllHandles"])(evt.detail, firstToolNearPoint.name, firstAnnotationNearPoint, null, firstToolNearPoint.options, 'touch', function () {
  3843. return Object(_shared_deactivateAllToolInstances_js__WEBPACK_IMPORTED_MODULE_8__["default"])(_toolState);
  3844. });
  3845. evt.stopImmediatePropagation();
  3846. evt.preventDefault(); // TODO: Why no stop propagation?
  3847. return;
  3848. } // If there is nothing to move, add a new instance of the tool
  3849. // Need to check here to see if activation is allowed!
  3850. // TODO: What would this be? First active tool?
  3851. // Or should _always_ pass through to our larger event handler that checks
  3852. // All tools anyway?
  3853. var allActiveTools = Object(_store_getActiveToolsForElement_js__WEBPACK_IMPORTED_MODULE_3__["default"])(element, _store_index_js__WEBPACK_IMPORTED_MODULE_2__["getters"].touchTools());
  3854. if (allActiveTools.length > 0 && allActiveTools[0].touchStartActiveCallback) {
  3855. allActiveTools[0].touchStartActiveCallback(evt);
  3856. } else {
  3857. Object(_touchStartActive_js__WEBPACK_IMPORTED_MODULE_1__["default"])(evt);
  3858. }
  3859. return false;
  3860. });
  3861. /***/ }),
  3862. /***/ "./eventDispatchers/touchEventHandlers/touchStart.js":
  3863. /*!***********************************************************!*\
  3864. !*** ./eventDispatchers/touchEventHandlers/touchStart.js ***!
  3865. \***********************************************************/
  3866. /*! exports provided: default */
  3867. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  3868. "use strict";
  3869. __webpack_require__.r(__webpack_exports__);
  3870. /* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../store/index.js */ "./store/index.js");
  3871. /* harmony import */ var _util_findAndMoveHelpers_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../util/findAndMoveHelpers.js */ "./util/findAndMoveHelpers.js");
  3872. /* harmony import */ var _store_getToolsWithMoveableHandles_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../store/getToolsWithMoveableHandles.js */ "./store/getToolsWithMoveableHandles.js");
  3873. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  3874. /* harmony import */ var _store_getInteractiveToolsForElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./../../store/getInteractiveToolsForElement.js */ "./store/getInteractiveToolsForElement.js");
  3875. /* harmony import */ var _store_getToolsWithDataForElement_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../../store/getToolsWithDataForElement.js */ "./store/getToolsWithDataForElement.js");
  3876. /* harmony import */ var _store_filterToolsUsableWithMultiPartTools_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./../../store/filterToolsUsableWithMultiPartTools.js */ "./store/filterToolsUsableWithMultiPartTools.js");
  3877. // State
  3878. /* harmony default export */ __webpack_exports__["default"] = (function (evt) {
  3879. if (_store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isToolLocked) {
  3880. return;
  3881. }
  3882. var eventData = evt.detail;
  3883. var element = eventData.element;
  3884. var coords = eventData.startPoints.canvas;
  3885. var activeAndPassiveTools = Object(_store_getInteractiveToolsForElement_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, _store_index_js__WEBPACK_IMPORTED_MODULE_0__["getters"].touchTools());
  3886. var activeTools = activeAndPassiveTools.filter(function (tool) {
  3887. return tool.mode === 'active' && tool.options.isTouchActive;
  3888. });
  3889. if (_store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isMultiPartToolActive) {
  3890. activeTools = Object(_store_filterToolsUsableWithMultiPartTools_js__WEBPACK_IMPORTED_MODULE_6__["default"])(activeTools);
  3891. } // If any tools are active, check if they have a special reason for dealing with the event.
  3892. if (activeTools.length > 0) {
  3893. // TODO: If length > 1, you could assess fitness and select the ideal tool
  3894. // TODO: But because we're locking this to 'active' tools, that should rarely be an issue
  3895. // Super-Meta-TODO: ^ I think we should just take the approach of one active tool per mouse button?
  3896. var firstActiveToolWithCallback = activeTools.find(function (tool) {
  3897. return typeof tool.preTouchStartCallback === 'function';
  3898. });
  3899. if (firstActiveToolWithCallback) {
  3900. var consumedEvent = firstActiveToolWithCallback.preTouchStartCallback(evt);
  3901. if (consumedEvent) {
  3902. return;
  3903. }
  3904. }
  3905. }
  3906. if (_store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isMultiPartToolActive) {
  3907. return;
  3908. }
  3909. var annotationTools = Object(_store_getToolsWithDataForElement_js__WEBPACK_IMPORTED_MODULE_5__["default"])(element, activeAndPassiveTools); // NEAR HANDLES?
  3910. var annotationToolsWithMoveableHandles = Object(_store_getToolsWithMoveableHandles_js__WEBPACK_IMPORTED_MODULE_2__["default"])(element, annotationTools, coords, 'touch'); // TODO: More than one? Which one was moved most recently?
  3911. // We'll just grab the first one we encounter for now
  3912. if (annotationToolsWithMoveableHandles.length > 0) {
  3913. // Todo: Ignore TAP, START, PRESS
  3914. var firstToolWithMoveableHandles = annotationToolsWithMoveableHandles[0];
  3915. var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["getToolState"])(element, firstToolWithMoveableHandles.name);
  3916. var _findHandleDataNearIm = Object(_util_findAndMoveHelpers_js__WEBPACK_IMPORTED_MODULE_1__["findHandleDataNearImagePoint"])(element, toolState, firstToolWithMoveableHandles.name, coords, 'touch'),
  3917. handle = _findHandleDataNearIm.handle,
  3918. data = _findHandleDataNearIm.data;
  3919. firstToolWithMoveableHandles.handleSelectedCallback(evt, data, handle, 'touch');
  3920. return;
  3921. } // NEAR POINT?
  3922. var annotationToolsWithPointNearTouch = annotationTools.filter(function (tool) {
  3923. var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["getToolState"])(element, tool.name);
  3924. var isNearPoint = toolState && toolState.data && tool.pointNearTool && toolState.data.some(function (data) {
  3925. return tool.pointNearTool(element, data, coords, 'touch');
  3926. });
  3927. return isNearPoint;
  3928. }); // TODO: More than one? Which one was moved most recently?
  3929. // We'll just grab the first one we encounter for now
  3930. if (annotationToolsWithPointNearTouch.length > 0) {
  3931. // Todo: Ignore: TAP, START, PRESS
  3932. var firstToolNearPoint = annotationToolsWithPointNearTouch[0];
  3933. var _toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["getToolState"])(element, firstToolNearPoint.name);
  3934. var firstAnnotationNearPoint = _toolState.data.find(function (data) {
  3935. return firstToolNearPoint.pointNearTool(element, data, coords);
  3936. });
  3937. firstToolNearPoint.toolSelectedCallback(evt, firstAnnotationNearPoint, 'touch');
  3938. return;
  3939. } // If any tools are active, check if they have a special reason for dealing with the event.
  3940. if (activeTools.length > 0) {
  3941. // TODO: If length > 1, you could assess fitness and select the ideal tool
  3942. // TODO: But because we're locking this to 'active' tools, that should rarely be an issue
  3943. // Super-Meta-TODO: ^ I think we should just take the approach of one active tool per mouse button?
  3944. var _firstActiveToolWithCallback = activeTools.find(function (tool) {
  3945. return typeof tool.postTouchStartCallback === 'function';
  3946. });
  3947. if (_firstActiveToolWithCallback) {
  3948. var _consumedEvent = _firstActiveToolWithCallback.postTouchStartCallback(evt);
  3949. if (_consumedEvent) {
  3950. return;
  3951. }
  3952. }
  3953. }
  3954. });
  3955. /***/ }),
  3956. /***/ "./eventDispatchers/touchEventHandlers/touchStartActive.js":
  3957. /*!*****************************************************************!*\
  3958. !*** ./eventDispatchers/touchEventHandlers/touchStartActive.js ***!
  3959. \*****************************************************************/
  3960. /*! exports provided: default */
  3961. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  3962. "use strict";
  3963. __webpack_require__.r(__webpack_exports__);
  3964. /* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../store/index.js */ "./store/index.js");
  3965. /* harmony import */ var _addNewMeasurement_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./addNewMeasurement.js */ "./eventDispatchers/touchEventHandlers/addNewMeasurement.js");
  3966. /* harmony import */ var _tools_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./../../tools/base/BaseAnnotationTool.js */ "./tools/base/BaseAnnotationTool.js");
  3967. /* harmony import */ var _util_getActiveTool__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../util/getActiveTool */ "./util/getActiveTool.js");
  3968. // State
  3969. /* harmony default export */ __webpack_exports__["default"] = (function (evt) {
  3970. if (_store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isToolLocked || _store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isMultiPartToolActive) {
  3971. return;
  3972. }
  3973. var element = evt.detail.element;
  3974. var activeTool = Object(_util_getActiveTool__WEBPACK_IMPORTED_MODULE_3__["default"])(element, null, 'touch'); // Note: custom `addNewMeasurement` will need to prevent event bubbling
  3975. if (activeTool && activeTool.addNewMeasurement) {
  3976. activeTool.addNewMeasurement(evt, 'touch');
  3977. } else if (activeTool instanceof _tools_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_2__["default"]) {
  3978. Object(_addNewMeasurement_js__WEBPACK_IMPORTED_MODULE_1__["default"])(evt, activeTool);
  3979. }
  3980. });
  3981. /***/ }),
  3982. /***/ "./eventDispatchers/touchToolEventDispatcher.js":
  3983. /*!******************************************************!*\
  3984. !*** ./eventDispatchers/touchToolEventDispatcher.js ***!
  3985. \******************************************************/
  3986. /*! exports provided: default */
  3987. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  3988. "use strict";
  3989. __webpack_require__.r(__webpack_exports__);
  3990. /* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../events.js */ "./events.js");
  3991. /* harmony import */ var _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./touchEventHandlers/index.js */ "./eventDispatchers/touchEventHandlers/index.js");
  3992. /**
  3993. * These listeners are emitted in order, and can be cancelled/prevented from bubbling
  3994. * by any previous event.
  3995. * - tap:
  3996. * - touchStart: check to see if we are close to an existing annotation, grab it
  3997. * - touchDrag:
  3998. * - touchStartActive: createNewMeasurement (usually)
  3999. * - touchPress:
  4000. * - touchRotate:
  4001. * - doubleTap: usually a one-time apply specialty action
  4002. * - touchPinch:
  4003. * - onImageRendered: redraw visible tool data
  4004. * @private
  4005. * @param {*} element
  4006. * @returns {void}
  4007. */
  4008. var enable = function enable(element) {
  4009. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TAP, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["tap"]);
  4010. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_START, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["touchStart"], {
  4011. passive: false
  4012. });
  4013. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_DRAG, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["touchDrag"], {
  4014. passive: false
  4015. });
  4016. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_END, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["touchEnd"]); // Mouse equivelant is `mouse_down_activate`
  4017. // Should the naming pattern here match?
  4018. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_START_ACTIVE, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["touchStartActive"]);
  4019. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_PRESS, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["touchPress"]);
  4020. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].DOUBLE_TAP, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["doubleTap"]);
  4021. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_PINCH, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["touchPinch"]);
  4022. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_ROTATE, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["touchRotate"]);
  4023. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MULTI_TOUCH_DRAG, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["multiTouchDrag"]);
  4024. };
  4025. var disable = function disable(element) {
  4026. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TAP, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["tap"]);
  4027. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_START, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["touchStart"]);
  4028. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_DRAG, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["touchDrag"]);
  4029. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_END, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["touchEnd"]); // Mouse equivelant is `mouse_down_activate`
  4030. // Should the naming pattern here match?
  4031. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_START_ACTIVE, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["touchStartActive"]);
  4032. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_PRESS, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["touchPress"]);
  4033. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].DOUBLE_TAP, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["doubleTap"]);
  4034. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_PINCH, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["touchPinch"]);
  4035. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_ROTATE, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["touchRotate"]);
  4036. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MULTI_TOUCH_DRAG, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["multiTouchDrag"]);
  4037. };
  4038. /* harmony default export */ __webpack_exports__["default"] = ({
  4039. enable: enable,
  4040. disable: disable
  4041. });
  4042. /***/ }),
  4043. /***/ "./eventListeners/index.js":
  4044. /*!*********************************!*\
  4045. !*** ./eventListeners/index.js ***!
  4046. \*********************************/
  4047. /*! exports provided: mouseEventListeners, wheelEventListener, touchEventListeners */
  4048. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  4049. "use strict";
  4050. __webpack_require__.r(__webpack_exports__);
  4051. /* harmony import */ var _mouseEventListeners_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./mouseEventListeners.js */ "./eventListeners/mouseEventListeners.js");
  4052. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mouseEventListeners", function() { return _mouseEventListeners_js__WEBPACK_IMPORTED_MODULE_0__["default"]; });
  4053. /* harmony import */ var _wheelEventListener_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./wheelEventListener.js */ "./eventListeners/wheelEventListener.js");
  4054. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "wheelEventListener", function() { return _wheelEventListener_js__WEBPACK_IMPORTED_MODULE_1__["default"]; });
  4055. /* harmony import */ var _touchEventListeners_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./touchEventListeners.js */ "./eventListeners/touchEventListeners.js");
  4056. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "touchEventListeners", function() { return _touchEventListeners_js__WEBPACK_IMPORTED_MODULE_2__["default"]; });
  4057. /***/ }),
  4058. /***/ "./eventListeners/internals/normalizeWheel.js":
  4059. /*!****************************************************!*\
  4060. !*** ./eventListeners/internals/normalizeWheel.js ***!
  4061. \****************************************************/
  4062. /*! exports provided: default */
  4063. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  4064. "use strict";
  4065. __webpack_require__.r(__webpack_exports__);
  4066. // Reasonable defaults
  4067. var PIXEL_STEP = 10;
  4068. var LINE_HEIGHT = 40;
  4069. var PAGE_HEIGHT = 800;
  4070. /**
  4071. * Normalizes wheel events and provides properties that are more
  4072. * consistent and helpful across different browsers
  4073. *
  4074. * @private
  4075. * @function normalizeWheel
  4076. * @param {WheelEvent} event
  4077. * @returns {Object} { spinX, spinY, pixlX, pixelY }
  4078. */
  4079. /* harmony default export */ __webpack_exports__["default"] = (function (event) {
  4080. var spinX = 0,
  4081. spinY = 0,
  4082. pixelX = 0,
  4083. pixelY = 0; // Legacy
  4084. if ('detail' in event) {
  4085. spinY = event.detail;
  4086. }
  4087. if ('wheelDelta' in event) {
  4088. spinY = -event.wheelDelta / 120;
  4089. }
  4090. if ('wheelDeltaY' in event) {
  4091. spinY = -event.wheelDeltaY / 120;
  4092. }
  4093. if ('wheelDeltaX' in event) {
  4094. spinX = -event.wheelDeltaX / 120;
  4095. }
  4096. pixelX = spinX * PIXEL_STEP;
  4097. pixelY = spinY * PIXEL_STEP;
  4098. if ('deltaY' in event) {
  4099. pixelY = event.deltaY;
  4100. }
  4101. if ('deltaX' in event) {
  4102. pixelX = event.deltaX;
  4103. }
  4104. if ((pixelX || pixelY) && event.deltaMode) {
  4105. if (event.deltaMode === 1) {
  4106. // Delta in LINE units
  4107. pixelX *= LINE_HEIGHT;
  4108. pixelY *= LINE_HEIGHT;
  4109. } else {
  4110. // Delta in PAGE units
  4111. pixelX *= PAGE_HEIGHT;
  4112. pixelY *= PAGE_HEIGHT;
  4113. }
  4114. } // Fall-back if spin cannot be determined
  4115. if (pixelX && !spinX) {
  4116. spinX = pixelX < 1 ? -1 : 1;
  4117. }
  4118. if (pixelY && !spinY) {
  4119. spinY = pixelY < 1 ? -1 : 1;
  4120. }
  4121. return {
  4122. spinX: spinX,
  4123. spinY: spinY,
  4124. pixelX: pixelX,
  4125. pixelY: pixelY
  4126. };
  4127. });
  4128. /***/ }),
  4129. /***/ "./eventListeners/internals/renderSegmentation.js":
  4130. /*!********************************************************!*\
  4131. !*** ./eventListeners/internals/renderSegmentation.js ***!
  4132. \********************************************************/
  4133. /*! exports provided: default */
  4134. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  4135. "use strict";
  4136. __webpack_require__.r(__webpack_exports__);
  4137. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return renderSegmentation; });
  4138. /* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../store/index.js */ "./store/index.js");
  4139. /* harmony import */ var _renderSegmentationFill__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./renderSegmentationFill */ "./eventListeners/internals/renderSegmentationFill.js");
  4140. /* harmony import */ var _renderSegmentationOutline__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./renderSegmentationOutline */ "./eventListeners/internals/renderSegmentationOutline.js");
  4141. var segmentationModule = Object(_store_index_js__WEBPACK_IMPORTED_MODULE_0__["getModule"])('segmentation');
  4142. /**
  4143. * Renders the segmentation based on the brush configuration and
  4144. * the active status of the labelmap.
  4145. * @param {Object} evt The cornerstone event.
  4146. * @param {Labelmap3D} labelmap3D The `Labelmap3D` object.
  4147. * @param {number} labelmapIndex The index of the active label map.
  4148. * @param {Labelmap2D} labelmap2D The `Labelmap2D` object to render.
  4149. * @param {boolean} isActiveLabelMap Whether or not the labelmap is active.
  4150. * @returns {null}
  4151. */
  4152. function renderSegmentation(evt, labelmap3D, labelmapIndex, labelmap2D, isActiveLabelMap) {
  4153. if (shouldRenderFill(isActiveLabelMap)) {
  4154. Object(_renderSegmentationFill__WEBPACK_IMPORTED_MODULE_1__["default"])(evt, labelmap3D, labelmap2D, labelmapIndex, isActiveLabelMap);
  4155. }
  4156. if (shouldRenderOutline(isActiveLabelMap)) {
  4157. Object(_renderSegmentationOutline__WEBPACK_IMPORTED_MODULE_2__["default"])(evt, labelmap3D, labelmap2D, labelmapIndex, isActiveLabelMap);
  4158. }
  4159. }
  4160. /**
  4161. * ShouldRenderFill - Returns true if `configuration.renderFill`
  4162. * is true , and if the global alpha is not zero.
  4163. *
  4164. * @param {boolean} isActiveLabelMap
  4165. * @returns {boolean} True if the segmentation should be filled.
  4166. */
  4167. function shouldRenderFill(isActiveLabelMap) {
  4168. var configuration = segmentationModule.configuration;
  4169. return configuration.renderFill && (isActiveLabelMap && configuration.fillAlpha !== 0 || !isActiveLabelMap && configuration.fillAlphaInactive !== 0);
  4170. }
  4171. /**
  4172. * ShouldRenderOutline - Returns true if `configuration.renderOutline`
  4173. * is true , and if the global alpha is not zero.
  4174. *
  4175. * @param {boolean} isActiveLabelMap
  4176. * @returns {boolean} True if the segmentation should be outlined.
  4177. */
  4178. function shouldRenderOutline(isActiveLabelMap) {
  4179. var configuration = segmentationModule.configuration;
  4180. return configuration.renderOutline && (isActiveLabelMap && configuration.outlineAlpha !== 0 || !isActiveLabelMap && configuration.outlineAlphaInactive !== 0);
  4181. }
  4182. /***/ }),
  4183. /***/ "./eventListeners/internals/renderSegmentationFill.js":
  4184. /*!************************************************************!*\
  4185. !*** ./eventListeners/internals/renderSegmentationFill.js ***!
  4186. \************************************************************/
  4187. /*! exports provided: default, getLabelmapCanvas, renderFill */
  4188. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  4189. "use strict";
  4190. __webpack_require__.r(__webpack_exports__);
  4191. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return renderSegmentationFill; });
  4192. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLabelmapCanvas", function() { return getLabelmapCanvas; });
  4193. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "renderFill", function() { return renderFill; });
  4194. /* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../store/index.js */ "./store/index.js");
  4195. /* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../drawing/index.js */ "./drawing/index.js");
  4196. /* harmony import */ var _externalModules__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../externalModules */ "./externalModules.js");
  4197. var segmentationModule = Object(_store_index_js__WEBPACK_IMPORTED_MODULE_0__["getModule"])('segmentation');
  4198. function renderSegmentationFill(evt, labelmap3D, labelmap2D, labelmapIndex, isActiveLabelMap) {
  4199. var labelmapCanvas = getLabelmapCanvas(evt, labelmap3D, labelmap2D);
  4200. renderFill(evt, labelmapCanvas, isActiveLabelMap);
  4201. }
  4202. /**
  4203. * Generates a canvas of the `Labelmap2D` data with transparent background, to draw onto the
  4204. * cornerstone canvas. Reduces the number of `putImageData` calls that need to be made by
  4205. * scanning across the labelmap and painting to the canvas in chunks.
  4206. *
  4207. * @param {Object} evt The cornerstone event.
  4208. * @param {Labelmap3D} labelmap3D The `Labelmap3D` object.
  4209. * @param {Labelmap2D} labelmap2D The `Labelmap2D` object containing the pixelData to render.
  4210. * @returns {HTMLCanvasElement}
  4211. */
  4212. function getLabelmapCanvas(evt, labelmap3D, labelmap2D) {
  4213. var state = segmentationModule.state;
  4214. var eventData = evt.detail;
  4215. var image = eventData.image;
  4216. var cols = image.width;
  4217. var rows = image.height;
  4218. var segmentsHidden = labelmap3D.segmentsHidden;
  4219. var pixelData = labelmap2D.pixelData;
  4220. var colorLutTable = state.colorLutTables[labelmap3D.colorLUTIndex];
  4221. var canvasElement = document.createElement('canvas');
  4222. canvasElement.width = cols;
  4223. canvasElement.height = rows;
  4224. var ctx = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_1__["getNewContext"])(canvasElement); // Image data initialized with all transparent black.
  4225. var imageData = new ImageData(cols, rows);
  4226. var data = imageData.data;
  4227. for (var i = 0; i < pixelData.length; i++) {
  4228. var segmentIndex = pixelData[i];
  4229. if (segmentIndex !== 0 && !segmentsHidden[segmentIndex]) {
  4230. var color = colorLutTable[pixelData[i]]; // Modify ImageData.
  4231. data[4 * i] = color[0]; // R value
  4232. data[4 * i + 1] = color[1]; // G value
  4233. data[4 * i + 2] = color[2]; // B value
  4234. data[4 * i + 3] = color[3]; // A value
  4235. }
  4236. } // Put this image data onto the labelmapCanvas.
  4237. ctx.putImageData(imageData, 0, 0);
  4238. return canvasElement;
  4239. }
  4240. /**
  4241. * Renders the filled region of each segment in the segmentation.
  4242. * @param {Object} evt The cornerstone event.
  4243. * @param {HTMLCanvasElement} labelmapCanvas The canvas generated for the labelmap.
  4244. * @param {boolean} isActiveLabelMap Whether or not the labelmap is active.
  4245. * @returns {null}
  4246. */
  4247. function renderFill(evt, labelmapCanvas, isActiveLabelMap) {
  4248. var configuration = segmentationModule.configuration;
  4249. var eventData = evt.detail;
  4250. var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_1__["getNewContext"])(eventData.canvasContext.canvas);
  4251. var canvasTopLeft = _externalModules__WEBPACK_IMPORTED_MODULE_2__["default"].cornerstone.pixelToCanvas(eventData.element, {
  4252. x: 0,
  4253. y: 0
  4254. });
  4255. var canvasTopRight = _externalModules__WEBPACK_IMPORTED_MODULE_2__["default"].cornerstone.pixelToCanvas(eventData.element, {
  4256. x: eventData.image.width,
  4257. y: 0
  4258. });
  4259. var canvasBottomRight = _externalModules__WEBPACK_IMPORTED_MODULE_2__["default"].cornerstone.pixelToCanvas(eventData.element, {
  4260. x: eventData.image.width,
  4261. y: eventData.image.height
  4262. });
  4263. var cornerstoneCanvasWidth = _externalModules__WEBPACK_IMPORTED_MODULE_2__["default"].cornerstoneMath.point.distance(canvasTopLeft, canvasTopRight);
  4264. var cornerstoneCanvasHeight = _externalModules__WEBPACK_IMPORTED_MODULE_2__["default"].cornerstoneMath.point.distance(canvasTopRight, canvasBottomRight);
  4265. var canvas = eventData.canvasContext.canvas;
  4266. var viewport = eventData.viewport;
  4267. var previousImageSmoothingEnabled = context.imageSmoothingEnabled;
  4268. var previousGlobalAlpha = context.globalAlpha;
  4269. context.imageSmoothingEnabled = false;
  4270. context.globalAlpha = isActiveLabelMap ? configuration.fillAlpha : configuration.fillAlphaInactive;
  4271. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_1__["transformCanvasContext"])(context, canvas, viewport);
  4272. var canvasViewportTranslation = getCanvasViewportTranslation(eventData);
  4273. context.drawImage(labelmapCanvas, canvas.width / 2 - cornerstoneCanvasWidth / 2 + canvasViewportTranslation.x, canvas.height / 2 - cornerstoneCanvasHeight / 2 + canvasViewportTranslation.y, cornerstoneCanvasWidth, cornerstoneCanvasHeight);
  4274. context.globalAlpha = previousGlobalAlpha;
  4275. context.imageSmoothingEnabled = previousImageSmoothingEnabled;
  4276. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_1__["resetCanvasContextTransform"])(context);
  4277. }
  4278. /**
  4279. * GetCanvasViewportTranslation - Returns translation coordinations for
  4280. * canvas viewport with calculation of image row/column pixel spacing.
  4281. *
  4282. * @param {Object} eventData The data associated with the event.
  4283. * @returns {Object} The coordinates of the translation.
  4284. */
  4285. function getCanvasViewportTranslation(eventData) {
  4286. var viewport = eventData.viewport,
  4287. image = eventData.image;
  4288. var widthScale = viewport.scale;
  4289. var heightScale = viewport.scale;
  4290. if (image.rowPixelSpacing < image.columnPixelSpacing) {
  4291. widthScale *= image.columnPixelSpacing / image.rowPixelSpacing;
  4292. } else if (image.columnPixelSpacing < image.rowPixelSpacing) {
  4293. heightScale *= image.rowPixelSpacing / image.columnPixelSpacing;
  4294. }
  4295. return {
  4296. x: viewport.translation.x * widthScale,
  4297. y: viewport.translation.y * heightScale
  4298. };
  4299. }
  4300. /***/ }),
  4301. /***/ "./eventListeners/internals/renderSegmentationOutline.js":
  4302. /*!***************************************************************!*\
  4303. !*** ./eventListeners/internals/renderSegmentationOutline.js ***!
  4304. \***************************************************************/
  4305. /*! exports provided: default, renderOutline, getOutline, _addTopRightCorner */
  4306. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  4307. "use strict";
  4308. __webpack_require__.r(__webpack_exports__);
  4309. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return renderSegmentationOutline; });
  4310. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "renderOutline", function() { return renderOutline; });
  4311. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getOutline", function() { return getOutline; });
  4312. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_addTopRightCorner", function() { return _addTopRightCorner; });
  4313. /* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../store/index.js */ "./store/index.js");
  4314. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../externalModules.js */ "./externalModules.js");
  4315. /* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../drawing/index.js */ "./drawing/index.js");
  4316. /* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../index.js */ "./index.js");
  4317. var segmentationModule = Object(_store_index_js__WEBPACK_IMPORTED_MODULE_0__["getModule"])('segmentation');
  4318. function renderSegmentationOutline(evt, labelmap3D, labelmap2D, labelmapIndex, isActiveLabelMap) {
  4319. var configuration = segmentationModule.configuration;
  4320. var outline = getOutline(evt, labelmap3D, labelmap2D, configuration.outlineWidth);
  4321. renderOutline(evt, outline, labelmap3D.colorLUTIndex, isActiveLabelMap);
  4322. }
  4323. /**
  4324. * RenderOutline - Renders the outlines of segments to the canvas.
  4325. *
  4326. * @param {Object} evt The cornerstone event.
  4327. * @param {Object} outline The outline to render.
  4328. * @param {number} colorLUTIndex The index of the colorLUT.
  4329. * @param {number} isActiveLabelMap Whether the labelmap is active.
  4330. * @returns {null}
  4331. */
  4332. function renderOutline(evt, outline, colorLUTIndex) {
  4333. var isActiveLabelMap = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
  4334. var configuration = segmentationModule.configuration,
  4335. state = segmentationModule.state;
  4336. var eventData = evt.detail;
  4337. var element = eventData.element,
  4338. canvasContext = eventData.canvasContext;
  4339. var lineWidth = configuration.outlineWidth || 1;
  4340. var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_2__["getNewContext"])(canvasContext.canvas);
  4341. var colorLutTable = state.colorLutTables[colorLUTIndex];
  4342. var previousAlpha = context.globalAlpha;
  4343. context.globalAlpha = isActiveLabelMap ? configuration.outlineAlpha : configuration.outlineAlphaInactive; // Draw outlines.
  4344. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_2__["draw"])(context, function (context) {
  4345. for (var i = 1; i < outline.length; i++) {
  4346. if (outline[i]) {
  4347. var color = colorLutTable[i];
  4348. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_2__["drawLines"])(context, element, outline[i], {
  4349. color: "rgba(".concat(color[0], ", ").concat(color[1], ", ").concat(color[2], ", 1.0 )"),
  4350. lineWidth: lineWidth
  4351. }, 'canvas');
  4352. }
  4353. }
  4354. });
  4355. context.globalAlpha = previousAlpha;
  4356. }
  4357. /**
  4358. * GetOutline - Returns an object containing all the line segments to be
  4359. * drawn the canvas.
  4360. *
  4361. * @param {Object} evt The cornerstone event.
  4362. * @param {Labelmap3D} labelmap3D The 3D labelmap.
  4363. * @param {Labelmap2D} labelmap2D The 2D labelmap for this current image.
  4364. * @param {number} lineWidth The width of the outline in canvas pixels.
  4365. *
  4366. * @returns {Object[][]} An array of arrays of lines for each segment.
  4367. */
  4368. function getOutline(evt, labelmap3D, labelmap2D, lineWidth) {
  4369. var eventData = evt.detail;
  4370. var element = eventData.element,
  4371. image = eventData.image,
  4372. viewport = eventData.viewport;
  4373. var cols = image.width;
  4374. var rows = image.height;
  4375. lineWidth = lineWidth || 1;
  4376. var segmentsHidden = labelmap3D.segmentsHidden;
  4377. var pixelData = labelmap2D.pixelData;
  4378. var activeSegmentIndex = labelmap3D.activeSegmentIndex;
  4379. var lineSegments = [];
  4380. labelmap2D.segmentsOnLabelmap.forEach(function (segmentIndex) {
  4381. var visible = !segmentsHidden[segmentIndex];
  4382. if (visible) {
  4383. lineSegments[segmentIndex] = [];
  4384. }
  4385. });
  4386. if (!lineSegments[activeSegmentIndex]) {
  4387. lineSegments[activeSegmentIndex] = [];
  4388. }
  4389. var _getPixelCoordinateFromPixelIndex = function _getPixelCoordinateFromPixelIndex(pixelIndex) {
  4390. return {
  4391. x: pixelIndex % cols,
  4392. y: Math.floor(pixelIndex / cols)
  4393. };
  4394. };
  4395. var offset = getOutlineOffset(viewport, lineWidth);
  4396. for (var i = 0; i < pixelData.length; i++) {
  4397. var segmentIndex = pixelData[i];
  4398. if (segmentIndex === 0) {
  4399. continue;
  4400. }
  4401. var visible = !segmentsHidden[segmentIndex];
  4402. if (!visible) {
  4403. continue;
  4404. }
  4405. var coord = _getPixelCoordinateFromPixelIndex(i);
  4406. var pixels = _getPixelIndiciesAroundPixel(coord, rows, cols); // Check pixel above
  4407. if (pixels.top === undefined || pixelData[pixels.top] !== segmentIndex) {
  4408. _addTopOutline(lineSegments[segmentIndex], element, coord, offset);
  4409. } // Check pixel below
  4410. if (pixels.bottom === undefined || pixelData[pixels.bottom] !== segmentIndex) {
  4411. _addBottomOutline(lineSegments[segmentIndex], element, coord, offset);
  4412. } // Check pixel to the left
  4413. if (pixels.left === undefined || pixelData[pixels.left] !== segmentIndex) {
  4414. _addLeftOutline(lineSegments[segmentIndex], element, coord, offset);
  4415. } // Check pixel to the right
  4416. if (pixels.right === undefined || pixelData[pixels.right] !== segmentIndex) {
  4417. _addRightOutline(lineSegments[segmentIndex], element, coord, offset);
  4418. } // Top left corner
  4419. if (pixels.topLeft !== undefined && pixelData[pixels.topLeft] !== segmentIndex && pixelData[pixels.top] === segmentIndex && pixelData[pixels.left] === segmentIndex) {
  4420. _addTopLeftCorner(lineSegments[segmentIndex], element, coord, offset);
  4421. } // Top right corner
  4422. if (pixels.topRight !== undefined && pixelData[pixels.topRight] !== segmentIndex && pixelData[pixels.top] === segmentIndex && pixelData[pixels.right] === segmentIndex) {
  4423. _addTopRightCorner(lineSegments[segmentIndex], element, coord, offset);
  4424. } // Bottom left corner
  4425. if (pixels.bottomLeft !== undefined && pixelData[pixels.bottomLeft] !== segmentIndex && pixelData[pixels.bottom] === segmentIndex && pixelData[pixels.left] === segmentIndex) {
  4426. _addBottomLeftCorner(lineSegments[segmentIndex], element, coord, offset);
  4427. } // Bottom right corner
  4428. if (pixels.bottomRight !== undefined && pixelData[pixels.bottomRight] !== segmentIndex && pixelData[pixels.bottom] === segmentIndex && pixelData[pixels.right] === segmentIndex) {
  4429. _addBottomRightCorner(lineSegments[segmentIndex], element, coord, offset);
  4430. }
  4431. }
  4432. return lineSegments;
  4433. }
  4434. /**
  4435. * GetOutlineOffset - Returns the outline offset (half line width) in the
  4436. * i (column) and j (row) pixel directions in the viewport's rotated frame.
  4437. * @param {Object} viewport The cornerstone viewport.
  4438. * @param {number} lineWidth The width of the outline.
  4439. * @returns {Object} Two vectors in the i and j pixel directions, with magnitude
  4440. * lineWidth / 2
  4441. */
  4442. function getOutlineOffset(viewport, lineWidth) {
  4443. var halfLineWidth = lineWidth / 2;
  4444. var theta = viewport.rotation;
  4445. theta *= Math.PI / 180;
  4446. var cosTheta = Math.cos(theta);
  4447. var sinTheta = Math.sin(theta);
  4448. var unitVectorI = [cosTheta, sinTheta];
  4449. var unitVectorJ = [-sinTheta, cosTheta];
  4450. var i = {
  4451. x: halfLineWidth * unitVectorI[0],
  4452. y: halfLineWidth * unitVectorI[1]
  4453. };
  4454. var j = {
  4455. x: halfLineWidth * unitVectorJ[0],
  4456. y: halfLineWidth * unitVectorJ[1]
  4457. };
  4458. if (viewport.hflip) {
  4459. i.x *= -1;
  4460. i.y *= -1;
  4461. }
  4462. if (viewport.vflip) {
  4463. j.x *= -1;
  4464. j.y *= -1;
  4465. }
  4466. return {
  4467. i: i,
  4468. j: j
  4469. };
  4470. }
  4471. /**
  4472. * _getPixelIndiciesAroundPixel - Returnns the coordinates for up to 8 surrounding
  4473. * pixels, if they within the bounds of the image.
  4474. *
  4475. * @param {Object} coord The coordinate to check.
  4476. * @param {number} rows The number of rows in the image.
  4477. * @param {number} cols The number of cols in the image.
  4478. *
  4479. * @returns {Object} Object containing the position of adjacent pixels.
  4480. */
  4481. function _getPixelIndiciesAroundPixel(coord, rows, cols) {
  4482. var pixelIndex = coord.y * cols + coord.x;
  4483. var pixel = {};
  4484. var hasPixelToTop = coord.y - 1 >= 0;
  4485. var hasPixelToBotoom = coord.y + 1 < rows;
  4486. var hasPixelToLeft = coord.x - 1 >= 0;
  4487. var hasPixelToRight = coord.x + 1 < cols;
  4488. if (hasPixelToTop) {
  4489. pixel.top = pixelIndex - cols;
  4490. if (hasPixelToRight) {
  4491. pixel.topRight = pixel.top + 1;
  4492. }
  4493. if (hasPixelToLeft) {
  4494. pixel.topLeft = pixel.top - 1;
  4495. }
  4496. }
  4497. if (hasPixelToBotoom) {
  4498. pixel.bottom = pixelIndex + cols;
  4499. if (hasPixelToRight) {
  4500. pixel.bottomRight = pixel.bottom + 1;
  4501. }
  4502. if (hasPixelToLeft) {
  4503. pixel.bottomLeft = pixel.bottom - 1;
  4504. }
  4505. }
  4506. if (hasPixelToLeft) {
  4507. pixel.left = pixelIndex - 1;
  4508. }
  4509. if (hasPixelToRight) {
  4510. pixel.right = pixelIndex + 1;
  4511. }
  4512. return pixel;
  4513. }
  4514. /**
  4515. * _addTopLeftCorner - Adds an outline to the top left corner of the pixel.
  4516. *
  4517. * @param {Object[]} lineSegmentsForSegment - The list to append.
  4518. * @param {Object} element - The Cornerstone enabled element.
  4519. * @param {Object} coord - The pixel to add a line to.
  4520. * @param {Object} offset - The x and y offset in the rotated frame.
  4521. *
  4522. * @returns {null}
  4523. */
  4524. function _addTopLeftCorner(lineSegmentsForSegment, element, coord, offset) {
  4525. var pixelToCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas;
  4526. var start = pixelToCanvas(element, coord);
  4527. start.x += offset.j.x;
  4528. start.y += offset.j.y;
  4529. var end = {
  4530. x: start.x,
  4531. y: start.y
  4532. };
  4533. end.x += offset.i.x * 2;
  4534. end.y += offset.i.y * 2;
  4535. lineSegmentsForSegment.push({
  4536. start: start,
  4537. end: end
  4538. });
  4539. }
  4540. /**
  4541. * _addTopRightCorner - Adds an outline to the top right corner of the pixel.
  4542. *
  4543. * @param {Object[]} lineSegmentsForSegment - The list to append.
  4544. * @param {Object} element - The Cornerstone enabled element.
  4545. * @param {Object} coord - The pixel to add a line to.
  4546. * @param {Object} offset - The x and y offset in the rotated frame.
  4547. *
  4548. * @returns {null}
  4549. */
  4550. function _addTopRightCorner(lineSegmentsForSegment, element, coord, offset) {
  4551. var pixelToCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas;
  4552. var start = pixelToCanvas(element, {
  4553. x: coord.x + 1,
  4554. y: coord.y
  4555. });
  4556. start.x += offset.j.x;
  4557. start.y += offset.j.y;
  4558. var end = {
  4559. x: start.x,
  4560. y: start.y
  4561. };
  4562. end.x -= offset.i.x * 2;
  4563. end.y -= offset.i.y * 2;
  4564. lineSegmentsForSegment.push({
  4565. start: start,
  4566. end: end
  4567. });
  4568. }
  4569. /**
  4570. * _addBottomLeftCorner - Adds an outline to the bottom left corner of the pixel.
  4571. *
  4572. * @param {Object[]} lineSegmentsForSegment - The list to append.
  4573. * @param {Object} element - The Cornerstone enabled element.
  4574. * @param {Object} coord - The pixel to add a line to.
  4575. * @param {Object} offset - The x and y offset in the rotated frame.
  4576. *
  4577. * @returns {null}
  4578. */
  4579. function _addBottomLeftCorner(lineSegmentsForSegment, element, coord, offset) {
  4580. var pixelToCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas;
  4581. var start = pixelToCanvas(element, {
  4582. x: coord.x,
  4583. y: coord.y + 1
  4584. });
  4585. start.x -= offset.j.x;
  4586. start.y -= offset.j.y;
  4587. var end = {
  4588. x: start.x,
  4589. y: start.y
  4590. };
  4591. end.x += offset.i.x * 2;
  4592. end.y += offset.i.y * 2;
  4593. lineSegmentsForSegment.push({
  4594. start: start,
  4595. end: end
  4596. });
  4597. }
  4598. /**
  4599. * _addBottomRightCorner - Adds an outline to the bottom right corner of the pixel.
  4600. *
  4601. * @param {Object[]} lineSegmentsForSegment - The list to append.
  4602. * @param {Object} element - The Cornerstone enabled element.
  4603. * @param {Object} coord - The pixel to add a line to.
  4604. * @param {Object} offset - The x and y offset in the rotated frame.
  4605. *
  4606. * @returns {null}
  4607. */
  4608. function _addBottomRightCorner(lineSegmentsForSegment, element, coord, offset) {
  4609. var pixelToCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas;
  4610. var start = pixelToCanvas(element, {
  4611. x: coord.x + 1,
  4612. y: coord.y + 1
  4613. });
  4614. start.x -= offset.j.x;
  4615. start.y -= offset.j.y;
  4616. var end = {
  4617. x: start.x,
  4618. y: start.y
  4619. };
  4620. end.x -= offset.i.x * 2;
  4621. end.y -= offset.i.y * 2;
  4622. lineSegmentsForSegment.push({
  4623. start: start,
  4624. end: end
  4625. });
  4626. }
  4627. /**
  4628. * _addTopOutline - adds an outline at the top of the pixel.
  4629. *
  4630. * @param {Object[]} lineSegmentsForSegment - The list to append.
  4631. * @param {Object} element - The Cornerstone enabled element.
  4632. * @param {Object} coord - The pixel to add a line to.
  4633. * @param {number} halfLineWidth - Half the line width, to place line within the pixel.
  4634. * @param {Object} offset - The x and y offset in the rotated frame.
  4635. *
  4636. * @returns {null}
  4637. */
  4638. function _addTopOutline(lineSegmentsForSegment, element, coord, offset) {
  4639. var pixelToCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas;
  4640. var start = pixelToCanvas(element, coord);
  4641. var end = pixelToCanvas(element, {
  4642. x: coord.x + 1,
  4643. y: coord.y
  4644. }); // Move the line in the y-direction.
  4645. start.x += offset.j.x;
  4646. start.y += offset.j.y;
  4647. end.x += offset.j.x;
  4648. end.y += offset.j.y;
  4649. lineSegmentsForSegment.push({
  4650. start: start,
  4651. end: end
  4652. });
  4653. }
  4654. /**
  4655. * _addBottomOutline - adds an outline at the bottom of the pixel.
  4656. *
  4657. * @param {Object[]} lineSegmentsForSegment - The list to append.
  4658. * @param {Object} element - The Cornerstone enabled element.
  4659. * @param {Object} coord - The pixel to add a line to.
  4660. * @param {Object} offset - The x and y offset in the rotated frame.
  4661. *
  4662. * @returns {null}
  4663. */
  4664. function _addBottomOutline(lineSegmentsForSegment, element, coord, offset) {
  4665. var pixelToCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas;
  4666. var start = pixelToCanvas(element, {
  4667. x: coord.x,
  4668. y: coord.y + 1
  4669. });
  4670. var end = pixelToCanvas(element, {
  4671. x: coord.x + 1,
  4672. y: coord.y + 1
  4673. }); // Move the line in the negative y-direction.
  4674. start.x -= offset.j.x;
  4675. start.y -= offset.j.y;
  4676. end.x -= offset.j.x;
  4677. end.y -= offset.j.y;
  4678. lineSegmentsForSegment.push({
  4679. start: start,
  4680. end: end
  4681. });
  4682. }
  4683. /**
  4684. * _addLeftOutline - adds an outline at the left side of the pixel.
  4685. *
  4686. * @param {Object[]} lineSegmentsForSegment - The list to append.
  4687. * @param {Object} element - The Cornerstone enabled element.
  4688. * @param {Object} coord - The pixel to add a line to.
  4689. * @param {Object} offset - The x and y offset in the rotated frame.
  4690. *
  4691. * @returns {null}
  4692. */
  4693. function _addLeftOutline(lineSegmentsForSegment, element, coord, offset) {
  4694. var pixelToCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas;
  4695. var start = pixelToCanvas(element, coord);
  4696. var end = pixelToCanvas(element, {
  4697. x: coord.x,
  4698. y: coord.y + 1
  4699. }); // Move the line in the x-direction.
  4700. start.x += offset.i.x;
  4701. start.y += offset.i.y;
  4702. end.x += offset.i.x;
  4703. end.y += offset.i.y;
  4704. lineSegmentsForSegment.push({
  4705. start: start,
  4706. end: end
  4707. });
  4708. }
  4709. /**
  4710. * _addRightOutline - adds an outline at the right side of the pixel.
  4711. *
  4712. * @param {Object[]} lineSegmentsForSegment - The list to append.
  4713. * @param {Object} element - The Cornerstone enabled element.
  4714. * @param {Object} coord - The pixel to add a line to.
  4715. * @param {Object} offset - The x and y offset in the rotated frame.
  4716. *
  4717. * @returns {null}
  4718. */
  4719. function _addRightOutline(lineSegmentsForSegment, element, coord, offset) {
  4720. var pixelToCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas;
  4721. var start = pixelToCanvas(element, {
  4722. x: coord.x + 1,
  4723. y: coord.y
  4724. });
  4725. var end = pixelToCanvas(element, {
  4726. x: coord.x + 1,
  4727. y: coord.y + 1
  4728. }); // Move the line in the negative x-direction.
  4729. start.x -= offset.i.x;
  4730. start.y -= offset.i.y;
  4731. end.x -= offset.i.x;
  4732. end.y -= offset.i.y;
  4733. lineSegmentsForSegment.push({
  4734. start: start,
  4735. end: end
  4736. });
  4737. }
  4738. /***/ }),
  4739. /***/ "./eventListeners/mouseEventListeners.js":
  4740. /*!***********************************************!*\
  4741. !*** ./eventListeners/mouseEventListeners.js ***!
  4742. \***********************************************/
  4743. /*! exports provided: default */
  4744. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  4745. "use strict";
  4746. __webpack_require__.r(__webpack_exports__);
  4747. /* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../events.js */ "./events.js");
  4748. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
  4749. /* harmony import */ var _util_copyPoints_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../util/copyPoints.js */ "./util/copyPoints.js");
  4750. /* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../util/triggerEvent.js */ "./util/triggerEvent.js");
  4751. /* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/logger.js */ "./util/logger.js");
  4752. var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_4__["getLogger"])('eventListeners:mouseEventListeners');
  4753. var isClickEvent = true;
  4754. var preventClickTimeout;
  4755. var clickDelay = 200;
  4756. var addedListeners = new Map();
  4757. function getEventButtons(event) {
  4758. if (typeof event.buttons === 'number') {
  4759. return event.buttons;
  4760. }
  4761. switch (event.which) {
  4762. // No button
  4763. case 0:
  4764. return 0;
  4765. // Left
  4766. case 1:
  4767. return 1;
  4768. // Middle
  4769. case 2:
  4770. return 4;
  4771. // Right
  4772. case 3:
  4773. return 2;
  4774. }
  4775. return 0;
  4776. }
  4777. function preventClickHandler() {
  4778. isClickEvent = false;
  4779. }
  4780. function mouseDoubleClick(e) {
  4781. var element = e.currentTarget;
  4782. var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getEnabledElement(element);
  4783. if (!enabledElement.image) {
  4784. return;
  4785. }
  4786. var eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DOUBLE_CLICK;
  4787. var startPoints = {
  4788. page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.pageToPoint(e),
  4789. image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, e.pageX, e.pageY),
  4790. client: {
  4791. x: e.clientX,
  4792. y: e.clientY
  4793. }
  4794. };
  4795. startPoints.canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, startPoints.image);
  4796. var lastPoints = Object(_util_copyPoints_js__WEBPACK_IMPORTED_MODULE_2__["default"])(startPoints);
  4797. logger.log('double-click: %o', getEventButtons(e));
  4798. var eventData = {
  4799. event: e,
  4800. buttons: getEventButtons(e),
  4801. viewport: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getViewport(element),
  4802. image: enabledElement.image,
  4803. element: element,
  4804. startPoints: startPoints,
  4805. lastPoints: lastPoints,
  4806. currentPoints: startPoints,
  4807. deltaPoints: {
  4808. x: 0,
  4809. y: 0
  4810. },
  4811. type: eventType
  4812. };
  4813. Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_3__["default"])(element, eventType, eventData);
  4814. }
  4815. function mouseDown(e) {
  4816. var element = e.currentTarget;
  4817. var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getEnabledElement(element);
  4818. if (!enabledElement.image) {
  4819. return;
  4820. }
  4821. preventClickTimeout = setTimeout(preventClickHandler, clickDelay); // Prevent CornerstoneToolsMouseMove while mouse is down
  4822. element.removeEventListener('mousemove', mouseMove);
  4823. var startPoints = {
  4824. page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.pageToPoint(e),
  4825. image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, e.pageX, e.pageY),
  4826. client: {
  4827. x: e.clientX,
  4828. y: e.clientY
  4829. }
  4830. };
  4831. startPoints.canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, startPoints.image);
  4832. var lastPoints = Object(_util_copyPoints_js__WEBPACK_IMPORTED_MODULE_2__["default"])(startPoints);
  4833. var eventData = {
  4834. event: e,
  4835. buttons: getEventButtons(e),
  4836. viewport: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getViewport(element),
  4837. image: enabledElement.image,
  4838. element: element,
  4839. startPoints: startPoints,
  4840. lastPoints: lastPoints,
  4841. currentPoints: startPoints,
  4842. deltaPoints: {
  4843. x: 0,
  4844. y: 0
  4845. },
  4846. type: _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DOWN
  4847. };
  4848. var eventPropagated = Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_3__["default"])(eventData.element, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DOWN, eventData);
  4849. if (eventPropagated) {
  4850. // No tools responded to this event, create a new tool
  4851. eventData.type = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DOWN_ACTIVATE;
  4852. Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_3__["default"])(eventData.element, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DOWN_ACTIVATE, eventData);
  4853. }
  4854. function onMouseMove(e) {
  4855. // Calculate our current points in page and image coordinates
  4856. var eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DRAG;
  4857. var currentPoints = {
  4858. page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.pageToPoint(e),
  4859. image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, e.pageX, e.pageY),
  4860. client: {
  4861. x: e.clientX,
  4862. y: e.clientY
  4863. }
  4864. };
  4865. currentPoints.canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, currentPoints.image); // Calculate delta values in page and image coordinates
  4866. var deltaPoints = {
  4867. page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),
  4868. image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),
  4869. client: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),
  4870. canvas: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)
  4871. };
  4872. logger.log('mousemove: %o', getEventButtons(e));
  4873. var eventData = {
  4874. buttons: getEventButtons(e),
  4875. viewport: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getViewport(element),
  4876. image: enabledElement.image,
  4877. element: element,
  4878. startPoints: startPoints,
  4879. lastPoints: lastPoints,
  4880. currentPoints: currentPoints,
  4881. deltaPoints: deltaPoints,
  4882. type: eventType,
  4883. ctrlKey: e.ctrlKey,
  4884. metaKey: e.metaKey,
  4885. shiftKey: e.shiftKey
  4886. };
  4887. Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_3__["default"])(eventData.element, eventType, eventData); // Update the last points
  4888. lastPoints = Object(_util_copyPoints_js__WEBPACK_IMPORTED_MODULE_2__["default"])(currentPoints);
  4889. } // Hook mouseup so we can unbind our event listeners
  4890. // When they stop dragging
  4891. function onMouseUp(e) {
  4892. // Cancel the timeout preventing the click event from triggering
  4893. clearTimeout(preventClickTimeout);
  4894. var eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_UP;
  4895. if (isClickEvent) {
  4896. eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_CLICK;
  4897. } // Calculate our current points in page and image coordinates
  4898. var currentPoints = {
  4899. page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.pageToPoint(e),
  4900. image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, e.pageX, e.pageY),
  4901. client: {
  4902. x: e.clientX,
  4903. y: e.clientY
  4904. }
  4905. };
  4906. currentPoints.canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, currentPoints.image); // Calculate delta values in page and image coordinates
  4907. var deltaPoints = {
  4908. page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),
  4909. image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),
  4910. client: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),
  4911. canvas: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)
  4912. };
  4913. logger.log('mouseup: %o', getEventButtons(e));
  4914. var eventData = {
  4915. event: e,
  4916. buttons: getEventButtons(e),
  4917. viewport: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getViewport(element),
  4918. image: enabledElement.image,
  4919. element: element,
  4920. startPoints: startPoints,
  4921. lastPoints: lastPoints,
  4922. currentPoints: currentPoints,
  4923. deltaPoints: deltaPoints,
  4924. type: eventType
  4925. };
  4926. Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_3__["default"])(eventData.element, eventType, eventData);
  4927. document.removeEventListener('mousemove', onMouseMove);
  4928. document.removeEventListener('mouseup', onMouseUp);
  4929. addedListeners.delete(onMouseMove);
  4930. addedListeners.delete(onMouseUp);
  4931. element.addEventListener('mousemove', mouseMove);
  4932. isClickEvent = true;
  4933. }
  4934. document.addEventListener('mousemove', onMouseMove);
  4935. document.addEventListener('mouseup', onMouseUp);
  4936. addedListeners.set(onMouseMove, 'mousemove');
  4937. addedListeners.set(onMouseUp, 'mouseup');
  4938. }
  4939. function mouseMove(e) {
  4940. var element = e.currentTarget;
  4941. var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getEnabledElement(element);
  4942. if (!enabledElement.image) {
  4943. return;
  4944. }
  4945. var eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_MOVE;
  4946. var startPoints = {
  4947. page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.pageToPoint(e),
  4948. image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, e.pageX, e.pageY),
  4949. client: {
  4950. x: e.clientX,
  4951. y: e.clientY
  4952. }
  4953. };
  4954. startPoints.canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, startPoints.image);
  4955. var lastPoints = Object(_util_copyPoints_js__WEBPACK_IMPORTED_MODULE_2__["default"])(startPoints); // Calculate our current points in page and image coordinates
  4956. var currentPoints = {
  4957. page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.pageToPoint(e),
  4958. image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, e.pageX, e.pageY),
  4959. client: {
  4960. x: e.clientX,
  4961. y: e.clientY
  4962. }
  4963. };
  4964. currentPoints.canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, currentPoints.image); // Calculate delta values in page and image coordinates
  4965. var deltaPoints = {
  4966. page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),
  4967. image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),
  4968. client: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),
  4969. canvas: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)
  4970. };
  4971. var eventData = {
  4972. viewport: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getViewport(element),
  4973. image: enabledElement.image,
  4974. element: element,
  4975. startPoints: startPoints,
  4976. lastPoints: lastPoints,
  4977. currentPoints: currentPoints,
  4978. deltaPoints: deltaPoints,
  4979. type: eventType
  4980. };
  4981. Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_3__["default"])(element, eventType, eventData); // Update the last points
  4982. lastPoints = Object(_util_copyPoints_js__WEBPACK_IMPORTED_MODULE_2__["default"])(currentPoints);
  4983. }
  4984. function disable(element) {
  4985. element.removeEventListener('mousedown', mouseDown);
  4986. element.removeEventListener('mousemove', mouseMove);
  4987. element.removeEventListener('dblclick', mouseDoubleClick); // Make sure we have removed any listeners that were added within the above listeners (#1337)
  4988. addedListeners.forEach(function (event, listener) {
  4989. document.removeEventListener(event, listener);
  4990. });
  4991. addedListeners.clear();
  4992. }
  4993. function enable(element) {
  4994. // Prevent handlers from being attached multiple times
  4995. disable(element);
  4996. element.addEventListener('mousedown', mouseDown);
  4997. element.addEventListener('mousemove', mouseMove);
  4998. element.addEventListener('dblclick', mouseDoubleClick);
  4999. }
  5000. /* harmony default export */ __webpack_exports__["default"] = ({
  5001. enable: enable,
  5002. disable: disable
  5003. });
  5004. /***/ }),
  5005. /***/ "./eventListeners/onImageRenderedBrushEventHandler.js":
  5006. /*!************************************************************!*\
  5007. !*** ./eventListeners/onImageRenderedBrushEventHandler.js ***!
  5008. \************************************************************/
  5009. /*! exports provided: default */
  5010. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  5011. "use strict";
  5012. __webpack_require__.r(__webpack_exports__);
  5013. /* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../store/index.js */ "./store/index.js");
  5014. /* harmony import */ var _internals_renderSegmentation_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internals/renderSegmentation.js */ "./eventListeners/internals/renderSegmentation.js");
  5015. var segmentationModule = Object(_store_index_js__WEBPACK_IMPORTED_MODULE_0__["getModule"])('segmentation');
  5016. /**
  5017. * Finds which segmentations need to be rendered based on the configuration and
  5018. * presence of `Labelmap2D` data on these frames.
  5019. *
  5020. * @param {Object} evt - The cornerstone event.
  5021. * @returns {null}
  5022. */
  5023. /* harmony default export */ __webpack_exports__["default"] = (function (evt) {
  5024. var eventData = evt.detail;
  5025. var element = eventData.element;
  5026. var configuration = segmentationModule.configuration,
  5027. getters = segmentationModule.getters;
  5028. var _getters$labelmaps3D = getters.labelmaps3D(element),
  5029. activeLabelmapIndex = _getters$labelmaps3D.activeLabelmapIndex,
  5030. labelmaps3D = _getters$labelmaps3D.labelmaps3D,
  5031. currentImageIdIndex = _getters$labelmaps3D.currentImageIdIndex;
  5032. if (!labelmaps3D) {
  5033. return;
  5034. }
  5035. if (configuration.shouldRenderInactiveLabelmaps) {
  5036. renderInactiveLabelMaps(evt, labelmaps3D, activeLabelmapIndex, currentImageIdIndex);
  5037. }
  5038. renderActiveLabelMap(evt, labelmaps3D, activeLabelmapIndex, currentImageIdIndex);
  5039. });
  5040. /**
  5041. * RenderActiveLabelMap - Renders the `Labelmap3D` for this element if a `Labelmap2D`
  5042. * view of the `currentImageIdIndex` exists.
  5043. *
  5044. * @param {Object} evt The cornerstone event.
  5045. * @param {Labelmap3D[]} labelmaps3D An array of `Labelmap3D` objects.
  5046. * @param {number} activeLabelmapIndex The index of the active label map.
  5047. * @param {number} currentImageIdIndex The in-stack image position.
  5048. * @returns {null}
  5049. */
  5050. function renderActiveLabelMap(evt, labelmaps3D, activeLabelmapIndex, currentImageIdIndex) {
  5051. var labelmap3D = labelmaps3D[activeLabelmapIndex];
  5052. if (!labelmap3D) {
  5053. return;
  5054. }
  5055. var labelmap2D = labelmap3D.labelmaps2D[currentImageIdIndex];
  5056. if (labelmap2D) {
  5057. Object(_internals_renderSegmentation_js__WEBPACK_IMPORTED_MODULE_1__["default"])(evt, labelmap3D, activeLabelmapIndex, labelmap2D, true);
  5058. }
  5059. }
  5060. /**
  5061. * RenderInactiveLabelMaps - Renders all the inactive `Labelmap3D`s for this element.
  5062. *
  5063. * @param {Object} evt The cornerstone event.
  5064. * @param {Labelmap3D[]} labelmaps3D An array of labelmaps.
  5065. * @param {number} activeLabelmapIndex The index of the active label map.
  5066. * @param {number} currentImageIdIndex The in-stack image position.
  5067. * @returns {null}
  5068. */
  5069. function renderInactiveLabelMaps(evt, labelmaps3D, activeLabelmapIndex, currentImageIdIndex) {
  5070. for (var i = 0; i < labelmaps3D.length; i++) {
  5071. var labelmap3D = labelmaps3D[i];
  5072. if (i === activeLabelmapIndex || !labelmap3D) {
  5073. continue;
  5074. }
  5075. var labelmap2D = labelmap3D.labelmaps2D[currentImageIdIndex];
  5076. if (labelmap2D) {
  5077. Object(_internals_renderSegmentation_js__WEBPACK_IMPORTED_MODULE_1__["default"])(evt, labelmap3D, i, labelmap2D, false);
  5078. }
  5079. }
  5080. }
  5081. /***/ }),
  5082. /***/ "./eventListeners/preventGhostClick.js":
  5083. /*!*********************************************!*\
  5084. !*** ./eventListeners/preventGhostClick.js ***!
  5085. \*********************************************/
  5086. /*! exports provided: default */
  5087. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  5088. "use strict";
  5089. __webpack_require__.r(__webpack_exports__);
  5090. // Functions to prevent ghost clicks following a touch
  5091. // All credit to @kosich
  5092. // https://gist.github.com/kosich/23188dd86633b6c2efb7
  5093. var antiGhostDelay = 2000,
  5094. pointerType = {
  5095. mouse: 0,
  5096. touch: 1
  5097. };
  5098. var lastInteractionType, lastInteractionTime;
  5099. function handleTap(type, e) {
  5100. var now = Date.now();
  5101. if (type !== lastInteractionType) {
  5102. if (now - lastInteractionTime <= antiGhostDelay) {
  5103. e.preventDefault();
  5104. e.stopPropagation();
  5105. e.stopImmediatePropagation();
  5106. return false;
  5107. }
  5108. lastInteractionType = type;
  5109. }
  5110. lastInteractionTime = now;
  5111. } // Cacheing the function references
  5112. // Necessary because a new function reference is created after .bind() is called
  5113. // http://stackoverflow.com/questions/11565471/removing-event-listener-which-was-added-with-bind
  5114. var handleTapMouse = handleTap.bind(null, pointerType.mouse);
  5115. var handleTapTouch = handleTap.bind(null, pointerType.touch);
  5116. function attachEvents(element, eventList, interactionType) {
  5117. var tapHandler = interactionType ? handleTapMouse : handleTapTouch;
  5118. eventList.forEach(function (eventName) {
  5119. element.addEventListener(eventName, tapHandler, {
  5120. passive: false
  5121. });
  5122. });
  5123. }
  5124. function removeEvents(element, eventList, interactionType) {
  5125. var tapHandler = interactionType ? handleTapMouse : handleTapTouch;
  5126. eventList.forEach(function (eventName) {
  5127. element.removeEventListener(eventName, tapHandler);
  5128. });
  5129. }
  5130. var mouseEvents = ['mousedown', 'mouseup'];
  5131. var touchEvents = ['touchstart', 'touchend'];
  5132. function disable(element) {
  5133. removeEvents(element, mouseEvents, pointerType.mouse);
  5134. removeEvents(element, touchEvents, pointerType.touch);
  5135. }
  5136. function enable(element) {
  5137. disable(element);
  5138. attachEvents(element, mouseEvents, pointerType.mouse);
  5139. attachEvents(element, touchEvents, pointerType.touch);
  5140. }
  5141. /* harmony default export */ __webpack_exports__["default"] = ({
  5142. enable: enable,
  5143. disable: disable
  5144. });
  5145. /***/ }),
  5146. /***/ "./eventListeners/touchEventListeners.js":
  5147. /*!***********************************************!*\
  5148. !*** ./eventListeners/touchEventListeners.js ***!
  5149. \***********************************************/
  5150. /*! exports provided: default */
  5151. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  5152. "use strict";
  5153. __webpack_require__.r(__webpack_exports__);
  5154. /* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../events.js */ "./events.js");
  5155. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
  5156. /* harmony import */ var _util_copyPoints_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../util/copyPoints.js */ "./util/copyPoints.js");
  5157. /* harmony import */ var _preventGhostClick_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./preventGhostClick.js */ "./eventListeners/preventGhostClick.js");
  5158. /* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/triggerEvent.js */ "./util/triggerEvent.js");
  5159. /* harmony import */ var _toolOptions_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../toolOptions.js */ "./toolOptions.js");
  5160. var startPoints, currentPoints, lastPoints, deltaPoints, eventData, touchStartDelay, pressTimeout, pageDistanceMoved;
  5161. var lastScale = 1.0,
  5162. lastRotation = 0.0,
  5163. preventNextPinch = false,
  5164. isPress = false,
  5165. lastDelta;
  5166. var pressDelay = 700,
  5167. pressMaxDistance = 5;
  5168. var inputName = 'touchInput';
  5169. function onTouch(e) {
  5170. var element = e.currentTarget || e.srcEvent.currentTarget;
  5171. var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getEnabledElement(element);
  5172. if (!enabledElement.image) {
  5173. return;
  5174. }
  5175. var eventType, scaleChange, delta, remainingPointers, rotation; // Prevent mouse events from occurring alongside touch events
  5176. e.preventDefault(); // If more than one finger is placed on the element, stop the press timeout
  5177. if (e.pointers && e.pointers.length > 1 || e.touches && e.touches.length > 1) {
  5178. isPress = false;
  5179. clearTimeout(pressTimeout);
  5180. }
  5181. switch (e.type) {
  5182. case 'tap':
  5183. isPress = false;
  5184. clearTimeout(pressTimeout); // Calculate our current points in page and image coordinates
  5185. currentPoints = {
  5186. page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.pageToPoint(e.pointers[0]),
  5187. image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, e.pointers[0].pageX, e.pointers[0].pageY),
  5188. client: {
  5189. x: e.pointers[0].clientX,
  5190. y: e.pointers[0].clientY
  5191. }
  5192. };
  5193. currentPoints.canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, currentPoints.image);
  5194. eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TAP;
  5195. eventData = {
  5196. event: e,
  5197. viewport: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getViewport(element),
  5198. image: enabledElement.image,
  5199. element: element,
  5200. currentPoints: currentPoints,
  5201. type: eventType,
  5202. isTouchEvent: true
  5203. };
  5204. Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, eventType, eventData);
  5205. break;
  5206. case 'doubletap':
  5207. isPress = false;
  5208. clearTimeout(pressTimeout); // Calculate our current points in page and image coordinates
  5209. currentPoints = {
  5210. page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.pageToPoint(e.pointers[0]),
  5211. image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, e.pointers[0].pageX, e.pointers[0].pageY),
  5212. client: {
  5213. x: e.pointers[0].clientX,
  5214. y: e.pointers[0].clientY
  5215. }
  5216. };
  5217. currentPoints.canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, currentPoints.image);
  5218. eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].DOUBLE_TAP;
  5219. eventData = {
  5220. event: e,
  5221. viewport: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getViewport(element),
  5222. image: enabledElement.image,
  5223. element: element,
  5224. currentPoints: currentPoints,
  5225. type: eventType,
  5226. isTouchEvent: true
  5227. };
  5228. Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, eventType, eventData);
  5229. break;
  5230. case 'pinchstart':
  5231. isPress = false;
  5232. clearTimeout(pressTimeout);
  5233. lastScale = 1.0;
  5234. break;
  5235. case 'pinchmove':
  5236. isPress = false;
  5237. clearTimeout(pressTimeout);
  5238. if (preventNextPinch === true) {
  5239. lastScale = e.scale;
  5240. preventNextPinch = false;
  5241. break;
  5242. }
  5243. scaleChange = (e.scale - lastScale) / lastScale;
  5244. startPoints = {
  5245. page: e.center,
  5246. image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, e.center.x, e.center.y)
  5247. };
  5248. startPoints.canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, startPoints.image);
  5249. eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_PINCH;
  5250. eventData = {
  5251. event: e,
  5252. startPoints: startPoints,
  5253. viewport: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getViewport(element),
  5254. image: enabledElement.image,
  5255. element: element,
  5256. direction: e.scale < 1 ? 1 : -1,
  5257. scaleChange: scaleChange,
  5258. type: eventType,
  5259. isTouchEvent: true
  5260. };
  5261. Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, eventType, eventData);
  5262. lastScale = e.scale;
  5263. break;
  5264. case 'touchstart':
  5265. lastScale = 1.0;
  5266. clearTimeout(pressTimeout);
  5267. clearTimeout(touchStartDelay);
  5268. touchStartDelay = setTimeout(function () {
  5269. startPoints = {
  5270. page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.pageToPoint(e.touches[0]),
  5271. image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, e.touches[0].pageX, e.touches[0].pageY),
  5272. client: {
  5273. x: e.touches[0].clientX,
  5274. y: e.touches[0].clientY
  5275. }
  5276. };
  5277. startPoints.canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, startPoints.image);
  5278. eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_START;
  5279. if (e.touches.length > 1) {
  5280. eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MULTI_TOUCH_START;
  5281. }
  5282. eventData = {
  5283. event: e,
  5284. viewport: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getViewport(element),
  5285. image: enabledElement.image,
  5286. element: element,
  5287. startPoints: startPoints,
  5288. currentPoints: startPoints,
  5289. type: eventType,
  5290. isTouchEvent: true
  5291. };
  5292. var eventPropagated = Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, eventType, eventData);
  5293. if (eventPropagated === true) {
  5294. // IsPress = false;
  5295. // ClearTimeout(pressTimeout);
  5296. // No current tools responded to the drag action.
  5297. // Create new tool measurement
  5298. eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_START_ACTIVE;
  5299. if (e.touches.length > 1) {
  5300. eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MULTI_TOUCH_START_ACTIVE;
  5301. }
  5302. eventData.type = eventType;
  5303. Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, eventType, eventData);
  5304. } // Console.log(eventType);
  5305. lastPoints = Object(_util_copyPoints_js__WEBPACK_IMPORTED_MODULE_2__["default"])(startPoints);
  5306. }, 50);
  5307. isPress = true;
  5308. pageDistanceMoved = 0;
  5309. pressTimeout = setTimeout(function () {
  5310. if (!isPress) {
  5311. return;
  5312. }
  5313. currentPoints = {
  5314. page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.pageToPoint(e.touches[0]),
  5315. image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, e.touches[0].pageX, e.touches[0].pageY),
  5316. client: {
  5317. x: e.touches[0].clientX,
  5318. y: e.touches[0].clientY
  5319. }
  5320. };
  5321. currentPoints.canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, startPoints.image);
  5322. eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_PRESS;
  5323. eventData = {
  5324. event: e,
  5325. viewport: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getViewport(element),
  5326. image: enabledElement.image,
  5327. element: element,
  5328. currentPoints: currentPoints,
  5329. type: eventType,
  5330. isTouchEvent: true
  5331. };
  5332. Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, eventType, eventData); // Console.log(eventType);
  5333. }, pressDelay);
  5334. break;
  5335. case 'touchend':
  5336. lastScale = 1.0;
  5337. isPress = false;
  5338. clearTimeout(pressTimeout);
  5339. setTimeout(function () {
  5340. startPoints = {
  5341. page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.pageToPoint(e.changedTouches[0]),
  5342. image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, e.changedTouches[0].pageX, e.changedTouches[0].pageY),
  5343. client: {
  5344. x: e.changedTouches[0].clientX,
  5345. y: e.changedTouches[0].clientY
  5346. }
  5347. };
  5348. startPoints.canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, startPoints.image);
  5349. eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_END;
  5350. eventData = {
  5351. event: e,
  5352. viewport: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getViewport(element),
  5353. image: enabledElement.image,
  5354. element: element,
  5355. startPoints: startPoints,
  5356. currentPoints: startPoints,
  5357. type: eventType,
  5358. isTouchEvent: true
  5359. };
  5360. Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, eventType, eventData);
  5361. }, 50);
  5362. break;
  5363. case 'panmove':
  5364. // Using the delta-value of HammerJS, because it takes all pointers into account
  5365. // This is very important when using panning in combination with pinch-zooming
  5366. // But HammerJS' delta is relative to the start of the pan event
  5367. // So it needs to be converted to a per-event-delta for CornerstoneTools
  5368. delta = {
  5369. x: e.deltaX - lastDelta.x,
  5370. y: e.deltaY - lastDelta.y
  5371. };
  5372. lastDelta = {
  5373. x: e.deltaX,
  5374. y: e.deltaY
  5375. }; // Calculate our current points in page and image coordinates
  5376. currentPoints = {
  5377. page: {
  5378. x: lastPoints.page.x + delta.x,
  5379. y: lastPoints.page.y + delta.y
  5380. },
  5381. image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, lastPoints.page.x + delta.x, lastPoints.page.y + delta.y),
  5382. client: {
  5383. x: lastPoints.client.x + delta.x,
  5384. y: lastPoints.client.y + delta.y
  5385. }
  5386. };
  5387. currentPoints.canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, currentPoints.image); // Calculate delta values in page and image coordinates
  5388. deltaPoints = {
  5389. page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),
  5390. image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),
  5391. client: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),
  5392. canvas: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)
  5393. };
  5394. pageDistanceMoved += Math.sqrt(deltaPoints.page.x * deltaPoints.page.x + deltaPoints.page.y * deltaPoints.page.y); // Console.log("pageDistanceMoved: " + pageDistanceMoved);
  5395. if (pageDistanceMoved > pressMaxDistance) {
  5396. // Console.log('Press event aborted due to movement');
  5397. isPress = false;
  5398. clearTimeout(pressTimeout);
  5399. }
  5400. eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_DRAG;
  5401. if (e.pointers.length > 1) {
  5402. eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MULTI_TOUCH_DRAG;
  5403. }
  5404. eventData = {
  5405. viewport: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getViewport(element),
  5406. image: enabledElement.image,
  5407. element: element,
  5408. startPoints: startPoints,
  5409. lastPoints: lastPoints,
  5410. currentPoints: currentPoints,
  5411. deltaPoints: deltaPoints,
  5412. numPointers: e.pointers.length,
  5413. type: eventType,
  5414. isTouchEvent: true
  5415. };
  5416. Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, eventType, eventData);
  5417. lastPoints = Object(_util_copyPoints_js__WEBPACK_IMPORTED_MODULE_2__["default"])(currentPoints);
  5418. break;
  5419. case 'panstart':
  5420. lastDelta = {
  5421. x: e.deltaX,
  5422. y: e.deltaY
  5423. };
  5424. currentPoints = {
  5425. page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.pageToPoint(e.pointers[0]),
  5426. image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, e.pointers[0].pageX, e.pointers[0].pageY),
  5427. client: {
  5428. x: e.pointers[0].clientX,
  5429. y: e.pointers[0].clientY
  5430. }
  5431. };
  5432. currentPoints.canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, currentPoints.image);
  5433. lastPoints = Object(_util_copyPoints_js__WEBPACK_IMPORTED_MODULE_2__["default"])(currentPoints);
  5434. break;
  5435. case 'panend':
  5436. isPress = false;
  5437. clearTimeout(pressTimeout); // If lastPoints is not yet set, it means panend fired without panstart or pan,
  5438. // So we can ignore this event
  5439. if (!lastPoints) {
  5440. return false;
  5441. }
  5442. currentPoints = {
  5443. page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.pageToPoint(e.pointers[0]),
  5444. image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, e.pointers[0].pageX, e.pointers[0].pageY),
  5445. client: {
  5446. x: e.pointers[0].clientX,
  5447. y: e.pointers[0].clientY
  5448. }
  5449. };
  5450. currentPoints.canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, currentPoints.image); // Calculate delta values in page and image coordinates
  5451. deltaPoints = {
  5452. page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),
  5453. image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),
  5454. client: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),
  5455. canvas: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)
  5456. };
  5457. eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_DRAG_END;
  5458. eventData = {
  5459. event: e.srcEvent,
  5460. viewport: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getViewport(element),
  5461. image: enabledElement.image,
  5462. element: element,
  5463. startPoints: startPoints,
  5464. lastPoints: lastPoints,
  5465. currentPoints: currentPoints,
  5466. deltaPoints: deltaPoints,
  5467. type: eventType,
  5468. isTouchEvent: true
  5469. };
  5470. Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, eventType, eventData);
  5471. remainingPointers = e.pointers.length - e.changedPointers.length;
  5472. if (remainingPointers === 2) {
  5473. preventNextPinch = true;
  5474. }
  5475. break;
  5476. case 'rotatemove':
  5477. isPress = false;
  5478. clearTimeout(pressTimeout);
  5479. rotation = e.rotation - lastRotation;
  5480. lastRotation = e.rotation;
  5481. eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_ROTATE;
  5482. eventData = {
  5483. event: e.srcEvent,
  5484. viewport: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getViewport(element),
  5485. image: enabledElement.image,
  5486. element: element,
  5487. rotation: rotation,
  5488. type: eventType
  5489. };
  5490. Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, eventType, eventData);
  5491. break;
  5492. }
  5493. return false;
  5494. }
  5495. function enable(element) {
  5496. disable(element);
  5497. var Hammer = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].Hammer;
  5498. var hammerOptions = {
  5499. inputClass: Hammer.SUPPORT_POINTER_EVENTS ? Hammer.PointerEventInput : Hammer.TouchInput
  5500. };
  5501. var mc = new Hammer.Manager(element, hammerOptions);
  5502. var panOptions = {
  5503. pointers: 0,
  5504. direction: Hammer.DIRECTION_ALL,
  5505. threshold: 0
  5506. };
  5507. var pan = new Hammer.Pan(panOptions);
  5508. var pinch = new Hammer.Pinch({
  5509. threshold: 0
  5510. });
  5511. var rotate = new Hammer.Rotate({
  5512. threshold: 0
  5513. });
  5514. pinch.recognizeWith(pan);
  5515. pinch.recognizeWith(rotate);
  5516. rotate.recognizeWith(pan);
  5517. var doubleTap = new Hammer.Tap({
  5518. event: 'doubletap',
  5519. taps: 2,
  5520. interval: 1500,
  5521. threshold: 50,
  5522. posThreshold: 50
  5523. });
  5524. doubleTap.recognizeWith(pan); // Add to the Manager
  5525. mc.add([doubleTap, pan, rotate, pinch]);
  5526. mc.on('tap doubletap panstart panmove panend pinchstart pinchmove rotatemove', onTouch);
  5527. _preventGhostClick_js__WEBPACK_IMPORTED_MODULE_3__["default"].enable(element);
  5528. var touchEvents = ['touchstart', 'touchend'];
  5529. touchEvents.forEach(function (eventType) {
  5530. element.addEventListener(eventType, onTouch, {
  5531. passive: false
  5532. });
  5533. }); // TODO: Check why we are using tool options if it's not a tool
  5534. var options = Object(_toolOptions_js__WEBPACK_IMPORTED_MODULE_5__["getToolOptions"])(inputName, element);
  5535. options.hammer = mc; // TODO: Check why we are using tool options if it's not a tool
  5536. Object(_toolOptions_js__WEBPACK_IMPORTED_MODULE_5__["setToolOptions"])(inputName, element, options);
  5537. }
  5538. function disable(element) {
  5539. _preventGhostClick_js__WEBPACK_IMPORTED_MODULE_3__["default"].disable(element);
  5540. var touchEvents = ['touchstart', 'touchend'];
  5541. touchEvents.forEach(function (eventType) {
  5542. element.removeEventListener(eventType, onTouch);
  5543. }); // TODO: Check why we are using tool options if it's not a tool
  5544. var options = Object(_toolOptions_js__WEBPACK_IMPORTED_MODULE_5__["getToolOptions"])(inputName, element);
  5545. var mc = options.hammer;
  5546. if (mc) {
  5547. mc.off('tap doubletap panstart panmove panend pinchstart pinchmove rotatemove', onTouch);
  5548. mc.input.destroy();
  5549. }
  5550. options.hammer = null;
  5551. Object(_toolOptions_js__WEBPACK_IMPORTED_MODULE_5__["clearToolOptions"])(inputName, element);
  5552. } // Module exports
  5553. var touchInput = {
  5554. enable: enable,
  5555. disable: disable
  5556. };
  5557. /* harmony default export */ __webpack_exports__["default"] = (touchInput);
  5558. /***/ }),
  5559. /***/ "./eventListeners/wheelEventListener.js":
  5560. /*!**********************************************!*\
  5561. !*** ./eventListeners/wheelEventListener.js ***!
  5562. \**********************************************/
  5563. /*! exports provided: default */
  5564. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  5565. "use strict";
  5566. __webpack_require__.r(__webpack_exports__);
  5567. /* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../events.js */ "./events.js");
  5568. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
  5569. /* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../util/triggerEvent.js */ "./util/triggerEvent.js");
  5570. /* harmony import */ var _internals_normalizeWheel_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./internals/normalizeWheel.js */ "./eventListeners/internals/normalizeWheel.js");
  5571. /**
  5572. * Internal module used to turn on listening, handling, and normalizing of the
  5573. * native `wheel` event
  5574. */
  5575. /**
  5576. *
  5577. * @private
  5578. * @function wheelEventHandler
  5579. * @param {WheelEvent} evt
  5580. * @returns {undefined}
  5581. */
  5582. function wheelEventHandler(evt) {
  5583. var element = evt.currentTarget;
  5584. var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getEnabledElement(element);
  5585. if (!enabledElement.image) {
  5586. return;
  5587. } // Prevent triggering MouseWheel events that are not real scroll events:
  5588. // E.g. when clicking the MiddleMouseWheelButton, a deltaY of 0 is emitted.
  5589. // See https://github.com/cornerstonejs/cornerstoneTools/issues/935
  5590. if (evt.deltaY > -1 && evt.deltaY < 1) {
  5591. return;
  5592. }
  5593. evt.preventDefault();
  5594. var pageX = evt.pageX,
  5595. pageY = evt.pageY;
  5596. var startingCoords = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, pageX, pageY);
  5597. var _normalizeWheel = Object(_internals_normalizeWheel_js__WEBPACK_IMPORTED_MODULE_3__["default"])(evt),
  5598. spinX = _normalizeWheel.spinX,
  5599. spinY = _normalizeWheel.spinY,
  5600. pixelX = _normalizeWheel.pixelX,
  5601. pixelY = _normalizeWheel.pixelY;
  5602. var direction = spinY < 0 ? -1 : 1;
  5603. var mouseWheelData = {
  5604. element: element,
  5605. viewport: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getViewport(element),
  5606. detail: evt,
  5607. image: enabledElement.image,
  5608. direction: direction,
  5609. spinX: spinX,
  5610. spinY: spinY,
  5611. pixelX: pixelX,
  5612. pixelY: pixelY,
  5613. pageX: pageX,
  5614. pageY: pageY,
  5615. imageX: startingCoords.x,
  5616. imageY: startingCoords.y
  5617. };
  5618. Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_2__["default"])(element, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_WHEEL, mouseWheelData);
  5619. }
  5620. /**
  5621. * Listens for the wheel event, and handles it. Handled event
  5622. * will be "normalized" and re-emitted as `EVENTS.MOUSE_WHEEL`
  5623. *
  5624. * @private
  5625. * @param {HTMLElement} element
  5626. * @returns {undefined}
  5627. */
  5628. function enable(element) {
  5629. disable(element);
  5630. element.addEventListener('wheel', wheelEventHandler, {
  5631. passive: false
  5632. });
  5633. }
  5634. /**
  5635. * Removes listener and handler for wheel event. `EVENTS.MOUSE_WHEEL`
  5636. * will no longer be emitted.
  5637. *
  5638. * @private
  5639. * @param {HTMLElement} element
  5640. * @returns {undefined}
  5641. */
  5642. function disable(element) {
  5643. element.removeEventListener('wheel', wheelEventHandler, {
  5644. passive: false
  5645. });
  5646. }
  5647. /* harmony default export */ __webpack_exports__["default"] = ({
  5648. enable: enable,
  5649. disable: disable
  5650. });
  5651. /***/ }),
  5652. /***/ "./eventListeners/windowResizeHandler.js":
  5653. /*!***********************************************!*\
  5654. !*** ./eventListeners/windowResizeHandler.js ***!
  5655. \***********************************************/
  5656. /*! exports provided: forceEnabledElementResize, default */
  5657. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  5658. "use strict";
  5659. __webpack_require__.r(__webpack_exports__);
  5660. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "forceEnabledElementResize", function() { return forceEnabledElementResize; });
  5661. /* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../store/index.js */ "./store/index.js");
  5662. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js");
  5663. var enable = function enable() {
  5664. disable(); // Clean up any lingering listeners
  5665. window.addEventListener('resize', resizeThrottler, false);
  5666. };
  5667. var disable = function disable() {
  5668. window.removeEventListener('resize', resizeThrottler, false);
  5669. };
  5670. var resizeTimeout;
  5671. function resizeThrottler() {
  5672. // Ignore resize events as long as an actualResizeHandler execution is in the queue
  5673. if (!resizeTimeout) {
  5674. resizeTimeout = setTimeout(function () {
  5675. resizeTimeout = null;
  5676. forceEnabledElementResize(); // The actualResizeHandler will execute at a rate of 15fps
  5677. }, 66);
  5678. }
  5679. }
  5680. var forceEnabledElementResize = function forceEnabledElementResize() {
  5681. _store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].enabledElements.forEach(function (element) {
  5682. _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.resize(element);
  5683. });
  5684. };
  5685. /* harmony default export */ __webpack_exports__["default"] = ({
  5686. enable: enable,
  5687. disable: disable
  5688. });
  5689. /***/ }),
  5690. /***/ "./events.js":
  5691. /*!*******************!*\
  5692. !*** ./events.js ***!
  5693. \*******************/
  5694. /*! exports provided: default */
  5695. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  5696. "use strict";
  5697. __webpack_require__.r(__webpack_exports__);
  5698. /**
  5699. * Enumerates the events for CornestoneTools. Native events are captured,
  5700. * normalized, and re-triggered with a `cornerstonetools` prefix. This allows
  5701. * us to handle events consistently across different browsers.
  5702. *
  5703. * @enum {String}
  5704. * @memberof CornerstoneTools
  5705. * @readonly
  5706. */
  5707. var EVENTS = {
  5708. //
  5709. // MOUSE
  5710. //
  5711. /**
  5712. * https://developer.mozilla.org/en-US/docs/Web/Events/mousedown
  5713. * @type {String}
  5714. */
  5715. MOUSE_DOWN: 'cornerstonetoolsmousedown',
  5716. /**
  5717. * https://developer.mozilla.org/en-US/docs/Web/Events/mouseup
  5718. * @type {String}
  5719. */
  5720. MOUSE_UP: 'cornerstonetoolsmouseup',
  5721. /**
  5722. * Is fired if a handled `MOUSE_DOWN` event does not `stopPropagation`. The hook
  5723. * we use to create new measurement data for mouse events.
  5724. * @type {String}
  5725. */
  5726. MOUSE_DOWN_ACTIVATE: 'cornerstonetoolsmousedownactivate',
  5727. /**
  5728. * https://developer.mozilla.org/en-US/docs/Web/Events/drag
  5729. * @type {String}
  5730. */
  5731. MOUSE_DRAG: 'cornerstonetoolsmousedrag',
  5732. /**
  5733. * https://developer.mozilla.org/en-US/docs/Web/Events/mousemove
  5734. * @type {String}
  5735. */
  5736. MOUSE_MOVE: 'cornerstonetoolsmousemove',
  5737. /**
  5738. * https://developer.mozilla.org/en-US/docs/Web/Events/click
  5739. * @type {String}
  5740. */
  5741. MOUSE_CLICK: 'cornerstonetoolsmouseclick',
  5742. /**
  5743. * https://developer.mozilla.org/en-US/docs/Web/Events/dblclick
  5744. * @type {String}
  5745. */
  5746. MOUSE_DOUBLE_CLICK: 'cornerstonetoolsmousedoubleclick',
  5747. /**
  5748. * https://developer.mozilla.org/en-US/docs/Web/Events/wheel
  5749. * @type {String}
  5750. */
  5751. MOUSE_WHEEL: 'cornerstonetoolsmousewheel',
  5752. //
  5753. // TOUCH
  5754. //
  5755. /**
  5756. * https://developer.mozilla.org/en-US/docs/Web/Events/touchstart
  5757. * @type {String}
  5758. */
  5759. TOUCH_START: 'cornerstonetoolstouchstart',
  5760. /**
  5761. * Is fired if a handled `TOUCH_START` event does not `stopPropagation`. The hook
  5762. * we use to create new measurement data for touch events.
  5763. * @type {String}
  5764. */
  5765. TOUCH_START_ACTIVE: 'cornerstonetoolstouchstartactive',
  5766. /**
  5767. * @type {String}
  5768. */
  5769. TOUCH_END: 'cornerstonetoolstouchend',
  5770. /**
  5771. * @type {String}
  5772. */
  5773. TOUCH_DRAG: 'cornerstonetoolstouchdrag',
  5774. /**
  5775. * @type {String}
  5776. */
  5777. TOUCH_DRAG_END: 'cornerstonetoolstouchdragend',
  5778. /**
  5779. * http://hammerjs.github.io/recognizer-pinch/
  5780. * @type {String}
  5781. */
  5782. TOUCH_PINCH: 'cornerstonetoolstouchpinch',
  5783. /**
  5784. * http://hammerjs.github.io/recognizer-rotate/
  5785. * @type {String}
  5786. */
  5787. TOUCH_ROTATE: 'cornerstonetoolstouchrotate',
  5788. /**
  5789. * http://hammerjs.github.io/recognizer-press/
  5790. * @type {String}
  5791. */
  5792. TOUCH_PRESS: 'cornerstonetoolstouchpress',
  5793. /**
  5794. * http://hammerjs.github.io/recognizer-tap/
  5795. * @type {String}
  5796. */
  5797. TAP: 'cornerstonetoolstap',
  5798. /**
  5799. * @type {String}
  5800. */
  5801. DOUBLE_TAP: 'cornerstonetoolsdoubletap',
  5802. /**
  5803. * @type {String}
  5804. */
  5805. MULTI_TOUCH_START: 'cornerstonetoolsmultitouchstart',
  5806. /**
  5807. * @type {String}
  5808. */
  5809. MULTI_TOUCH_START_ACTIVE: 'cornerstonetoolsmultitouchstartactive',
  5810. /**
  5811. * @type {String}
  5812. */
  5813. MULTI_TOUCH_DRAG: 'cornerstonetoolsmultitouchdrag',
  5814. //
  5815. // KEYBOARD
  5816. //
  5817. /**
  5818. * https://developer.mozilla.org/en-US/docs/Web/Events/keydown
  5819. * @type {String}
  5820. */
  5821. KEY_DOWN: 'cornerstonetoolskeydown',
  5822. /**
  5823. * https://developer.mozilla.org/en-US/docs/Web/Events/keyup
  5824. * @type {String}
  5825. */
  5826. KEY_UP: 'cornerstonetoolskeyup',
  5827. /**
  5828. * https://developer.mozilla.org/en-US/docs/Web/Events/keypress
  5829. * @type {String}
  5830. */
  5831. KEY_PRESS: 'cornerstonetoolskeypress',
  5832. //
  5833. // CUSTOM
  5834. //
  5835. /**
  5836. * @type {String}
  5837. */
  5838. MEASUREMENT_ADDED: 'cornerstonetoolsmeasurementadded',
  5839. /**
  5840. * @type {String}
  5841. */
  5842. MEASUREMENT_MODIFIED: 'cornerstonetoolsmeasurementmodified',
  5843. /**
  5844. * @type {String}
  5845. */
  5846. MEASUREMENT_COMPLETED: 'cornerstonetoolsmeasurementcompleted',
  5847. /**
  5848. * @type {String}
  5849. */
  5850. MEASUREMENT_REMOVED: 'cornerstonetoolsmeasurementremoved',
  5851. /**
  5852. * @type {String}
  5853. */
  5854. TOOL_DEACTIVATED: 'cornerstonetoolstooldeactivated',
  5855. /**
  5856. * @type {String}
  5857. */
  5858. CLIP_STOPPED: 'cornerstonetoolsclipstopped',
  5859. /**
  5860. * @type {String}
  5861. */
  5862. STACK_SCROLL: 'cornerstonetoolsstackscroll',
  5863. /**
  5864. * @type {String}
  5865. */
  5866. STACK_PREFETCH_IMAGE_LOADED: 'cornerstonetoolsstackprefetchimageloaded',
  5867. /**
  5868. * @type {String}
  5869. */
  5870. STACK_PREFETCH_DONE: 'cornerstonetoolsstackprefetchdone',
  5871. /**
  5872. * @type {String}
  5873. */
  5874. LABELMAP_MODIFIED: 'cornersontetoolslabelmapmodified'
  5875. };
  5876. /* harmony default export */ __webpack_exports__["default"] = (EVENTS);
  5877. /***/ }),
  5878. /***/ "./externalModules.js":
  5879. /*!****************************!*\
  5880. !*** ./externalModules.js ***!
  5881. \****************************/
  5882. /*! exports provided: default */
  5883. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  5884. "use strict";
  5885. __webpack_require__.r(__webpack_exports__);
  5886. var cornerstone = window.cornerstone;
  5887. var cornerstoneMath = window.cornerstoneMath;
  5888. var Hammer = window.Hammer;
  5889. /* harmony default export */ __webpack_exports__["default"] = ({
  5890. set cornerstone(cs) {
  5891. cornerstone = cs;
  5892. },
  5893. get cornerstone() {
  5894. return cornerstone;
  5895. },
  5896. set cornerstoneMath(cm) {
  5897. cornerstoneMath = cm;
  5898. },
  5899. get cornerstoneMath() {
  5900. return cornerstoneMath;
  5901. },
  5902. set Hammer(module) {
  5903. Hammer = module;
  5904. },
  5905. get Hammer() {
  5906. return Hammer;
  5907. }
  5908. });
  5909. /***/ }),
  5910. /***/ "./importInternal.js":
  5911. /*!***************************!*\
  5912. !*** ./importInternal.js ***!
  5913. \***************************/
  5914. /*! exports provided: default */
  5915. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  5916. "use strict";
  5917. __webpack_require__.r(__webpack_exports__);
  5918. /* harmony import */ var _lib_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./lib.js */ "./lib.js");
  5919. /**
  5920. * Imports functionality from cornerstoneTools for use in external packages/plugins.
  5921. * @param {string} uri the import path for the entity to import.
  5922. * @returns {Class|Object|Function} The entity requested.
  5923. */
  5924. /* harmony default export */ __webpack_exports__["default"] = (function (uri) {
  5925. return _lib_js__WEBPACK_IMPORTED_MODULE_0__["lib"][uri];
  5926. });
  5927. /***/ }),
  5928. /***/ "./index.js":
  5929. /*!******************!*\
  5930. !*** ./index.js ***!
  5931. \******************/
  5932. /*! exports provided: AngleTool, ArrowAnnotateTool, BidirectionalTool, CircleRoiTool, CobbAngleTool, EllipticalRoiTool, FreehandRoiTool, LengthTool, ProbeTool, RectangleRoiTool, TextMarkerTool, BrushTool, SphericalBrushTool, RectangleScissorsTool, FreehandScissorsTool, CircleScissorsTool, CorrectionScissorsTool, CrosshairsTool, DoubleTapFitToWindowTool, DragProbeTool, EraserTool, FreehandRoiSculptorTool, MagnifyTool, OverlayTool, OrientationMarkersTool, PanMultiTouchTool, PanTool, ReferenceLinesTool, RotateTool, RotateTouchTool, ScaleOverlayTool, StackScrollMouseWheelTool, StackScrollMultiTouchTool, StackScrollTool, WwwcRegionTool, WwwcTool, ZoomMouseWheelTool, ZoomTool, ZoomTouchPinchTool, init, stackPrefetch, stackRenderers, playClip, stopClip, store, getModule, getToolForElement, addTool, addToolForElement, removeTool, removeToolForElement, setToolOptions, setToolOptionsForElement, isToolActiveForElement, setToolActive, setToolActiveForElement, setToolEnabled, setToolEnabledForElement, setToolDisabled, setToolDisabledForElement, setToolPassive, setToolPassiveForElement, addToolState, getToolState, removeToolState, clearToolState, setElementToolStateManager, getElementToolStateManager, textStyle, toolStyle, toolColors, toolCoordinates, stackSpecificStateManager, newStackSpecificToolStateManager, addStackStateManager, loadHandlerManager, newImageIdSpecificToolStateManager, globalImageIdSpecificToolStateManager, newFrameOfReferenceSpecificToolStateManager, globalFrameOfReferenceSpecificToolStateManager, forceEnabledElementResize, orientation, SaveAs, enableLogger, disableLogger, register, registerSome, wwwcSynchronizer, updateImageSynchronizer, Synchronizer, stackScrollSynchronizer, stackImagePositionSynchronizer, stackImagePositionOffsetSynchronizer, stackImageIndexSynchronizer, panZoomSynchronizer, importInternal, external, EVENTS, version, import, default */
  5933. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  5934. "use strict";
  5935. __webpack_require__.r(__webpack_exports__);
  5936. /* harmony import */ var _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./tools/annotation/index.js */ "./tools/annotation/index.js");
  5937. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "AngleTool", function() { return _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["AngleTool"]; });
  5938. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ArrowAnnotateTool", function() { return _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["ArrowAnnotateTool"]; });
  5939. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BidirectionalTool", function() { return _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["BidirectionalTool"]; });
  5940. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "CircleRoiTool", function() { return _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["CircleRoiTool"]; });
  5941. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "CobbAngleTool", function() { return _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["CobbAngleTool"]; });
  5942. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "EllipticalRoiTool", function() { return _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["EllipticalRoiTool"]; });
  5943. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FreehandRoiTool", function() { return _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["FreehandRoiTool"]; });
  5944. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "LengthTool", function() { return _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["LengthTool"]; });
  5945. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ProbeTool", function() { return _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["ProbeTool"]; });
  5946. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "RectangleRoiTool", function() { return _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["RectangleRoiTool"]; });
  5947. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TextMarkerTool", function() { return _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["TextMarkerTool"]; });
  5948. /* harmony import */ var _tools_segmentation_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tools/segmentation/index.js */ "./tools/segmentation/index.js");
  5949. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BrushTool", function() { return _tools_segmentation_index_js__WEBPACK_IMPORTED_MODULE_1__["BrushTool"]; });
  5950. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SphericalBrushTool", function() { return _tools_segmentation_index_js__WEBPACK_IMPORTED_MODULE_1__["SphericalBrushTool"]; });
  5951. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "RectangleScissorsTool", function() { return _tools_segmentation_index_js__WEBPACK_IMPORTED_MODULE_1__["RectangleScissorsTool"]; });
  5952. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FreehandScissorsTool", function() { return _tools_segmentation_index_js__WEBPACK_IMPORTED_MODULE_1__["FreehandScissorsTool"]; });
  5953. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "CircleScissorsTool", function() { return _tools_segmentation_index_js__WEBPACK_IMPORTED_MODULE_1__["CircleScissorsTool"]; });
  5954. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "CorrectionScissorsTool", function() { return _tools_segmentation_index_js__WEBPACK_IMPORTED_MODULE_1__["CorrectionScissorsTool"]; });
  5955. /* harmony import */ var _tools_index_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/index.js */ "./tools/index.js");
  5956. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "CrosshairsTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["CrosshairsTool"]; });
  5957. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "DoubleTapFitToWindowTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["DoubleTapFitToWindowTool"]; });
  5958. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "DragProbeTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["DragProbeTool"]; });
  5959. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "EraserTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["EraserTool"]; });
  5960. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FreehandRoiSculptorTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["FreehandRoiSculptorTool"]; });
  5961. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "MagnifyTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["MagnifyTool"]; });
  5962. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "OverlayTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["OverlayTool"]; });
  5963. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "OrientationMarkersTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["OrientationMarkersTool"]; });
  5964. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "PanMultiTouchTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["PanMultiTouchTool"]; });
  5965. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "PanTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["PanTool"]; });
  5966. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ReferenceLinesTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["ReferenceLinesTool"]; });
  5967. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "RotateTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["RotateTool"]; });
  5968. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "RotateTouchTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["RotateTouchTool"]; });
  5969. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ScaleOverlayTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["ScaleOverlayTool"]; });
  5970. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "StackScrollMouseWheelTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["StackScrollMouseWheelTool"]; });
  5971. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "StackScrollMultiTouchTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["StackScrollMultiTouchTool"]; });
  5972. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "StackScrollTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["StackScrollTool"]; });
  5973. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "WwwcRegionTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["WwwcRegionTool"]; });
  5974. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "WwwcTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["WwwcTool"]; });
  5975. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ZoomMouseWheelTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["ZoomMouseWheelTool"]; });
  5976. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ZoomTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["ZoomTool"]; });
  5977. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ZoomTouchPinchTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["ZoomTouchPinchTool"]; });
  5978. /* harmony import */ var _init_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./init.js */ "./init.js");
  5979. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "init", function() { return _init_js__WEBPACK_IMPORTED_MODULE_3__["default"]; });
  5980. /* harmony import */ var _stackTools_stackPrefetch_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./stackTools/stackPrefetch.js */ "./stackTools/stackPrefetch.js");
  5981. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackPrefetch", function() { return _stackTools_stackPrefetch_js__WEBPACK_IMPORTED_MODULE_4__["default"]; });
  5982. /* harmony import */ var _stackTools_stackRenderers_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./stackTools/stackRenderers.js */ "./stackTools/stackRenderers.js");
  5983. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackRenderers", function() { return _stackTools_stackRenderers_js__WEBPACK_IMPORTED_MODULE_5__["default"]; });
  5984. /* harmony import */ var _stackTools_playClip_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./stackTools/playClip.js */ "./stackTools/playClip.js");
  5985. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "playClip", function() { return _stackTools_playClip_js__WEBPACK_IMPORTED_MODULE_6__["playClip"]; });
  5986. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stopClip", function() { return _stackTools_playClip_js__WEBPACK_IMPORTED_MODULE_6__["stopClip"]; });
  5987. /* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./store/index.js */ "./store/index.js");
  5988. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "store", function() { return _store_index_js__WEBPACK_IMPORTED_MODULE_7__["default"]; });
  5989. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getModule", function() { return _store_index_js__WEBPACK_IMPORTED_MODULE_7__["getModule"]; });
  5990. /* harmony import */ var _store_getToolForElement_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./store/getToolForElement.js */ "./store/getToolForElement.js");
  5991. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getToolForElement", function() { return _store_getToolForElement_js__WEBPACK_IMPORTED_MODULE_8__["default"]; });
  5992. /* harmony import */ var _store_addTool_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./store/addTool.js */ "./store/addTool.js");
  5993. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addTool", function() { return _store_addTool_js__WEBPACK_IMPORTED_MODULE_9__["addTool"]; });
  5994. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addToolForElement", function() { return _store_addTool_js__WEBPACK_IMPORTED_MODULE_9__["addToolForElement"]; });
  5995. /* harmony import */ var _store_removeTool_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./store/removeTool.js */ "./store/removeTool.js");
  5996. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "removeTool", function() { return _store_removeTool_js__WEBPACK_IMPORTED_MODULE_10__["removeTool"]; });
  5997. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "removeToolForElement", function() { return _store_removeTool_js__WEBPACK_IMPORTED_MODULE_10__["removeToolForElement"]; });
  5998. /* harmony import */ var _store_setToolOptions_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./store/setToolOptions.js */ "./store/setToolOptions.js");
  5999. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setToolOptions", function() { return _store_setToolOptions_js__WEBPACK_IMPORTED_MODULE_11__["setToolOptions"]; });
  6000. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setToolOptionsForElement", function() { return _store_setToolOptions_js__WEBPACK_IMPORTED_MODULE_11__["setToolOptionsForElement"]; });
  6001. /* harmony import */ var _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./store/setToolMode.js */ "./store/setToolMode.js");
  6002. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setToolActive", function() { return _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_12__["setToolActive"]; });
  6003. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setToolActiveForElement", function() { return _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_12__["setToolActiveForElement"]; });
  6004. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setToolEnabled", function() { return _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_12__["setToolEnabled"]; });
  6005. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setToolEnabledForElement", function() { return _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_12__["setToolEnabledForElement"]; });
  6006. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setToolDisabled", function() { return _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_12__["setToolDisabled"]; });
  6007. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setToolDisabledForElement", function() { return _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_12__["setToolDisabledForElement"]; });
  6008. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setToolPassive", function() { return _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_12__["setToolPassive"]; });
  6009. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setToolPassiveForElement", function() { return _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_12__["setToolPassiveForElement"]; });
  6010. /* harmony import */ var _store_isToolActiveForElement__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./store/isToolActiveForElement */ "./store/isToolActiveForElement.js");
  6011. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isToolActiveForElement", function() { return _store_isToolActiveForElement__WEBPACK_IMPORTED_MODULE_13__["default"]; });
  6012. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./stateManagement/toolState.js */ "./stateManagement/toolState.js");
  6013. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addToolState", function() { return _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_14__["addToolState"]; });
  6014. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getToolState", function() { return _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_14__["getToolState"]; });
  6015. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "removeToolState", function() { return _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_14__["removeToolState"]; });
  6016. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "clearToolState", function() { return _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_14__["clearToolState"]; });
  6017. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setElementToolStateManager", function() { return _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_14__["setElementToolStateManager"]; });
  6018. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getElementToolStateManager", function() { return _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_14__["getElementToolStateManager"]; });
  6019. /* harmony import */ var _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./stateManagement/textStyle.js */ "./stateManagement/textStyle.js");
  6020. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "textStyle", function() { return _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_15__["default"]; });
  6021. /* harmony import */ var _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./stateManagement/toolStyle.js */ "./stateManagement/toolStyle.js");
  6022. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "toolStyle", function() { return _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_16__["default"]; });
  6023. /* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./stateManagement/toolColors.js */ "./stateManagement/toolColors.js");
  6024. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "toolColors", function() { return _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_17__["default"]; });
  6025. /* harmony import */ var _stateManagement_toolCoordinates_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./stateManagement/toolCoordinates.js */ "./stateManagement/toolCoordinates.js");
  6026. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "toolCoordinates", function() { return _stateManagement_toolCoordinates_js__WEBPACK_IMPORTED_MODULE_18__["default"]; });
  6027. /* harmony import */ var _stateManagement_stackSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./stateManagement/stackSpecificStateManager.js */ "./stateManagement/stackSpecificStateManager.js");
  6028. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackSpecificStateManager", function() { return _stateManagement_stackSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_19__["stackSpecificStateManager"]; });
  6029. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "newStackSpecificToolStateManager", function() { return _stateManagement_stackSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_19__["newStackSpecificToolStateManager"]; });
  6030. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addStackStateManager", function() { return _stateManagement_stackSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_19__["addStackStateManager"]; });
  6031. /* harmony import */ var _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./stateManagement/loadHandlerManager.js */ "./stateManagement/loadHandlerManager.js");
  6032. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "loadHandlerManager", function() { return _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_20__["default"]; });
  6033. /* harmony import */ var _stateManagement_imageIdSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./stateManagement/imageIdSpecificStateManager.js */ "./stateManagement/imageIdSpecificStateManager.js");
  6034. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "newImageIdSpecificToolStateManager", function() { return _stateManagement_imageIdSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_21__["newImageIdSpecificToolStateManager"]; });
  6035. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "globalImageIdSpecificToolStateManager", function() { return _stateManagement_imageIdSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_21__["globalImageIdSpecificToolStateManager"]; });
  6036. /* harmony import */ var _stateManagement_frameOfReferenceStateManager_js__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./stateManagement/frameOfReferenceStateManager.js */ "./stateManagement/frameOfReferenceStateManager.js");
  6037. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "newFrameOfReferenceSpecificToolStateManager", function() { return _stateManagement_frameOfReferenceStateManager_js__WEBPACK_IMPORTED_MODULE_22__["newFrameOfReferenceSpecificToolStateManager"]; });
  6038. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "globalFrameOfReferenceSpecificToolStateManager", function() { return _stateManagement_frameOfReferenceStateManager_js__WEBPACK_IMPORTED_MODULE_22__["globalFrameOfReferenceSpecificToolStateManager"]; });
  6039. /* harmony import */ var _eventListeners_windowResizeHandler_js__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./eventListeners/windowResizeHandler.js */ "./eventListeners/windowResizeHandler.js");
  6040. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "forceEnabledElementResize", function() { return _eventListeners_windowResizeHandler_js__WEBPACK_IMPORTED_MODULE_23__["forceEnabledElementResize"]; });
  6041. /* harmony import */ var _orientation_index_js__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./orientation/index.js */ "./orientation/index.js");
  6042. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "orientation", function() { return _orientation_index_js__WEBPACK_IMPORTED_MODULE_24__["default"]; });
  6043. /* harmony import */ var _util_SaveAs_js__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./util/SaveAs.js */ "./util/SaveAs.js");
  6044. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SaveAs", function() { return _util_SaveAs_js__WEBPACK_IMPORTED_MODULE_25__["default"]; });
  6045. /* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./util/logger.js */ "./util/logger.js");
  6046. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "enableLogger", function() { return _util_logger_js__WEBPACK_IMPORTED_MODULE_26__["enable"]; });
  6047. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "disableLogger", function() { return _util_logger_js__WEBPACK_IMPORTED_MODULE_26__["disable"]; });
  6048. /* harmony import */ var _thirdParty_register_js__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./thirdParty/register.js */ "./thirdParty/register.js");
  6049. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "register", function() { return _thirdParty_register_js__WEBPACK_IMPORTED_MODULE_27__["default"]; });
  6050. /* harmony import */ var _thirdParty_registerSome_js__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./thirdParty/registerSome.js */ "./thirdParty/registerSome.js");
  6051. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "registerSome", function() { return _thirdParty_registerSome_js__WEBPACK_IMPORTED_MODULE_28__["default"]; });
  6052. /* harmony import */ var _synchronization_wwwcSynchronizer_js__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./synchronization/wwwcSynchronizer.js */ "./synchronization/wwwcSynchronizer.js");
  6053. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "wwwcSynchronizer", function() { return _synchronization_wwwcSynchronizer_js__WEBPACK_IMPORTED_MODULE_29__["default"]; });
  6054. /* harmony import */ var _synchronization_updateImageSynchronizer_js__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./synchronization/updateImageSynchronizer.js */ "./synchronization/updateImageSynchronizer.js");
  6055. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "updateImageSynchronizer", function() { return _synchronization_updateImageSynchronizer_js__WEBPACK_IMPORTED_MODULE_30__["default"]; });
  6056. /* harmony import */ var _synchronization_Synchronizer_js__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./synchronization/Synchronizer.js */ "./synchronization/Synchronizer.js");
  6057. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Synchronizer", function() { return _synchronization_Synchronizer_js__WEBPACK_IMPORTED_MODULE_31__["default"]; });
  6058. /* harmony import */ var _synchronization_stackScrollSynchronizer_js__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./synchronization/stackScrollSynchronizer.js */ "./synchronization/stackScrollSynchronizer.js");
  6059. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackScrollSynchronizer", function() { return _synchronization_stackScrollSynchronizer_js__WEBPACK_IMPORTED_MODULE_32__["default"]; });
  6060. /* harmony import */ var _synchronization_stackImagePositionSynchronizer_js__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./synchronization/stackImagePositionSynchronizer.js */ "./synchronization/stackImagePositionSynchronizer.js");
  6061. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackImagePositionSynchronizer", function() { return _synchronization_stackImagePositionSynchronizer_js__WEBPACK_IMPORTED_MODULE_33__["default"]; });
  6062. /* harmony import */ var _synchronization_stackImagePositionOffsetSynchronizer_js__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./synchronization/stackImagePositionOffsetSynchronizer.js */ "./synchronization/stackImagePositionOffsetSynchronizer.js");
  6063. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackImagePositionOffsetSynchronizer", function() { return _synchronization_stackImagePositionOffsetSynchronizer_js__WEBPACK_IMPORTED_MODULE_34__["default"]; });
  6064. /* harmony import */ var _synchronization_stackImageIndexSynchronizer_js__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./synchronization/stackImageIndexSynchronizer.js */ "./synchronization/stackImageIndexSynchronizer.js");
  6065. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackImageIndexSynchronizer", function() { return _synchronization_stackImageIndexSynchronizer_js__WEBPACK_IMPORTED_MODULE_35__["default"]; });
  6066. /* harmony import */ var _synchronization_panZoomSynchronizer_js__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./synchronization/panZoomSynchronizer.js */ "./synchronization/panZoomSynchronizer.js");
  6067. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "panZoomSynchronizer", function() { return _synchronization_panZoomSynchronizer_js__WEBPACK_IMPORTED_MODULE_36__["default"]; });
  6068. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./externalModules.js */ "./externalModules.js");
  6069. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "external", function() { return _externalModules_js__WEBPACK_IMPORTED_MODULE_37__["default"]; });
  6070. /* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./events.js */ "./events.js");
  6071. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "EVENTS", function() { return _events_js__WEBPACK_IMPORTED_MODULE_38__["default"]; });
  6072. /* harmony import */ var _version_js__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./version.js */ "./version.js");
  6073. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "version", function() { return _version_js__WEBPACK_IMPORTED_MODULE_39__["default"]; });
  6074. /* harmony import */ var _importInternal_js__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./importInternal.js */ "./importInternal.js");
  6075. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "importInternal", function() { return _importInternal_js__WEBPACK_IMPORTED_MODULE_40__["default"]; });
  6076. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "import", function() { return _importInternal_js__WEBPACK_IMPORTED_MODULE_40__["default"]; });
  6077. /**
  6078. * Root
  6079. * @namespace CornerstoneTools
  6080. */
  6081. /**
  6082. * Drawing API to assist in consistent annotation creation
  6083. * @namespace Drawing
  6084. */
  6085. /**
  6086. * Event dispatchers listen for events from `cornerstone` and `enabledElements`. Dispatchers
  6087. * choose which tool(s) get to handle the event by looking at callbacks, priority, and other factors.
  6088. * @private
  6089. * @namespace EventDispatchers
  6090. */
  6091. /**
  6092. * Event listeners normalize events emitted by `cornerstone` and `enabledElements`. The listeners
  6093. * then re-emit events prefixed with `cornerstonetools`. For example, `mousemove` becomes `cornerstonetoolsmousemove`.
  6094. * Most of these events are caught by an `eventDispatcher`, and used to shape tool behavior.
  6095. * @private
  6096. * @namespace EventListeners
  6097. */
  6098. /**
  6099. * Manipulators describe a tool's `handle` behavior. Leveraging a small set of manipulators
  6100. * allows us to create a consistent experience when interacting with tools via their handles.
  6101. * @namespace Manipulators
  6102. */
  6103. /**
  6104. * Mixins are "tool beahviors" that can be added to a tool via its mixin
  6105. * array configuration property
  6106. * @namespace Mixins
  6107. */
  6108. /**
  6109. * StateManagement
  6110. * @namespace StateManagement
  6111. */
  6112. /**
  6113. * Sync
  6114. * @namespace Synchronization
  6115. */
  6116. /**
  6117. * Third party
  6118. * @namespace ThirdParty
  6119. */
  6120. /**
  6121. * Tools
  6122. * @namespace Tools
  6123. */
  6124. /**
  6125. * Tools that extend the {@link #Tools.Base.BaseAnnotationTool|`BaseAnnotationTool`}
  6126. * @namespace Tools.Annotation
  6127. */
  6128. /**
  6129. * The parent (abstract) classes that all tools derive from.
  6130. * @namespace Tools.Base
  6131. */
  6132. /**
  6133. * Tools that extend the {@link #Tools.Base.BaseBrushTool|`BaseBrushTool`}
  6134. * @namespace Tools.Brush
  6135. */
  6136. /**
  6137. * Util
  6138. * @namespace Util
  6139. */
  6140. // ~~~~~~ STACK TOOLS ~~~~~ //
  6141. // ~~~~~~ STATE MANAGEMENT ~~~~~ //
  6142. // ~~~~~~ ORIENTATION ~~~~~ //
  6143. // ~~~~~~ CANVAS EXPORT ~~~~~ //
  6144. // ~~~~~~ THIRD PARTY SUPPORT ~~~~~ //
  6145. // ~~~~~~ SYNCHRONIZERS ~~~~~ //
  6146. // ~~~~~~ REQUEST POOL MANAGER ~~~~~ //
  6147. var cornerstoneTools = {
  6148. // ~~~ TOOLS
  6149. // ~ Annotation Tools
  6150. AngleTool: _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["AngleTool"],
  6151. ArrowAnnotateTool: _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["ArrowAnnotateTool"],
  6152. BidirectionalTool: _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["BidirectionalTool"],
  6153. CircleRoiTool: _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["CircleRoiTool"],
  6154. CobbAngleTool: _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["CobbAngleTool"],
  6155. EllipticalRoiTool: _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["EllipticalRoiTool"],
  6156. FreehandRoiTool: _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["FreehandRoiTool"],
  6157. LengthTool: _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["LengthTool"],
  6158. ProbeTool: _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["ProbeTool"],
  6159. RectangleRoiTool: _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["RectangleRoiTool"],
  6160. TextMarkerTool: _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["TextMarkerTool"],
  6161. // ~ Segmentation Tools
  6162. BrushTool: _tools_segmentation_index_js__WEBPACK_IMPORTED_MODULE_1__["BrushTool"],
  6163. SphericalBrushTool: _tools_segmentation_index_js__WEBPACK_IMPORTED_MODULE_1__["SphericalBrushTool"],
  6164. RectangleScissorsTool: _tools_segmentation_index_js__WEBPACK_IMPORTED_MODULE_1__["RectangleScissorsTool"],
  6165. FreehandScissorsTool: _tools_segmentation_index_js__WEBPACK_IMPORTED_MODULE_1__["FreehandScissorsTool"],
  6166. CircleScissorsTool: _tools_segmentation_index_js__WEBPACK_IMPORTED_MODULE_1__["CircleScissorsTool"],
  6167. CorrectionScissorsTool: _tools_segmentation_index_js__WEBPACK_IMPORTED_MODULE_1__["CorrectionScissorsTool"],
  6168. // ~ Tools
  6169. CrosshairsTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["CrosshairsTool"],
  6170. DoubleTapFitToWindowTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["DoubleTapFitToWindowTool"],
  6171. DragProbeTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["DragProbeTool"],
  6172. EraserTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["EraserTool"],
  6173. FreehandRoiSculptorTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["FreehandRoiSculptorTool"],
  6174. MagnifyTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["MagnifyTool"],
  6175. OverlayTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["OverlayTool"],
  6176. OrientationMarkersTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["OrientationMarkersTool"],
  6177. PanMultiTouchTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["PanMultiTouchTool"],
  6178. PanTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["PanTool"],
  6179. ReferenceLinesTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["ReferenceLinesTool"],
  6180. RotateTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["RotateTool"],
  6181. RotateTouchTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["RotateTouchTool"],
  6182. ScaleOverlayTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["ScaleOverlayTool"],
  6183. StackScrollMouseWheelTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["StackScrollMouseWheelTool"],
  6184. StackScrollMultiTouchTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["StackScrollMultiTouchTool"],
  6185. StackScrollTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["StackScrollTool"],
  6186. WwwcRegionTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["WwwcRegionTool"],
  6187. WwwcTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["WwwcTool"],
  6188. ZoomMouseWheelTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["ZoomMouseWheelTool"],
  6189. ZoomTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["ZoomTool"],
  6190. ZoomTouchPinchTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["ZoomTouchPinchTool"],
  6191. init: _init_js__WEBPACK_IMPORTED_MODULE_3__["default"],
  6192. stackPrefetch: _stackTools_stackPrefetch_js__WEBPACK_IMPORTED_MODULE_4__["default"],
  6193. stackRenderers: _stackTools_stackRenderers_js__WEBPACK_IMPORTED_MODULE_5__["default"],
  6194. playClip: _stackTools_playClip_js__WEBPACK_IMPORTED_MODULE_6__["playClip"],
  6195. stopClip: _stackTools_playClip_js__WEBPACK_IMPORTED_MODULE_6__["stopClip"],
  6196. store: _store_index_js__WEBPACK_IMPORTED_MODULE_7__["default"],
  6197. getModule: _store_index_js__WEBPACK_IMPORTED_MODULE_7__["getModule"],
  6198. getToolForElement: _store_getToolForElement_js__WEBPACK_IMPORTED_MODULE_8__["default"],
  6199. addTool: _store_addTool_js__WEBPACK_IMPORTED_MODULE_9__["addTool"],
  6200. addToolForElement: _store_addTool_js__WEBPACK_IMPORTED_MODULE_9__["addToolForElement"],
  6201. removeTool: _store_removeTool_js__WEBPACK_IMPORTED_MODULE_10__["removeTool"],
  6202. removeToolForElement: _store_removeTool_js__WEBPACK_IMPORTED_MODULE_10__["removeToolForElement"],
  6203. setToolOptions: _store_setToolOptions_js__WEBPACK_IMPORTED_MODULE_11__["setToolOptions"],
  6204. setToolOptionsForElement: _store_setToolOptions_js__WEBPACK_IMPORTED_MODULE_11__["setToolOptionsForElement"],
  6205. isToolActiveForElement: _store_isToolActiveForElement__WEBPACK_IMPORTED_MODULE_13__["default"],
  6206. setToolActive: _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_12__["setToolActive"],
  6207. setToolActiveForElement: _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_12__["setToolActiveForElement"],
  6208. setToolEnabled: _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_12__["setToolEnabled"],
  6209. setToolEnabledForElement: _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_12__["setToolEnabledForElement"],
  6210. setToolDisabled: _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_12__["setToolDisabled"],
  6211. setToolDisabledForElement: _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_12__["setToolDisabledForElement"],
  6212. setToolPassive: _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_12__["setToolPassive"],
  6213. setToolPassiveForElement: _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_12__["setToolPassiveForElement"],
  6214. addToolState: _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_14__["addToolState"],
  6215. getToolState: _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_14__["getToolState"],
  6216. removeToolState: _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_14__["removeToolState"],
  6217. clearToolState: _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_14__["clearToolState"],
  6218. setElementToolStateManager: _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_14__["setElementToolStateManager"],
  6219. getElementToolStateManager: _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_14__["getElementToolStateManager"],
  6220. textStyle: _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_15__["default"],
  6221. toolStyle: _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_16__["default"],
  6222. toolColors: _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_17__["default"],
  6223. toolCoordinates: _stateManagement_toolCoordinates_js__WEBPACK_IMPORTED_MODULE_18__["default"],
  6224. stackSpecificStateManager: _stateManagement_stackSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_19__["stackSpecificStateManager"],
  6225. newStackSpecificToolStateManager: _stateManagement_stackSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_19__["newStackSpecificToolStateManager"],
  6226. addStackStateManager: _stateManagement_stackSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_19__["addStackStateManager"],
  6227. loadHandlerManager: _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_20__["default"],
  6228. newImageIdSpecificToolStateManager: _stateManagement_imageIdSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_21__["newImageIdSpecificToolStateManager"],
  6229. globalImageIdSpecificToolStateManager: _stateManagement_imageIdSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_21__["globalImageIdSpecificToolStateManager"],
  6230. newFrameOfReferenceSpecificToolStateManager: _stateManagement_frameOfReferenceStateManager_js__WEBPACK_IMPORTED_MODULE_22__["newFrameOfReferenceSpecificToolStateManager"],
  6231. globalFrameOfReferenceSpecificToolStateManager: _stateManagement_frameOfReferenceStateManager_js__WEBPACK_IMPORTED_MODULE_22__["globalFrameOfReferenceSpecificToolStateManager"],
  6232. forceEnabledElementResize: _eventListeners_windowResizeHandler_js__WEBPACK_IMPORTED_MODULE_23__["forceEnabledElementResize"],
  6233. orientation: _orientation_index_js__WEBPACK_IMPORTED_MODULE_24__["default"],
  6234. SaveAs: _util_SaveAs_js__WEBPACK_IMPORTED_MODULE_25__["default"],
  6235. enableLogger: _util_logger_js__WEBPACK_IMPORTED_MODULE_26__["enable"],
  6236. disableLogger: _util_logger_js__WEBPACK_IMPORTED_MODULE_26__["disable"],
  6237. importInternal: _importInternal_js__WEBPACK_IMPORTED_MODULE_40__["default"],
  6238. import: _importInternal_js__WEBPACK_IMPORTED_MODULE_40__["default"],
  6239. register: _thirdParty_register_js__WEBPACK_IMPORTED_MODULE_27__["default"],
  6240. registerSome: _thirdParty_registerSome_js__WEBPACK_IMPORTED_MODULE_28__["default"],
  6241. wwwcSynchronizer: _synchronization_wwwcSynchronizer_js__WEBPACK_IMPORTED_MODULE_29__["default"],
  6242. updateImageSynchronizer: _synchronization_updateImageSynchronizer_js__WEBPACK_IMPORTED_MODULE_30__["default"],
  6243. Synchronizer: _synchronization_Synchronizer_js__WEBPACK_IMPORTED_MODULE_31__["default"],
  6244. stackScrollSynchronizer: _synchronization_stackScrollSynchronizer_js__WEBPACK_IMPORTED_MODULE_32__["default"],
  6245. stackImagePositionSynchronizer: _synchronization_stackImagePositionSynchronizer_js__WEBPACK_IMPORTED_MODULE_33__["default"],
  6246. stackImagePositionOffsetSynchronizer: _synchronization_stackImagePositionOffsetSynchronizer_js__WEBPACK_IMPORTED_MODULE_34__["default"],
  6247. stackImageIndexSynchronizer: _synchronization_stackImageIndexSynchronizer_js__WEBPACK_IMPORTED_MODULE_35__["default"],
  6248. panZoomSynchronizer: _synchronization_panZoomSynchronizer_js__WEBPACK_IMPORTED_MODULE_36__["default"],
  6249. external: _externalModules_js__WEBPACK_IMPORTED_MODULE_37__["default"],
  6250. EVENTS: _events_js__WEBPACK_IMPORTED_MODULE_38__["default"],
  6251. version: _version_js__WEBPACK_IMPORTED_MODULE_39__["default"]
  6252. }; // Named Exports
  6253. /* harmony default export */ __webpack_exports__["default"] = (cornerstoneTools);
  6254. /***/ }),
  6255. /***/ "./init.js":
  6256. /*!*****************!*\
  6257. !*** ./init.js ***!
  6258. \*****************/
  6259. /*! exports provided: default */
  6260. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  6261. "use strict";
  6262. __webpack_require__.r(__webpack_exports__);
  6263. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./externalModules.js */ "./externalModules.js");
  6264. /* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./store/index.js */ "./store/index.js");
  6265. /* harmony import */ var _store_internals_addEnabledElement_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./store/internals/addEnabledElement.js */ "./store/internals/addEnabledElement.js");
  6266. /* harmony import */ var _store_internals_removeEnabledElement_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./store/internals/removeEnabledElement.js */ "./store/internals/removeEnabledElement.js");
  6267. /* harmony import */ var _eventListeners_windowResizeHandler_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./eventListeners/windowResizeHandler.js */ "./eventListeners/windowResizeHandler.js");
  6268. /**
  6269. * Merges the provided configuration with default values and returns a
  6270. * configured CornerstoneTools instance.
  6271. * @export
  6272. * @public
  6273. * @method
  6274. * @name init
  6275. *
  6276. * @param {Object|Object[]} [defaultConfiguration = {}] The configuration to apply. Assumed globalConfiguration
  6277. * only one value, otherwise moduleName, configuration entires in an array.
  6278. * @returns {Object} A configured CornerstoneTools instance with top level API members.
  6279. */
  6280. /* harmony default export */ __webpack_exports__["default"] = (function () {
  6281. var defaultConfiguration = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  6282. _addCornerstoneEventListeners();
  6283. _initModules();
  6284. var globalConfigurationModule = Object(_store_index_js__WEBPACK_IMPORTED_MODULE_1__["getModule"])('globalConfiguration');
  6285. if (Array.isArray(defaultConfiguration)) {
  6286. defaultConfiguration.forEach(function (configurationEntry) {
  6287. var moduleName = configurationEntry.moduleName,
  6288. configuration = configurationEntry.configuration;
  6289. var module = Object(_store_index_js__WEBPACK_IMPORTED_MODULE_1__["getModule"])(moduleName);
  6290. if (module) {
  6291. module.configuration = Object.assign({}, module.configuration, configuration);
  6292. }
  6293. });
  6294. } else {
  6295. // DefaultConfiguration is an object, default to assigning it to globalConfiguration.
  6296. globalConfigurationModule.configuration = Object.assign({}, globalConfigurationModule.configuration, defaultConfiguration);
  6297. }
  6298. if (globalConfigurationModule.configuration.autoResizeViewports) {
  6299. _eventListeners_windowResizeHandler_js__WEBPACK_IMPORTED_MODULE_4__["default"].enable();
  6300. }
  6301. });
  6302. /**
  6303. * Wires up event listeners for the Cornerstone#ElementDisabled and
  6304. * Cornerstone#ElementEnabled events.
  6305. * @private
  6306. * @method
  6307. * @returns {void}
  6308. */
  6309. function _addCornerstoneEventListeners() {
  6310. // Clear any listeners that may already be set
  6311. _removeCornerstoneEventListeners();
  6312. var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone;
  6313. var elementEnabledEvent = cornerstone.EVENTS.ELEMENT_ENABLED;
  6314. var elementDisabledEvent = cornerstone.EVENTS.ELEMENT_DISABLED;
  6315. cornerstone.events.addEventListener(elementEnabledEvent, _store_internals_addEnabledElement_js__WEBPACK_IMPORTED_MODULE_2__["default"]);
  6316. cornerstone.events.addEventListener(elementDisabledEvent, _store_internals_removeEnabledElement_js__WEBPACK_IMPORTED_MODULE_3__["default"]);
  6317. }
  6318. /**
  6319. * Removes event listeners for the Cornerstone#ElementDisabled and
  6320. * Cornerstone#ElementEnabled events.
  6321. * @private
  6322. * @method
  6323. * @returns {void}
  6324. */
  6325. function _removeCornerstoneEventListeners() {
  6326. var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone;
  6327. var elementEnabledEvent = cornerstone.EVENTS.ELEMENT_ENABLED;
  6328. var elementDisabledEvent = cornerstone.EVENTS.ELEMENT_DISABLED;
  6329. cornerstone.events.removeEventListener(elementEnabledEvent, _store_internals_addEnabledElement_js__WEBPACK_IMPORTED_MODULE_2__["default"]);
  6330. cornerstone.events.removeEventListener(elementDisabledEvent, _store_internals_removeEnabledElement_js__WEBPACK_IMPORTED_MODULE_3__["default"]);
  6331. }
  6332. /*
  6333. * TODO: This could cause issues if the module was already initialized for
  6334. * the store. As there's nothing stopping implementers from calling `init`
  6335. * multiple times. Modules should self-check if they have already been
  6336. * registered to prevent issues.
  6337. */
  6338. /**
  6339. * Iterate over our store's modules. If the module has an `onRegisterCallback`
  6340. * call it. This hook can be used to setup any global store requirements per
  6341. * module.
  6342. * @private
  6343. * @method
  6344. * @returns {void}
  6345. */
  6346. function _initModules() {
  6347. var modules = _store_index_js__WEBPACK_IMPORTED_MODULE_1__["default"].modules;
  6348. Object.keys(modules).forEach(function (key) {
  6349. if (typeof modules[key].onRegisterCallback === 'function') {
  6350. modules[key].onRegisterCallback();
  6351. }
  6352. });
  6353. }
  6354. /***/ }),
  6355. /***/ "./lib.js":
  6356. /*!****************!*\
  6357. !*** ./lib.js ***!
  6358. \****************/
  6359. /*! exports provided: lib */
  6360. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  6361. "use strict";
  6362. __webpack_require__.r(__webpack_exports__);
  6363. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "lib", function() { return lib; });
  6364. /* harmony import */ var _tools_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./tools/base/BaseTool.js */ "./tools/base/BaseTool.js");
  6365. /* harmony import */ var _tools_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tools/base/BaseAnnotationTool.js */ "./tools/base/BaseAnnotationTool.js");
  6366. /* harmony import */ var _tools_base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/base/BaseBrushTool.js */ "./tools/base/BaseBrushTool.js");
  6367. /* harmony import */ var _manipulators_index_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./manipulators/index.js */ "./manipulators/index.js");
  6368. /* harmony import */ var _util_findAndMoveHelpers_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./util/findAndMoveHelpers.js */ "./util/findAndMoveHelpers.js");
  6369. /* harmony import */ var _mixins_index_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./mixins/index.js */ "./mixins/index.js");
  6370. /* harmony import */ var _tools_cursors_index_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./tools/cursors/index.js */ "./tools/cursors/index.js");
  6371. /* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./drawing/index.js */ "./drawing/index.js");
  6372. /* harmony import */ var _util_clip_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./util/clip.js */ "./util/clip.js");
  6373. /* harmony import */ var _util_debounce__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./util/debounce */ "./util/debounce.js");
  6374. /* harmony import */ var _util_deepmerge__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./util/deepmerge */ "./util/deepmerge.js");
  6375. /* harmony import */ var _util_getDefault__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./util/getDefault */ "./util/getDefault.js");
  6376. /* harmony import */ var _util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./util/getPixelSpacing */ "./util/getPixelSpacing.js");
  6377. /* harmony import */ var _util_isEmptyObject__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./util/isEmptyObject */ "./util/isEmptyObject.js");
  6378. /* harmony import */ var _util_isObject__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./util/isObject */ "./util/isObject.js");
  6379. /* harmony import */ var _util_isPointInImage__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./util/isPointInImage */ "./util/isPointInImage.js");
  6380. /* harmony import */ var _util_isPointInPolygon__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./util/isPointInPolygon */ "./util/isPointInPolygon.js");
  6381. /* harmony import */ var _util_throttle__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./util/throttle */ "./util/throttle.js");
  6382. /* harmony import */ var _util_wait__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./util/wait */ "./util/wait.js");
  6383. /* harmony import */ var _util_getKeyPressData__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./util/getKeyPressData */ "./util/getKeyPressData.js");
  6384. /* harmony import */ var _util_getProximityThreshold_js__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./util/getProximityThreshold.js */ "./util/getProximityThreshold.js");
  6385. /* harmony import */ var _drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./drawing/drawTextBox.js */ "./drawing/drawTextBox.js");
  6386. /* harmony import */ var _drawing_drawArrow_js__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./drawing/drawArrow.js */ "./drawing/drawArrow.js");
  6387. /* harmony import */ var _drawing_drawLink_js__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./drawing/drawLink.js */ "./drawing/drawLink.js");
  6388. /* harmony import */ var _drawing_drawLinkedTextBox_js__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./drawing/drawLinkedTextBox.js */ "./drawing/drawLinkedTextBox.js");
  6389. /* harmony import */ var _drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./drawing/drawHandles.js */ "./drawing/drawHandles.js");
  6390. /* harmony import */ var _util_getActiveTool__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./util/getActiveTool */ "./util/getActiveTool.js");
  6391. /* harmony import */ var _util_getLuminance_js__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./util/getLuminance.js */ "./util/getLuminance.js");
  6392. /* harmony import */ var _util_getROITextBoxCoords__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./util/getROITextBoxCoords */ "./util/getROITextBoxCoords.js");
  6393. /* harmony import */ var _util_copyPoints_js__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./util/copyPoints.js */ "./util/copyPoints.js");
  6394. /* harmony import */ var _util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./util/calculateSUV.js */ "./util/calculateSUV.js");
  6395. /* harmony import */ var _util_setContextToDisplayFontSize_js__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./util/setContextToDisplayFontSize.js */ "./util/setContextToDisplayFontSize.js");
  6396. /* harmony import */ var _util_scrollToIndex_js__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./util/scrollToIndex.js */ "./util/scrollToIndex.js");
  6397. /* harmony import */ var _util_scroll_js__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./util/scroll.js */ "./util/scroll.js");
  6398. /* harmony import */ var _util_roundToDecimal_js__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./util/roundToDecimal.js */ "./util/roundToDecimal.js");
  6399. /* harmony import */ var _util_pointProjector_js__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./util/pointProjector.js */ "./util/pointProjector.js");
  6400. /* harmony import */ var _util_lineSegDistance_js__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./util/lineSegDistance.js */ "./util/lineSegDistance.js");
  6401. /* harmony import */ var _util_logger__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./util/logger */ "./util/logger.js");
  6402. /* harmony import */ var _util_pointInsideBoundingBox_js__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./util/pointInsideBoundingBox.js */ "./util/pointInsideBoundingBox.js");
  6403. /* harmony import */ var _util_makeUnselectable_js__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./util/makeUnselectable.js */ "./util/makeUnselectable.js");
  6404. /* harmony import */ var _util_getRGBPixels_js__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./util/getRGBPixels.js */ "./util/getRGBPixels.js");
  6405. /* harmony import */ var _util_getMaxSimultaneousRequests_js__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ./util/getMaxSimultaneousRequests.js */ "./util/getMaxSimultaneousRequests.js");
  6406. /* harmony import */ var _util_angleBetweenPoints_js__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ./util/angleBetweenPoints.js */ "./util/angleBetweenPoints.js");
  6407. /* harmony import */ var _util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ./util/numbersWithCommas.js */ "./util/numbersWithCommas.js");
  6408. /* harmony import */ var _tools_cursors_MouseCursor_js__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! ./tools/cursors/MouseCursor.js */ "./tools/cursors/MouseCursor.js");
  6409. /* harmony import */ var _util_ellipse_index_js__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! ./util/ellipse/index.js */ "./util/ellipse/index.js");
  6410. /* harmony import */ var _util_freehand_index_js__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! ./util/freehand/index.js */ "./util/freehand/index.js");
  6411. /* harmony import */ var _util_segmentation__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! ./util/segmentation */ "./util/segmentation/index.js");
  6412. /* harmony import */ var _util_zoom_index_js__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(/*! ./util/zoom/index.js */ "./util/zoom/index.js");
  6413. /* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(/*! ./util/triggerEvent.js */ "./util/triggerEvent.js");
  6414. /* harmony import */ var _util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(/*! ./util/convertToVector3.js */ "./util/convertToVector3.js");
  6415. var lib = {
  6416. 'base/BaseTool': _tools_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_0__["default"],
  6417. 'base/BaseAnnotationTool': _tools_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_1__["default"],
  6418. 'base/BaseBrushTool': _tools_base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_2__["default"],
  6419. 'tools/cursors/MouseCursor': _tools_cursors_MouseCursor_js__WEBPACK_IMPORTED_MODULE_44__["default"],
  6420. 'tools/cursors': _tools_cursors_index_js__WEBPACK_IMPORTED_MODULE_6__,
  6421. 'manipulators/anyHandlesOutsideImage': _manipulators_index_js__WEBPACK_IMPORTED_MODULE_3__["anyHandlesOutsideImage"],
  6422. 'manipulators/getHandleNearImagePoint': _manipulators_index_js__WEBPACK_IMPORTED_MODULE_3__["getHandleNearImagePoint"],
  6423. 'manipulators/getHandlePixelPosition': _manipulators_index_js__WEBPACK_IMPORTED_MODULE_3__["getHandlePixelPosition"],
  6424. 'manipulators/handleActivator': _manipulators_index_js__WEBPACK_IMPORTED_MODULE_3__["handleActivator"],
  6425. 'manipulators/moveAllHandles': _manipulators_index_js__WEBPACK_IMPORTED_MODULE_3__["moveAllHandles"],
  6426. 'manipulators/moveHandle': _manipulators_index_js__WEBPACK_IMPORTED_MODULE_3__["moveHandle"],
  6427. 'manipulators/moveNewHandle': _manipulators_index_js__WEBPACK_IMPORTED_MODULE_3__["moveNewHandle"],
  6428. 'manipulators/moveHandleNearImagePoint': _util_findAndMoveHelpers_js__WEBPACK_IMPORTED_MODULE_4__["moveHandleNearImagePoint"],
  6429. 'manipulators/findHandleDataNearImagePoint': _util_findAndMoveHelpers_js__WEBPACK_IMPORTED_MODULE_4__["findHandleDataNearImagePoint"],
  6430. 'manipulators/moveAnnotation': _util_findAndMoveHelpers_js__WEBPACK_IMPORTED_MODULE_4__["moveAnnotation"],
  6431. 'mixins/activeOrDisabledBinaryTool': _mixins_index_js__WEBPACK_IMPORTED_MODULE_5__["default"].activeOrDisabledBinaryTool,
  6432. 'mixins/enabledOrDisabledBinaryTool': _mixins_index_js__WEBPACK_IMPORTED_MODULE_5__["default"].enabledOrDisabledBinaryTool,
  6433. 'drawing/getNewContext': _drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["getNewContext"],
  6434. 'drawing/draw': _drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["draw"],
  6435. 'drawing/path': _drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["path"],
  6436. 'drawing/setShadow': _drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["setShadow"],
  6437. 'drawing/drawLine': _drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["drawLine"],
  6438. 'drawing/drawLines': _drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["drawLines"],
  6439. 'drawing/drawJoinedLines': _drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["drawJoinedLines"],
  6440. 'drawing/drawCircle': _drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["drawCircle"],
  6441. 'drawing/drawEllipse': _drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["drawEllipse"],
  6442. 'drawing/drawRect': _drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["drawRect"],
  6443. 'drawing/fillOutsideRect': _drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["fillOutsideRect"],
  6444. 'drawing/drawTextBox': _drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_21__["default"],
  6445. 'drawing/drawArrow': _drawing_drawArrow_js__WEBPACK_IMPORTED_MODULE_22__["default"],
  6446. 'drawing/fillBox': _drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["fillBox"],
  6447. 'drawing/fillTextLines': _drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["fillTextLines"],
  6448. 'drawing/drawLink': _drawing_drawLink_js__WEBPACK_IMPORTED_MODULE_23__["default"],
  6449. 'drawing/drawLinkedTextBox': _drawing_drawLinkedTextBox_js__WEBPACK_IMPORTED_MODULE_24__["default"],
  6450. 'drawing/drawHandles': _drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_25__["default"],
  6451. 'drawing/textBoxWidth': _drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_21__["textBoxWidth"],
  6452. 'util/getActiveTool': _util_getActiveTool__WEBPACK_IMPORTED_MODULE_26__["default"],
  6453. 'util/getLuminance': _util_getLuminance_js__WEBPACK_IMPORTED_MODULE_27__["default"],
  6454. 'util/getROITextBoxCoords': _util_getROITextBoxCoords__WEBPACK_IMPORTED_MODULE_28__["default"],
  6455. 'util/copyPoints': _util_copyPoints_js__WEBPACK_IMPORTED_MODULE_29__["default"],
  6456. 'util/calculateSUV': _util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_30__["default"],
  6457. 'util/setContextToDisplayFontSize': _util_setContextToDisplayFontSize_js__WEBPACK_IMPORTED_MODULE_31__["default"],
  6458. 'util/scrollToIndex': _util_scrollToIndex_js__WEBPACK_IMPORTED_MODULE_32__["default"],
  6459. 'util/scroll': _util_scroll_js__WEBPACK_IMPORTED_MODULE_33__["default"],
  6460. 'util/roundToDecimal': _util_roundToDecimal_js__WEBPACK_IMPORTED_MODULE_34__["default"],
  6461. 'util/projectPatientPointToImagePlane': _util_pointProjector_js__WEBPACK_IMPORTED_MODULE_35__["projectPatientPointToImagePlane"],
  6462. 'util/imagePointToPatientPoint': _util_pointProjector_js__WEBPACK_IMPORTED_MODULE_35__["imagePointToPatientPoint"],
  6463. 'util/planePlaneIntersection': _util_pointProjector_js__WEBPACK_IMPORTED_MODULE_35__["planePlaneIntersection"],
  6464. 'util/pointInsideBoundingBox': _util_pointInsideBoundingBox_js__WEBPACK_IMPORTED_MODULE_38__["default"],
  6465. 'util/makeUnselectable': _util_makeUnselectable_js__WEBPACK_IMPORTED_MODULE_39__["default"],
  6466. 'util/getRGBPixels': _util_getRGBPixels_js__WEBPACK_IMPORTED_MODULE_40__["default"],
  6467. 'util/getBrowserInfo': _util_getMaxSimultaneousRequests_js__WEBPACK_IMPORTED_MODULE_41__["getBrowserInfo"],
  6468. 'util/isMobileDevice': _util_getMaxSimultaneousRequests_js__WEBPACK_IMPORTED_MODULE_41__["isMobileDevice"],
  6469. 'util/angleBetweenPoints': _util_angleBetweenPoints_js__WEBPACK_IMPORTED_MODULE_42__["default"],
  6470. 'util/numbersWithCommas': _util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_43__["default"],
  6471. 'util/lineSegDistance': _util_lineSegDistance_js__WEBPACK_IMPORTED_MODULE_36__["default"],
  6472. 'util/triggerEvent': _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_49__["default"],
  6473. 'util/convertToVector3': _util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_50__["default"],
  6474. 'util/clip': _util_clip_js__WEBPACK_IMPORTED_MODULE_8__["clip"],
  6475. 'util/clipToBox': _util_clip_js__WEBPACK_IMPORTED_MODULE_8__["clipToBox"],
  6476. 'util/clipBoxToDisplayedArea': _util_clip_js__WEBPACK_IMPORTED_MODULE_8__["clipBoxToDisplayedArea"],
  6477. 'util/debounce': _util_debounce__WEBPACK_IMPORTED_MODULE_9__["default"],
  6478. 'util/deepmerge': _util_deepmerge__WEBPACK_IMPORTED_MODULE_10__["default"],
  6479. 'util/getDefault': _util_getDefault__WEBPACK_IMPORTED_MODULE_11__["default"],
  6480. 'util/getProximityThreshold': _util_getProximityThreshold_js__WEBPACK_IMPORTED_MODULE_20__["default"],
  6481. 'util/getPixelSpacing': _util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_12__["default"],
  6482. 'util/isEmptyObject': _util_isEmptyObject__WEBPACK_IMPORTED_MODULE_13__["default"],
  6483. 'util/isObject': _util_isObject__WEBPACK_IMPORTED_MODULE_14__["default"],
  6484. 'util/isPointInImage': _util_isPointInImage__WEBPACK_IMPORTED_MODULE_15__["default"],
  6485. 'util/isPointInPolygon': _util_isPointInPolygon__WEBPACK_IMPORTED_MODULE_16__["default"],
  6486. 'util/getLogger': _util_logger__WEBPACK_IMPORTED_MODULE_37__["getLogger"],
  6487. 'util/throttle': _util_throttle__WEBPACK_IMPORTED_MODULE_17__["default"],
  6488. 'util/wait': _util_wait__WEBPACK_IMPORTED_MODULE_18__["wait"],
  6489. 'util/waitForEnabledElementImageToLoad': _util_wait__WEBPACK_IMPORTED_MODULE_18__["waitForEnabledElementImageToLoad"],
  6490. 'util/getKeyPressData': _util_getKeyPressData__WEBPACK_IMPORTED_MODULE_19__["default"],
  6491. // Whole tool specific util packages
  6492. 'util/ellipseUtils': _util_ellipse_index_js__WEBPACK_IMPORTED_MODULE_45__["default"],
  6493. 'util/freehandUtils': _util_freehand_index_js__WEBPACK_IMPORTED_MODULE_46__["default"],
  6494. 'util/segmentationUtils': _util_segmentation__WEBPACK_IMPORTED_MODULE_47__,
  6495. 'util/zoomUtils': _util_zoom_index_js__WEBPACK_IMPORTED_MODULE_48__["default"]
  6496. };
  6497. /***/ }),
  6498. /***/ "./manipulators/anyHandlesOutsideImage.js":
  6499. /*!************************************************!*\
  6500. !*** ./manipulators/anyHandlesOutsideImage.js ***!
  6501. \************************************************/
  6502. /*! exports provided: default */
  6503. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  6504. "use strict";
  6505. __webpack_require__.r(__webpack_exports__);
  6506. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
  6507. /**
  6508. * Determine if a handle is outside the bounds of the rendered image.
  6509. * @public
  6510. * @function anyHandlesOutsideImage
  6511. * @memberof Manipulators
  6512. *
  6513. * @param {*} renderData - Cornerstone Tool's event detail
  6514. * @param {Object} handles - An object containing named handles
  6515. * @returns {Boolean} - True if the handle was placed outside the image
  6516. */
  6517. /* harmony default export */ __webpack_exports__["default"] = (function (renderData, handles) {
  6518. var image = renderData.image;
  6519. var imageRect = {
  6520. left: 0,
  6521. top: 0,
  6522. width: image.width,
  6523. height: image.height
  6524. };
  6525. var handleOutsideImage = false;
  6526. Object.keys(handles).forEach(function (name) {
  6527. var handle = handles[name];
  6528. if (handle.allowedOutsideImage === true) {
  6529. return;
  6530. }
  6531. if (_externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.point.insideRect(handle, imageRect) === false) {
  6532. handleOutsideImage = true;
  6533. }
  6534. });
  6535. return handleOutsideImage;
  6536. });
  6537. /***/ }),
  6538. /***/ "./manipulators/getHandleNearImagePoint.js":
  6539. /*!*************************************************!*\
  6540. !*** ./manipulators/getHandleNearImagePoint.js ***!
  6541. \*************************************************/
  6542. /*! exports provided: default */
  6543. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  6544. "use strict";
  6545. __webpack_require__.r(__webpack_exports__);
  6546. /* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "../node_modules/@babel/runtime/helpers/typeof.js");
  6547. /* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__);
  6548. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
  6549. /* harmony import */ var _util_pointInsideBoundingBox_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../util/pointInsideBoundingBox.js */ "./util/pointInsideBoundingBox.js");
  6550. /**
  6551. * Returns the first handle found to be near the provided point. Handles to search can be an array of handles, an
  6552. * object of named handles, or an object of named handles AND named arrays of handles.
  6553. *
  6554. * @public
  6555. * @function getHandleNearImagePoint
  6556. * @memberof Manipulators
  6557. *
  6558. * @param {*} element - Target enabledElement
  6559. * @param {(Array|Object)} handles - An arry of handles, object with named handles, or object with named handles AND named arrays of handles
  6560. * @param {Object} coords - The coordinates to measure from when determining distance from handles
  6561. * @param {number} distanceThreshold - minimum distance handle needs to be from provided coords
  6562. * @returns {Object} Handle
  6563. */
  6564. var getHandleNearImagePoint = function getHandleNearImagePoint(element, handles, coords, distanceThreshold) {
  6565. var nearbyHandle;
  6566. if (!handles) {
  6567. return;
  6568. }
  6569. if (Array.isArray(handles)) {
  6570. var handleKeys = Object.keys(handles);
  6571. for (var i = 0; i < handleKeys.length; i++) {
  6572. var key = handleKeys[i];
  6573. var handle = handles[key];
  6574. if ( // Not a true handle
  6575. !handle.hasOwnProperty('x') || !handle.hasOwnProperty('y')) {
  6576. continue;
  6577. }
  6578. if (_isHandleNearImagePoint(handle, element, coords, distanceThreshold)) {
  6579. nearbyHandle = handle;
  6580. break;
  6581. }
  6582. }
  6583. } else if (_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default()(handles) === 'object') {
  6584. var _handleKeys = Object.keys(handles);
  6585. for (var _i = 0; _i < _handleKeys.length; _i++) {
  6586. var handleName = _handleKeys[_i];
  6587. if (Array.isArray(handles[handleName])) {
  6588. nearbyHandle = getHandleNearImagePoint(element, handles[handleName], coords, distanceThreshold);
  6589. if (nearbyHandle) {
  6590. break;
  6591. }
  6592. } else {
  6593. var _handle = handles[handleName];
  6594. if (_isHandleNearImagePoint(_handle, element, coords, distanceThreshold)) {
  6595. nearbyHandle = _handle;
  6596. break;
  6597. }
  6598. }
  6599. }
  6600. }
  6601. return nearbyHandle;
  6602. };
  6603. /**
  6604. * Determines if the handle is less than the provided distance from the provided coordinates
  6605. * @private
  6606. * @function _isHandleNearImagePoint
  6607. *
  6608. * @param {*} handle
  6609. * @param {*} element
  6610. * @param {*} coords
  6611. * @param {*} distanceThreshold
  6612. * @returns {boolean} true if handles is near image point
  6613. */
  6614. var _isHandleNearImagePoint = function _isHandleNearImagePoint(handle, element, coords, distanceThreshold) {
  6615. if (handle.hasOwnProperty('pointNearHandle')) {
  6616. if (handle.pointNearHandle(element, handle, coords)) {
  6617. return true;
  6618. }
  6619. } else if (handle.hasBoundingBox === true) {
  6620. if (Object(_util_pointInsideBoundingBox_js__WEBPACK_IMPORTED_MODULE_2__["default"])(handle, coords)) {
  6621. return true;
  6622. }
  6623. } else {
  6624. var handleCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, handle);
  6625. var distance = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.distance(handleCanvas, coords);
  6626. if (distance <= distanceThreshold) {
  6627. return true;
  6628. }
  6629. }
  6630. return false;
  6631. };
  6632. /* harmony default export */ __webpack_exports__["default"] = (getHandleNearImagePoint);
  6633. /***/ }),
  6634. /***/ "./manipulators/getHandlePixelPosition.js":
  6635. /*!************************************************!*\
  6636. !*** ./manipulators/getHandlePixelPosition.js ***!
  6637. \************************************************/
  6638. /*! exports provided: default */
  6639. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  6640. "use strict";
  6641. __webpack_require__.r(__webpack_exports__);
  6642. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
  6643. /* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../store/index.js */ "./store/index.js");
  6644. /**
  6645. * Return the handle position considering offset for touch interaction.
  6646. * @public
  6647. * @function getHandlePixelPosition
  6648. * @memberof Manipulators
  6649. *
  6650. * @param {Object} eventData - Data object associated with the event
  6651. * @param {string} interactionType - Type of user's input
  6652. * @returns {Object} - The translated point object
  6653. */
  6654. /* harmony default export */ __webpack_exports__["default"] = (function (eventData, interactionType) {
  6655. var currentPoints = eventData.currentPoints,
  6656. element = eventData.element;
  6657. var page = currentPoints.page;
  6658. var handleTouchOffset = _store_index_js__WEBPACK_IMPORTED_MODULE_1__["state"].handleTouchOffset;
  6659. var offsetX = 0;
  6660. var offsetY = 0;
  6661. if (interactionType === 'touch') {
  6662. offsetX = handleTouchOffset.x;
  6663. offsetY = handleTouchOffset.y;
  6664. }
  6665. return _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.pageToPixel(element, page.x + offsetX, page.y + offsetY);
  6666. });
  6667. /***/ }),
  6668. /***/ "./manipulators/handleActivator.js":
  6669. /*!*****************************************!*\
  6670. !*** ./manipulators/handleActivator.js ***!
  6671. \*****************************************/
  6672. /*! exports provided: default */
  6673. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  6674. "use strict";
  6675. __webpack_require__.r(__webpack_exports__);
  6676. /* harmony import */ var _getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getHandleNearImagePoint.js */ "./manipulators/getHandleNearImagePoint.js");
  6677. /**
  6678. * Update the active handle
  6679. * @public
  6680. * @function handleActivator
  6681. * @memberof Manipulators
  6682. *
  6683. * @param {*} element
  6684. * @param {*} handles
  6685. * @param {*} canvasPoint
  6686. * @param {*} distanceThreshold
  6687. * @returns {Boolean} - True if a handle was activated
  6688. */
  6689. /* harmony default export */ __webpack_exports__["default"] = (function (element, handles, canvasPoint, distanceThreshold) {
  6690. if (!distanceThreshold) {
  6691. distanceThreshold = 6;
  6692. }
  6693. var activeHandle = _getActiveHandle(handles);
  6694. var nearbyHandle = Object(_getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element, handles, canvasPoint, distanceThreshold);
  6695. if (activeHandle !== nearbyHandle) {
  6696. if (nearbyHandle !== undefined) {
  6697. nearbyHandle.active = true;
  6698. }
  6699. if (activeHandle !== undefined) {
  6700. activeHandle.active = false;
  6701. }
  6702. return true;
  6703. }
  6704. return false;
  6705. });
  6706. /**
  6707. *
  6708. * @private
  6709. *
  6710. * @param {*} handles
  6711. * @returns {Object} - Activated Handle
  6712. */
  6713. function _getActiveHandle(handles) {
  6714. var activeHandle;
  6715. Object.keys(handles).forEach(function (name) {
  6716. var handle = handles[name];
  6717. if (handle.active === true) {
  6718. activeHandle = handle;
  6719. return;
  6720. }
  6721. });
  6722. return activeHandle;
  6723. }
  6724. /***/ }),
  6725. /***/ "./manipulators/index.js":
  6726. /*!*******************************!*\
  6727. !*** ./manipulators/index.js ***!
  6728. \*******************************/
  6729. /*! exports provided: anyHandlesOutsideImage, getHandleNearImagePoint, getHandlePixelPosition, handleActivator, moveAllHandles, moveHandle, moveNewHandle */
  6730. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  6731. "use strict";
  6732. __webpack_require__.r(__webpack_exports__);
  6733. /* harmony import */ var _anyHandlesOutsideImage_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./anyHandlesOutsideImage.js */ "./manipulators/anyHandlesOutsideImage.js");
  6734. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "anyHandlesOutsideImage", function() { return _anyHandlesOutsideImage_js__WEBPACK_IMPORTED_MODULE_0__["default"]; });
  6735. /* harmony import */ var _getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getHandleNearImagePoint.js */ "./manipulators/getHandleNearImagePoint.js");
  6736. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getHandleNearImagePoint", function() { return _getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_1__["default"]; });
  6737. /* harmony import */ var _getHandlePixelPosition_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./getHandlePixelPosition.js */ "./manipulators/getHandlePixelPosition.js");
  6738. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getHandlePixelPosition", function() { return _getHandlePixelPosition_js__WEBPACK_IMPORTED_MODULE_2__["default"]; });
  6739. /* harmony import */ var _handleActivator_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./handleActivator.js */ "./manipulators/handleActivator.js");
  6740. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "handleActivator", function() { return _handleActivator_js__WEBPACK_IMPORTED_MODULE_3__["default"]; });
  6741. /* harmony import */ var _moveAllHandles_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./moveAllHandles.js */ "./manipulators/moveAllHandles.js");
  6742. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "moveAllHandles", function() { return _moveAllHandles_js__WEBPACK_IMPORTED_MODULE_4__["default"]; });
  6743. /* harmony import */ var _moveHandle_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./moveHandle.js */ "./manipulators/moveHandle.js");
  6744. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "moveHandle", function() { return _moveHandle_js__WEBPACK_IMPORTED_MODULE_5__["default"]; });
  6745. /* harmony import */ var _moveNewHandle_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./moveNewHandle.js */ "./manipulators/moveNewHandle.js");
  6746. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "moveNewHandle", function() { return _moveNewHandle_js__WEBPACK_IMPORTED_MODULE_6__["default"]; });
  6747. /***/ }),
  6748. /***/ "./manipulators/moveAllHandles.js":
  6749. /*!****************************************!*\
  6750. !*** ./manipulators/moveAllHandles.js ***!
  6751. \****************************************/
  6752. /*! exports provided: default */
  6753. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  6754. "use strict";
  6755. __webpack_require__.r(__webpack_exports__);
  6756. /* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../events.js */ "./events.js");
  6757. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
  6758. /* harmony import */ var _anyHandlesOutsideImage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./anyHandlesOutsideImage.js */ "./manipulators/anyHandlesOutsideImage.js");
  6759. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  6760. /* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/triggerEvent.js */ "./util/triggerEvent.js");
  6761. /* harmony import */ var _util_clip_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../util/clip.js */ "./util/clip.js");
  6762. /* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./../store/index.js */ "./store/index.js");
  6763. /* harmony import */ var _util_getActiveTool__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../util/getActiveTool */ "./util/getActiveTool.js");
  6764. /* harmony import */ var _tools_base_BaseAnnotationTool__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../tools/base/BaseAnnotationTool */ "./tools/base/BaseAnnotationTool.js");
  6765. /* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../util/logger.js */ "./util/logger.js");
  6766. var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_9__["getLogger"])('manipulators:moveAllHandles');
  6767. var manipulatorStateModule = Object(_store_index_js__WEBPACK_IMPORTED_MODULE_6__["getModule"])('manipulatorState');
  6768. var _dragEvents = {
  6769. mouse: [_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DRAG],
  6770. touch: [_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_DRAG]
  6771. };
  6772. var _upOrEndEvents = {
  6773. mouse: [_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_UP, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_CLICK],
  6774. touch: [_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_END, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_DRAG_END, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_PINCH, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_PRESS, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TAP]
  6775. };
  6776. /**
  6777. * Manipulator to move all provided handles at the same time
  6778. * @public
  6779. * @function moveAllHandles
  6780. * @memberof Manipulators
  6781. *
  6782. * @param {*} evtDetail
  6783. * @param {*} evtDetail.element
  6784. * @param {String} toolName
  6785. * @param {*} annotation
  6786. * @param {*} [handle=null] - not needed by moveAllHandles, but keeps call signature the same as `moveHandle`
  6787. * @param {Object} [options={}]
  6788. * @param {Boolean} [options.deleteIfHandleOutsideImage]
  6789. * @param {Boolean} [options.preventHandleOutsideImage]
  6790. * @param {string} [interactionType=mouse]
  6791. * @param {function} [doneMovingCallback]
  6792. * @returns {undefined}
  6793. */
  6794. /* harmony default export */ __webpack_exports__["default"] = (function (_ref, toolName, annotation, handle) {
  6795. var element = _ref.element;
  6796. var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
  6797. var interactionType = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 'mouse';
  6798. var doneMovingCallback = arguments.length > 6 ? arguments[6] : undefined;
  6799. // Use global defaults, unless overidden by provided options
  6800. options = Object.assign({
  6801. deleteIfHandleOutsideImage: _store_index_js__WEBPACK_IMPORTED_MODULE_6__["state"].deleteIfHandleOutsideImage,
  6802. preventHandleOutsideImage: _store_index_js__WEBPACK_IMPORTED_MODULE_6__["state"].preventHandleOutsideImage
  6803. }, options);
  6804. var dragHandler = _dragHandler.bind(this, toolName, annotation, options, interactionType); // So we don't need to inline the entire `upOrEndHandler` function
  6805. var upOrEndHandler = function upOrEndHandler(evt) {
  6806. _upOrEndHandler(toolName, annotation, options, interactionType, {
  6807. dragHandler: dragHandler,
  6808. upOrEndHandler: upOrEndHandler
  6809. }, evt, doneMovingCallback);
  6810. };
  6811. manipulatorStateModule.setters.addActiveManipulatorForElement(element, _cancelEventHandler.bind(null, annotation, options, interactionType, {
  6812. dragHandler: dragHandler,
  6813. upOrEndHandler: upOrEndHandler
  6814. }, element, doneMovingCallback));
  6815. annotation.active = true;
  6816. _store_index_js__WEBPACK_IMPORTED_MODULE_6__["state"].isToolLocked = true; // Add Event Listeners
  6817. _dragEvents[interactionType].forEach(function (eventType) {
  6818. element.addEventListener(eventType, dragHandler);
  6819. });
  6820. _upOrEndEvents[interactionType].forEach(function (eventType) {
  6821. element.addEventListener(eventType, upOrEndHandler);
  6822. });
  6823. });
  6824. function _dragHandler(toolName, annotation) {
  6825. var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
  6826. var interactionType = arguments.length > 3 ? arguments[3] : undefined;
  6827. var evt = arguments.length > 4 ? arguments[4] : undefined;
  6828. var _evt$detail = evt.detail,
  6829. element = _evt$detail.element,
  6830. image = _evt$detail.image,
  6831. buttons = _evt$detail.buttons;
  6832. var _evt$detail$deltaPoin = evt.detail.deltaPoints.image,
  6833. x = _evt$detail$deltaPoin.x,
  6834. y = _evt$detail$deltaPoin.y;
  6835. annotation.active = true;
  6836. annotation.invalidated = true;
  6837. var handleKeys = Object.keys(annotation.handles);
  6838. for (var i = 0; i < handleKeys.length; i++) {
  6839. var key = handleKeys[i];
  6840. var handle = annotation.handles[key];
  6841. if ( // Don't move this part of the annotation
  6842. handle.movesIndependently === true || // Not a true handle
  6843. !handle.hasOwnProperty('x') || !handle.hasOwnProperty('y')) {
  6844. continue;
  6845. }
  6846. handle.x += x;
  6847. handle.y += y;
  6848. if (options.preventHandleOutsideImage) {
  6849. Object(_util_clip_js__WEBPACK_IMPORTED_MODULE_5__["clipToBox"])(handle, image);
  6850. }
  6851. }
  6852. _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.updateImage(element);
  6853. var activeTool = Object(_util_getActiveTool__WEBPACK_IMPORTED_MODULE_7__["default"])(element, buttons, interactionType);
  6854. if (activeTool instanceof _tools_base_BaseAnnotationTool__WEBPACK_IMPORTED_MODULE_8__["default"]) {
  6855. activeTool.updateCachedStats(image, element, annotation);
  6856. }
  6857. var eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MEASUREMENT_MODIFIED;
  6858. var modifiedEventData = {
  6859. toolName: toolName,
  6860. toolType: toolName,
  6861. // Deprecation notice: toolType will be replaced by toolName
  6862. element: element,
  6863. measurementData: annotation
  6864. };
  6865. Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, eventType, modifiedEventData);
  6866. evt.preventDefault();
  6867. evt.stopPropagation();
  6868. }
  6869. function _cancelEventHandler(annotation) {
  6870. var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  6871. var interactionType = arguments.length > 2 ? arguments[2] : undefined;
  6872. var _ref2 = arguments.length > 3 ? arguments[3] : undefined,
  6873. dragHandler = _ref2.dragHandler,
  6874. upOrEndHandler = _ref2.upOrEndHandler;
  6875. var element = arguments.length > 4 ? arguments[4] : undefined;
  6876. var doneMovingCallback = arguments.length > 5 ? arguments[5] : undefined;
  6877. _endHandler(annotation, options, interactionType, {
  6878. dragHandler: dragHandler,
  6879. upOrEndHandler: upOrEndHandler
  6880. }, element, doneMovingCallback, false);
  6881. }
  6882. function _upOrEndHandler(toolName, annotation) {
  6883. var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
  6884. var interactionType = arguments.length > 3 ? arguments[3] : undefined;
  6885. var _ref3 = arguments.length > 4 ? arguments[4] : undefined,
  6886. dragHandler = _ref3.dragHandler,
  6887. upOrEndHandler = _ref3.upOrEndHandler;
  6888. var evt = arguments.length > 5 ? arguments[5] : undefined;
  6889. var doneMovingCallback = arguments.length > 6 ? arguments[6] : undefined;
  6890. var eventData = evt.detail;
  6891. var element = eventData.element;
  6892. manipulatorStateModule.setters.removeActiveManipulatorForElement(element); // If any handle is outside the image, delete the tool data
  6893. if (options.deleteIfHandleOutsideImage && Object(_anyHandlesOutsideImage_js__WEBPACK_IMPORTED_MODULE_2__["default"])(eventData, annotation.handles)) {
  6894. Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["removeToolState"])(element, toolName, annotation);
  6895. }
  6896. _endHandler(annotation, options, interactionType, {
  6897. dragHandler: dragHandler,
  6898. upOrEndHandler: upOrEndHandler
  6899. }, element, doneMovingCallback, true);
  6900. }
  6901. function _endHandler(annotation) {
  6902. var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  6903. var interactionType = arguments.length > 2 ? arguments[2] : undefined;
  6904. var _ref4 = arguments.length > 3 ? arguments[3] : undefined,
  6905. dragHandler = _ref4.dragHandler,
  6906. upOrEndHandler = _ref4.upOrEndHandler;
  6907. var element = arguments.length > 4 ? arguments[4] : undefined;
  6908. var doneMovingCallback = arguments.length > 5 ? arguments[5] : undefined;
  6909. var success = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : true;
  6910. annotation.active = false;
  6911. annotation.invalidated = true;
  6912. _store_index_js__WEBPACK_IMPORTED_MODULE_6__["state"].isToolLocked = false; // Remove Event Listeners
  6913. _dragEvents[interactionType].forEach(function (eventType) {
  6914. element.removeEventListener(eventType, dragHandler);
  6915. });
  6916. _upOrEndEvents[interactionType].forEach(function (eventType) {
  6917. element.removeEventListener(eventType, upOrEndHandler);
  6918. });
  6919. if (typeof options.doneMovingCallback === 'function') {
  6920. logger.warn('`options.doneMovingCallback` has been depricated. See https://github.com/cornerstonejs/cornerstoneTools/pull/915 for details.');
  6921. options.doneMovingCallback(success);
  6922. }
  6923. if (typeof doneMovingCallback === 'function') {
  6924. doneMovingCallback(success);
  6925. }
  6926. _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.updateImage(element);
  6927. }
  6928. /***/ }),
  6929. /***/ "./manipulators/moveHandle.js":
  6930. /*!************************************!*\
  6931. !*** ./manipulators/moveHandle.js ***!
  6932. \************************************/
  6933. /*! exports provided: default */
  6934. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  6935. "use strict";
  6936. __webpack_require__.r(__webpack_exports__);
  6937. /* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../events.js */ "./events.js");
  6938. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
  6939. /* harmony import */ var _anyHandlesOutsideImage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./anyHandlesOutsideImage.js */ "./manipulators/anyHandlesOutsideImage.js");
  6940. /* harmony import */ var _getHandlePixelPosition_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./getHandlePixelPosition.js */ "./manipulators/getHandlePixelPosition.js");
  6941. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  6942. /* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../util/triggerEvent.js */ "./util/triggerEvent.js");
  6943. /* harmony import */ var _util_clip_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../util/clip.js */ "./util/clip.js");
  6944. /* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../store/index.js */ "./store/index.js");
  6945. /* harmony import */ var _util_getActiveTool__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../util/getActiveTool */ "./util/getActiveTool.js");
  6946. /* harmony import */ var _tools_base_BaseAnnotationTool__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../tools/base/BaseAnnotationTool */ "./tools/base/BaseAnnotationTool.js");
  6947. /* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../util/logger.js */ "./util/logger.js");
  6948. var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_10__["getLogger"])('manipulators:moveHandle');
  6949. var manipulatorStateModule = Object(_store_index_js__WEBPACK_IMPORTED_MODULE_7__["getModule"])('manipulatorState');
  6950. var runAnimation = {
  6951. value: false
  6952. };
  6953. var _dragEvents = {
  6954. mouse: [_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DRAG],
  6955. touch: [_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_DRAG]
  6956. };
  6957. var _upOrEndEvents = {
  6958. mouse: [_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_UP, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_CLICK],
  6959. touch: [_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_END, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_DRAG_END, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_PINCH, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_PRESS, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TAP]
  6960. };
  6961. /**
  6962. * Move the provided handle
  6963. *
  6964. * @public
  6965. * @method moveHandle
  6966. * @memberof Manipulators
  6967. *
  6968. * @param {*} evtDetail
  6969. * @param {*} toolName
  6970. * @param {*} annotation
  6971. * @param {*} handle
  6972. * @param {*} [options={}]
  6973. * @param {Boolean} [options.deleteIfHandleOutsideImage]
  6974. * @param {Boolean} [options.preventHandleOutsideImage]
  6975. * @param {*} [interactionType=mouse]
  6976. * @param {function} doneMovingCallback
  6977. * @returns {undefined}
  6978. */
  6979. /* harmony default export */ __webpack_exports__["default"] = (function (evtDetail, toolName, annotation, handle) {
  6980. var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
  6981. var interactionType = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 'mouse';
  6982. var doneMovingCallback = arguments.length > 6 ? arguments[6] : undefined;
  6983. // Use global defaults, unless overidden by provided options
  6984. options = Object.assign({
  6985. deleteIfHandleOutsideImage: _store_index_js__WEBPACK_IMPORTED_MODULE_7__["state"].deleteIfHandleOutsideImage,
  6986. preventHandleOutsideImage: _store_index_js__WEBPACK_IMPORTED_MODULE_7__["state"].preventHandleOutsideImage
  6987. }, options);
  6988. var element = evtDetail.element;
  6989. var dragHandler = _dragHandler.bind(this, toolName, annotation, handle, options, interactionType); // So we don't need to inline the entire `upOrEndHandler` function
  6990. var upOrEndHandler = function upOrEndHandler() {
  6991. _upOrEndHandler(toolName, evtDetail, annotation, handle, options, interactionType, {
  6992. dragHandler: dragHandler,
  6993. upOrEndHandler: upOrEndHandler
  6994. }, doneMovingCallback);
  6995. };
  6996. manipulatorStateModule.setters.addActiveManipulatorForElement(element, _cancelEventHandler.bind(null, toolName, evtDetail, annotation, handle, options, interactionType, {
  6997. dragHandler: dragHandler,
  6998. upOrEndHandler: upOrEndHandler
  6999. }, doneMovingCallback));
  7000. handle.active = true;
  7001. handle.moving = true;
  7002. annotation.active = true;
  7003. _store_index_js__WEBPACK_IMPORTED_MODULE_7__["state"].isToolLocked = true; // Add Event Listeners
  7004. _dragEvents[interactionType].forEach(function (eventType) {
  7005. element.addEventListener(eventType, dragHandler);
  7006. });
  7007. _upOrEndEvents[interactionType].forEach(function (eventType) {
  7008. element.addEventListener(eventType, upOrEndHandler);
  7009. }); // ==========================
  7010. // ======== TOUCH ==========
  7011. // ==========================
  7012. if (interactionType === 'touch') {
  7013. runAnimation.value = true;
  7014. var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getEnabledElement(element);
  7015. var targetLocation = Object(_getHandlePixelPosition_js__WEBPACK_IMPORTED_MODULE_3__["default"])(evtDetail, interactionType);
  7016. _animate(handle, runAnimation, enabledElement, targetLocation);
  7017. }
  7018. });
  7019. function _dragHandler(toolName, annotation, handle, options, interactionType, evt) {
  7020. var _evt$detail = evt.detail,
  7021. image = _evt$detail.image,
  7022. element = _evt$detail.element,
  7023. buttons = _evt$detail.buttons;
  7024. var targetLocation = Object(_getHandlePixelPosition_js__WEBPACK_IMPORTED_MODULE_3__["default"])(evt.detail, interactionType);
  7025. runAnimation.value = false;
  7026. handle.active = true;
  7027. handle.hasMoved = true;
  7028. handle.x = targetLocation.x;
  7029. handle.y = targetLocation.y; // TODO: A way to not flip this for textboxes on annotations
  7030. annotation.invalidated = true;
  7031. if (options.preventHandleOutsideImage) {
  7032. Object(_util_clip_js__WEBPACK_IMPORTED_MODULE_6__["clipToBox"])(handle, image);
  7033. }
  7034. _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.updateImage(element);
  7035. var activeTool = Object(_util_getActiveTool__WEBPACK_IMPORTED_MODULE_8__["default"])(element, buttons, interactionType);
  7036. if (activeTool instanceof _tools_base_BaseAnnotationTool__WEBPACK_IMPORTED_MODULE_9__["default"]) {
  7037. activeTool.updateCachedStats(image, element, annotation);
  7038. }
  7039. var eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MEASUREMENT_MODIFIED;
  7040. var modifiedEventData = {
  7041. toolName: toolName,
  7042. toolType: toolName,
  7043. // Deprecation notice: toolType will be replaced by toolName
  7044. element: element,
  7045. measurementData: annotation
  7046. };
  7047. Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_5__["default"])(element, eventType, modifiedEventData);
  7048. }
  7049. function _cancelEventHandler(toolName, evtDetail, annotation, handle) {
  7050. var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
  7051. var interactionType = arguments.length > 5 ? arguments[5] : undefined;
  7052. var _ref = arguments.length > 6 ? arguments[6] : undefined,
  7053. dragHandler = _ref.dragHandler,
  7054. upOrEndHandler = _ref.upOrEndHandler;
  7055. var doneMovingCallback = arguments.length > 7 ? arguments[7] : undefined;
  7056. _endHandler(toolName, evtDetail, annotation, handle, options, interactionType, {
  7057. dragHandler: dragHandler,
  7058. upOrEndHandler: upOrEndHandler
  7059. }, doneMovingCallback, false);
  7060. }
  7061. function _upOrEndHandler(toolName, evtDetail, annotation, handle) {
  7062. var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
  7063. var interactionType = arguments.length > 5 ? arguments[5] : undefined;
  7064. var _ref2 = arguments.length > 6 ? arguments[6] : undefined,
  7065. dragHandler = _ref2.dragHandler,
  7066. upOrEndHandler = _ref2.upOrEndHandler;
  7067. var doneMovingCallback = arguments.length > 7 ? arguments[7] : undefined;
  7068. var element = evtDetail.element;
  7069. manipulatorStateModule.setters.removeActiveManipulatorForElement(element);
  7070. _endHandler(toolName, evtDetail, annotation, handle, options, interactionType, {
  7071. dragHandler: dragHandler,
  7072. upOrEndHandler: upOrEndHandler
  7073. }, doneMovingCallback, true);
  7074. }
  7075. function _endHandler(toolName, evtDetail, annotation, handle) {
  7076. var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
  7077. var interactionType = arguments.length > 5 ? arguments[5] : undefined;
  7078. var _ref3 = arguments.length > 6 ? arguments[6] : undefined,
  7079. dragHandler = _ref3.dragHandler,
  7080. upOrEndHandler = _ref3.upOrEndHandler;
  7081. var doneMovingCallback = arguments.length > 7 ? arguments[7] : undefined;
  7082. var success = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : true;
  7083. var element = evtDetail.element;
  7084. handle.active = false;
  7085. handle.moving = false;
  7086. annotation.active = false;
  7087. annotation.invalidated = true;
  7088. runAnimation.value = false;
  7089. _store_index_js__WEBPACK_IMPORTED_MODULE_7__["state"].isToolLocked = false; // Remove Event Listeners
  7090. _dragEvents[interactionType].forEach(function (eventType) {
  7091. element.removeEventListener(eventType, dragHandler);
  7092. });
  7093. _upOrEndEvents[interactionType].forEach(function (eventType) {
  7094. element.removeEventListener(eventType, upOrEndHandler);
  7095. }); // If any handle is outside the image, delete the tool data
  7096. if (options.deleteIfHandleOutsideImage && Object(_anyHandlesOutsideImage_js__WEBPACK_IMPORTED_MODULE_2__["default"])(evtDetail, annotation.handles)) {
  7097. Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_4__["removeToolState"])(element, toolName, annotation);
  7098. } // // TODO: What dark magic makes us want to handle TOUCH_PRESS differently?
  7099. // if (evt.type === EVENTS.TOUCH_PRESS) {
  7100. // evt.detail.handlePressed = annotation;
  7101. // handle.x = image.x; // Original Event
  7102. // handle.y = image.y;
  7103. // }
  7104. if (typeof options.doneMovingCallback === 'function') {
  7105. logger.warn('`options.doneMovingCallback` has been depricated. See https://github.com/cornerstonejs/cornerstoneTools/pull/915 for details.');
  7106. options.doneMovingCallback(success);
  7107. }
  7108. if (typeof doneMovingCallback === 'function') {
  7109. doneMovingCallback(success);
  7110. }
  7111. _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.updateImage(element);
  7112. }
  7113. /**
  7114. * Animates the provided handle using `requestAnimationFrame`
  7115. * @private
  7116. * @method _animate
  7117. *
  7118. * @param {*} handle
  7119. * @param {*} runAnimation
  7120. * @param {*} enabledElement
  7121. * @param {*} targetLocation
  7122. * @returns {undefined}
  7123. */
  7124. function _animate(handle, runAnimation, enabledElement, targetLocation) {
  7125. if (!runAnimation.value) {
  7126. return;
  7127. } // Pixels / second
  7128. var distanceRemaining = Math.abs(handle.y - targetLocation.y);
  7129. var linearDistEachFrame = distanceRemaining / 10;
  7130. if (distanceRemaining < 1) {
  7131. handle.y = targetLocation.y;
  7132. runAnimation.value = false;
  7133. return;
  7134. }
  7135. if (handle.y > targetLocation.y) {
  7136. handle.y -= linearDistEachFrame;
  7137. } else if (handle.y < targetLocation.y) {
  7138. handle.y += linearDistEachFrame;
  7139. } // Update the image
  7140. _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.updateImage(enabledElement.element); // Request a new frame
  7141. _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.requestAnimationFrame(function () {
  7142. _animate(handle, runAnimation, enabledElement, targetLocation);
  7143. });
  7144. }
  7145. /***/ }),
  7146. /***/ "./manipulators/moveNewHandle.js":
  7147. /*!***************************************!*\
  7148. !*** ./manipulators/moveNewHandle.js ***!
  7149. \***************************************/
  7150. /*! exports provided: default */
  7151. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  7152. "use strict";
  7153. __webpack_require__.r(__webpack_exports__);
  7154. /* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../events.js */ "./events.js");
  7155. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
  7156. /* harmony import */ var _anyHandlesOutsideImage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./anyHandlesOutsideImage.js */ "./manipulators/anyHandlesOutsideImage.js");
  7157. /* harmony import */ var _getHandlePixelPosition_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./getHandlePixelPosition.js */ "./manipulators/getHandlePixelPosition.js");
  7158. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  7159. /* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../util/triggerEvent.js */ "./util/triggerEvent.js");
  7160. /* harmony import */ var _util_clip_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../util/clip.js */ "./util/clip.js");
  7161. /* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../store/index.js */ "./store/index.js");
  7162. /* harmony import */ var _util_getActiveTool__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../util/getActiveTool */ "./util/getActiveTool.js");
  7163. /* harmony import */ var _tools_base_BaseAnnotationTool__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../tools/base/BaseAnnotationTool */ "./tools/base/BaseAnnotationTool.js");
  7164. /* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../util/logger.js */ "./util/logger.js");
  7165. var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_10__["getLogger"])('manipulators:moveNewHandle');
  7166. var manipulatorStateModule = Object(_store_index_js__WEBPACK_IMPORTED_MODULE_7__["getModule"])('manipulatorState');
  7167. var _moveEvents = {
  7168. mouse: [_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_MOVE, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DRAG],
  7169. touch: [_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_DRAG]
  7170. };
  7171. var _moveEndEvents = {
  7172. mouse: [_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_UP, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_CLICK],
  7173. touch: [_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_END, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_PINCH, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TAP]
  7174. };
  7175. /**
  7176. * Move a new handle
  7177. *
  7178. * @public
  7179. * @method moveNewHandle
  7180. * @memberof Manipulators
  7181. *
  7182. * @param {*} eventData
  7183. * @param {*} toolName
  7184. * @param {*} annotation
  7185. * @param {*} handle
  7186. * @param {*} [options={}]
  7187. * @param {Boolean} [options.deleteIfHandleOutsideImage]
  7188. * @param {Boolean} [options.preventHandleOutsideImage]
  7189. * @param {string} [interactionType=mouse]
  7190. * @param {function} [doneMovingCallback]
  7191. * @returns {void}
  7192. */
  7193. /* harmony default export */ __webpack_exports__["default"] = (function (eventData, toolName, annotation, handle, options) {
  7194. var interactionType = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 'mouse';
  7195. var doneMovingCallback = arguments.length > 6 ? arguments[6] : undefined;
  7196. // Use global defaults, unless overidden by provided options
  7197. options = Object.assign({
  7198. deleteIfHandleOutsideImage: _store_index_js__WEBPACK_IMPORTED_MODULE_7__["state"].deleteIfHandleOutsideImage,
  7199. preventHandleOutsideImage: _store_index_js__WEBPACK_IMPORTED_MODULE_7__["state"].preventHandleOutsideImage
  7200. }, options);
  7201. options.hasMoved = false;
  7202. var element = eventData.element;
  7203. annotation.active = true;
  7204. handle.moving = true;
  7205. handle.active = true;
  7206. _store_index_js__WEBPACK_IMPORTED_MODULE_7__["state"].isToolLocked = true;
  7207. function moveHandler(evt) {
  7208. _moveHandler(toolName, annotation, handle, options, interactionType, evt);
  7209. } // So we don't need to inline the entire `moveEndEventHandler` function
  7210. function moveEndHandler(evt) {
  7211. _moveEndHandler(toolName, annotation, handle, options, interactionType, {
  7212. moveHandler: moveHandler,
  7213. moveEndHandler: moveEndHandler
  7214. }, evt, doneMovingCallback);
  7215. } // Factory function
  7216. // begin, end, cancel
  7217. // Or... Handle "CANCEL"
  7218. // TODO: SETUP IN all other manipulators
  7219. // Add event listeners
  7220. _moveEvents[interactionType].forEach(function (eventType) {
  7221. element.addEventListener(eventType, moveHandler);
  7222. });
  7223. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_START, _stopImmediatePropagation);
  7224. _moveEndEvents[interactionType].forEach(function (eventType) {
  7225. element.addEventListener(eventType, moveEndHandler);
  7226. }); // When cancelling... What is our active tool?
  7227. // `isToolLocked` ... Track which (annotation) tool is being manipulated
  7228. // If not "completed", removeToolState (maybe an `isComplete` flag)
  7229. // 5 locations: MEASUREMENT_COMPLETED
  7230. // Firing event... Sets `isCompleted` flag for annotation uuid
  7231. manipulatorStateModule.setters.addActiveManipulatorForElement(element, _cancelEventHandler.bind(null, annotation, handle, options, interactionType, {
  7232. moveHandler: moveHandler,
  7233. moveEndHandler: moveEndHandler
  7234. }, element, doneMovingCallback));
  7235. });
  7236. /**
  7237. * Updates annotation as the "pointer" is moved/dragged
  7238. * Emits `cornerstonetoolsmeasurementmodified` events
  7239. *
  7240. * @param {string} toolName
  7241. * @param {*} annotation
  7242. * @param {*} handle
  7243. * @param {*} options
  7244. * @param {string} interactionType
  7245. * @param {*} evt
  7246. *
  7247. * @returns {void}
  7248. */
  7249. function _moveHandler(toolName, annotation, handle, options, interactionType, evt) {
  7250. var _evt$detail = evt.detail,
  7251. image = _evt$detail.image,
  7252. element = _evt$detail.element,
  7253. buttons = _evt$detail.buttons;
  7254. var targetLocation = Object(_getHandlePixelPosition_js__WEBPACK_IMPORTED_MODULE_3__["default"])(evt.detail, interactionType);
  7255. options.hasMoved = true;
  7256. annotation.invalidated = true;
  7257. handle.active = true;
  7258. handle.x = targetLocation.x;
  7259. handle.y = targetLocation.y;
  7260. if (options && options.preventHandleOutsideImage) {
  7261. Object(_util_clip_js__WEBPACK_IMPORTED_MODULE_6__["clipToBox"])(handle, image);
  7262. }
  7263. _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.updateImage(element);
  7264. var activeTool = Object(_util_getActiveTool__WEBPACK_IMPORTED_MODULE_8__["default"])(element, buttons, interactionType);
  7265. if (activeTool instanceof _tools_base_BaseAnnotationTool__WEBPACK_IMPORTED_MODULE_9__["default"]) {
  7266. activeTool.updateCachedStats(image, element, annotation);
  7267. }
  7268. var eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MEASUREMENT_MODIFIED;
  7269. var modifiedEventData = {
  7270. toolName: toolName,
  7271. toolType: toolName,
  7272. // Deprecation notice: toolType will be replaced by toolName
  7273. element: element,
  7274. measurementData: annotation
  7275. };
  7276. Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_5__["default"])(element, eventType, modifiedEventData);
  7277. }
  7278. function _endHandler(interactionType, options, element, _ref, doneMovingCallback) {
  7279. var moveHandler = _ref.moveHandler,
  7280. moveEndHandler = _ref.moveEndHandler;
  7281. var success = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true;
  7282. // Remove event listeners
  7283. _moveEvents[interactionType].forEach(function (eventType) {
  7284. element.removeEventListener(eventType, moveHandler);
  7285. });
  7286. _moveEndEvents[interactionType].forEach(function (eventType) {
  7287. element.removeEventListener(eventType, moveEndHandler);
  7288. });
  7289. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_START, _stopImmediatePropagation);
  7290. _store_index_js__WEBPACK_IMPORTED_MODULE_7__["state"].isToolLocked = false;
  7291. if (typeof doneMovingCallback === 'function') {
  7292. doneMovingCallback(success);
  7293. }
  7294. if (typeof options.doneMovingCallback === 'function') {
  7295. logger.warn('`options.doneMovingCallback` has been depricated. See https://github.com/cornerstonejs/cornerstoneTools/pull/915 for details.');
  7296. options.doneMovingCallback(success);
  7297. } // Update Image
  7298. _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.updateImage(element);
  7299. }
  7300. function _moveEndHandler(toolName, annotation, handle, options, interactionType, _ref2, evt, doneMovingCallback) {
  7301. var moveHandler = _ref2.moveHandler,
  7302. moveEndHandler = _ref2.moveEndHandler;
  7303. var eventData = evt.detail;
  7304. var element = eventData.element;
  7305. var moveNewHandleSuccessful = true;
  7306. if (options.hasMoved === false) {
  7307. return;
  7308. }
  7309. var targetLocation = Object(_getHandlePixelPosition_js__WEBPACK_IMPORTED_MODULE_3__["default"])(eventData, interactionType); // "Release" the handle
  7310. annotation.active = false;
  7311. annotation.invalidated = true;
  7312. handle.active = false;
  7313. handle.moving = false;
  7314. handle.x = targetLocation.x;
  7315. handle.y = targetLocation.y;
  7316. manipulatorStateModule.setters.removeActiveManipulatorForElement(element); // TODO: WHY?
  7317. // Why would a Touch_Pinch or Touch_Press be associated with a new handle?
  7318. // if (evt.type === EVENTS.TOUCH_PINCH || evt.type === EVENTS.TOUCH_PRESS) {
  7319. // handle.active = false;
  7320. // external.cornerstone.updateImage(element);
  7321. // if (typeof options.doneMovingCallback === 'function') {
  7322. // logger.warn(
  7323. // '`options.doneMovingCallback` has been depricated. See https://github.com/cornerstonejs/cornerstoneTools/pull/915 for details.'
  7324. // );
  7325. // options.doneMovingCallback(success);
  7326. // }
  7327. // if (typeof doneMovingCallback === 'function') {
  7328. // doneMovingCallback(success);
  7329. // }
  7330. // return;
  7331. // }
  7332. if (options.preventHandleOutsideImage) {
  7333. Object(_util_clip_js__WEBPACK_IMPORTED_MODULE_6__["clipToBox"])(handle, evt.detail.image);
  7334. } // If any handle is outside the image, delete the tool data
  7335. if (options.deleteIfHandleOutsideImage && Object(_anyHandlesOutsideImage_js__WEBPACK_IMPORTED_MODULE_2__["default"])(evt.detail, annotation.handles)) {
  7336. annotation.cancelled = true;
  7337. moveNewHandleSuccessful = false;
  7338. Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_4__["removeToolState"])(element, toolName, annotation);
  7339. }
  7340. _endHandler(interactionType, options, element, {
  7341. moveHandler: moveHandler,
  7342. moveEndHandler: moveEndHandler
  7343. }, doneMovingCallback, moveNewHandleSuccessful);
  7344. }
  7345. function _cancelEventHandler(annotation, handle, options, interactionType, _ref3, element, doneMovingCallback) {
  7346. var moveHandler = _ref3.moveHandler,
  7347. moveEndHandler = _ref3.moveEndHandler;
  7348. // "Release" the handle
  7349. annotation.active = false;
  7350. annotation.invalidated = true;
  7351. handle.active = false;
  7352. _endHandler(interactionType, options, element, {
  7353. moveHandler: moveHandler,
  7354. moveEndHandler: moveEndHandler
  7355. }, doneMovingCallback, false);
  7356. }
  7357. /**
  7358. * Stop the CornerstoneToolsTouchStart event from
  7359. * Becoming a CornerstoneToolsTouchStartActive event when
  7360. * MoveNewHandle ends
  7361. *
  7362. * @private
  7363. * @function _stopImmediatePropagation
  7364. *
  7365. * @param {*} evt
  7366. * @returns {Boolean} false
  7367. */
  7368. function _stopImmediatePropagation(evt) {
  7369. evt.stopImmediatePropagation();
  7370. return false;
  7371. }
  7372. /***/ }),
  7373. /***/ "./mixins/activeOrDisabledBinaryTool.js":
  7374. /*!**********************************************!*\
  7375. !*** ./mixins/activeOrDisabledBinaryTool.js ***!
  7376. \**********************************************/
  7377. /*! exports provided: default */
  7378. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  7379. "use strict";
  7380. __webpack_require__.r(__webpack_exports__);
  7381. /* harmony import */ var _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../store/setToolMode.js */ "./store/setToolMode.js");
  7382. /**
  7383. * If one attempts to change mode to 'passive', redirect the tool to 'disabled'.
  7384. *
  7385. * @param {HTMLElement} element The element on which the tool resides.
  7386. * @returns {undefined}
  7387. */
  7388. function passiveCallback(element) {
  7389. Object(_store_setToolMode_js__WEBPACK_IMPORTED_MODULE_0__["setToolDisabledForElement"])(element, this.name);
  7390. }
  7391. /**
  7392. * If one attempts to turn the tool 'enabled', redirect the tool to 'active'.
  7393. *
  7394. * @param {HTMLElement} element The element on which the tool resides.
  7395. * @returns {undefined}
  7396. */
  7397. function enabledCallback(element) {
  7398. Object(_store_setToolMode_js__WEBPACK_IMPORTED_MODULE_0__["setToolActiveForElement"])(element, this.name);
  7399. }
  7400. /**
  7401. * @mixin activeOrDisabledBinaryTool - Redirect enabled/passive mode changes to active/disabled.
  7402. * @memberof Mixins
  7403. */
  7404. /* harmony default export */ __webpack_exports__["default"] = ({
  7405. passiveCallback: passiveCallback,
  7406. enabledCallback: enabledCallback
  7407. });
  7408. /***/ }),
  7409. /***/ "./mixins/enabledOrDisabledBinaryTool.js":
  7410. /*!***********************************************!*\
  7411. !*** ./mixins/enabledOrDisabledBinaryTool.js ***!
  7412. \***********************************************/
  7413. /*! exports provided: default */
  7414. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  7415. "use strict";
  7416. __webpack_require__.r(__webpack_exports__);
  7417. /* harmony import */ var _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../store/setToolMode.js */ "./store/setToolMode.js");
  7418. /**
  7419. * If one attempts to change mode to 'passive', redirect the tool to 'disabled'.
  7420. *
  7421. * @param {HTMLElement} element The element on which the tool resides.
  7422. * @returns {undefined}
  7423. */
  7424. function passiveCallback(element) {
  7425. Object(_store_setToolMode_js__WEBPACK_IMPORTED_MODULE_0__["setToolDisabledForElement"])(element, this.name);
  7426. }
  7427. /**
  7428. * If one attempts to change mode to 'active', redirect the tool to 'enabled'.
  7429. *
  7430. * @param {HTMLElement} element The element on which the tool resides.
  7431. * @returns {undefined}
  7432. */
  7433. function activeCallback(element) {
  7434. Object(_store_setToolMode_js__WEBPACK_IMPORTED_MODULE_0__["setToolEnabledForElement"])(element, this.name);
  7435. }
  7436. /**
  7437. *
  7438. * @mixin enabledOrDisabledBinaryTool - Redirect active/passive mode changes to enabled/disabled.
  7439. * @memberof Mixins
  7440. */
  7441. /* harmony default export */ __webpack_exports__["default"] = ({
  7442. passiveCallback: passiveCallback,
  7443. activeCallback: activeCallback
  7444. });
  7445. /***/ }),
  7446. /***/ "./mixins/index.js":
  7447. /*!*************************!*\
  7448. !*** ./mixins/index.js ***!
  7449. \*************************/
  7450. /*! exports provided: default */
  7451. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  7452. "use strict";
  7453. __webpack_require__.r(__webpack_exports__);
  7454. /* harmony import */ var _activeOrDisabledBinaryTool_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./activeOrDisabledBinaryTool.js */ "./mixins/activeOrDisabledBinaryTool.js");
  7455. /* harmony import */ var _enabledOrDisabledBinaryTool_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./enabledOrDisabledBinaryTool.js */ "./mixins/enabledOrDisabledBinaryTool.js");
  7456. /* harmony import */ var _segmentation_circleSegmentationMixin_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./segmentation/circleSegmentationMixin.js */ "./mixins/segmentation/circleSegmentationMixin.js");
  7457. /* harmony import */ var _segmentation_polylineSegmentationMixin_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./segmentation/polylineSegmentationMixin.js */ "./mixins/segmentation/polylineSegmentationMixin.js");
  7458. /* harmony import */ var _segmentation_freehandSegmentationMixin_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./segmentation/freehandSegmentationMixin.js */ "./mixins/segmentation/freehandSegmentationMixin.js");
  7459. /* harmony import */ var _segmentation_rectangleSegmentationMixin_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./segmentation/rectangleSegmentationMixin.js */ "./mixins/segmentation/rectangleSegmentationMixin.js");
  7460. /* harmony import */ var _segmentation_renderBrushMixin_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./segmentation/renderBrushMixin.js */ "./mixins/segmentation/renderBrushMixin.js");
  7461. /* harmony default export */ __webpack_exports__["default"] = ({
  7462. activeOrDisabledBinaryTool: _activeOrDisabledBinaryTool_js__WEBPACK_IMPORTED_MODULE_0__["default"],
  7463. enabledOrDisabledBinaryTool: _enabledOrDisabledBinaryTool_js__WEBPACK_IMPORTED_MODULE_1__["default"],
  7464. circleSegmentationMixin: _segmentation_circleSegmentationMixin_js__WEBPACK_IMPORTED_MODULE_2__["default"],
  7465. polylineSegmentationMixin: _segmentation_polylineSegmentationMixin_js__WEBPACK_IMPORTED_MODULE_3__["default"],
  7466. freehandSegmentationMixin: _segmentation_freehandSegmentationMixin_js__WEBPACK_IMPORTED_MODULE_4__["default"],
  7467. rectangleSegmentationMixin: _segmentation_rectangleSegmentationMixin_js__WEBPACK_IMPORTED_MODULE_5__["default"],
  7468. renderBrushMixin: _segmentation_renderBrushMixin_js__WEBPACK_IMPORTED_MODULE_6__["default"]
  7469. });
  7470. /***/ }),
  7471. /***/ "./mixins/segmentation/circleSegmentationMixin.js":
  7472. /*!********************************************************!*\
  7473. !*** ./mixins/segmentation/circleSegmentationMixin.js ***!
  7474. \********************************************************/
  7475. /*! exports provided: default */
  7476. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  7477. "use strict";
  7478. __webpack_require__.r(__webpack_exports__);
  7479. /* harmony import */ var _drawing__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../drawing */ "./drawing/index.js");
  7480. /* harmony import */ var _externalModules__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../externalModules */ "./externalModules.js");
  7481. /* harmony import */ var _util_isEmptyObject__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../util/isEmptyObject */ "./util/isEmptyObject.js");
  7482. /* harmony import */ var _store__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../store */ "./store/index.js");
  7483. /* harmony import */ var _util_segmentation__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../util/segmentation */ "./util/segmentation/index.js");
  7484. var _getModule = Object(_store__WEBPACK_IMPORTED_MODULE_3__["getModule"])('segmentation'),
  7485. getters = _getModule.getters,
  7486. setters = _getModule.setters;
  7487. /**
  7488. * Sets the start and end handle points to empty objects
  7489. *
  7490. * @private
  7491. * @method _resetHandles
  7492. * @returns {undefined}
  7493. */
  7494. function _resetHandles() {
  7495. this.handles = {
  7496. start: {},
  7497. end: {}
  7498. };
  7499. }
  7500. /**
  7501. * Render hook: draws the Scissors's outline, box, or circle
  7502. *
  7503. * @param {Object} evt Cornerstone.event#cornerstoneimagerendered > cornerstoneimagerendered event
  7504. * @memberof Tools.ScissorsTool
  7505. * @returns {void}
  7506. */
  7507. function renderToolData(evt) {
  7508. var _this = this;
  7509. var eventData = evt.detail;
  7510. var element = eventData.element;
  7511. var color = getters.brushColor(element, true);
  7512. var context = Object(_drawing__WEBPACK_IMPORTED_MODULE_0__["getNewContext"])(eventData.canvasContext.canvas);
  7513. var distance = _externalModules__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.distance;
  7514. Object(_drawing__WEBPACK_IMPORTED_MODULE_0__["draw"])(context, function (context) {
  7515. if (!_this.handles) {
  7516. return null;
  7517. }
  7518. var startCanvas = _externalModules__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, _this.handles.start);
  7519. var endCanvas = _externalModules__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, _this.handles.end); // Calculating the radius where startCanvas is the center of the circle to be drawn
  7520. var radius = distance(startCanvas, endCanvas); // Draw Circle
  7521. Object(_drawing__WEBPACK_IMPORTED_MODULE_0__["drawCircle"])(context, element, _this.handles.start, radius, {
  7522. color: color
  7523. });
  7524. });
  7525. }
  7526. /**
  7527. * Sets the start handle point and claims the eventDispatcher event
  7528. *
  7529. * @private
  7530. * @param {*} evt // mousedown, touchstart, click
  7531. * @returns {Boolean} True
  7532. */
  7533. function _startOutliningRegion(evt) {
  7534. var consumeEvent = true;
  7535. var element = evt.detail.element;
  7536. var image = evt.detail.currentPoints.image;
  7537. if (Object(_util_isEmptyObject__WEBPACK_IMPORTED_MODULE_2__["default"])(this.handles.start)) {
  7538. this.handles.start = image;
  7539. } else {
  7540. this.handles.end = image;
  7541. this._applyStrategy(evt);
  7542. }
  7543. _externalModules__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.updateImage(element);
  7544. return consumeEvent;
  7545. }
  7546. /**
  7547. * This function will update the handles and updateImage to force re-draw
  7548. *
  7549. * @private
  7550. * @method _setHandlesAndUpdate
  7551. * @param {(CornerstoneTools.event#TOUCH_DRAG|CornerstoneTools.event#MOUSE_DRAG|CornerstoneTools.event#MOUSE_MOVE)} evt Interaction event emitted by an enabledElement
  7552. * @returns {void}
  7553. */
  7554. function _setHandlesAndUpdate(evt) {
  7555. var _evt$detail = evt.detail,
  7556. element = _evt$detail.element,
  7557. currentPoints = _evt$detail.currentPoints;
  7558. var image = currentPoints.image;
  7559. this.handles.end = image;
  7560. _externalModules__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.updateImage(element);
  7561. }
  7562. /**
  7563. * Event handler for MOUSE_UP/TOUCH_END during handle drag event loop.
  7564. *
  7565. * @private
  7566. * @method _applyStrategy
  7567. * @param {(CornerstoneTools.event#MOUSE_UP|CornerstoneTools.event#TOUCH_END)} evt Interaction event emitted by an enabledElement
  7568. * @returns {void}
  7569. */
  7570. function _applyStrategy(evt) {
  7571. evt.detail.handles = this.handles;
  7572. var element = evt.detail.element;
  7573. var _getters$labelmap2D = getters.labelmap2D(element),
  7574. labelmap2D = _getters$labelmap2D.labelmap2D,
  7575. labelmap3D = _getters$labelmap2D.labelmap3D,
  7576. currentImageIdIndex = _getters$labelmap2D.currentImageIdIndex;
  7577. var pixelData = labelmap2D.pixelData;
  7578. var previousPixeldata = pixelData.slice();
  7579. var points = {
  7580. start: {
  7581. x: this.handles.start.x,
  7582. y: this.handles.start.y
  7583. },
  7584. end: {
  7585. x: this.handles.end.x,
  7586. y: this.handles.end.y
  7587. }
  7588. };
  7589. var operationData = {
  7590. points: points,
  7591. pixelData: pixelData,
  7592. segmentIndex: labelmap3D.activeSegmentIndex,
  7593. segmentationMixinType: "circleSegmentationMixin"
  7594. };
  7595. this.applyActiveStrategy(evt, operationData);
  7596. var operation = {
  7597. imageIdIndex: currentImageIdIndex,
  7598. diff: Object(_util_segmentation__WEBPACK_IMPORTED_MODULE_4__["getDiffBetweenPixelData"])(previousPixeldata, pixelData)
  7599. };
  7600. setters.pushState(this.element, [operation]); // Invalidate the brush tool data so it is redrawn
  7601. setters.updateSegmentsOnLabelmap2D(labelmap2D);
  7602. _externalModules__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.updateImage(element);
  7603. this._resetHandles();
  7604. }
  7605. /**
  7606. * @mixin circleSegmentationMixin - Segmentation operations for circles.
  7607. * @memberof Mixins
  7608. */
  7609. /* harmony default export */ __webpack_exports__["default"] = ({
  7610. postTouchStartCallback: _startOutliningRegion,
  7611. postMouseDownCallback: _startOutliningRegion,
  7612. mouseClickCallback: _startOutliningRegion,
  7613. touchDragCallback: _setHandlesAndUpdate,
  7614. mouseDragCallback: _setHandlesAndUpdate,
  7615. mouseMoveCallback: _setHandlesAndUpdate,
  7616. touchEndCallback: _applyStrategy,
  7617. mouseUpCallback: _applyStrategy,
  7618. initializeMixin: _resetHandles,
  7619. renderToolData: renderToolData,
  7620. _resetHandles: _resetHandles,
  7621. _applyStrategy: _applyStrategy
  7622. });
  7623. /***/ }),
  7624. /***/ "./mixins/segmentation/freehandSegmentationMixin.js":
  7625. /*!**********************************************************!*\
  7626. !*** ./mixins/segmentation/freehandSegmentationMixin.js ***!
  7627. \**********************************************************/
  7628. /*! exports provided: default */
  7629. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  7630. "use strict";
  7631. __webpack_require__.r(__webpack_exports__);
  7632. /* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "../node_modules/@babel/runtime/helpers/toConsumableArray.js");
  7633. /* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__);
  7634. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../externalModules.js */ "./externalModules.js");
  7635. /* harmony import */ var _store__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../store */ "./store/index.js");
  7636. /* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../util/logger.js */ "./util/logger.js");
  7637. /* harmony import */ var _drawing__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../drawing */ "./drawing/index.js");
  7638. /* harmony import */ var _util_segmentation__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../util/segmentation */ "./util/segmentation/index.js");
  7639. var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_3__["getLogger"])('tools:ScissorsTool');
  7640. var _getModule = Object(_store__WEBPACK_IMPORTED_MODULE_2__["getModule"])('segmentation'),
  7641. getters = _getModule.getters,
  7642. setters = _getModule.setters;
  7643. /**
  7644. * Render hook: draws the FreehandScissors's outline
  7645. *
  7646. * @param {Object} evt Cornerstone.event#cornerstoneimagerendered > cornerstoneimagerendered event
  7647. * @memberof Tools.ScissorsTool
  7648. * @returns {void}
  7649. */
  7650. function renderToolData(evt) {
  7651. var eventData = evt.detail;
  7652. var element = eventData.element;
  7653. var color = getters.brushColor(element, true);
  7654. var context = Object(_drawing__WEBPACK_IMPORTED_MODULE_4__["getNewContext"])(eventData.canvasContext.canvas);
  7655. var points = this.handles.points;
  7656. if (points.length < 2) {
  7657. return;
  7658. }
  7659. Object(_drawing__WEBPACK_IMPORTED_MODULE_4__["draw"])(context, function (context) {
  7660. for (var j = 0; j < points.length; j++) {
  7661. var lines = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(points[j].lines);
  7662. if (j === points.length - 1) {
  7663. // If it's still being actively drawn, keep the last line to
  7664. // The mouse location
  7665. lines.push(points[0]);
  7666. }
  7667. Object(_drawing__WEBPACK_IMPORTED_MODULE_4__["drawJoinedLines"])(context, element, points[j], lines, {
  7668. color: color
  7669. });
  7670. }
  7671. });
  7672. }
  7673. /**
  7674. * Sets the start handle point and claims the eventDispatcher event
  7675. *
  7676. * @private
  7677. * @param {*} evt // mousedown, touchstart, click
  7678. * @returns {void|null}
  7679. */
  7680. function _startOutliningRegion(evt) {
  7681. var element = evt.detail.element;
  7682. var image = evt.detail.currentPoints.image;
  7683. var points = this.handles.points;
  7684. if (!points.length) {
  7685. logger.warn('Something went wrong, empty handles detected.');
  7686. return null;
  7687. }
  7688. points.push({
  7689. x: image.x,
  7690. y: image.y,
  7691. lines: []
  7692. });
  7693. this.currentHandle += 1;
  7694. _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.updateImage(element);
  7695. }
  7696. /**
  7697. * This function will update the handles and updateImage to force re-draw
  7698. *
  7699. * @private
  7700. * @method _setHandlesAndUpdate
  7701. * @param {(CornerstoneTools.event#TOUCH_DRAG|CornerstoneTools.event#MOUSE_DRAG|CornerstoneTools.event#MOUSE_MOVE)} evt Interaction event emitted by an enabledElement
  7702. * @returns {void}
  7703. */
  7704. function _setHandlesAndUpdate(evt) {
  7705. var eventData = evt.detail;
  7706. var element = evt.detail.element;
  7707. this._addPoint(eventData);
  7708. _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.updateImage(element);
  7709. }
  7710. /**
  7711. * Event handler for MOUSE_UP/TOUCH_END during handle drag event loop.
  7712. *
  7713. * @private
  7714. * @method _applyStrategy
  7715. * @param {(CornerstoneTools.event#MOUSE_UP|CornerstoneTools.event#TOUCH_END)} evt Interaction event emitted by an enabledElement
  7716. * @returns {void}
  7717. */
  7718. function _applyStrategy(evt) {
  7719. var points = this.handles.points;
  7720. var element = evt.detail.element;
  7721. var _getters$labelmap2D = getters.labelmap2D(element),
  7722. labelmap2D = _getters$labelmap2D.labelmap2D,
  7723. labelmap3D = _getters$labelmap2D.labelmap3D,
  7724. currentImageIdIndex = _getters$labelmap2D.currentImageIdIndex;
  7725. var pixelData = labelmap2D.pixelData;
  7726. var previousPixeldata = pixelData.slice();
  7727. var operationData = {
  7728. points: points,
  7729. pixelData: pixelData,
  7730. segmentIndex: labelmap3D.activeSegmentIndex,
  7731. segmentationMixinType: "freehandSegmentationMixin"
  7732. };
  7733. this.applyActiveStrategy(evt, operationData);
  7734. var operation = {
  7735. imageIdIndex: currentImageIdIndex,
  7736. diff: Object(_util_segmentation__WEBPACK_IMPORTED_MODULE_5__["getDiffBetweenPixelData"])(previousPixeldata, pixelData)
  7737. };
  7738. setters.pushState(this.element, [operation]); // Invalidate the brush tool data so it is redrawn
  7739. setters.updateSegmentsOnLabelmap2D(labelmap2D);
  7740. _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.updateImage(element);
  7741. this._resetHandles();
  7742. }
  7743. /**
  7744. * Sets the start and end handle points to empty objects
  7745. *
  7746. * @private
  7747. * @method _resetHandles
  7748. * @returns {undefined}
  7749. */
  7750. function _resetHandles() {
  7751. this.handles = {
  7752. points: []
  7753. };
  7754. this.currentHandle = 0;
  7755. }
  7756. /**
  7757. * Adds a point on mouse click in polygon mode.
  7758. *
  7759. * @private
  7760. * @param {Object} evt - data object associated with an event.
  7761. * @returns {void}
  7762. */
  7763. function _addPoint(evt) {
  7764. var points = this.handles.points;
  7765. if (points.length) {
  7766. // Add the line from the current handle to the new handle
  7767. points[this.currentHandle - 1].lines.push({
  7768. x: evt.currentPoints.image.x,
  7769. y: evt.currentPoints.image.y,
  7770. lines: []
  7771. });
  7772. } // Add the new handle
  7773. points.push({
  7774. x: evt.currentPoints.image.x,
  7775. y: evt.currentPoints.image.y,
  7776. lines: []
  7777. }); // Increment the current handle value
  7778. this.currentHandle += 1; // Force onImageRendered to fire
  7779. _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.updateImage(evt.element);
  7780. }
  7781. /**
  7782. * @mixin freehandSegmentationMixin - segmentation operations for freehand
  7783. * @memberof Mixins
  7784. */
  7785. /* harmony default export */ __webpack_exports__["default"] = ({
  7786. postTouchStartCallback: _startOutliningRegion,
  7787. postMouseDownCallback: _startOutliningRegion,
  7788. mouseClickCallback: _startOutliningRegion,
  7789. touchDragCallback: _setHandlesAndUpdate,
  7790. mouseDragCallback: _setHandlesAndUpdate,
  7791. mouseMoveCallback: _setHandlesAndUpdate,
  7792. touchEndCallback: _applyStrategy,
  7793. mouseUpCallback: _applyStrategy,
  7794. initializeMixin: _resetHandles,
  7795. renderToolData: renderToolData,
  7796. _resetHandles: _resetHandles,
  7797. _addPoint: _addPoint,
  7798. _applyStrategy: _applyStrategy
  7799. });
  7800. /***/ }),
  7801. /***/ "./mixins/segmentation/polylineSegmentationMixin.js":
  7802. /*!**********************************************************!*\
  7803. !*** ./mixins/segmentation/polylineSegmentationMixin.js ***!
  7804. \**********************************************************/
  7805. /*! exports provided: default */
  7806. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  7807. "use strict";
  7808. __webpack_require__.r(__webpack_exports__);
  7809. /* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "../node_modules/@babel/runtime/helpers/toConsumableArray.js");
  7810. /* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__);
  7811. /* harmony import */ var _drawing__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../drawing */ "./drawing/index.js");
  7812. /* harmony import */ var _store__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../store */ "./store/index.js");
  7813. /* harmony import */ var _freehandSegmentationMixin__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./freehandSegmentationMixin */ "./mixins/segmentation/freehandSegmentationMixin.js");
  7814. var _getModule = Object(_store__WEBPACK_IMPORTED_MODULE_2__["getModule"])('segmentation'),
  7815. getters = _getModule.getters;
  7816. /**
  7817. * Override for `freehandSegmentationMixin`'s `renderToolData` method to render a polyline instead
  7818. * of a freehand region with the first and last point connected. Apply after the `freehandSegmentationMixin`.
  7819. *
  7820. * @override
  7821. * @param {Object} evt The cornerstone render event.
  7822. * @returns {null}
  7823. */
  7824. function renderToolData(evt) {
  7825. var _this = this;
  7826. var eventData = evt.detail;
  7827. var element = eventData.element;
  7828. var color = getters.brushColor(element, true);
  7829. var context = Object(_drawing__WEBPACK_IMPORTED_MODULE_1__["getNewContext"])(eventData.canvasContext.canvas);
  7830. var handles = this.handles;
  7831. Object(_drawing__WEBPACK_IMPORTED_MODULE_1__["draw"])(context, function (context) {
  7832. var isNotTheFirstHandle = handles.points.length > 1;
  7833. if (isNotTheFirstHandle) {
  7834. for (var j = 0; j < handles.points.length; j++) {
  7835. var lines = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(handles.points[j].lines);
  7836. Object(_drawing__WEBPACK_IMPORTED_MODULE_1__["drawJoinedLines"])(context, element, _this.handles.points[j], lines, {
  7837. color: color
  7838. });
  7839. }
  7840. }
  7841. });
  7842. }
  7843. var polylineSegmentationMixin = Object.assign({}, _freehandSegmentationMixin__WEBPACK_IMPORTED_MODULE_3__["default"], {
  7844. renderToolData: renderToolData
  7845. });
  7846. /**
  7847. * @mixin freehandPolylineRenderOverride - segmentation operations for corrections Polyline
  7848. * @memberof Mixins
  7849. */
  7850. /* harmony default export */ __webpack_exports__["default"] = (polylineSegmentationMixin);
  7851. /***/ }),
  7852. /***/ "./mixins/segmentation/rectangleSegmentationMixin.js":
  7853. /*!***********************************************************!*\
  7854. !*** ./mixins/segmentation/rectangleSegmentationMixin.js ***!
  7855. \***********************************************************/
  7856. /*! exports provided: default */
  7857. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  7858. "use strict";
  7859. __webpack_require__.r(__webpack_exports__);
  7860. /* harmony import */ var _drawing__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../drawing */ "./drawing/index.js");
  7861. /* harmony import */ var _externalModules__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../externalModules */ "./externalModules.js");
  7862. /* harmony import */ var _util_isEmptyObject__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../util/isEmptyObject */ "./util/isEmptyObject.js");
  7863. /* harmony import */ var _store__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../store */ "./store/index.js");
  7864. /* harmony import */ var _util_segmentation__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../util/segmentation */ "./util/segmentation/index.js");
  7865. var _getModule = Object(_store__WEBPACK_IMPORTED_MODULE_3__["getModule"])('segmentation'),
  7866. getters = _getModule.getters,
  7867. setters = _getModule.setters;
  7868. /**
  7869. * Render hook: draws the Scissors's outline, box, or circle
  7870. *
  7871. * @param {Object} evt Cornerstone.event#cornerstoneimagerendered > cornerstoneimagerendered event
  7872. * @memberof Tools.ScissorsTool
  7873. * @returns {void}
  7874. */
  7875. function renderToolData(evt) {
  7876. var _this = this;
  7877. var eventData = evt.detail;
  7878. var element = eventData.element;
  7879. var color = getters.brushColor(element, true);
  7880. var context = Object(_drawing__WEBPACK_IMPORTED_MODULE_0__["getNewContext"])(eventData.canvasContext.canvas);
  7881. Object(_drawing__WEBPACK_IMPORTED_MODULE_0__["draw"])(context, function (context) {
  7882. Object(_drawing__WEBPACK_IMPORTED_MODULE_0__["drawRect"])(context, element, _this.handles.start, _this.handles.end, {
  7883. color: color
  7884. });
  7885. });
  7886. }
  7887. /**
  7888. * Sets the start handle point and claims the eventDispatcher event
  7889. *
  7890. * @private
  7891. * @param {*} evt // mousedown, touchstart, click
  7892. * @returns {Boolean} True
  7893. */
  7894. function _startOutliningRegion(evt) {
  7895. var consumeEvent = true;
  7896. var element = evt.detail.element;
  7897. var image = evt.detail.currentPoints.image;
  7898. if (Object(_util_isEmptyObject__WEBPACK_IMPORTED_MODULE_2__["default"])(this.handles.start)) {
  7899. this.handles.start = image;
  7900. } else {
  7901. this.handles.end = image;
  7902. this._applyStrategy(evt);
  7903. }
  7904. _externalModules__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.updateImage(element);
  7905. return consumeEvent;
  7906. }
  7907. /**
  7908. * This function will update the handles and updateImage to force re-draw
  7909. *
  7910. * @private
  7911. * @method _setHandlesAndUpdate
  7912. * @param {(CornerstoneTools.event#TOUCH_DRAG|CornerstoneTools.event#MOUSE_DRAG|CornerstoneTools.event#MOUSE_MOVE)} evt Interaction event emitted by an enabledElement
  7913. * @returns {void}
  7914. */
  7915. function _setHandlesAndUpdate(evt) {
  7916. var _evt$detail = evt.detail,
  7917. element = _evt$detail.element,
  7918. image = _evt$detail.currentPoints.image;
  7919. this.handles.end = image;
  7920. _externalModules__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.updateImage(element);
  7921. }
  7922. /**
  7923. * Event handler for MOUSE_UP/TOUCH_END during handle drag event loop.
  7924. *
  7925. * @private
  7926. * @method _applyStrategy
  7927. * @param {(CornerstoneTools.event#MOUSE_UP|CornerstoneTools.event#TOUCH_END)} evt Interaction event emitted by an enabledElement
  7928. * @returns {void}
  7929. */
  7930. function _applyStrategy(evt) {
  7931. evt.detail.handles = this.handles;
  7932. var element = evt.detail.element;
  7933. var _getters$labelmap2D = getters.labelmap2D(element),
  7934. labelmap2D = _getters$labelmap2D.labelmap2D,
  7935. labelmap3D = _getters$labelmap2D.labelmap3D,
  7936. currentImageIdIndex = _getters$labelmap2D.currentImageIdIndex;
  7937. var pixelData = labelmap2D.pixelData;
  7938. var previousPixeldata = pixelData.slice();
  7939. var points = [{
  7940. x: this.handles.start.x,
  7941. y: this.handles.start.y
  7942. }, {
  7943. x: this.handles.end.x,
  7944. y: this.handles.end.y
  7945. }];
  7946. var operationData = {
  7947. points: points,
  7948. pixelData: pixelData,
  7949. segmentIndex: labelmap3D.activeSegmentIndex,
  7950. segmentationMixinType: "rectangleSegmentationMixin"
  7951. };
  7952. this.applyActiveStrategy(evt, operationData);
  7953. var operation = {
  7954. imageIdIndex: currentImageIdIndex,
  7955. diff: Object(_util_segmentation__WEBPACK_IMPORTED_MODULE_4__["getDiffBetweenPixelData"])(previousPixeldata, pixelData)
  7956. };
  7957. setters.pushState(this.element, [operation]); // Invalidate the brush tool data so it is redrawn
  7958. setters.updateSegmentsOnLabelmap2D(labelmap2D);
  7959. _externalModules__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.updateImage(element);
  7960. this._resetHandles();
  7961. }
  7962. /**
  7963. * Sets the start and end handle points to empty objects
  7964. *
  7965. * @private
  7966. * @method _resetHandles
  7967. * @returns {void}
  7968. */
  7969. function _resetHandles() {
  7970. this.handles = {
  7971. start: {},
  7972. end: {}
  7973. };
  7974. }
  7975. /**
  7976. * @mixin rectangleSegmentationMixin - segmentation operations for rectangles
  7977. * @memberof Mixins
  7978. */
  7979. /* harmony default export */ __webpack_exports__["default"] = ({
  7980. postTouchStartCallback: _startOutliningRegion,
  7981. postMouseDownCallback: _startOutliningRegion,
  7982. mouseClickCallback: _startOutliningRegion,
  7983. touchDragCallback: _setHandlesAndUpdate,
  7984. mouseDragCallback: _setHandlesAndUpdate,
  7985. mouseMoveCallback: _setHandlesAndUpdate,
  7986. touchEndCallback: _applyStrategy,
  7987. mouseUpCallback: _applyStrategy,
  7988. initializeMixin: _resetHandles,
  7989. renderToolData: renderToolData,
  7990. _resetHandles: _resetHandles,
  7991. _applyStrategy: _applyStrategy
  7992. });
  7993. /***/ }),
  7994. /***/ "./mixins/segmentation/renderBrushMixin.js":
  7995. /*!*************************************************!*\
  7996. !*** ./mixins/segmentation/renderBrushMixin.js ***!
  7997. \*************************************************/
  7998. /*! exports provided: default */
  7999. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  8000. "use strict";
  8001. __webpack_require__.r(__webpack_exports__);
  8002. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../externalModules.js */ "./externalModules.js");
  8003. /* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../../store/index.js */ "./store/index.js");
  8004. /**
  8005. * Called by the event dispatcher to render the image.
  8006. *
  8007. * @param {Object} evt - The event.
  8008. * @returns {void}
  8009. */
  8010. function renderBrush(evt) {
  8011. var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone;
  8012. var _getModule = Object(_store_index_js__WEBPACK_IMPORTED_MODULE_1__["getModule"])('segmentation'),
  8013. getters = _getModule.getters,
  8014. configuration = _getModule.configuration;
  8015. var eventData = evt.detail;
  8016. var viewport = eventData.viewport;
  8017. var mousePosition;
  8018. if (this._drawing) {
  8019. mousePosition = this._lastImageCoords;
  8020. } else if (this._mouseUpRender) {
  8021. mousePosition = this._lastImageCoords;
  8022. this._mouseUpRender = false;
  8023. } else {
  8024. mousePosition = _store_index_js__WEBPACK_IMPORTED_MODULE_1__["default"].state.mousePositionImage;
  8025. }
  8026. if (!mousePosition) {
  8027. return;
  8028. }
  8029. var _eventData$image = eventData.image,
  8030. rows = _eventData$image.rows,
  8031. columns = _eventData$image.columns;
  8032. var _mousePosition = mousePosition,
  8033. x = _mousePosition.x,
  8034. y = _mousePosition.y;
  8035. if (x < 0 || x > columns || y < 0 || y > rows) {
  8036. return;
  8037. } // Draw the hover overlay on top of the pixel data
  8038. var radius = configuration.radius;
  8039. var context = eventData.canvasContext;
  8040. var element = eventData.element;
  8041. var color = getters.brushColor(element, this._drawing);
  8042. context.setTransform(1, 0, 0, 1, 0, 0);
  8043. var circleRadius = radius * viewport.scale;
  8044. var mouseCoordsCanvas = cornerstone.pixelToCanvas(element, mousePosition);
  8045. context.beginPath();
  8046. context.strokeStyle = color;
  8047. context.ellipse(mouseCoordsCanvas.x, mouseCoordsCanvas.y, circleRadius, circleRadius, 0, 0, 2 * Math.PI);
  8048. context.stroke();
  8049. }
  8050. /* harmony default export */ __webpack_exports__["default"] = ({
  8051. renderBrush: renderBrush
  8052. });
  8053. /***/ }),
  8054. /***/ "./orientation/getOrientationString.js":
  8055. /*!*********************************************!*\
  8056. !*** ./orientation/getOrientationString.js ***!
  8057. \*********************************************/
  8058. /*! exports provided: default */
  8059. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  8060. "use strict";
  8061. __webpack_require__.r(__webpack_exports__);
  8062. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
  8063. /* harmony import */ var _util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../util/convertToVector3.js */ "./util/convertToVector3.js");
  8064. /**
  8065. * Returns the orientation of the vector in the patient coordinate system.
  8066. * @public
  8067. * @function getOrientationString
  8068. *
  8069. * @param {Array|cornerstoneMath.Vector3} vector Input array or Vector3
  8070. * @returns {string} The orientation in the patient coordinate system.
  8071. */
  8072. /* harmony default export */ __webpack_exports__["default"] = (function (vector) {
  8073. var vec3 = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__["default"])(vector); // Thanks to David Clunie
  8074. // https://sites.google.com/site/dicomnotes/
  8075. var orientation = '';
  8076. var orientationX = vec3.x < 0 ? 'R' : 'L';
  8077. var orientationY = vec3.y < 0 ? 'A' : 'P';
  8078. var orientationZ = vec3.z < 0 ? 'F' : 'H'; // Should probably make this a function vector3.abs
  8079. var abs = new _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.Vector3(Math.abs(vec3.x), Math.abs(vec3.y), Math.abs(vec3.z));
  8080. var MIN = 0.0001;
  8081. for (var i = 0; i < 3; i++) {
  8082. if (abs.x > MIN && abs.x > abs.y && abs.x > abs.z) {
  8083. orientation += orientationX;
  8084. abs.x = 0;
  8085. } else if (abs.y > MIN && abs.y > abs.x && abs.y > abs.z) {
  8086. orientation += orientationY;
  8087. abs.y = 0;
  8088. } else if (abs.z > MIN && abs.z > abs.x && abs.z > abs.y) {
  8089. orientation += orientationZ;
  8090. abs.z = 0;
  8091. } else if (abs.x > MIN && abs.y > MIN && abs.x === abs.y) {
  8092. orientation += orientationX + orientationY;
  8093. abs.x = 0;
  8094. abs.y = 0;
  8095. } else if (abs.x > MIN && abs.z > MIN && abs.x === abs.z) {
  8096. orientation += orientationX + orientationZ;
  8097. abs.x = 0;
  8098. abs.z = 0;
  8099. } else if (abs.y > MIN && abs.z > MIN && abs.y === abs.z) {
  8100. orientation += orientationY + orientationZ;
  8101. abs.y = 0;
  8102. abs.z = 0;
  8103. } else {
  8104. break;
  8105. }
  8106. }
  8107. return orientation;
  8108. });
  8109. /***/ }),
  8110. /***/ "./orientation/index.js":
  8111. /*!******************************!*\
  8112. !*** ./orientation/index.js ***!
  8113. \******************************/
  8114. /*! exports provided: default */
  8115. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  8116. "use strict";
  8117. __webpack_require__.r(__webpack_exports__);
  8118. /* harmony import */ var _getOrientationString_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getOrientationString.js */ "./orientation/getOrientationString.js");
  8119. /* harmony import */ var _invertOrientationString_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./invertOrientationString.js */ "./orientation/invertOrientationString.js");
  8120. var orientation = {
  8121. getOrientationString: _getOrientationString_js__WEBPACK_IMPORTED_MODULE_0__["default"],
  8122. invertOrientationString: _invertOrientationString_js__WEBPACK_IMPORTED_MODULE_1__["default"]
  8123. };
  8124. /* harmony default export */ __webpack_exports__["default"] = (orientation);
  8125. /***/ }),
  8126. /***/ "./orientation/invertOrientationString.js":
  8127. /*!************************************************!*\
  8128. !*** ./orientation/invertOrientationString.js ***!
  8129. \************************************************/
  8130. /*! exports provided: default */
  8131. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  8132. "use strict";
  8133. __webpack_require__.r(__webpack_exports__);
  8134. /**
  8135. * Inverts an orientation string.
  8136. * @public
  8137. * @function invertOrientationString
  8138. *
  8139. * @param {string} orientationString The orientation.
  8140. * @returns {string} The inverted orientationString.
  8141. */
  8142. /* harmony default export */ __webpack_exports__["default"] = (function (orientationString) {
  8143. var inverted = orientationString.replace('H', 'f');
  8144. inverted = inverted.replace('F', 'h');
  8145. inverted = inverted.replace('R', 'l');
  8146. inverted = inverted.replace('L', 'r');
  8147. inverted = inverted.replace('A', 'p');
  8148. inverted = inverted.replace('P', 'a');
  8149. inverted = inverted.toUpperCase();
  8150. return inverted;
  8151. });
  8152. /***/ }),
  8153. /***/ "./stackTools/fusionRenderer.js":
  8154. /*!**************************************!*\
  8155. !*** ./stackTools/fusionRenderer.js ***!
  8156. \**************************************/
  8157. /*! exports provided: default */
  8158. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  8159. "use strict";
  8160. __webpack_require__.r(__webpack_exports__);
  8161. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return FusionRenderer; });
  8162. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
  8163. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
  8164. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
  8165. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
  8166. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
  8167. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  8168. var FusionRenderer =
  8169. /*#__PURE__*/
  8170. function () {
  8171. function FusionRenderer() {
  8172. _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, FusionRenderer);
  8173. this.currentImageIdIndex = 0;
  8174. this.layerIds = [];
  8175. this.findImageFn = undefined;
  8176. }
  8177. _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(FusionRenderer, [{
  8178. key: "render",
  8179. value: function render(element, imageStacks) {
  8180. var _this = this;
  8181. // Move this to base Renderer class
  8182. if (!Number.isInteger(this.currentImageIdIndex)) {
  8183. throw new Error('FusionRenderer: render - Image ID Index is not an integer');
  8184. }
  8185. if (!this.findImageFn) {
  8186. throw new Error('No findImage function has been defined');
  8187. }
  8188. if (!imageStacks) {
  8189. var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["getToolState"])(element, 'stack');
  8190. imageStacks = toolData.data;
  8191. } // TODO: Figure out what to do with LoadHandlers in this scenario...
  8192. var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_2__["default"].cornerstone; // For the base layer, go to the currentImageIdIndex
  8193. var baseImageObject = imageStacks[0];
  8194. var currentImageId = baseImageObject.imageIds[this.currentImageIdIndex];
  8195. var overlayImageStacks = imageStacks.slice(1, imageStacks.length);
  8196. cornerstone.loadAndCacheImage(currentImageId).then(function (baseImage) {
  8197. var baseLayerId = _this.layerIds[0]; // Get the base layer if one exists
  8198. if (baseLayerId) {
  8199. cornerstone.setLayerImage(element, baseImage, baseLayerId);
  8200. } else {
  8201. // Otherwise, create a new layer with the base layer's image
  8202. baseLayerId = cornerstone.addLayer(element, baseImage, baseImageObject.options);
  8203. _this.layerIds.push(baseLayerId);
  8204. } // Display the image immediately while the overlay images are identified
  8205. cornerstone.displayImage(element, baseImage); // Loop through the remaining 'overlay' image stacks
  8206. overlayImageStacks.forEach(function (imgObj, overlayLayerIndex) {
  8207. var imageId = _this.findImageFn(imgObj.imageIds, currentImageId);
  8208. var layerIndex = overlayLayerIndex + 1;
  8209. var currentLayerId = _this.layerIds[layerIndex]; // If no layer exists yet for this overlaid stack, create
  8210. // One and add it to the layerIds property for this instance
  8211. // Of the fusion renderer.
  8212. if (!currentLayerId) {
  8213. currentLayerId = cornerstone.addLayer(element, undefined, imgObj.options);
  8214. _this.layerIds.push(currentLayerId);
  8215. }
  8216. if (imageId) {
  8217. // If an imageId was returned from the findImage function,
  8218. // Load it, make sure it's visible and update the layer
  8219. // With the new image object.
  8220. cornerstone.loadAndCacheImage(imageId).then(function (image) {
  8221. cornerstone.setLayerImage(element, image, currentLayerId);
  8222. cornerstone.updateImage(element);
  8223. });
  8224. } else {
  8225. // If no imageId was returned from the findImage function.
  8226. // This means that there is no relevant image to display.
  8227. cornerstone.setLayerImage(element, undefined, currentLayerId);
  8228. cornerstone.setActiveLayer(element, baseLayerId);
  8229. cornerstone.updateImage(element);
  8230. }
  8231. });
  8232. });
  8233. }
  8234. }]);
  8235. return FusionRenderer;
  8236. }();
  8237. /***/ }),
  8238. /***/ "./stackTools/playClip.js":
  8239. /*!********************************!*\
  8240. !*** ./stackTools/playClip.js ***!
  8241. \********************************/
  8242. /*! exports provided: playClip, stopClip */
  8243. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  8244. "use strict";
  8245. __webpack_require__.r(__webpack_exports__);
  8246. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "playClip", function() { return playClip; });
  8247. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "stopClip", function() { return stopClip; });
  8248. /* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../events.js */ "./events.js");
  8249. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
  8250. /* harmony import */ var _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../stateManagement/loadHandlerManager.js */ "./stateManagement/loadHandlerManager.js");
  8251. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  8252. /* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/triggerEvent.js */ "./util/triggerEvent.js");
  8253. var toolName = 'playClip';
  8254. /**
  8255. * [private] Turns a Frame Time Vector (0018,1065) array into a normalized array of timeouts. Each element
  8256. * ... of the resulting array represents the amount of time each frame will remain on the screen.
  8257. * @param {Array} vector A Frame Time Vector (0018,1065) as specified in section C.7.6.5.1.2 of DICOM standard.
  8258. * @param {Number} speed A speed factor which will be applied to each element of the resulting array.
  8259. * @returns {Array} An array with timeouts for each animation frame.
  8260. */
  8261. function getPlayClipTimeouts(vector, speed) {
  8262. var i;
  8263. var sample;
  8264. var delay;
  8265. var sum = 0;
  8266. var limit = vector.length;
  8267. var timeouts = []; // Initialize time varying to false
  8268. timeouts.isTimeVarying = false;
  8269. if (typeof speed !== 'number' || speed <= 0) {
  8270. speed = 1;
  8271. } // First element of a frame time vector must be discarded
  8272. for (i = 1; i < limit; i++) {
  8273. // eslint-disable-next-line no-bitwise
  8274. delay = Number(vector[i]) / speed | 0; // Integral part only
  8275. timeouts.push(delay);
  8276. if (i === 1) {
  8277. // Use first item as a sample for comparison
  8278. sample = delay;
  8279. } else if (delay !== sample) {
  8280. timeouts.isTimeVarying = true;
  8281. }
  8282. sum += delay;
  8283. }
  8284. if (timeouts.length > 0) {
  8285. if (timeouts.isTimeVarying) {
  8286. // If it's a time varying vector, make the last item an average...
  8287. // eslint-disable-next-line no-bitwise
  8288. delay = sum / timeouts.length | 0;
  8289. } else {
  8290. delay = timeouts[0];
  8291. }
  8292. timeouts.push(delay);
  8293. }
  8294. return timeouts;
  8295. }
  8296. /**
  8297. * [private] Performs the heavy lifting of stopping an ongoing animation.
  8298. * @param {Object} playClipData The data from playClip that needs to be stopped.
  8299. * @returns {void}
  8300. */
  8301. function stopClipWithData(playClipData) {
  8302. var id = playClipData.intervalId;
  8303. if (typeof id !== 'undefined') {
  8304. playClipData.intervalId = undefined;
  8305. if (playClipData.usingFrameTimeVector) {
  8306. clearTimeout(id);
  8307. } else {
  8308. clearInterval(id);
  8309. }
  8310. }
  8311. }
  8312. /**
  8313. * [private] Trigger playClip tool stop event.
  8314. * @param {HTMLElement} element
  8315. * @returns {void}
  8316. */
  8317. function triggerStopEvent(element) {
  8318. var eventDetail = {
  8319. element: element
  8320. };
  8321. Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].CLIP_STOPPED, eventDetail);
  8322. }
  8323. /**
  8324. * Starts playing a clip or adjusts the frame rate of an already playing clip. framesPerSecond is
  8325. * optional and defaults to 30 if not specified. A negative framesPerSecond will play the clip in reverse.
  8326. * The element must be a stack of images
  8327. * @param {HTMLElement} element
  8328. * @param {number} framesPerSecond
  8329. * @returns {void}
  8330. */
  8331. function playClip(element, framesPerSecond) {
  8332. var playClipData;
  8333. var playClipTimeouts;
  8334. if (element === undefined) {
  8335. throw new Error('playClip: element must not be undefined');
  8336. }
  8337. var stackToolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["getToolState"])(element, 'stack');
  8338. if (!stackToolData || !stackToolData.data || !stackToolData.data.length) {
  8339. return;
  8340. }
  8341. var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone; // If we have more than one stack, check if we have a stack renderer defined
  8342. var stackRenderer;
  8343. if (stackToolData.data.length > 1) {
  8344. var stackRendererData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["getToolState"])(element, 'stackRenderer');
  8345. if (stackRendererData && stackRendererData.data && stackRendererData.data.length) {
  8346. stackRenderer = stackRendererData.data[0];
  8347. }
  8348. }
  8349. var stackData = stackToolData.data[0];
  8350. var playClipToolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["getToolState"])(element, toolName);
  8351. if (!playClipToolData || !playClipToolData.data || !playClipToolData.data.length) {
  8352. playClipData = {
  8353. intervalId: undefined,
  8354. framesPerSecond: 30,
  8355. lastFrameTimeStamp: undefined,
  8356. frameRate: 0,
  8357. frameTimeVector: undefined,
  8358. ignoreFrameTimeVector: false,
  8359. usingFrameTimeVector: false,
  8360. speed: 1,
  8361. reverse: false,
  8362. loop: true
  8363. };
  8364. Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["addToolState"])(element, toolName, playClipData);
  8365. } else {
  8366. playClipData = playClipToolData.data[0]; // Make sure the specified clip is not running before any property update
  8367. stopClipWithData(playClipData);
  8368. } // If a framesPerSecond is specified and is valid, update the playClipData now
  8369. if (framesPerSecond < 0 || framesPerSecond > 0) {
  8370. playClipData.framesPerSecond = Number(framesPerSecond);
  8371. playClipData.reverse = playClipData.framesPerSecond < 0; // If framesPerSecond is given, frameTimeVector will be ignored...
  8372. playClipData.ignoreFrameTimeVector = true;
  8373. } // Determine if frame time vector should be used instead of a fixed frame rate...
  8374. if (playClipData.ignoreFrameTimeVector !== true && playClipData.frameTimeVector && playClipData.frameTimeVector.length === stackData.imageIds.length) {
  8375. playClipTimeouts = getPlayClipTimeouts(playClipData.frameTimeVector, playClipData.speed);
  8376. } // This function encapsulates the frame rendering logic...
  8377. var playClipAction = function playClipAction() {
  8378. // Hoisting of context variables
  8379. var loader,
  8380. startLoadingHandler,
  8381. endLoadingHandler,
  8382. errorLoadingHandler,
  8383. newImageIdIndex = stackData.currentImageIdIndex;
  8384. var imageCount = stackData.imageIds.length;
  8385. if (playClipData.reverse) {
  8386. newImageIdIndex--;
  8387. } else {
  8388. newImageIdIndex++;
  8389. }
  8390. if (!playClipData.loop && (newImageIdIndex < 0 || newImageIdIndex >= imageCount)) {
  8391. stopClipWithData(playClipData);
  8392. triggerStopEvent(element);
  8393. return;
  8394. } // Loop around if we go outside the stack
  8395. if (newImageIdIndex >= imageCount) {
  8396. newImageIdIndex = 0;
  8397. }
  8398. if (newImageIdIndex < 0) {
  8399. newImageIdIndex = imageCount - 1;
  8400. }
  8401. if (newImageIdIndex !== stackData.currentImageIdIndex) {
  8402. startLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].getStartLoadHandler(element);
  8403. endLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].getEndLoadHandler(element);
  8404. errorLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].getErrorLoadingHandler(element);
  8405. if (startLoadingHandler) {
  8406. startLoadingHandler(element);
  8407. }
  8408. if (stackData.preventCache === true) {
  8409. loader = cornerstone.loadImage(stackData.imageIds[newImageIdIndex]);
  8410. } else {
  8411. loader = cornerstone.loadAndCacheImage(stackData.imageIds[newImageIdIndex]);
  8412. }
  8413. loader.then(function (image) {
  8414. try {
  8415. stackData.currentImageIdIndex = newImageIdIndex;
  8416. if (stackRenderer) {
  8417. stackRenderer.currentImageIdIndex = newImageIdIndex;
  8418. stackRenderer.render(element, stackToolData.data);
  8419. } else {
  8420. cornerstone.displayImage(element, image);
  8421. }
  8422. if (endLoadingHandler) {
  8423. endLoadingHandler(element, image);
  8424. }
  8425. } catch (error) {
  8426. return;
  8427. }
  8428. }, function (error) {
  8429. var imageId = stackData.imageIds[newImageIdIndex];
  8430. if (errorLoadingHandler) {
  8431. errorLoadingHandler(element, imageId, error);
  8432. }
  8433. });
  8434. }
  8435. }; // If playClipTimeouts array is available, not empty and its elements are NOT uniform ...
  8436. // ... (at least one timeout is different from the others), use alternate setTimeout implementation
  8437. if (playClipTimeouts && playClipTimeouts.length > 0 && playClipTimeouts.isTimeVarying) {
  8438. playClipData.usingFrameTimeVector = true;
  8439. playClipData.intervalId = setTimeout(function playClipTimeoutHandler() {
  8440. playClipData.intervalId = setTimeout(playClipTimeoutHandler, playClipTimeouts[stackData.currentImageIdIndex]);
  8441. playClipAction();
  8442. }, 0);
  8443. } else {
  8444. // ... otherwise user setInterval implementation which is much more efficient.
  8445. playClipData.usingFrameTimeVector = false;
  8446. playClipData.intervalId = setInterval(playClipAction, 1000 / Math.abs(playClipData.framesPerSecond));
  8447. }
  8448. }
  8449. /**
  8450. * Stops an already playing clip.
  8451. * @param {HTMLElement} element
  8452. * @returns {void}
  8453. */
  8454. function stopClip(element) {
  8455. var playClipToolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["getToolState"])(element, toolName);
  8456. if (!playClipToolData || !playClipToolData.data || !playClipToolData.data.length) {
  8457. return;
  8458. }
  8459. stopClipWithData(playClipToolData.data[0]);
  8460. }
  8461. /***/ }),
  8462. /***/ "./stackTools/stackPrefetch.js":
  8463. /*!*************************************!*\
  8464. !*** ./stackTools/stackPrefetch.js ***!
  8465. \*************************************/
  8466. /*! exports provided: default */
  8467. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  8468. "use strict";
  8469. __webpack_require__.r(__webpack_exports__);
  8470. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js");
  8471. /* harmony import */ var _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../stateManagement/loadHandlerManager.js */ "./stateManagement/loadHandlerManager.js");
  8472. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  8473. /* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../util/logger.js */ "./util/logger.js");
  8474. /* harmony import */ var _util_triggerEvent__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/triggerEvent */ "./util/triggerEvent.js");
  8475. /* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../events.js */ "./events.js");
  8476. var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_3__["getLogger"])('stackTools:stackPrefetch');
  8477. var toolName = 'stackPrefetch';
  8478. var requestType = 'prefetch';
  8479. var priority = 0;
  8480. var addToBeginning = true;
  8481. var configuration = {
  8482. maxImagesToPrefetch: Infinity,
  8483. preserveExistingPool: false
  8484. };
  8485. var resetPrefetchTimeout;
  8486. var resetPrefetchDelay = 10;
  8487. function range(lowEnd, highEnd) {
  8488. // Javascript version of Python's range function
  8489. // http://stackoverflow.com/questions/3895478/does-javascript-have-a-method-like-range-to-generate-an-array-based-on-suppl
  8490. lowEnd = Math.round(lowEnd) || 0;
  8491. highEnd = Math.round(highEnd) || 0;
  8492. var arr = [];
  8493. var c = highEnd - lowEnd + 1;
  8494. if (c <= 0) {
  8495. return arr;
  8496. }
  8497. while (c--) {
  8498. arr[c] = highEnd--;
  8499. }
  8500. return arr;
  8501. }
  8502. function nearestIndex(arr, x) {
  8503. // Return index of nearest values in array
  8504. // http://stackoverflow.com/questions/25854212/return-index-of-nearest-values-in-an-array
  8505. var low = 0;
  8506. var high = arr.length - 1;
  8507. arr.forEach(function (v, idx) {
  8508. if (v < x) {
  8509. low = Math.max(idx, low);
  8510. } else if (v > x) {
  8511. high = Math.min(idx, high);
  8512. }
  8513. });
  8514. return {
  8515. low: low,
  8516. high: high
  8517. };
  8518. }
  8519. function prefetch(element) {
  8520. // Check to make sure stack data exists
  8521. var stackData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_2__["getToolState"])(element, 'stack');
  8522. if (!stackData || !stackData.data || !stackData.data.length) {
  8523. return;
  8524. }
  8525. var stack = stackData.data[0]; // Get the stackPrefetch tool data
  8526. var stackPrefetchData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_2__["getToolState"])(element, toolName);
  8527. if (!stackPrefetchData) {
  8528. return;
  8529. }
  8530. var stackPrefetch = stackPrefetchData.data[0] || {}; // If all the requests are complete, disable the stackPrefetch tool
  8531. if (!stackPrefetch.indicesToRequest || !stackPrefetch.indicesToRequest.length) {
  8532. stackPrefetch.enabled = false;
  8533. } // Make sure the tool is still enabled
  8534. if (stackPrefetch.enabled === false) {
  8535. return;
  8536. } // Remove an imageIdIndex from the list of indices to request
  8537. // This fires when the individual image loading deferred is resolved
  8538. function removeFromList(imageIdIndex) {
  8539. var index = stackPrefetch.indicesToRequest.indexOf(imageIdIndex);
  8540. if (index > -1) {
  8541. // Don't remove last element if imageIdIndex not found
  8542. stackPrefetch.indicesToRequest.splice(index, 1);
  8543. }
  8544. } // Remove all already cached images from the
  8545. // IndicesToRequest array
  8546. stackPrefetchData.data[0].indicesToRequest.sort(function (a, b) {
  8547. return a - b;
  8548. });
  8549. var indicesToRequestCopy = stackPrefetch.indicesToRequest.slice();
  8550. indicesToRequestCopy.forEach(function (imageIdIndex) {
  8551. var imageId = stack.imageIds[imageIdIndex];
  8552. if (!imageId) {
  8553. return;
  8554. }
  8555. var imageLoadObject = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.imageCache.getImageLoadObject(imageId);
  8556. if (imageLoadObject) {
  8557. removeFromList(imageIdIndex);
  8558. }
  8559. }); // Stop here if there are no images left to request
  8560. // After those in the cache have been removed
  8561. if (!stackPrefetch.indicesToRequest.length) {
  8562. return;
  8563. } // Clear the requestPool of prefetch requests, if needed.
  8564. if (!configuration.preserveExistingPool) {
  8565. _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.imageLoadPoolManager.clearRequestStack(requestType);
  8566. } // Identify the nearest imageIdIndex to the currentImageIdIndex
  8567. var nearest = nearestIndex(stackPrefetch.indicesToRequest, stack.currentImageIdIndex);
  8568. var imageId;
  8569. var nextImageIdIndex;
  8570. var preventCache = false;
  8571. function doneCallback(image) {
  8572. logger.log('prefetch done: %s', image.imageId);
  8573. var imageIdIndex = stack.imageIds.indexOf(image.imageId);
  8574. removeFromList(imageIdIndex);
  8575. Object(_util_triggerEvent__WEBPACK_IMPORTED_MODULE_4__["default"])(element, _events_js__WEBPACK_IMPORTED_MODULE_5__["default"].STACK_PREFETCH_IMAGE_LOADED, {
  8576. element: element,
  8577. imageId: image.imageId,
  8578. imageIndex: imageIdIndex,
  8579. stackPrefetch: stackPrefetch,
  8580. stack: stack
  8581. }); // If there are no more images to fetch
  8582. if (!(stackPrefetch.indicesToRequest && stackPrefetch.indicesToRequest.length > 0)) {
  8583. Object(_util_triggerEvent__WEBPACK_IMPORTED_MODULE_4__["default"])(element, _events_js__WEBPACK_IMPORTED_MODULE_5__["default"].STACK_PREFETCH_DONE, {
  8584. element: element,
  8585. stackPrefetch: stackPrefetch,
  8586. stack: stack
  8587. });
  8588. }
  8589. } // Retrieve the errorLoadingHandler if one exists
  8590. var errorLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_1__["default"].getErrorLoadingHandler(element);
  8591. function failCallback(error) {
  8592. logger.log('prefetch errored: %o', error);
  8593. if (errorLoadingHandler) {
  8594. errorLoadingHandler(element, imageId, error, 'stackPrefetch');
  8595. }
  8596. } // Prefetch images around the current image (before and after)
  8597. var lowerIndex = nearest.low;
  8598. var higherIndex = nearest.high;
  8599. var imageIdsToPrefetch = [];
  8600. while (lowerIndex >= 0 || higherIndex < stackPrefetch.indicesToRequest.length) {
  8601. var currentIndex = stack.currentImageIdIndex;
  8602. var shouldSkipLower = currentIndex - stackPrefetch.indicesToRequest[lowerIndex] > configuration.maxImagesToPrefetch;
  8603. var shouldSkipHigher = stackPrefetch.indicesToRequest[higherIndex] - currentIndex > configuration.maxImagesToPrefetch;
  8604. var shouldLoadLower = !shouldSkipLower && lowerIndex >= 0;
  8605. var shouldLoadHigher = !shouldSkipHigher && higherIndex < stackPrefetch.indicesToRequest.length;
  8606. if (!shouldLoadHigher && !shouldLoadLower) {
  8607. break;
  8608. }
  8609. if (shouldLoadLower) {
  8610. nextImageIdIndex = stackPrefetch.indicesToRequest[lowerIndex--];
  8611. imageId = stack.imageIds[nextImageIdIndex];
  8612. imageIdsToPrefetch.push(imageId);
  8613. }
  8614. if (shouldLoadHigher) {
  8615. nextImageIdIndex = stackPrefetch.indicesToRequest[higherIndex++];
  8616. imageId = stack.imageIds[nextImageIdIndex];
  8617. imageIdsToPrefetch.push(imageId);
  8618. }
  8619. }
  8620. var requestFn;
  8621. var options = {
  8622. addToBeginning: addToBeginning,
  8623. priority: priority,
  8624. requestType: requestType
  8625. };
  8626. if (preventCache) {
  8627. requestFn = function requestFn(id) {
  8628. return _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.loadImage(id, options);
  8629. };
  8630. } else {
  8631. requestFn = function requestFn(id) {
  8632. return _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.loadAndCacheImage(id, options);
  8633. };
  8634. }
  8635. imageIdsToPrefetch.reverse().forEach(function (imageId) {
  8636. _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.imageLoadPoolManager.addRequest(requestFn.bind(null, imageId), requestType, // Additional details
  8637. {
  8638. imageId: imageId
  8639. }, priority, addToBeginning);
  8640. });
  8641. }
  8642. function getPromiseRemovedHandler(element) {
  8643. return function (e) {
  8644. var eventData = e.detail; // When an imagePromise has been pushed out of the cache, re-add its index
  8645. // It to the indicesToRequest list so that it will be retrieved later if the
  8646. // CurrentImageIdIndex is changed to an image nearby
  8647. var stackData;
  8648. try {
  8649. // It will throw an exception in some cases (eg: thumbnails)
  8650. stackData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_2__["getToolState"])(element, 'stack');
  8651. } catch (error) {
  8652. return;
  8653. }
  8654. if (!stackData || !stackData.data || !stackData.data.length) {
  8655. return;
  8656. }
  8657. var stack = stackData.data[0];
  8658. var imageIdIndex = stack.imageIds.indexOf(eventData.imageId); // Make sure the image that was removed is actually in this stack
  8659. // Before adding it to the indicesToRequest array
  8660. if (imageIdIndex < 0) {
  8661. return;
  8662. }
  8663. var stackPrefetchData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_2__["getToolState"])(element, toolName);
  8664. if (!stackPrefetchData || !stackPrefetchData.data || !stackPrefetchData.data.length) {
  8665. return;
  8666. }
  8667. stackPrefetchData.data[0].indicesToRequest.push(imageIdIndex);
  8668. };
  8669. }
  8670. function onImageUpdated(e) {
  8671. // Start prefetching again (after a delay)
  8672. // When the user has scrolled to a new image
  8673. clearTimeout(resetPrefetchTimeout);
  8674. resetPrefetchTimeout = setTimeout(function () {
  8675. var element = e.target; // If playClip is enabled and the user loads a different series in the viewport
  8676. // An exception will be thrown because the element will not be enabled anymore
  8677. try {
  8678. prefetch(element);
  8679. } catch (error) {
  8680. return;
  8681. }
  8682. }, resetPrefetchDelay);
  8683. }
  8684. function enable(element) {
  8685. // Clear old prefetch data. Skipping this can cause problems when changing the series inside an element
  8686. var stackPrefetchDataArray = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_2__["getToolState"])(element, toolName);
  8687. stackPrefetchDataArray.data = []; // First check that there is stack data available
  8688. var stackData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_2__["getToolState"])(element, 'stack');
  8689. if (!stackData || !stackData.data || !stackData.data.length) {
  8690. return;
  8691. }
  8692. var stack = stackData.data[0]; // Check if we are allowed to cache images in this stack
  8693. if (stack.preventCache === true) {
  8694. logger.warn('A stack that should not be cached was given the stackPrefetch');
  8695. return;
  8696. } // Use the currentImageIdIndex from the stack as the initalImageIdIndex
  8697. var stackPrefetchData = {
  8698. indicesToRequest: range(0, stack.imageIds.length - 1),
  8699. enabled: true,
  8700. direction: 1
  8701. }; // Remove the currentImageIdIndex from the list to request
  8702. var indexOfCurrentImage = stackPrefetchData.indicesToRequest.indexOf(stack.currentImageIdIndex);
  8703. stackPrefetchData.indicesToRequest.splice(indexOfCurrentImage, 1);
  8704. Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_2__["addToolState"])(element, toolName, stackPrefetchData);
  8705. prefetch(element);
  8706. element.removeEventListener(_externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.EVENTS.NEW_IMAGE, onImageUpdated);
  8707. element.addEventListener(_externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.EVENTS.NEW_IMAGE, onImageUpdated);
  8708. var promiseRemovedHandler = getPromiseRemovedHandler(element);
  8709. _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.events.removeEventListener(_externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.EVENTS.IMAGE_CACHE_PROMISE_REMOVED, promiseRemovedHandler);
  8710. _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.events.addEventListener(_externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.EVENTS.IMAGE_CACHE_PROMISE_REMOVED, promiseRemovedHandler);
  8711. }
  8712. function disable(element) {
  8713. clearTimeout(resetPrefetchTimeout);
  8714. element.removeEventListener(_externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.EVENTS.NEW_IMAGE, onImageUpdated);
  8715. var promiseRemovedHandler = getPromiseRemovedHandler(element);
  8716. _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.events.removeEventListener(_externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.EVENTS.IMAGE_CACHE_PROMISE_REMOVED, promiseRemovedHandler);
  8717. var stackPrefetchData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_2__["getToolState"])(element, toolName); // If there is actually something to disable, disable it
  8718. if (stackPrefetchData && stackPrefetchData.data.length) {
  8719. stackPrefetchData.data[0].enabled = false; // Clear current prefetch requests from the requestPool
  8720. _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.imageLoadPoolManager.clearRequestStack(requestType);
  8721. }
  8722. }
  8723. function getConfiguration() {
  8724. return configuration;
  8725. }
  8726. function setConfiguration(config) {
  8727. configuration = config;
  8728. } // Module/private exports
  8729. var stackPrefetch = {
  8730. enable: enable,
  8731. disable: disable,
  8732. getConfiguration: getConfiguration,
  8733. setConfiguration: setConfiguration
  8734. };
  8735. /* harmony default export */ __webpack_exports__["default"] = (stackPrefetch);
  8736. /***/ }),
  8737. /***/ "./stackTools/stackRenderers.js":
  8738. /*!**************************************!*\
  8739. !*** ./stackTools/stackRenderers.js ***!
  8740. \**************************************/
  8741. /*! exports provided: default */
  8742. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  8743. "use strict";
  8744. __webpack_require__.r(__webpack_exports__);
  8745. /* harmony import */ var _fusionRenderer_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./fusionRenderer.js */ "./stackTools/fusionRenderer.js");
  8746. var stackRenderers = {};
  8747. stackRenderers.FusionRenderer = _fusionRenderer_js__WEBPACK_IMPORTED_MODULE_0__["default"];
  8748. /* harmony default export */ __webpack_exports__["default"] = (stackRenderers);
  8749. /***/ }),
  8750. /***/ "./stateManagement/frameOfReferenceStateManager.js":
  8751. /*!*********************************************************!*\
  8752. !*** ./stateManagement/frameOfReferenceStateManager.js ***!
  8753. \*********************************************************/
  8754. /*! exports provided: newFrameOfReferenceSpecificToolStateManager, globalFrameOfReferenceSpecificToolStateManager */
  8755. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  8756. "use strict";
  8757. __webpack_require__.r(__webpack_exports__);
  8758. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "newFrameOfReferenceSpecificToolStateManager", function() { return newFrameOfReferenceSpecificToolStateManager; });
  8759. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "globalFrameOfReferenceSpecificToolStateManager", function() { return globalFrameOfReferenceSpecificToolStateManager; });
  8760. /**
  8761. * Implements a frame-of-reference specific tool state management strategy. This means that
  8762. * Measurement data are tied to a specific frame of reference UID and only visible to objects using
  8763. * That frame-of-reference UID.
  8764. * @public
  8765. * @constructor newFrameOfReferenceSpecificToolStateManager
  8766. * @memberof StateManagement
  8767. *
  8768. * @returns {Object} A frameOfReferenceSpecificToolStateManager instance.
  8769. */
  8770. function newFrameOfReferenceSpecificToolStateManager() {
  8771. var toolState = {}; // Here we add tool state, this is done by tools as well
  8772. // As modules that restore saved state
  8773. function addFrameOfReferenceSpecificToolState(frameOfReference, toolName, data) {
  8774. // If we don't have any tool state for this frameOfReference, add an empty object
  8775. if (toolState.hasOwnProperty(frameOfReference) === false) {
  8776. toolState[frameOfReference] = {};
  8777. }
  8778. var frameOfReferenceToolState = toolState[frameOfReference]; // If we don't have tool state for this type of tool, add an empty object
  8779. if (frameOfReferenceToolState.hasOwnProperty(toolName) === false) {
  8780. frameOfReferenceToolState[toolName] = {
  8781. data: []
  8782. };
  8783. }
  8784. var toolData = frameOfReferenceToolState[toolName]; // Finally, add this new tool to the state
  8785. toolData.data.push(data);
  8786. } // Here you can get state - used by tools as well as modules
  8787. // That save state persistently
  8788. function getFrameOfReferenceSpecificToolState(frameOfReference, toolName) {
  8789. // If we don't have any tool state for this frame of reference, return undefined
  8790. if (toolState.hasOwnProperty(frameOfReference) === false) {
  8791. return;
  8792. }
  8793. var frameOfReferenceToolState = toolState[frameOfReference]; // If we don't have tool state for this type of tool, return undefined
  8794. if (frameOfReferenceToolState.hasOwnProperty(toolName) === false) {
  8795. return;
  8796. }
  8797. var toolData = frameOfReferenceToolState[toolName];
  8798. return toolData;
  8799. }
  8800. function removeFrameOfReferenceSpecificToolState(frameOfReference, toolName, data) {
  8801. // If we don't have any tool state for this frame of reference, return undefined
  8802. if (toolState.hasOwnProperty(frameOfReference) === false) {
  8803. return;
  8804. }
  8805. var frameOfReferenceToolState = toolState[frameOfReference]; // If we don't have tool state for this type of tool, return undefined
  8806. if (frameOfReferenceToolState.hasOwnProperty(toolName) === false) {
  8807. return;
  8808. }
  8809. var toolData = frameOfReferenceToolState[toolName]; // Find this tool data
  8810. var indexOfData = -1;
  8811. for (var i = 0; i < toolData.data.length; i++) {
  8812. if (toolData.data[i] === data) {
  8813. indexOfData = i;
  8814. }
  8815. }
  8816. if (indexOfData !== -1) {
  8817. toolData.data.splice(indexOfData, 1);
  8818. }
  8819. }
  8820. return {
  8821. get: getFrameOfReferenceSpecificToolState,
  8822. add: addFrameOfReferenceSpecificToolState,
  8823. remove: removeFrameOfReferenceSpecificToolState
  8824. };
  8825. } // A global frameOfReferenceSpecificToolStateManager - the most common case is to share 3d information
  8826. // Between stacks of images
  8827. var globalFrameOfReferenceSpecificToolStateManager = newFrameOfReferenceSpecificToolStateManager();
  8828. /***/ }),
  8829. /***/ "./stateManagement/imageIdSpecificStateManager.js":
  8830. /*!********************************************************!*\
  8831. !*** ./stateManagement/imageIdSpecificStateManager.js ***!
  8832. \********************************************************/
  8833. /*! exports provided: newImageIdSpecificToolStateManager, globalImageIdSpecificToolStateManager */
  8834. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  8835. "use strict";
  8836. __webpack_require__.r(__webpack_exports__);
  8837. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "newImageIdSpecificToolStateManager", function() { return newImageIdSpecificToolStateManager; });
  8838. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "globalImageIdSpecificToolStateManager", function() { return globalImageIdSpecificToolStateManager; });
  8839. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
  8840. /**
  8841. * Implements an imageId specific tool state management strategy. This means that
  8842. * Measurements data is tied to a specific imageId and only visible for enabled elements
  8843. * That are displaying that imageId.
  8844. * @public
  8845. * @constructor newImageIdSpecificToolStateManager
  8846. * @memberof StateManagement
  8847. *
  8848. * @returns {Object} An imageIdSpecificToolStateManager instance.
  8849. */
  8850. function newImageIdSpecificToolStateManager() {
  8851. var toolState = {}; // Here we add tool state, this is done by tools as well
  8852. // As modules that restore saved state
  8853. function saveImageIdToolState(imageId) {
  8854. return toolState[imageId];
  8855. }
  8856. function restoreImageIdToolState(imageId, imageIdToolState) {
  8857. toolState[imageId] = imageIdToolState;
  8858. }
  8859. function saveToolState() {
  8860. return toolState;
  8861. }
  8862. function restoreToolState(savedToolState) {
  8863. toolState = savedToolState;
  8864. } // Here we add tool state, this is done by tools as well
  8865. // As modules that restore saved state
  8866. function addElementToolState(element, toolName, data) {
  8867. var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.getEnabledElement(element); // If we don't have an image for this element exit early
  8868. if (!enabledElement.image) {
  8869. return;
  8870. }
  8871. addImageIdToolState(enabledElement.image.imageId, toolName, data);
  8872. }
  8873. function addImageIdToolState(imageId, toolName, data) {
  8874. // If we don't have any tool state for this imageId, add an empty object
  8875. if (toolState.hasOwnProperty(imageId) === false) {
  8876. toolState[imageId] = {};
  8877. }
  8878. var imageIdToolState = toolState[imageId]; // If we don't have tool state for this tool name, add an empty object
  8879. if (imageIdToolState.hasOwnProperty(toolName) === false) {
  8880. imageIdToolState[toolName] = {
  8881. data: []
  8882. };
  8883. }
  8884. var toolData = imageIdToolState[toolName]; // Finally, add this new tool to the state
  8885. toolData.data.push(data);
  8886. }
  8887. function getElementToolState(element, toolName) {
  8888. var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.getEnabledElement(element); // If the element does not have an image return undefined.
  8889. if (!enabledElement.image) {
  8890. return;
  8891. }
  8892. return getImageIdToolState(enabledElement.image.imageId, toolName);
  8893. } // Here you can get state - used by tools as well as modules
  8894. // That save state persistently
  8895. function getImageIdToolState(imageId, toolName) {
  8896. // If we don't have any tool state for this imageId, return undefined
  8897. if (toolState.hasOwnProperty(imageId) === false) {
  8898. return;
  8899. }
  8900. var imageIdToolState = toolState[imageId]; // If we don't have tool state for this tool name, return undefined
  8901. if (imageIdToolState.hasOwnProperty(toolName) === false) {
  8902. return;
  8903. }
  8904. return imageIdToolState[toolName];
  8905. } // Replaces the given tool's state using the provided element's imageId
  8906. function setElementToolState(element, toolName, data) {
  8907. var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.getEnabledElement(element);
  8908. if (!enabledElement.image) {
  8909. return;
  8910. }
  8911. setImageIdToolState(enabledElement.image.imageId, toolName, data);
  8912. } // Replaces the imageId's tool state for a given tool
  8913. function setImageIdToolState(imageId, toolName, data) {
  8914. var imageIdToolState = toolState[imageId]; // Set the toolState
  8915. imageIdToolState[toolName] = data;
  8916. } // Clears all tool data from this toolStateManager.
  8917. function clearElementToolState(element) {
  8918. var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.getEnabledElement(element);
  8919. if (!enabledElement.image) {
  8920. return;
  8921. }
  8922. clearImageIdToolState(enabledElement.image.imageId);
  8923. }
  8924. function clearImageIdToolState(imageId) {
  8925. if (toolState.hasOwnProperty(imageId) === false) {
  8926. return;
  8927. }
  8928. delete toolState[imageId];
  8929. }
  8930. return {
  8931. get: getElementToolState,
  8932. add: addElementToolState,
  8933. set: setElementToolState,
  8934. clear: clearElementToolState,
  8935. getImageIdToolState: getImageIdToolState,
  8936. addImageIdToolState: addImageIdToolState,
  8937. setImageIdToolState: setImageIdToolState,
  8938. clearImageIdToolState: clearImageIdToolState,
  8939. saveImageIdToolState: saveImageIdToolState,
  8940. restoreImageIdToolState: restoreImageIdToolState,
  8941. saveToolState: saveToolState,
  8942. restoreToolState: restoreToolState,
  8943. toolState: toolState
  8944. };
  8945. } // A global imageIdSpecificToolStateManager - the most common case is to share state between all
  8946. // Visible enabled images
  8947. var globalImageIdSpecificToolStateManager = newImageIdSpecificToolStateManager();
  8948. /***/ }),
  8949. /***/ "./stateManagement/loadHandlerManager.js":
  8950. /*!***********************************************!*\
  8951. !*** ./stateManagement/loadHandlerManager.js ***!
  8952. \***********************************************/
  8953. /*! exports provided: default */
  8954. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  8955. "use strict";
  8956. __webpack_require__.r(__webpack_exports__);
  8957. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
  8958. var _DEFAULT_LOAD_HANDLER = 'DEFAULT';
  8959. var defaultStartLoadHandler = {};
  8960. var defaultEndLoadHandler = {};
  8961. var defaultErrorLoadingHandler = {};
  8962. function _getUUIDFromElement(element) {
  8963. if (!element) {
  8964. return _DEFAULT_LOAD_HANDLER;
  8965. }
  8966. var uuid = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.getEnabledElement(element).uuid;
  8967. if (!uuid) {
  8968. throw new Error('Something went wrong when getting uuid from element');
  8969. }
  8970. return uuid;
  8971. }
  8972. function setStartLoadHandler(handler) {
  8973. var element = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
  8974. if (!handler) {
  8975. throw new Error('The Handler function must be defined');
  8976. }
  8977. var uuid = _getUUIDFromElement(element);
  8978. defaultStartLoadHandler[uuid] = handler;
  8979. }
  8980. function getStartLoadHandler(element) {
  8981. var uuid = _getUUIDFromElement(element);
  8982. return defaultStartLoadHandler[uuid] || defaultStartLoadHandler[_DEFAULT_LOAD_HANDLER];
  8983. }
  8984. function setEndLoadHandler(handler) {
  8985. var element = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
  8986. if (!handler) {
  8987. throw new Error('The Handler function must be defined');
  8988. }
  8989. var uuid = _getUUIDFromElement(element);
  8990. defaultEndLoadHandler[uuid] = handler;
  8991. }
  8992. function getEndLoadHandler(element) {
  8993. var uuid = _getUUIDFromElement(element);
  8994. return defaultEndLoadHandler[uuid] || defaultEndLoadHandler[_DEFAULT_LOAD_HANDLER];
  8995. }
  8996. function setErrorLoadingHandler(handler) {
  8997. var element = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
  8998. if (!handler) {
  8999. throw new Error('The Handler function must be defined');
  9000. }
  9001. var uuid = _getUUIDFromElement(element);
  9002. defaultErrorLoadingHandler[uuid] = handler;
  9003. }
  9004. function getErrorLoadingHandler(element) {
  9005. var uuid = _getUUIDFromElement(element);
  9006. return defaultErrorLoadingHandler[uuid] || defaultErrorLoadingHandler[_DEFAULT_LOAD_HANDLER];
  9007. }
  9008. function removeHandlers(element) {
  9009. var uuid = _getUUIDFromElement(element);
  9010. delete defaultStartLoadHandler[uuid];
  9011. delete defaultEndLoadHandler[uuid];
  9012. delete defaultErrorLoadingHandler[uuid];
  9013. }
  9014. var loadHandlerManager = {
  9015. setStartLoadHandler: setStartLoadHandler,
  9016. getStartLoadHandler: getStartLoadHandler,
  9017. setEndLoadHandler: setEndLoadHandler,
  9018. getEndLoadHandler: getEndLoadHandler,
  9019. setErrorLoadingHandler: setErrorLoadingHandler,
  9020. getErrorLoadingHandler: getErrorLoadingHandler,
  9021. removeHandlers: removeHandlers
  9022. };
  9023. /* harmony default export */ __webpack_exports__["default"] = (loadHandlerManager);
  9024. /***/ }),
  9025. /***/ "./stateManagement/stackSpecificStateManager.js":
  9026. /*!******************************************************!*\
  9027. !*** ./stateManagement/stackSpecificStateManager.js ***!
  9028. \******************************************************/
  9029. /*! exports provided: stackSpecificStateManager, newStackSpecificToolStateManager, addStackStateManager */
  9030. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  9031. "use strict";
  9032. __webpack_require__.r(__webpack_exports__);
  9033. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "stackSpecificStateManager", function() { return stackSpecificStateManager; });
  9034. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "newStackSpecificToolStateManager", function() { return newStackSpecificToolStateManager; });
  9035. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addStackStateManager", function() { return addStackStateManager; });
  9036. /* harmony import */ var _imageIdSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./imageIdSpecificStateManager.js */ "./stateManagement/imageIdSpecificStateManager.js");
  9037. /* harmony import */ var _toolState_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./toolState.js */ "./stateManagement/toolState.js");
  9038. /**
  9039. * Implements an Stack specific tool state management strategy. This means
  9040. * That tool data is shared between all imageIds in a given stack.
  9041. * @public
  9042. * @constructor newStackSpecificToolStateManager
  9043. * @memberof StateManagement
  9044. *
  9045. * @param {string[]} toolNames List of tools that should have state shared across a stack (a display set) of images
  9046. * @param {Object} oldStateManager The imageIdSpecificStateManager.
  9047. * @returns {Object} A stackSpecificToolStateManager instance.
  9048. */
  9049. function newStackSpecificToolStateManager(toolNames, oldStateManager) {
  9050. var toolState = {};
  9051. function saveToolState() {
  9052. return toolState;
  9053. }
  9054. function restoreToolState(stackToolState) {
  9055. toolState = stackToolState;
  9056. } // Here we add tool state, this is done by tools as well
  9057. // As modules that restore saved state
  9058. function addStackSpecificToolState(element, toolName, data) {
  9059. // If this is a tool type to apply to the stack, do so
  9060. if (toolNames.indexOf(toolName) >= 0) {
  9061. // If we don't have tool state for this tool name, add an empty object
  9062. if (toolState.hasOwnProperty(toolName) === false) {
  9063. toolState[toolName] = {
  9064. data: []
  9065. };
  9066. }
  9067. var toolData = toolState[toolName]; // Finally, add this new tool to the state
  9068. toolData.data.push(data);
  9069. } else {
  9070. // Call the imageId specific tool state manager
  9071. return oldStateManager.add(element, toolName, data);
  9072. }
  9073. } // Here you can get state - used by tools as well as modules
  9074. // That save state persistently
  9075. function getStackSpecificToolState(element, toolName) {
  9076. // If this is a tool type to apply to the stack, do so
  9077. if (toolNames.indexOf(toolName) >= 0) {
  9078. // If we don't have tool state for this tool name, add an empty object
  9079. if (toolState.hasOwnProperty(toolName) === false) {
  9080. toolState[toolName] = {
  9081. data: []
  9082. };
  9083. }
  9084. return toolState[toolName];
  9085. } // Call the imageId specific tool state manager
  9086. return oldStateManager.get(element, toolName);
  9087. }
  9088. var stackSpecificToolStateManager = {
  9089. get: getStackSpecificToolState,
  9090. add: addStackSpecificToolState,
  9091. saveToolState: saveToolState,
  9092. restoreToolState: restoreToolState,
  9093. toolState: toolState
  9094. };
  9095. return stackSpecificToolStateManager;
  9096. }
  9097. var stackStateManagers = [];
  9098. function addStackStateManager(element, otherTools) {
  9099. var oldStateManager = Object(_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getElementToolStateManager"])(element);
  9100. if (!oldStateManager) {
  9101. oldStateManager = _imageIdSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_0__["globalImageIdSpecificToolStateManager"];
  9102. }
  9103. var stackTools = ['stack', 'stackPrefetch', 'playClip', 'volume', 'slab', 'referenceLines', 'crosshairs', 'stackRenderer'];
  9104. if (otherTools) {
  9105. stackTools = stackTools.concat(otherTools);
  9106. }
  9107. var stackSpecificStateManager = newStackSpecificToolStateManager(stackTools, oldStateManager);
  9108. stackStateManagers.push(stackSpecificStateManager);
  9109. Object(_toolState_js__WEBPACK_IMPORTED_MODULE_1__["setElementToolStateManager"])(element, stackSpecificStateManager);
  9110. }
  9111. var stackSpecificStateManager = {
  9112. newStackSpecificToolStateManager: newStackSpecificToolStateManager,
  9113. addStackStateManager: addStackStateManager
  9114. };
  9115. /***/ }),
  9116. /***/ "./stateManagement/textStyle.js":
  9117. /*!**************************************!*\
  9118. !*** ./stateManagement/textStyle.js ***!
  9119. \**************************************/
  9120. /*! exports provided: default */
  9121. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  9122. "use strict";
  9123. __webpack_require__.r(__webpack_exports__);
  9124. var textStyle = {
  9125. fontSize: 15,
  9126. fontFamily: 'Arial',
  9127. backgroundColor: 'transparent'
  9128. };
  9129. /**
  9130. * @deprecated
  9131. * This function will be deprecated and users must use `setFontSize` and
  9132. * `setFontFamily` to set the font configuration independently.
  9133. *
  9134. * @param {string} font Font string with font size and font family
  9135. * @returns {void}
  9136. */
  9137. function setFont(font) {
  9138. var split = font.split('px ');
  9139. if (split.length === 2) {
  9140. setFontSize(parseFloat(split[0]));
  9141. setFontFamily(split[1]);
  9142. }
  9143. }
  9144. /**
  9145. * Returns all the font styling properties combined into a single string
  9146. * following the CSS font property pattern.
  9147. * @see {@link https://www.w3.org/TR/css-fonts-3/#font-prop|3.7. Shorthand font property: the font property}
  9148. *
  9149. * @returns {string} CSS font property
  9150. */
  9151. function getFont() {
  9152. return "".concat(textStyle.fontSize, "px ").concat(textStyle.fontFamily);
  9153. }
  9154. /**
  9155. * Sets the font family that will be used for general font rendering.
  9156. * @see {@link https://www.w3.org/TR/css-fonts-3/#font-family-prop|3.1. Font family: the font-family property}
  9157. *
  9158. * @param {string} fontFamily Name of the font to be used
  9159. * @returns {void}
  9160. */
  9161. function setFontFamily(fontFamily) {
  9162. if (typeof fontFamily !== 'string') {
  9163. throw new Error('Font family must be a valid string');
  9164. }
  9165. textStyle.fontFamily = fontFamily;
  9166. }
  9167. /**
  9168. * Returns the defined font family for rendering text boxes.
  9169. *
  9170. * @returns {string} The font family used for rendering text boxes
  9171. */
  9172. function getFontFamily() {
  9173. return textStyle.fontFamily;
  9174. }
  9175. /**
  9176. * Sets the font size in pixels that will be used for general font rendering.
  9177. *
  9178. * @param {number} fontSize Font size in pixels
  9179. * @returns {void}
  9180. */
  9181. function setFontSize(fontSize) {
  9182. if (typeof fontSize !== 'number' || isNaN(fontSize) || !isFinite(fontSize)) {
  9183. throw new Error('Font size must be a valid number');
  9184. }
  9185. textStyle.fontSize = parseFloat(fontSize);
  9186. }
  9187. /**
  9188. * Returns the font size in pixels that will be used for general font rendering.
  9189. *
  9190. * @returns {number} Font size in pixels
  9191. */
  9192. function getFontSize() {
  9193. return textStyle.fontSize;
  9194. }
  9195. /**
  9196. * Changes the background color of the text's bounding box.
  9197. * The default background color is transparent, that's why it doesn't display
  9198. * any background for the text box.
  9199. *
  9200. * @param {string} backgroundColor Background color for the text
  9201. * @returns {void}
  9202. */
  9203. function setBackgroundColor(backgroundColor) {
  9204. textStyle.backgroundColor = backgroundColor;
  9205. }
  9206. /**
  9207. * Returns the background color that is being used for rendering text boxes.
  9208. *
  9209. * @returns {string} The background color for the text's bounding box
  9210. */
  9211. function getBackgroundColor() {
  9212. return textStyle.backgroundColor;
  9213. }
  9214. var textStyleApi = {
  9215. setFont: setFont,
  9216. getFont: getFont,
  9217. setFontSize: setFontSize,
  9218. getFontSize: getFontSize,
  9219. setFontFamily: setFontFamily,
  9220. getFontFamily: getFontFamily,
  9221. setBackgroundColor: setBackgroundColor,
  9222. getBackgroundColor: getBackgroundColor
  9223. };
  9224. /* harmony default export */ __webpack_exports__["default"] = (textStyleApi);
  9225. /***/ }),
  9226. /***/ "./stateManagement/toolColors.js":
  9227. /*!***************************************!*\
  9228. !*** ./stateManagement/toolColors.js ***!
  9229. \***************************************/
  9230. /*! exports provided: default */
  9231. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  9232. "use strict";
  9233. __webpack_require__.r(__webpack_exports__);
  9234. var defaultColor = 'white',
  9235. activeColor = 'greenyellow',
  9236. fillColor = 'transparent';
  9237. function setFillColor(color) {
  9238. fillColor = color;
  9239. }
  9240. function getFillColor() {
  9241. return fillColor;
  9242. }
  9243. function setToolColor(color) {
  9244. defaultColor = color;
  9245. }
  9246. function getToolColor() {
  9247. return defaultColor;
  9248. }
  9249. function setActiveColor(color) {
  9250. activeColor = color;
  9251. }
  9252. function getActiveColor() {
  9253. return activeColor;
  9254. }
  9255. function getColorIfActive(data) {
  9256. if (data.color) {
  9257. return data.color;
  9258. }
  9259. return data.active ? activeColor : defaultColor;
  9260. }
  9261. var toolColors = {
  9262. setFillColor: setFillColor,
  9263. getFillColor: getFillColor,
  9264. setToolColor: setToolColor,
  9265. getToolColor: getToolColor,
  9266. setActiveColor: setActiveColor,
  9267. getActiveColor: getActiveColor,
  9268. getColorIfActive: getColorIfActive
  9269. };
  9270. /* harmony default export */ __webpack_exports__["default"] = (toolColors);
  9271. /***/ }),
  9272. /***/ "./stateManagement/toolCoordinates.js":
  9273. /*!********************************************!*\
  9274. !*** ./stateManagement/toolCoordinates.js ***!
  9275. \********************************************/
  9276. /*! exports provided: default */
  9277. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  9278. "use strict";
  9279. __webpack_require__.r(__webpack_exports__);
  9280. var coordsData;
  9281. function setCoords(eventData) {
  9282. coordsData = eventData.currentPoints.canvas;
  9283. }
  9284. function getCoords() {
  9285. return coordsData;
  9286. }
  9287. var toolCoordinates = {
  9288. setCoords: setCoords,
  9289. getCoords: getCoords
  9290. };
  9291. /* harmony default export */ __webpack_exports__["default"] = (toolCoordinates);
  9292. /***/ }),
  9293. /***/ "./stateManagement/toolState.js":
  9294. /*!**************************************!*\
  9295. !*** ./stateManagement/toolState.js ***!
  9296. \**************************************/
  9297. /*! exports provided: addToolState, getToolState, removeToolState, clearToolState, setElementToolStateManager, getElementToolStateManager */
  9298. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  9299. "use strict";
  9300. __webpack_require__.r(__webpack_exports__);
  9301. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addToolState", function() { return addToolState; });
  9302. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getToolState", function() { return getToolState; });
  9303. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeToolState", function() { return removeToolState; });
  9304. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clearToolState", function() { return clearToolState; });
  9305. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setElementToolStateManager", function() { return setElementToolStateManager; });
  9306. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getElementToolStateManager", function() { return getElementToolStateManager; });
  9307. /* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../events.js */ "./events.js");
  9308. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
  9309. /* harmony import */ var _imageIdSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./imageIdSpecificStateManager.js */ "./stateManagement/imageIdSpecificStateManager.js");
  9310. /* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../util/triggerEvent.js */ "./util/triggerEvent.js");
  9311. /* harmony import */ var _util_uuidv4_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/uuidv4.js */ "./util/uuidv4.js");
  9312. /**
  9313. * Returns the toolstate for a specific element.
  9314. * @public
  9315. * @function getElementToolStateManager
  9316. *
  9317. * @param {HTMLElement} element The element.
  9318. * @returns {Object} The toolState.
  9319. */
  9320. function getElementToolStateManager(element) {
  9321. var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getEnabledElement(element); // If the enabledElement has no toolStateManager, create a default one for it
  9322. // NOTE: This makes state management element specific
  9323. if (enabledElement.toolStateManager === undefined) {
  9324. enabledElement.toolStateManager = _imageIdSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_2__["globalImageIdSpecificToolStateManager"];
  9325. }
  9326. return enabledElement.toolStateManager;
  9327. }
  9328. /**
  9329. * Adds tool state to the toolStateManager, this is done by tools as well
  9330. * as modules that restore saved state.
  9331. * @public
  9332. * @method addToolState
  9333. *
  9334. * @param {HTMLElement} element The element.
  9335. * @param {string} toolName The name of the tool the state belongs to.
  9336. * @param {Object} measurementData The data to store in the state.
  9337. * @returns {undefined}
  9338. */
  9339. function addToolState(element, toolName, measurementData) {
  9340. var toolStateManager = getElementToolStateManager(element);
  9341. measurementData.uuid = measurementData.uuid || Object(_util_uuidv4_js__WEBPACK_IMPORTED_MODULE_4__["default"])();
  9342. toolStateManager.add(element, toolName, measurementData);
  9343. var eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MEASUREMENT_ADDED;
  9344. var eventData = {
  9345. toolName: toolName,
  9346. toolType: toolName,
  9347. // Deprecation notice: toolType will be replaced by toolName
  9348. element: element,
  9349. measurementData: measurementData
  9350. };
  9351. Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_3__["default"])(element, eventType, eventData);
  9352. }
  9353. /**
  9354. * Returns tool specific state of an element. Used by tools as well as modules
  9355. * that save state persistently
  9356. * @export
  9357. * @public
  9358. * @method
  9359. * @name getToolState
  9360. *
  9361. * @param {HTMLElement} element The element.
  9362. * @param {string} toolName The name of the tool the state belongs to.
  9363. * @returns {Object} The element's state for the given toolName.
  9364. */
  9365. function getToolState(element, toolName) {
  9366. var toolStateManager = getElementToolStateManager(element);
  9367. return toolStateManager.get(element, toolName);
  9368. }
  9369. /**
  9370. * Removes specific tool state from the toolStateManager.
  9371. * @public
  9372. * @method removeToolState
  9373. *
  9374. * @param {HTMLElement} element The element.
  9375. * @param {string} toolName The name of the tool the state belongs to.
  9376. * @param {Object} data The data to remove from the toolStateManager.
  9377. * @returns {undefined}
  9378. */
  9379. function removeToolState(element, toolName, data) {
  9380. var toolStateManager = getElementToolStateManager(element);
  9381. var toolData = toolStateManager.get(element, toolName);
  9382. if (!toolData || !toolData.data || !toolData.data.length) {
  9383. return;
  9384. } // Find this tool data
  9385. var indexOfData = -1;
  9386. for (var i = 0; i < toolData.data.length; i++) {
  9387. if (toolData.data[i] === data) {
  9388. indexOfData = i;
  9389. }
  9390. }
  9391. if (indexOfData !== -1) {
  9392. toolData.data.splice(indexOfData, 1);
  9393. var eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MEASUREMENT_REMOVED;
  9394. var eventData = {
  9395. toolName: toolName,
  9396. toolType: toolName,
  9397. // Deprecation notice: toolType will be replaced by toolName
  9398. element: element,
  9399. measurementData: data
  9400. };
  9401. Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_3__["default"])(element, eventType, eventData);
  9402. }
  9403. }
  9404. /**
  9405. * Removes all toolState from the toolStateManager corresponding to
  9406. * the toolName and element.
  9407. * @public
  9408. * @method clearToolState
  9409. *
  9410. * @param {HTMLElement} element The element.
  9411. * @param {string} toolName The name of the tool the state belongs to.
  9412. * @returns {undefined}
  9413. */
  9414. function clearToolState(element, toolName) {
  9415. var toolStateManager = getElementToolStateManager(element);
  9416. var toolData = toolStateManager.get(element, toolName); // If any toolData actually exists, clear it
  9417. if (toolData !== undefined) {
  9418. toolData.data = [];
  9419. }
  9420. }
  9421. /**
  9422. * Sets the tool state manager for an element
  9423. * @public
  9424. * @method setElementToolStateManager
  9425. *
  9426. * @param {HTMLElement} element The element.
  9427. * @param {Object} toolStateManager The toolStateManager.
  9428. * @returns {undefined}
  9429. */
  9430. function setElementToolStateManager(element, toolStateManager) {
  9431. var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getEnabledElement(element);
  9432. enabledElement.toolStateManager = toolStateManager;
  9433. }
  9434. /***/ }),
  9435. /***/ "./stateManagement/toolStyle.js":
  9436. /*!**************************************!*\
  9437. !*** ./stateManagement/toolStyle.js ***!
  9438. \**************************************/
  9439. /*! exports provided: default */
  9440. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  9441. "use strict";
  9442. __webpack_require__.r(__webpack_exports__);
  9443. var defaultWidth = 1,
  9444. activeWidth = 2;
  9445. function setToolWidth(width) {
  9446. defaultWidth = width;
  9447. }
  9448. function getToolWidth() {
  9449. return defaultWidth;
  9450. }
  9451. function setActiveWidth(width) {
  9452. activeWidth = width;
  9453. }
  9454. function getActiveWidth() {
  9455. return activeWidth;
  9456. }
  9457. var toolStyle = {
  9458. setToolWidth: setToolWidth,
  9459. getToolWidth: getToolWidth,
  9460. setActiveWidth: setActiveWidth,
  9461. getActiveWidth: getActiveWidth
  9462. };
  9463. /* harmony default export */ __webpack_exports__["default"] = (toolStyle);
  9464. /***/ }),
  9465. /***/ "./store/addTool.js":
  9466. /*!**************************!*\
  9467. !*** ./store/addTool.js ***!
  9468. \**************************/
  9469. /*! exports provided: addTool, addToolForElement */
  9470. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  9471. "use strict";
  9472. __webpack_require__.r(__webpack_exports__);
  9473. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addTool", function() { return addTool; });
  9474. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addToolForElement", function() { return addToolForElement; });
  9475. /* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index.js */ "./store/index.js");
  9476. /* harmony import */ var _getToolForElement_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getToolForElement.js */ "./store/getToolForElement.js");
  9477. /* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../util/logger.js */ "./util/logger.js");
  9478. var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_2__["getLogger"])('addTool');
  9479. /**
  9480. * Adds a tool to an enabled element.
  9481. *
  9482. * @public
  9483. * @function addToolForElement
  9484. * @memberof CornerstoneTools
  9485. *
  9486. * @param {HTMLElement} element The element to add the tool to.
  9487. * @param {BaseTool} ApiTool The tool to add to the element.
  9488. * @param {Object} [props] Override the default tool props
  9489. * @returns {undefined}
  9490. */
  9491. var addToolForElement = function addToolForElement(element, ApiTool, props) {
  9492. // Instantiating the tool here makes it harder to accidentally add
  9493. // The same tool (by reference) for multiple elements (which would reassign the tool
  9494. // To a new element).
  9495. var tool = new ApiTool(props);
  9496. var toolAlreadyAddedToElement = Object(_getToolForElement_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element, tool.name);
  9497. if (toolAlreadyAddedToElement) {
  9498. logger.warn('%s has already been added to the target element', tool.name);
  9499. return;
  9500. }
  9501. tool.element = element;
  9502. _index_js__WEBPACK_IMPORTED_MODULE_0__["default"].state.tools.push(tool);
  9503. };
  9504. /**
  9505. * Adds a tool to all enabled element.
  9506. *
  9507. * @public
  9508. * @function addTool
  9509. * @memberof CornerstoneTools
  9510. *
  9511. * @param {BaseTool} ApiTool The tool to add to each element.
  9512. * @param {Object} [props] Override the default tool configuration
  9513. * @returns {undefined}
  9514. */
  9515. var addTool = function addTool(ApiTool, props) {
  9516. _addToolGlobally(ApiTool, props);
  9517. _index_js__WEBPACK_IMPORTED_MODULE_0__["default"].state.enabledElements.forEach(function (element) {
  9518. addToolForElement(element, ApiTool, props);
  9519. });
  9520. };
  9521. /**
  9522. * Adds tool with matching name from globally registered tools.
  9523. * Requires `globalToolSyncEnabled` to be set to true
  9524. *
  9525. * @private
  9526. * @function addToolGlobally
  9527. *
  9528. * @param {BaseTool} ApiTool
  9529. * @param {Object} [props] Override the default tool configuration
  9530. * @returns {undefined}
  9531. */
  9532. var _addToolGlobally = function _addToolGlobally(ApiTool, props) {
  9533. var _getModule = Object(_index_js__WEBPACK_IMPORTED_MODULE_0__["getModule"])('globalConfiguration'),
  9534. configuration = _getModule.configuration;
  9535. if (!configuration.globalToolSyncEnabled) {
  9536. return;
  9537. }
  9538. var tool = new ApiTool(props);
  9539. var toolAlreadyAddedGlobally = _index_js__WEBPACK_IMPORTED_MODULE_0__["default"].state.globalTools[tool.name] !== undefined;
  9540. if (toolAlreadyAddedGlobally) {
  9541. logger.warn('%s has already been added globally', tool.name);
  9542. return;
  9543. }
  9544. _index_js__WEBPACK_IMPORTED_MODULE_0__["default"].state.globalTools[tool.name] = {
  9545. tool: ApiTool,
  9546. props: props,
  9547. activeBindings: []
  9548. };
  9549. };
  9550. /***/ }),
  9551. /***/ "./store/filterToolsUsableWithMultiPartTools.js":
  9552. /*!******************************************************!*\
  9553. !*** ./store/filterToolsUsableWithMultiPartTools.js ***!
  9554. \******************************************************/
  9555. /*! exports provided: default */
  9556. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  9557. "use strict";
  9558. __webpack_require__.r(__webpack_exports__);
  9559. /* harmony import */ var _tools_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../tools/base/BaseAnnotationTool.js */ "./tools/base/BaseAnnotationTool.js");
  9560. /* harmony import */ var _tools_base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../tools/base/BaseBrushTool.js */ "./tools/base/BaseBrushTool.js");
  9561. /**
  9562. * Filters an array of tools, returning only tools which are active or passive.
  9563. * @export
  9564. * @public
  9565. * @method
  9566. * @name filterToolsUseableWithMultiPartTools
  9567. *
  9568. * @param {Object[]} tools The input tool array.
  9569. * @returns {Object[]} The filtered array.
  9570. */
  9571. /* harmony default export */ __webpack_exports__["default"] = (function (tools) {
  9572. return tools.filter(function (tool) {
  9573. return !tool.isMultiPartTool && !(tool instanceof _tools_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_0__["default"]) && !(tool instanceof _tools_base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_1__["default"]);
  9574. });
  9575. });
  9576. /***/ }),
  9577. /***/ "./store/getActiveToolsForElement.js":
  9578. /*!*******************************************!*\
  9579. !*** ./store/getActiveToolsForElement.js ***!
  9580. \*******************************************/
  9581. /*! exports provided: default */
  9582. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  9583. "use strict";
  9584. __webpack_require__.r(__webpack_exports__);
  9585. /**
  9586. * Filters an array of tools, returning only tools which are active.
  9587. * @export
  9588. * @public
  9589. * @method
  9590. * @name getActiveToolsForElement
  9591. *
  9592. * @param {HTMLElement} element The element.
  9593. * @param {Object[]} tools The input tool array.
  9594. * @param {string} handlerType The input type being queried.
  9595. * @returns {Object[]} The filtered array.
  9596. */
  9597. /* harmony default export */ __webpack_exports__["default"] = (function (element, tools, handlerType) {
  9598. return tools.filter(function (tool) {
  9599. return tool.element === element && tool.mode === 'active' && (handlerType === undefined || tool.options["is".concat(handlerType, "Active")]);
  9600. });
  9601. });
  9602. /***/ }),
  9603. /***/ "./store/getInteractiveToolsForElement.js":
  9604. /*!************************************************!*\
  9605. !*** ./store/getInteractiveToolsForElement.js ***!
  9606. \************************************************/
  9607. /*! exports provided: default */
  9608. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  9609. "use strict";
  9610. __webpack_require__.r(__webpack_exports__);
  9611. /**
  9612. * Filters an array of tools, returning only tools which are active or passive.
  9613. * @export
  9614. * @public
  9615. * @method
  9616. * @name getInteractiveToolsForElement
  9617. *
  9618. * @param {HTMLElement} element The element.
  9619. * @param {Object[]} tools The input tool array.
  9620. * @returns {Object[]} The filtered array.
  9621. */
  9622. /* harmony default export */ __webpack_exports__["default"] = (function (element, tools) {
  9623. return tools.filter(function (tool) {
  9624. return tool.element === element && (tool.mode === 'active' || tool.mode === 'passive');
  9625. });
  9626. });
  9627. /***/ }),
  9628. /***/ "./store/getToolForElement.js":
  9629. /*!************************************!*\
  9630. !*** ./store/getToolForElement.js ***!
  9631. \************************************/
  9632. /*! exports provided: default */
  9633. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  9634. "use strict";
  9635. __webpack_require__.r(__webpack_exports__);
  9636. /* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index.js */ "./store/index.js");
  9637. /**
  9638. * Returns the tool instance attached to the element.
  9639. * @export
  9640. * @public
  9641. * @method
  9642. * @name getToolForElement
  9643. *
  9644. * @param {HTMLElement} element The element.
  9645. * @param {string} name The tool's name.
  9646. * @returns {Object} The tool instance.
  9647. */
  9648. /* harmony default export */ __webpack_exports__["default"] = (function (element, name) {
  9649. return _index_js__WEBPACK_IMPORTED_MODULE_0__["state"].tools.find(function (tool) {
  9650. return tool.element === element && tool.name === name;
  9651. });
  9652. });
  9653. /***/ }),
  9654. /***/ "./store/getToolsWithDataForElement.js":
  9655. /*!*********************************************!*\
  9656. !*** ./store/getToolsWithDataForElement.js ***!
  9657. \*********************************************/
  9658. /*! exports provided: default */
  9659. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  9660. "use strict";
  9661. __webpack_require__.r(__webpack_exports__);
  9662. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  9663. /**
  9664. * Filters an array of tools, returning only tools which have annotation data.
  9665. * @export
  9666. * @public
  9667. * @method
  9668. * @name getToolsWithDataForElement
  9669. *
  9670. * @param {HTMLElement} element The element.
  9671. * @param {Object[]} tools The input tool array.
  9672. * @returns {Object[]} The filtered array.
  9673. */
  9674. /* harmony default export */ __webpack_exports__["default"] = (function (element, tools) {
  9675. return tools.filter(function (tool) {
  9676. var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_0__["getToolState"])(element, tool.name);
  9677. return toolState && toolState.data.length > 0;
  9678. });
  9679. });
  9680. /***/ }),
  9681. /***/ "./store/getToolsWithMoveableHandles.js":
  9682. /*!**********************************************!*\
  9683. !*** ./store/getToolsWithMoveableHandles.js ***!
  9684. \**********************************************/
  9685. /*! exports provided: default */
  9686. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  9687. "use strict";
  9688. __webpack_require__.r(__webpack_exports__);
  9689. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  9690. /* harmony import */ var _manipulators_getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../manipulators/getHandleNearImagePoint.js */ "./manipulators/getHandleNearImagePoint.js");
  9691. /* harmony import */ var _util_getProximityThreshold_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../util/getProximityThreshold.js */ "./util/getProximityThreshold.js");
  9692. /**
  9693. * Filters an array of tools, returning only tools with moveable handles at the
  9694. * mouse location.
  9695. *
  9696. * @public
  9697. * @function getToolsWithMoveableHandles
  9698. *
  9699. * @param {HTMLElement} element The element
  9700. * @param {Object[]} tools The input tool array.
  9701. * @param {Object} coords The coordinates of the mouse position.
  9702. * @param {string} [interactionType=mouse]
  9703. * @returns {Object[]} The filtered array.
  9704. */
  9705. /* harmony default export */ __webpack_exports__["default"] = (function (element, tools, coords) {
  9706. var interactionType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'mouse';
  9707. return tools.filter(function (tool) {
  9708. var distanceThreshold = Object(_util_getProximityThreshold_js__WEBPACK_IMPORTED_MODULE_2__["default"])(interactionType, tool.name);
  9709. var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_0__["getToolState"])(element, tool.name);
  9710. for (var i = 0; i < toolState.data.length; i++) {
  9711. if (Object(_manipulators_getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element, toolState.data[i].handles, coords, distanceThreshold) !== undefined) {
  9712. return true;
  9713. }
  9714. }
  9715. return false;
  9716. });
  9717. });
  9718. /***/ }),
  9719. /***/ "./store/index.js":
  9720. /*!************************!*\
  9721. !*** ./store/index.js ***!
  9722. \************************/
  9723. /*! exports provided: state, getters, modules, getModule, default */
  9724. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  9725. "use strict";
  9726. __webpack_require__.r(__webpack_exports__);
  9727. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "state", function() { return state; });
  9728. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getters", function() { return getters; });
  9729. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "modules", function() { return modules; });
  9730. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getModule", function() { return getModule; });
  9731. /* harmony import */ var _modules_segmentationModule__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./modules/segmentationModule */ "./store/modules/segmentationModule/index.js");
  9732. /* harmony import */ var _modules_manipulatorStateModule__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modules/manipulatorStateModule */ "./store/modules/manipulatorStateModule.js");
  9733. /* harmony import */ var _modules_cursorModule_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./modules/cursorModule.js */ "./store/modules/cursorModule.js");
  9734. /* harmony import */ var _modules_globalConfigurationModule_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./modules/globalConfigurationModule.js */ "./store/modules/globalConfigurationModule.js");
  9735. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
  9736. /* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../util/logger.js */ "./util/logger.js");
  9737. // Modules
  9738. var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_5__["getLogger"])('store:modules:storeLogger');
  9739. var state = {
  9740. // Global
  9741. globalTools: {},
  9742. globalToolChangeHistory: [],
  9743. // Tracking
  9744. enabledElements: [],
  9745. tools: [],
  9746. isToolLocked: false,
  9747. activeMultiPartTool: null,
  9748. mousePositionImage: {},
  9749. // Settings
  9750. clickProximity: 6,
  9751. touchProximity: 10,
  9752. handleRadius: 6,
  9753. deleteIfHandleOutsideImage: true,
  9754. preventHandleOutsideImage: false,
  9755. preventTextBoxOutsideDisplayedArea: false,
  9756. // Average pixel width of index finger is 45-57 pixels
  9757. // https://www.smashingmagazine.com/2012/02/finger-friendly-design-ideal-mobile-touchscreen-target-sizes/
  9758. handleTouchOffset: {
  9759. x: 0,
  9760. y: -57
  9761. },
  9762. // Cursor
  9763. svgCursorUrl: null
  9764. };
  9765. var getters = {
  9766. mouseTools: function mouseTools() {
  9767. return state.tools.filter(function (tool) {
  9768. return tool.supportedInteractionTypes.includes('Mouse');
  9769. });
  9770. },
  9771. touchTools: function touchTools() {
  9772. return state.tools.filter(function (tool) {
  9773. return tool.supportedInteractionTypes.includes('Touch');
  9774. });
  9775. },
  9776. enabledElementByUID: function enabledElementByUID(enabledElementUID) {
  9777. return state.enabledElements.find(function (element) {
  9778. return _externalModules_js__WEBPACK_IMPORTED_MODULE_4__["default"].cornerstone.getEnabledElement(element).uuid === enabledElementUID;
  9779. });
  9780. }
  9781. };
  9782. var modules = {
  9783. segmentation: _modules_segmentationModule__WEBPACK_IMPORTED_MODULE_0__["default"],
  9784. cursor: _modules_cursorModule_js__WEBPACK_IMPORTED_MODULE_2__["default"],
  9785. globalConfiguration: _modules_globalConfigurationModule_js__WEBPACK_IMPORTED_MODULE_3__["default"],
  9786. manipulatorState: _modules_manipulatorStateModule__WEBPACK_IMPORTED_MODULE_1__["default"]
  9787. };
  9788. function getModule(moduleName) {
  9789. return modules[moduleName];
  9790. }
  9791. /* harmony default export */ __webpack_exports__["default"] = ({
  9792. modules: modules,
  9793. state: state,
  9794. getters: getters
  9795. });
  9796. /***/ }),
  9797. /***/ "./store/internals/addEnabledElement.js":
  9798. /*!**********************************************!*\
  9799. !*** ./store/internals/addEnabledElement.js ***!
  9800. \**********************************************/
  9801. /*! exports provided: default */
  9802. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  9803. "use strict";
  9804. __webpack_require__.r(__webpack_exports__);
  9805. /* harmony import */ var _eventListeners_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../eventListeners/index.js */ "./eventListeners/index.js");
  9806. /* harmony import */ var _eventDispatchers_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../eventDispatchers/index.js */ "./eventDispatchers/index.js");
  9807. /* harmony import */ var _addTool_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./../addTool.js */ "./store/addTool.js");
  9808. /* harmony import */ var _setToolMode_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./../setToolMode.js */ "./store/setToolMode.js");
  9809. /* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../index.js */ "./store/index.js");
  9810. /* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../util/logger.js */ "./util/logger.js");
  9811. var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_5__["getLogger"])('internals:addEnabledElement');
  9812. /**
  9813. * Element Enabled event.
  9814. *
  9815. * @event Cornerstone#ElementEnabled
  9816. * @type {Object}
  9817. * @property {string} type
  9818. * @property {Object} detail
  9819. * @property {HTMLElement} detail.element - The element being enabled.
  9820. */
  9821. /* TODO: It would be nice if this automatically added "all tools"
  9822. * To the enabledElement that already exist on all other tools.
  9823. * A half-measure might be a new method to "duplicate" the tool
  9824. * Configuration for an existing enabled element
  9825. * We may need to also save/store the original class/constructor per tool
  9826. * To accomplish this
  9827. */
  9828. /**
  9829. * Adds an enabledElement to our store.
  9830. * @export
  9831. * @private
  9832. * @method
  9833. * @name addEnabledElement
  9834. * @param {Cornerstone#ElementEnabled} elementEnabledEvt
  9835. * @listens Cornerstone#ElementEnabled
  9836. * @returns {void}
  9837. */
  9838. /* harmony default export */ __webpack_exports__["default"] = (function (elementEnabledEvt) {
  9839. logger.log('EVENT:ELEMENT_ENABLED');
  9840. var enabledElement = elementEnabledEvt.detail.element; // Dispatchers
  9841. _eventDispatchers_index_js__WEBPACK_IMPORTED_MODULE_1__["imageRenderedEventDispatcher"].enable(enabledElement);
  9842. _eventDispatchers_index_js__WEBPACK_IMPORTED_MODULE_1__["newImageEventDispatcher"].enable(enabledElement);
  9843. var _getModule = Object(_index_js__WEBPACK_IMPORTED_MODULE_4__["getModule"])('globalConfiguration'),
  9844. configuration = _getModule.configuration; // Mouse
  9845. if (configuration.mouseEnabled) {
  9846. _eventListeners_index_js__WEBPACK_IMPORTED_MODULE_0__["mouseEventListeners"].enable(enabledElement);
  9847. _eventListeners_index_js__WEBPACK_IMPORTED_MODULE_0__["wheelEventListener"].enable(enabledElement);
  9848. _eventDispatchers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseToolEventDispatcher"].enable(enabledElement);
  9849. } // Touch
  9850. if (configuration.touchEnabled) {
  9851. _eventListeners_index_js__WEBPACK_IMPORTED_MODULE_0__["touchEventListeners"].enable(enabledElement);
  9852. _eventDispatchers_index_js__WEBPACK_IMPORTED_MODULE_1__["touchToolEventDispatcher"].enable(enabledElement);
  9853. } // State
  9854. _addEnabledElement(enabledElement);
  9855. });
  9856. /**
  9857. * Adds the enabled element to the store.
  9858. * @private
  9859. * @method
  9860. * @param {HTMLElement} enabledElement
  9861. * @returns {void}
  9862. */
  9863. var _addEnabledElement = function _addEnabledElement(enabledElement) {
  9864. _index_js__WEBPACK_IMPORTED_MODULE_4__["default"].state.enabledElements.push(enabledElement);
  9865. if (_index_js__WEBPACK_IMPORTED_MODULE_4__["default"].modules) {
  9866. _initModulesOnElement(enabledElement);
  9867. }
  9868. _addGlobalToolsToElement(enabledElement);
  9869. _repeatGlobalToolHistory(enabledElement);
  9870. };
  9871. /**
  9872. * Iterate over our store's modules. If the module has an `enabledElementCallback`
  9873. * call it and pass it a reference to our enabled element.
  9874. * @private
  9875. * @method
  9876. * @param {Object} enabledElement
  9877. * @returns {void}
  9878. */
  9879. function _initModulesOnElement(enabledElement) {
  9880. var modules = _index_js__WEBPACK_IMPORTED_MODULE_4__["default"].modules;
  9881. Object.keys(modules).forEach(function (key) {
  9882. if (typeof modules[key].enabledElementCallback === 'function') {
  9883. modules[key].enabledElementCallback(enabledElement);
  9884. }
  9885. });
  9886. }
  9887. /**
  9888. * Iterate over our stores globalTools adding each one to `enabledElement`
  9889. * @private
  9890. * @method
  9891. * @param {HTMLElement} enabledElement
  9892. * @returns {void}
  9893. */
  9894. function _addGlobalToolsToElement(enabledElement) {
  9895. var _getModule2 = Object(_index_js__WEBPACK_IMPORTED_MODULE_4__["getModule"])('globalConfiguration'),
  9896. configuration = _getModule2.configuration;
  9897. if (!configuration.globalToolSyncEnabled) {
  9898. return;
  9899. }
  9900. Object.keys(_index_js__WEBPACK_IMPORTED_MODULE_4__["default"].state.globalTools).forEach(function (key) {
  9901. var _store$state$globalTo = _index_js__WEBPACK_IMPORTED_MODULE_4__["default"].state.globalTools[key],
  9902. tool = _store$state$globalTo.tool,
  9903. props = _store$state$globalTo.props;
  9904. Object(_addTool_js__WEBPACK_IMPORTED_MODULE_2__["addToolForElement"])(enabledElement, tool, props);
  9905. });
  9906. }
  9907. /**
  9908. * Iterate over the globalToolChangeHistory and apply each `historyEvent`
  9909. * to the supplied `enabledElement`.
  9910. * @private
  9911. * @method
  9912. * @param {HTMLElement} enabledElement
  9913. * @returns {void}
  9914. */
  9915. function _repeatGlobalToolHistory(enabledElement) {
  9916. var _getModule3 = Object(_index_js__WEBPACK_IMPORTED_MODULE_4__["getModule"])('globalConfiguration'),
  9917. configuration = _getModule3.configuration;
  9918. if (!configuration.globalToolSyncEnabled) {
  9919. return;
  9920. }
  9921. var setToolModeFns = {
  9922. active: _setToolMode_js__WEBPACK_IMPORTED_MODULE_3__["setToolActiveForElement"],
  9923. passive: _setToolMode_js__WEBPACK_IMPORTED_MODULE_3__["setToolPassiveForElement"],
  9924. enabled: _setToolMode_js__WEBPACK_IMPORTED_MODULE_3__["setToolEnabledForElement"],
  9925. disabled: _setToolMode_js__WEBPACK_IMPORTED_MODULE_3__["setToolDisabledForElement"]
  9926. };
  9927. _index_js__WEBPACK_IMPORTED_MODULE_4__["default"].state.globalToolChangeHistory.forEach(function (historyEvent) {
  9928. var args = historyEvent.args.slice(0);
  9929. args.unshift(enabledElement);
  9930. setToolModeFns[historyEvent.mode].apply(null, args);
  9931. });
  9932. }
  9933. /***/ }),
  9934. /***/ "./store/internals/removeEnabledElement.js":
  9935. /*!*************************************************!*\
  9936. !*** ./store/internals/removeEnabledElement.js ***!
  9937. \*************************************************/
  9938. /*! exports provided: default */
  9939. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  9940. "use strict";
  9941. __webpack_require__.r(__webpack_exports__);
  9942. /* harmony import */ var _eventListeners_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../eventListeners/index.js */ "./eventListeners/index.js");
  9943. /* harmony import */ var _eventDispatchers_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../eventDispatchers/index.js */ "./eventDispatchers/index.js");
  9944. /* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../index.js */ "./store/index.js");
  9945. /* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../util/logger.js */ "./util/logger.js");
  9946. /* harmony import */ var _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../stateManagement/loadHandlerManager.js */ "./stateManagement/loadHandlerManager.js");
  9947. /* harmony import */ var _setToolMode__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../setToolMode */ "./store/setToolMode.js");
  9948. var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_3__["getLogger"])('internals:removeEnabledElement');
  9949. /**
  9950. * Element Disabled event.
  9951. *
  9952. * @event Cornerstone#ElementDisabled
  9953. * @type {Object}
  9954. * @property {string} type
  9955. * @property {Object} detail
  9956. * @property {HTMLElement} detail.element - The element being disabled.
  9957. */
  9958. /**
  9959. * Removes an enabledElement from our store, and all associated tools that were added to it.
  9960. * @export
  9961. * @private
  9962. * @method
  9963. * @name removeEnabledElement
  9964. * @param {Cornerstone#ElementDisabled} elementDisabledEvt
  9965. * @listens Cornerstone#ElementDisabled
  9966. * @returns {void}
  9967. */
  9968. /* harmony default export */ __webpack_exports__["default"] = (function (elementDisabledEvt) {
  9969. logger.log('EVENT:ELEMENT_DISABLED');
  9970. var enabledElement = elementDisabledEvt.detail.element;
  9971. var _getModule = Object(_index_js__WEBPACK_IMPORTED_MODULE_2__["getModule"])('globalConfiguration'),
  9972. configuration = _getModule.configuration; // Dispatchers
  9973. _eventDispatchers_index_js__WEBPACK_IMPORTED_MODULE_1__["imageRenderedEventDispatcher"].disable(enabledElement);
  9974. _eventDispatchers_index_js__WEBPACK_IMPORTED_MODULE_1__["newImageEventDispatcher"].disable(enabledElement); // Mouse
  9975. if (configuration.mouseEnabled) {
  9976. _eventListeners_index_js__WEBPACK_IMPORTED_MODULE_0__["mouseEventListeners"].disable(enabledElement);
  9977. _eventListeners_index_js__WEBPACK_IMPORTED_MODULE_0__["wheelEventListener"].disable(enabledElement);
  9978. _eventDispatchers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseToolEventDispatcher"].disable(enabledElement);
  9979. } // Touch
  9980. if (configuration.touchEnabled) {
  9981. _eventListeners_index_js__WEBPACK_IMPORTED_MODULE_0__["touchEventListeners"].disable(enabledElement);
  9982. _eventDispatchers_index_js__WEBPACK_IMPORTED_MODULE_1__["touchToolEventDispatcher"].disable(enabledElement);
  9983. } // State
  9984. _removeAllToolsForElement(enabledElement);
  9985. _removeEnabledElement(enabledElement);
  9986. _removeLoadHandlers(enabledElement);
  9987. });
  9988. /**
  9989. * Remove all tools associated with enabled element.
  9990. * @private
  9991. * @method
  9992. * @param {HTMLElement} enabledElement
  9993. * @returns {void}
  9994. */
  9995. var _removeAllToolsForElement = function _removeAllToolsForElement(enabledElement) {
  9996. _index_js__WEBPACK_IMPORTED_MODULE_2__["default"].state.tools.forEach(function (tool) {
  9997. if (tool.element === enabledElement) {
  9998. Object(_setToolMode__WEBPACK_IMPORTED_MODULE_5__["setToolDisabledForElement"])(tool.element, tool.name);
  9999. }
  10000. });
  10001. _index_js__WEBPACK_IMPORTED_MODULE_2__["default"].state.tools = _index_js__WEBPACK_IMPORTED_MODULE_2__["default"].state.tools.filter(function (tool) {
  10002. return tool.element !== enabledElement;
  10003. });
  10004. };
  10005. /**
  10006. * Remove the enabled element from the store if it exists.
  10007. * @private
  10008. * @method
  10009. * @param {HTMLElement} enabledElement
  10010. * @returns {void}
  10011. */
  10012. var _removeEnabledElement = function _removeEnabledElement(enabledElement) {
  10013. if (_index_js__WEBPACK_IMPORTED_MODULE_2__["default"].modules) {
  10014. _cleanModulesOnElement(enabledElement);
  10015. }
  10016. var foundElementIndex = _index_js__WEBPACK_IMPORTED_MODULE_2__["default"].state.enabledElements.findIndex(function (element) {
  10017. return element === enabledElement;
  10018. });
  10019. if (foundElementIndex > -1) {
  10020. _index_js__WEBPACK_IMPORTED_MODULE_2__["default"].state.enabledElements.splice(foundElementIndex, 1);
  10021. } else {
  10022. logger.warn('unable to remove element');
  10023. }
  10024. };
  10025. /**
  10026. * Remove load handler for the element
  10027. * @private
  10028. * @method
  10029. * @param {HTMLElement} element
  10030. * @returns {void}
  10031. */
  10032. var _removeLoadHandlers = function _removeLoadHandlers(element) {
  10033. _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_4__["default"].removeHandlers(element);
  10034. };
  10035. /**
  10036. * Iterate over our store's modules. If the module has a
  10037. * `removeEnabledElementCallback` call it and clean up unneeded metadata.
  10038. * @private
  10039. * @method
  10040. * @param {Object} enabledElement
  10041. * @returns {void}
  10042. */
  10043. function _cleanModulesOnElement(enabledElement) {
  10044. var modules = _index_js__WEBPACK_IMPORTED_MODULE_2__["default"].modules;
  10045. Object.keys(modules).forEach(function (key) {
  10046. if (typeof modules[key].removeEnabledElementCallback === 'function') {
  10047. modules[key].removeEnabledElementCallback(enabledElement);
  10048. }
  10049. });
  10050. }
  10051. /***/ }),
  10052. /***/ "./store/isToolActiveForElement.js":
  10053. /*!*****************************************!*\
  10054. !*** ./store/isToolActiveForElement.js ***!
  10055. \*****************************************/
  10056. /*! exports provided: default */
  10057. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  10058. "use strict";
  10059. __webpack_require__.r(__webpack_exports__);
  10060. /* harmony import */ var _getToolForElement_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getToolForElement.js */ "./store/getToolForElement.js");
  10061. /**
  10062. * Queries if a tool is active on the specified element.
  10063. * @export
  10064. * @public
  10065. * @method
  10066. * @name isToolActiveForElement
  10067. *
  10068. * @param {HTMLElement} element The element being queried.
  10069. * @param {string} name The name of the tool.
  10070. * @returns {boolean} True if the tool is active.
  10071. */
  10072. /* harmony default export */ __webpack_exports__["default"] = (function (element, name) {
  10073. var tool = Object(_getToolForElement_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element, name);
  10074. return tool.mode === 'active';
  10075. });
  10076. /***/ }),
  10077. /***/ "./store/modules/cursorModule.js":
  10078. /*!***************************************!*\
  10079. !*** ./store/modules/cursorModule.js ***!
  10080. \***************************************/
  10081. /*! exports provided: default */
  10082. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  10083. "use strict";
  10084. __webpack_require__.r(__webpack_exports__);
  10085. /* harmony import */ var _externalModules__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../externalModules */ "./externalModules.js");
  10086. var configuration = {
  10087. iconSize: 16,
  10088. viewBox: {
  10089. x: 16,
  10090. y: 16
  10091. },
  10092. mousePoint: {
  10093. x: 8,
  10094. y: 8
  10095. },
  10096. mousePointerGroupString: "\n <path stroke=\"ACTIVE_COLOR\" d=\"M8 16L8 0\"></path>\n <path stroke=\"ACTIVE_COLOR\" d=\"M16 8L0 8\"></path>\n "
  10097. };
  10098. var setters = {
  10099. defaultOptions: function defaultOptions(newOptions) {
  10100. Object.assign(configuration, newOptions);
  10101. }
  10102. };
  10103. var getters = {
  10104. defaultOptions: function defaultOptions() {
  10105. return configuration;
  10106. }
  10107. };
  10108. /* harmony default export */ __webpack_exports__["default"] = ({
  10109. configuration: configuration,
  10110. getters: getters,
  10111. setters: setters
  10112. });
  10113. /***/ }),
  10114. /***/ "./store/modules/globalConfigurationModule.js":
  10115. /*!****************************************************!*\
  10116. !*** ./store/modules/globalConfigurationModule.js ***!
  10117. \****************************************************/
  10118. /*! exports provided: default */
  10119. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  10120. "use strict";
  10121. __webpack_require__.r(__webpack_exports__);
  10122. var configuration = {
  10123. mouseEnabled: true,
  10124. touchEnabled: true,
  10125. globalToolSyncEnabled: false,
  10126. showSVGCursors: false,
  10127. autoResizeViewports: true,
  10128. lineDash: [4, 4]
  10129. };
  10130. /* harmony default export */ __webpack_exports__["default"] = ({
  10131. configuration: configuration
  10132. });
  10133. /***/ }),
  10134. /***/ "./store/modules/manipulatorStateModule.js":
  10135. /*!*************************************************!*\
  10136. !*** ./store/modules/manipulatorStateModule.js ***!
  10137. \*************************************************/
  10138. /*! exports provided: default */
  10139. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  10140. "use strict";
  10141. __webpack_require__.r(__webpack_exports__);
  10142. /* harmony import */ var _externalModules__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../externalModules */ "./externalModules.js");
  10143. var state = {
  10144. activeManipulators: {}
  10145. };
  10146. function addActiveManipulatorForElement(element, cancelFn) {
  10147. var enabledElement = _externalModules__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.getEnabledElement(element);
  10148. var enabledElementUUID = enabledElement.uuid;
  10149. state.activeManipulators[enabledElementUUID] = cancelFn;
  10150. }
  10151. function removeActiveManipulatorForElement(element) {
  10152. var enabledElement = _externalModules__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.getEnabledElement(element);
  10153. var enabledElementUUID = enabledElement.uuid;
  10154. var activeManipulators = state.activeManipulators;
  10155. delete activeManipulators[enabledElementUUID];
  10156. }
  10157. function cancelActiveManipulatorsForElement(element) {
  10158. var enabledElement = _externalModules__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.getEnabledElement(element);
  10159. var enabledElementUUID = enabledElement.uuid;
  10160. _cancelActiveManipulatorsForElementUUID(enabledElementUUID);
  10161. }
  10162. function _cancelActiveManipulatorsForElementUUID(enabledElementUUID) {
  10163. var activeManipulators = state.activeManipulators;
  10164. var cancelFn = activeManipulators[enabledElementUUID];
  10165. if (typeof cancelFn === 'function') {
  10166. cancelFn();
  10167. }
  10168. delete activeManipulators[enabledElementUUID];
  10169. }
  10170. function cancelActiveManipulators() {
  10171. var activeManipulators = state.activeManipulators;
  10172. Object.keys(activeManipulators).forEach(function (enabledElementUUID) {
  10173. return _cancelActiveManipulatorsForElementUUID(enabledElementUUID);
  10174. });
  10175. }
  10176. function _cornerstoneNewImageHandler(evt) {
  10177. var eventData = evt.detail;
  10178. var element = eventData.element;
  10179. removeActiveManipulatorForElement(element);
  10180. }
  10181. function removeEnabledElementCallback(element) {
  10182. var NEW_IMAGE = _externalModules__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.EVENTS.NEW_IMAGE;
  10183. element.removeEventListener(NEW_IMAGE, _cornerstoneNewImageHandler);
  10184. removeActiveManipulatorForElement(element);
  10185. }
  10186. function enabledElementCallback(element) {
  10187. var NEW_IMAGE = _externalModules__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.EVENTS.NEW_IMAGE;
  10188. element.removeEventListener(NEW_IMAGE, _cornerstoneNewImageHandler);
  10189. element.addEventListener(NEW_IMAGE, _cornerstoneNewImageHandler);
  10190. }
  10191. /* harmony default export */ __webpack_exports__["default"] = ({
  10192. setters: {
  10193. // Add/remove
  10194. addActiveManipulatorForElement: addActiveManipulatorForElement,
  10195. removeActiveManipulatorForElement: removeActiveManipulatorForElement,
  10196. // Cancel
  10197. cancelActiveManipulatorsForElement: cancelActiveManipulatorsForElement,
  10198. cancelActiveManipulators: cancelActiveManipulators
  10199. },
  10200. state: state,
  10201. enabledElementCallback: enabledElementCallback,
  10202. removeEnabledElementCallback: removeEnabledElementCallback
  10203. });
  10204. /***/ }),
  10205. /***/ "./store/modules/segmentationModule/activeLabelmapIndex.js":
  10206. /*!*****************************************************************!*\
  10207. !*** ./store/modules/segmentationModule/activeLabelmapIndex.js ***!
  10208. \*****************************************************************/
  10209. /*! exports provided: getActiveLabelmapIndex, setActiveLabelmapIndex */
  10210. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  10211. "use strict";
  10212. __webpack_require__.r(__webpack_exports__);
  10213. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getActiveLabelmapIndex", function() { return getActiveLabelmapIndex; });
  10214. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setActiveLabelmapIndex", function() { return setActiveLabelmapIndex; });
  10215. /* harmony import */ var _getElement__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getElement */ "./store/modules/segmentationModule/getElement.js");
  10216. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  10217. /* harmony import */ var _addLabelmap3D__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./addLabelmap3D */ "./store/modules/segmentationModule/addLabelmap3D.js");
  10218. /* harmony import */ var _state__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./state */ "./store/modules/segmentationModule/state.js");
  10219. /* harmony import */ var _externalModules__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../externalModules */ "./externalModules.js");
  10220. /**
  10221. * Returns the index of the active `Labelmap3D`.
  10222. *
  10223. * @param {HTMLElement|string} elementOrEnabledElementUID The cornerstone
  10224. * enabled element or its UUID.
  10225. * @returns {number} The index of the active `Labelmap3D`.
  10226. */
  10227. function getActiveLabelmapIndex(elementOrEnabledElementUID) {
  10228. var element = Object(_getElement__WEBPACK_IMPORTED_MODULE_0__["default"])(elementOrEnabledElementUID);
  10229. if (!element) {
  10230. return;
  10231. }
  10232. var stackState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getToolState"])(element, 'stack');
  10233. var stackData = stackState.data[0];
  10234. var firstImageId = stackData.imageIds[0];
  10235. var brushStackState = _state__WEBPACK_IMPORTED_MODULE_3__["default"].series[firstImageId];
  10236. if (!brushStackState) {
  10237. return;
  10238. }
  10239. return brushStackState.activeLabelmapIndex;
  10240. }
  10241. /**
  10242. * Sets the active `labelmapIndex` for the `BrushStackState` displayed on this
  10243. * element. Creates the corresponding `Labelmap3D` if it doesn't exist.
  10244. *
  10245. * @param {HTMLElement|string} elementOrEnabledElementUID The cornerstone enabled
  10246. * element or its UUID.
  10247. * @param {number} labelmapIndex = 0 The index of the labelmap.
  10248. * @returns {null}
  10249. */
  10250. function setActiveLabelmapIndex(elementOrEnabledElementUID) {
  10251. var labelmapIndex = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
  10252. var element = Object(_getElement__WEBPACK_IMPORTED_MODULE_0__["default"])(elementOrEnabledElementUID);
  10253. if (!element) {
  10254. return;
  10255. }
  10256. var cornerstone = _externalModules__WEBPACK_IMPORTED_MODULE_4__["default"].cornerstone;
  10257. var stackState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getToolState"])(element, 'stack');
  10258. var stackData = stackState.data[0];
  10259. var enabledElement = cornerstone.getEnabledElement(element);
  10260. var _enabledElement$image = enabledElement.image,
  10261. rows = _enabledElement$image.rows,
  10262. columns = _enabledElement$image.columns;
  10263. var numberOfFrames = stackData.imageIds.length;
  10264. var size = rows * columns * numberOfFrames;
  10265. var firstImageId = stackData.imageIds[0];
  10266. var brushStackState = _state__WEBPACK_IMPORTED_MODULE_3__["default"].series[firstImageId];
  10267. if (brushStackState) {
  10268. brushStackState.activeLabelmapIndex = labelmapIndex;
  10269. if (!brushStackState.labelmaps3D[labelmapIndex]) {
  10270. Object(_addLabelmap3D__WEBPACK_IMPORTED_MODULE_2__["default"])(brushStackState, labelmapIndex, size);
  10271. }
  10272. } else {
  10273. _state__WEBPACK_IMPORTED_MODULE_3__["default"].series[firstImageId] = {
  10274. activeLabelmapIndex: labelmapIndex,
  10275. labelmaps3D: []
  10276. };
  10277. brushStackState = _state__WEBPACK_IMPORTED_MODULE_3__["default"].series[firstImageId];
  10278. Object(_addLabelmap3D__WEBPACK_IMPORTED_MODULE_2__["default"])(brushStackState, labelmapIndex, size);
  10279. }
  10280. cornerstone.updateImage(element);
  10281. }
  10282. /***/ }),
  10283. /***/ "./store/modules/segmentationModule/activeSegmentIndex.js":
  10284. /*!****************************************************************!*\
  10285. !*** ./store/modules/segmentationModule/activeSegmentIndex.js ***!
  10286. \****************************************************************/
  10287. /*! exports provided: getActiveSegmentIndex, setActiveSegmentIndex, incrementActiveSegmentIndex, decrementActiveSegmentIndex */
  10288. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  10289. "use strict";
  10290. __webpack_require__.r(__webpack_exports__);
  10291. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getActiveSegmentIndex", function() { return getActiveSegmentIndex; });
  10292. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setActiveSegmentIndex", function() { return setActiveSegmentIndex; });
  10293. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "incrementActiveSegmentIndex", function() { return incrementActiveSegmentIndex; });
  10294. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "decrementActiveSegmentIndex", function() { return decrementActiveSegmentIndex; });
  10295. /* harmony import */ var _getElement__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getElement */ "./store/modules/segmentationModule/getElement.js");
  10296. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  10297. /* harmony import */ var _state__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./state */ "./store/modules/segmentationModule/state.js");
  10298. /* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../index.js */ "./store/index.js");
  10299. /**
  10300. * Returns the `activeSegmentIndex` for the active `Labelmap3D` for the `BrushStackState` displayed on the element.
  10301. *
  10302. * @param {HTMLElement|string} elementOrEnabledElementUID The cornerstone enabled
  10303. * element or its UUID.
  10304. * @param {number} [labelmapIndex] The labelmap index, defaults to the active labelmap index.
  10305. * @returns {number} The active segment index.
  10306. */
  10307. function getActiveSegmentIndex(elementOrEnabledElementUID, labelmapIndex) {
  10308. var element = Object(_getElement__WEBPACK_IMPORTED_MODULE_0__["default"])(elementOrEnabledElementUID);
  10309. if (!element) {
  10310. return;
  10311. }
  10312. var stackState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getToolState"])(element, 'stack');
  10313. var stackData = stackState.data[0];
  10314. var firstImageId = stackData.imageIds[0];
  10315. var brushStackState = _state__WEBPACK_IMPORTED_MODULE_2__["default"].series[firstImageId];
  10316. if (brushStackState) {
  10317. labelmapIndex = labelmapIndex === undefined ? brushStackState.activeLabelmapIndex : labelmapIndex;
  10318. var labelmap3D = brushStackState.labelmaps3D[labelmapIndex];
  10319. if (labelmap3D) {
  10320. return labelmap3D.activeSegmentIndex;
  10321. }
  10322. }
  10323. return 1;
  10324. }
  10325. /**
  10326. * Sets the `activeSegmentIndex` for the active `Labelmap3D` on the element.
  10327. *
  10328. * @param {HTMLElement|string} elementOrEnabledElementUID The cornerstone enabled
  10329. * element or its UUID.
  10330. * @param {number} segmentIndex The segmentIndex to set active.
  10331. * @returns {null}
  10332. */
  10333. function setActiveSegmentIndex(elementOrEnabledElementUID, segmentIndex) {
  10334. var element = Object(_getElement__WEBPACK_IMPORTED_MODULE_0__["default"])(elementOrEnabledElementUID);
  10335. if (!element) {
  10336. return;
  10337. }
  10338. var stackState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getToolState"])(element, 'stack');
  10339. var stackData = stackState.data[0];
  10340. var firstImageId = stackData.imageIds[0];
  10341. var brushStackState = _state__WEBPACK_IMPORTED_MODULE_2__["default"].series[firstImageId];
  10342. if (!brushStackState) {
  10343. return;
  10344. }
  10345. var activeLabelmapIndex = brushStackState.activeLabelmapIndex;
  10346. var labelmap3D = brushStackState.labelmaps3D[activeLabelmapIndex];
  10347. var _getModule = Object(_index_js__WEBPACK_IMPORTED_MODULE_3__["getModule"])('segmentation'),
  10348. configuration = _getModule.configuration;
  10349. if (segmentIndex <= 0) {
  10350. segmentIndex = 1;
  10351. } else if (segmentIndex > configuration.segmentsPerLabelmap) {
  10352. segmentIndex = configuration.segmentsPerLabelmap;
  10353. }
  10354. labelmap3D.activeSegmentIndex = segmentIndex;
  10355. }
  10356. /**
  10357. * Increment the `activeSegmentIndex` for the active `Labelmap3D` on the element.
  10358. *
  10359. * @param {HTMLElement|string} elementOrEnabledElementUID The cornerstone enabled
  10360. * element or its UUID.
  10361. * @returns {null}
  10362. */
  10363. function incrementActiveSegmentIndex(elementOrEnabledElementUID) {
  10364. var element = Object(_getElement__WEBPACK_IMPORTED_MODULE_0__["default"])(elementOrEnabledElementUID);
  10365. if (!element) {
  10366. return;
  10367. }
  10368. _changeActiveSegmentIndex(element, 'increase');
  10369. }
  10370. /**
  10371. * Decrement the `activeSegmentIndex` for the active `Labelmap3D` on the element.
  10372. *
  10373. * @param {HTMLElement} elementOrEnabledElementUID The cornerstone enabled
  10374. * element or its UUID.
  10375. * @returns {null}
  10376. */
  10377. function decrementActiveSegmentIndex(elementOrEnabledElementUID) {
  10378. var element = Object(_getElement__WEBPACK_IMPORTED_MODULE_0__["default"])(elementOrEnabledElementUID);
  10379. if (!element) {
  10380. return;
  10381. }
  10382. _changeActiveSegmentIndex(element, 'decrease');
  10383. }
  10384. /**
  10385. * Changes the `activeSegmentIndex` for the active `Labelmap3D` on the element.
  10386. *
  10387. * @param {HTMLElement} element The cornerstone enabled element.
  10388. * @param {string} increaseOrDecrease = Whether to increase/decrease the activeLabelmapIndex.
  10389. * @returns {null}
  10390. */
  10391. function _changeActiveSegmentIndex(element) {
  10392. var increaseOrDecrease = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'increase';
  10393. var _getModule2 = Object(_index_js__WEBPACK_IMPORTED_MODULE_3__["getModule"])('segmentation'),
  10394. configuration = _getModule2.configuration;
  10395. var stackState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getToolState"])(element, 'stack');
  10396. var stackData = stackState.data[0];
  10397. var firstImageId = stackData.imageIds[0];
  10398. var brushStackState = _state__WEBPACK_IMPORTED_MODULE_2__["default"].series[firstImageId];
  10399. if (!brushStackState) {
  10400. return;
  10401. }
  10402. var activeLabelmapIndex = brushStackState.activeLabelmapIndex;
  10403. var labelmap3D = brushStackState.labelmaps3D[activeLabelmapIndex];
  10404. switch (increaseOrDecrease) {
  10405. case 'increase':
  10406. labelmap3D.activeSegmentIndex++;
  10407. if (labelmap3D.activeSegmentIndex > configuration.segmentsPerLabelmap) {
  10408. labelmap3D.activeSegmentIndex = 1;
  10409. }
  10410. break;
  10411. case 'decrease':
  10412. labelmap3D.activeSegmentIndex--;
  10413. if (labelmap3D.activeSegmentIndex <= 0) {
  10414. labelmap3D.activeSegmentIndex = configuration.segmentsPerLabelmap;
  10415. }
  10416. break;
  10417. }
  10418. }
  10419. /***/ }),
  10420. /***/ "./store/modules/segmentationModule/addLabelmap2D.js":
  10421. /*!***********************************************************!*\
  10422. !*** ./store/modules/segmentationModule/addLabelmap2D.js ***!
  10423. \***********************************************************/
  10424. /*! exports provided: default */
  10425. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  10426. "use strict";
  10427. __webpack_require__.r(__webpack_exports__);
  10428. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return addLabelmap2D; });
  10429. /* harmony import */ var _arrayTypes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./arrayTypes */ "./store/modules/segmentationModule/arrayTypes.js");
  10430. /* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../index.js */ "./store/index.js");
  10431. var UINT_16_ARRAY = _arrayTypes__WEBPACK_IMPORTED_MODULE_0__["default"].UINT_16_ARRAY,
  10432. FLOAT_32_ARRAY = _arrayTypes__WEBPACK_IMPORTED_MODULE_0__["default"].FLOAT_32_ARRAY;
  10433. /**
  10434. * Adds a `Labelmap2D` view of one frame of a `Labelmap3D`.
  10435. *
  10436. * @param {BrushStackState} brushStackState The `BrushStackState` for a particular `Series`.
  10437. * @param {number} labelmapIndex The labelmap index.
  10438. * @param {number} imageIdIndex The stack position of the image.
  10439. * @param {number} rows The number of rows in the image.
  10440. * @param {number} columns The number of columns in the image.
  10441. * @returns {null}
  10442. */
  10443. function addLabelmap2D(brushStackState, labelmapIndex, imageIdIndex, rows, columns) {
  10444. var _getModule = Object(_index_js__WEBPACK_IMPORTED_MODULE_1__["getModule"])('segmentation'),
  10445. configuration = _getModule.configuration;
  10446. var sliceLength = rows * columns;
  10447. var elementOffset = sliceLength * imageIdIndex;
  10448. var pixelData;
  10449. switch (configuration.arrayType) {
  10450. case UINT_16_ARRAY:
  10451. pixelData = new Uint16Array(brushStackState.labelmaps3D[labelmapIndex].buffer, elementOffset * 2, // 2 bytes/voxel
  10452. sliceLength);
  10453. break;
  10454. case FLOAT_32_ARRAY:
  10455. pixelData = new Float32Array(brushStackState.labelmaps3D[labelmapIndex].buffer, elementOffset * 4, // 4 bytes/voxel
  10456. sliceLength);
  10457. break;
  10458. default:
  10459. throw new Error("Unsupported Array Type ".concat(configuration.arrayType));
  10460. }
  10461. brushStackState.labelmaps3D[labelmapIndex].labelmaps2D[imageIdIndex] = {
  10462. pixelData: pixelData,
  10463. segmentsOnLabelmap: []
  10464. };
  10465. }
  10466. /***/ }),
  10467. /***/ "./store/modules/segmentationModule/addLabelmap3D.js":
  10468. /*!***********************************************************!*\
  10469. !*** ./store/modules/segmentationModule/addLabelmap3D.js ***!
  10470. \***********************************************************/
  10471. /*! exports provided: default */
  10472. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  10473. "use strict";
  10474. __webpack_require__.r(__webpack_exports__);
  10475. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return addLabelmap3D; });
  10476. /* harmony import */ var _arrayTypes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./arrayTypes */ "./store/modules/segmentationModule/arrayTypes.js");
  10477. /* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../index.js */ "./store/index.js");
  10478. var UINT_16_ARRAY = _arrayTypes__WEBPACK_IMPORTED_MODULE_0__["default"].UINT_16_ARRAY,
  10479. FLOAT_32_ARRAY = _arrayTypes__WEBPACK_IMPORTED_MODULE_0__["default"].FLOAT_32_ARRAY;
  10480. /**
  10481. * AddLabelmap3D - Adds a `Labelmap3D` object to the `BrushStackState` object.
  10482. *
  10483. * @param {BrushStackState} brushStackState The labelmap state for a particular stack.
  10484. * @param {number} labelmapIndex The labelmapIndex to set.
  10485. * @param {number} size The size of the ArrayBuffer in bytes/ 2.
  10486. * @returns {null}
  10487. */
  10488. function addLabelmap3D(brushStackState, labelmapIndex, size) {
  10489. var _getModule = Object(_index_js__WEBPACK_IMPORTED_MODULE_1__["getModule"])('segmentation'),
  10490. configuration = _getModule.configuration;
  10491. var bytesPerVoxel;
  10492. switch (configuration.arrayType) {
  10493. case UINT_16_ARRAY:
  10494. bytesPerVoxel = 2;
  10495. break;
  10496. case FLOAT_32_ARRAY:
  10497. bytesPerVoxel = 4;
  10498. break;
  10499. default:
  10500. throw new Error("Unsupported Array Type ".concat(configuration.arrayType));
  10501. } // Buffer size is multiplied by bytesPerVoxel to allocate enough space.
  10502. brushStackState.labelmaps3D[labelmapIndex] = {
  10503. buffer: new ArrayBuffer(size * bytesPerVoxel),
  10504. labelmaps2D: [],
  10505. metadata: [],
  10506. activeSegmentIndex: 1,
  10507. colorLUTIndex: 0,
  10508. segmentsHidden: [],
  10509. undo: [],
  10510. redo: []
  10511. };
  10512. }
  10513. /***/ }),
  10514. /***/ "./store/modules/segmentationModule/arrayTypes.js":
  10515. /*!********************************************************!*\
  10516. !*** ./store/modules/segmentationModule/arrayTypes.js ***!
  10517. \********************************************************/
  10518. /*! exports provided: default */
  10519. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  10520. "use strict";
  10521. __webpack_require__.r(__webpack_exports__);
  10522. var ARRAY_TYPES = {
  10523. UINT_16_ARRAY: 0,
  10524. FLOAT_32_ARRAY: 1
  10525. };
  10526. /* harmony default export */ __webpack_exports__["default"] = (ARRAY_TYPES);
  10527. /***/ }),
  10528. /***/ "./store/modules/segmentationModule/colorLUT.js":
  10529. /*!******************************************************!*\
  10530. !*** ./store/modules/segmentationModule/colorLUT.js ***!
  10531. \******************************************************/
  10532. /*! exports provided: default, setColorLUTIndexForLabelmap3D, getColorForSegmentIndexColorLUT, setColorForSegmentIndexOfColorLUT, getColorLUT */
  10533. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  10534. "use strict";
  10535. __webpack_require__.r(__webpack_exports__);
  10536. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return setColorLUT; });
  10537. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setColorLUTIndexForLabelmap3D", function() { return setColorLUTIndexForLabelmap3D; });
  10538. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getColorForSegmentIndexColorLUT", function() { return getColorForSegmentIndexColorLUT; });
  10539. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setColorForSegmentIndexOfColorLUT", function() { return setColorForSegmentIndexOfColorLUT; });
  10540. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getColorLUT", function() { return getColorLUT; });
  10541. /* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "../node_modules/@babel/runtime/helpers/toConsumableArray.js");
  10542. /* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__);
  10543. /* harmony import */ var _util_logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../util/logger */ "./util/logger.js");
  10544. /* harmony import */ var _state__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./state */ "./store/modules/segmentationModule/state.js");
  10545. /* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../index.js */ "./store/index.js");
  10546. var logger = Object(_util_logger__WEBPACK_IMPORTED_MODULE_1__["getLogger"])('store:modules:segmentationModule:setColorLUT');
  10547. /**
  10548. * SetColorLUT - Sets the labelmap to a specfic LUT, or generates a new LUT.
  10549. *
  10550. * @param {number} labelmapIndex The labelmap index to apply the color LUT to.
  10551. * @param {number[][]} [colorLUT] An array of The colorLUT to set.
  10552. * @returns {null}
  10553. */
  10554. function setColorLUT(colorLUTIndex) {
  10555. var colorLUT = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
  10556. var _getModule = Object(_index_js__WEBPACK_IMPORTED_MODULE_3__["getModule"])('segmentation'),
  10557. configuration = _getModule.configuration;
  10558. var segmentsPerLabelmap = configuration.segmentsPerLabelmap;
  10559. if (colorLUT) {
  10560. _checkColorLUTLength(colorLUT, segmentsPerLabelmap);
  10561. if (colorLUT.length < segmentsPerLabelmap) {
  10562. colorLUT = [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(colorLUT), _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(_generateNewColorLUT(segmentsPerLabelmap - colorLUT.length)));
  10563. }
  10564. } else {
  10565. // Autogenerate colorLUT.
  10566. colorLUT = colorLUT || _generateNewColorLUT(segmentsPerLabelmap);
  10567. } // Apppend the "zero" (no label) color to the front of the LUT.
  10568. colorLUT.unshift([0, 0, 0, 0]);
  10569. _state__WEBPACK_IMPORTED_MODULE_2__["default"].colorLutTables[colorLUTIndex] = colorLUT;
  10570. }
  10571. function setColorLUTIndexForLabelmap3D(labelmap3D, colorLUTIndex) {
  10572. labelmap3D.colorLUTIndex = colorLUTIndex;
  10573. }
  10574. function getColorForSegmentIndexColorLUT(labelmap3DOrColorLUTIndex, segmentIndex) {
  10575. var colorLUT = getColorLUT(labelmap3DOrColorLUTIndex);
  10576. return colorLUT[segmentIndex];
  10577. }
  10578. /**
  10579. * Sets a single color of a colorLUT.
  10580. *
  10581. * @param {Object|number} labelmap3DOrColorLUTIndex Either a `Labelmap3D` object (who's referenced colorLUT will be changed), or a colorLUTIndex.
  10582. * @param {number} segmentIndex The segmentIndex color to change.
  10583. * @param {number[]} colorArray The color values in RGBA array format (required length 4).
  10584. */
  10585. function setColorForSegmentIndexOfColorLUT(labelmap3DOrColorLUTIndex, segmentIndex, colorArray) {
  10586. var colorLUT = getColorLUT(labelmap3DOrColorLUTIndex);
  10587. colorLUT[segmentIndex] = colorArray;
  10588. }
  10589. function getColorLUT(labelmap3DOrColorLUTIndex) {
  10590. if (typeof labelmap3DOrColorLUTIndex === 'number') {
  10591. return _state__WEBPACK_IMPORTED_MODULE_2__["default"].colorLutTables[labelmap3DOrColorLUTIndex];
  10592. }
  10593. return _state__WEBPACK_IMPORTED_MODULE_2__["default"].colorLutTables[labelmap3DOrColorLUTIndex.colorLUTIndex];
  10594. }
  10595. /**
  10596. * Checks the length of `colorLUT` compared to `segmnetsPerLabelmap` and flags up any warnings.
  10597. * @param {number[][]} colorLUT
  10598. * @param {number} segmentsPerLabelmap
  10599. * @returns {boolean} Whether the length is valid.
  10600. */
  10601. function _checkColorLUTLength(colorLUT, segmentsPerLabelmap) {
  10602. if (colorLUT.length < segmentsPerLabelmap) {
  10603. logger.warn("The provided colorLUT only provides ".concat(colorLUT.length, " labels, whereas segmentsPerLabelmap is set to ").concat(segmentsPerLabelmap, ". Autogenerating the rest."));
  10604. } else if (colorLUT.length > segmentsPerLabelmap) {
  10605. logger.warn("segmentsPerLabelmap is set to ".concat(segmentsPerLabelmap, ", and the provided colorLUT provides ").concat(colorLUT.length, ". Using the first ").concat(segmentsPerLabelmap, " colors from the LUT."));
  10606. }
  10607. }
  10608. /**
  10609. * Generates a new color LUT (Look Up Table) of length `numberOfColors`,
  10610. * which returns an RGBA color for each segment index.
  10611. *
  10612. * @param {Number} numberOfColors = 255 The number of colors to generate
  10613. * @returns {Number[][]} The array of RGB values.
  10614. */
  10615. function _generateNewColorLUT() {
  10616. var numberOfColors = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 255;
  10617. var rgbArr = [];
  10618. for (var i = 0; i < numberOfColors; i++) {
  10619. rgbArr.push(getRGBAfromHSLA(getNextHue(), getNextL()));
  10620. }
  10621. return rgbArr;
  10622. }
  10623. var goldenAngle = 137.5;
  10624. var hueValue = 222.5;
  10625. function getNextHue() {
  10626. hueValue += goldenAngle;
  10627. if (hueValue >= 360) {
  10628. hueValue -= 360;
  10629. }
  10630. return hueValue;
  10631. }
  10632. var l = 0.6;
  10633. var maxL = 0.82;
  10634. var minL = 0.3;
  10635. var incL = 0.07;
  10636. function getNextL() {
  10637. l += incL;
  10638. if (l > maxL) {
  10639. var diff = l - maxL;
  10640. l = minL + diff;
  10641. }
  10642. return l;
  10643. }
  10644. /**
  10645. * GetRGBAfromHSL - Returns an RGBA color given H, S, L and A.
  10646. *
  10647. * @param {Number} hue The hue.
  10648. * @param {Number} s = 1 The saturation.
  10649. * @param {Number} l = 0.6 The lightness.
  10650. * @param {Number} alpha = 255 The alpha.
  10651. * @returns {Number[]} The RGBA formatted color.
  10652. */
  10653. function getRGBAfromHSLA(hue) {
  10654. var s = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
  10655. var l = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0.6;
  10656. var alpha = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 255;
  10657. var c = (1 - Math.abs(2 * l - 1)) * s;
  10658. var x = c * (1 - Math.abs(hue / 60 % 2 - 1));
  10659. var m = l - c / 2;
  10660. var r, g, b;
  10661. if (hue < 60) {
  10662. r = c;
  10663. g = x;
  10664. b = 0;
  10665. } else if (hue < 120) {
  10666. r = x;
  10667. g = c;
  10668. b = 0;
  10669. } else if (hue < 180) {
  10670. r = 0;
  10671. g = c;
  10672. b = x;
  10673. } else if (hue < 240) {
  10674. r = 0;
  10675. g = x;
  10676. b = c;
  10677. } else if (hue < 300) {
  10678. r = x;
  10679. g = 0;
  10680. b = c;
  10681. } else if (hue < 360) {
  10682. r = c;
  10683. g = 0;
  10684. b = x;
  10685. }
  10686. return [(r + m) * 255, (g + m) * 255, (b + m) * 255, alpha];
  10687. }
  10688. /***/ }),
  10689. /***/ "./store/modules/segmentationModule/defaultConfiguration.js":
  10690. /*!******************************************************************!*\
  10691. !*** ./store/modules/segmentationModule/defaultConfiguration.js ***!
  10692. \******************************************************************/
  10693. /*! exports provided: default */
  10694. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  10695. "use strict";
  10696. __webpack_require__.r(__webpack_exports__);
  10697. /* harmony import */ var _arrayTypes__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./arrayTypes */ "./store/modules/segmentationModule/arrayTypes.js");
  10698. var UINT_16_ARRAY = _arrayTypes__WEBPACK_IMPORTED_MODULE_0__["default"].UINT_16_ARRAY; // Segmentation module configuration.
  10699. var defaultConfiguration = {
  10700. renderOutline: true,
  10701. renderFill: true,
  10702. shouldRenderInactiveLabelmaps: true,
  10703. radius: 10,
  10704. minRadius: 1,
  10705. maxRadius: 50,
  10706. fillAlpha: 0.2,
  10707. fillAlphaInactive: 0.1,
  10708. outlineAlpha: 0.7,
  10709. outlineAlphaInactive: 0.35,
  10710. outlineWidth: 3,
  10711. storeHistory: true,
  10712. segmentsPerLabelmap: 65535,
  10713. // Max is 65535 due to using 16-bit Unsigned ints.
  10714. arrayType: UINT_16_ARRAY
  10715. };
  10716. /* harmony default export */ __webpack_exports__["default"] = (defaultConfiguration);
  10717. /***/ }),
  10718. /***/ "./store/modules/segmentationModule/deleteSegment.js":
  10719. /*!***********************************************************!*\
  10720. !*** ./store/modules/segmentationModule/deleteSegment.js ***!
  10721. \***********************************************************/
  10722. /*! exports provided: default */
  10723. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  10724. "use strict";
  10725. __webpack_require__.r(__webpack_exports__);
  10726. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return deleteSegment; });
  10727. /* harmony import */ var _getElement__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getElement */ "./store/modules/segmentationModule/getElement.js");
  10728. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  10729. /* harmony import */ var _state__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./state */ "./store/modules/segmentationModule/state.js");
  10730. /* harmony import */ var _externalModules__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../externalModules */ "./externalModules.js");
  10731. /**
  10732. * Deletes the segment and any associated metadata from the `Labelmap3D`.
  10733. *
  10734. * @param {HTMLElement|string} elementOrEnabledElementUID The cornerstone enabled element or its UUID.
  10735. * @param {number} segmentIndex The segment Index
  10736. * @param {number} [labelmapIndex] The labelmap index. Defaults to the active labelmap index.
  10737. *
  10738. * @returns {null}
  10739. */
  10740. function deleteSegment(elementOrEnabledElementUID, segmentIndex, labelmapIndex) {
  10741. if (!segmentIndex) {
  10742. return;
  10743. }
  10744. var element = Object(_getElement__WEBPACK_IMPORTED_MODULE_0__["default"])(elementOrEnabledElementUID);
  10745. if (!element) {
  10746. return;
  10747. }
  10748. var stackState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getToolState"])(element, 'stack');
  10749. var stackData = stackState.data[0];
  10750. var firstImageId = stackData.imageIds[0];
  10751. var brushStackState = _state__WEBPACK_IMPORTED_MODULE_2__["default"].series[firstImageId];
  10752. if (!brushStackState) {
  10753. return;
  10754. }
  10755. labelmapIndex = labelmapIndex === undefined ? brushStackState.activeLabelmapIndex : labelmapIndex;
  10756. var labelmap3D = brushStackState.labelmaps3D[labelmapIndex];
  10757. if (!labelmap3D) {
  10758. return;
  10759. } // Delete metadata if present.
  10760. delete labelmap3D.metadata[segmentIndex];
  10761. var labelmaps2D = labelmap3D.labelmaps2D; // Clear segment's voxels.
  10762. for (var i = 0; i < labelmaps2D.length; i++) {
  10763. var labelmap2D = labelmaps2D[i]; // If the labelmap2D has data, and it contains the segment, delete it.
  10764. if (labelmap2D && labelmap2D.segmentsOnLabelmap.includes(segmentIndex)) {
  10765. var pixelData = labelmap2D.pixelData; // Remove this segment from the list.
  10766. var indexOfSegment = labelmap2D.segmentsOnLabelmap.indexOf(segmentIndex);
  10767. labelmap2D.segmentsOnLabelmap.splice(indexOfSegment, 1); // Delete the label for this segment.
  10768. for (var p = 0; p < pixelData.length; p++) {
  10769. if (pixelData[p] === segmentIndex) {
  10770. pixelData[p] = 0;
  10771. }
  10772. }
  10773. }
  10774. }
  10775. _externalModules__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstone.updateImage(element);
  10776. }
  10777. /***/ }),
  10778. /***/ "./store/modules/segmentationModule/getBrushColor.js":
  10779. /*!***********************************************************!*\
  10780. !*** ./store/modules/segmentationModule/getBrushColor.js ***!
  10781. \***********************************************************/
  10782. /*! exports provided: default */
  10783. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  10784. "use strict";
  10785. __webpack_require__.r(__webpack_exports__);
  10786. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getBrushColor; });
  10787. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  10788. /* harmony import */ var _state__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./state */ "./store/modules/segmentationModule/state.js");
  10789. /* harmony import */ var _getElement__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./getElement */ "./store/modules/segmentationModule/getElement.js");
  10790. /* harmony import */ var _util_logger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../util/logger */ "./util/logger.js");
  10791. var logger = Object(_util_logger__WEBPACK_IMPORTED_MODULE_3__["getLogger"])('store:modules:segmentationModule:getBrushColor');
  10792. /**
  10793. * Returns the brush color as a rgba CSS color for the active segment of the active
  10794. * `Labelmap3D` for the `BrushStackState` displayed on the element.
  10795. *
  10796. * @param {HTMLElement|string} elementOrEnabledElementUID The cornerstone enabled
  10797. * element or its UUID.
  10798. * @param {boolean} drawing = false Whether the user is drawing or not.
  10799. * @returns {string} An rgba value as a string.
  10800. */
  10801. function getBrushColor(elementOrEnabledElementUID) {
  10802. var drawing = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
  10803. var element = Object(_getElement__WEBPACK_IMPORTED_MODULE_2__["default"])(elementOrEnabledElementUID);
  10804. if (!element) {
  10805. return;
  10806. }
  10807. var stackState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_0__["getToolState"])(element, 'stack');
  10808. if (!stackState) {
  10809. logger.error('Consumers must define stacks in their application if using segmentations in cornerstoneTools.');
  10810. return;
  10811. }
  10812. var stackData = stackState.data[0];
  10813. var firstImageId = stackData.imageIds[0];
  10814. var brushStackState = _state__WEBPACK_IMPORTED_MODULE_1__["default"].series[firstImageId];
  10815. var color;
  10816. if (brushStackState) {
  10817. var activeLabelmapIndex = brushStackState.activeLabelmapIndex;
  10818. var labelmap3D = brushStackState.labelmaps3D[activeLabelmapIndex];
  10819. var activeSegmentIndex = labelmap3D.activeSegmentIndex;
  10820. color = _state__WEBPACK_IMPORTED_MODULE_1__["default"].colorLutTables[labelmap3D.colorLUTIndex][activeSegmentIndex];
  10821. } else {
  10822. // No data yet, make brush the default color of colormap 0.
  10823. color = _state__WEBPACK_IMPORTED_MODULE_1__["default"].colorLutTables[0][1];
  10824. }
  10825. return drawing ? "rgba(".concat(color[0], ", ").concat(color[1], ", ").concat(color[2], ", 1.0 )") : "rgba(".concat(color[0], ", ").concat(color[1], ", ").concat(color[2], ", 0.8 )");
  10826. }
  10827. /***/ }),
  10828. /***/ "./store/modules/segmentationModule/getElement.js":
  10829. /*!********************************************************!*\
  10830. !*** ./store/modules/segmentationModule/getElement.js ***!
  10831. \********************************************************/
  10832. /*! exports provided: default */
  10833. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  10834. "use strict";
  10835. __webpack_require__.r(__webpack_exports__);
  10836. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _getElement; });
  10837. /* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../index.js */ "./store/index.js");
  10838. /**
  10839. * Returns the cornerstone enabled element given either the element or its enabledElement UUID.
  10840. *
  10841. * @param {string|HTMLElement} elementOrEnabledElementUID The enabledElement
  10842. * or its UUID.
  10843. * @returns {HTMLElement}
  10844. */
  10845. function _getElement(elementOrEnabledElementUID) {
  10846. if (elementOrEnabledElementUID instanceof HTMLElement) {
  10847. return elementOrEnabledElementUID;
  10848. }
  10849. return _index_js__WEBPACK_IMPORTED_MODULE_0__["getters"].enabledElementByUID(elementOrEnabledElementUID);
  10850. }
  10851. /***/ }),
  10852. /***/ "./store/modules/segmentationModule/getLabelmap2D.js":
  10853. /*!***********************************************************!*\
  10854. !*** ./store/modules/segmentationModule/getLabelmap2D.js ***!
  10855. \***********************************************************/
  10856. /*! exports provided: default, getLabelmap2DByImageIdIndex */
  10857. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  10858. "use strict";
  10859. __webpack_require__.r(__webpack_exports__);
  10860. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getLabelmap2D; });
  10861. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLabelmap2DByImageIdIndex", function() { return getLabelmap2DByImageIdIndex; });
  10862. /* harmony import */ var _getElement__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getElement */ "./store/modules/segmentationModule/getElement.js");
  10863. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  10864. /* harmony import */ var _getSegmentsOnPixeldata__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./getSegmentsOnPixeldata */ "./store/modules/segmentationModule/getSegmentsOnPixeldata.js");
  10865. /* harmony import */ var _addLabelmap3D__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./addLabelmap3D */ "./store/modules/segmentationModule/addLabelmap3D.js");
  10866. /* harmony import */ var _addLabelmap2D__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./addLabelmap2D */ "./store/modules/segmentationModule/addLabelmap2D.js");
  10867. /* harmony import */ var _externalModules__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../externalModules */ "./externalModules.js");
  10868. /* harmony import */ var _state__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./state */ "./store/modules/segmentationModule/state.js");
  10869. /* harmony import */ var _arrayTypes__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./arrayTypes */ "./store/modules/segmentationModule/arrayTypes.js");
  10870. /* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../index.js */ "./store/index.js");
  10871. /* harmony import */ var _util_logger__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../../util/logger */ "./util/logger.js");
  10872. var UINT_16_ARRAY = _arrayTypes__WEBPACK_IMPORTED_MODULE_7__["default"].UINT_16_ARRAY,
  10873. FLOAT_32_ARRAY = _arrayTypes__WEBPACK_IMPORTED_MODULE_7__["default"].FLOAT_32_ARRAY;
  10874. var logger = Object(_util_logger__WEBPACK_IMPORTED_MODULE_9__["getLogger"])('store:modules:segmentationModule:getLabelmap2D');
  10875. /**
  10876. * Returns the active `labelmap3D` and the `currentImageIdIndex`. If a labelmap does
  10877. * not get exist, creates a new one. Generates a `labelmap2D` for the `currentImageIndex`
  10878. * if it does not yet exist.
  10879. *
  10880. * @param {HTMLElement|string} elementOrEnabledElementUID The cornerstone enabled
  10881. * element or its UUID.
  10882. * @returns {Object} The `Labelmap2D`, `Labelmap3D`, `activeLabelmapIndex` and `currentImageIdIndex`.
  10883. */
  10884. function getLabelmap2D(elementOrEnabledElementUID) {
  10885. var element = Object(_getElement__WEBPACK_IMPORTED_MODULE_0__["default"])(elementOrEnabledElementUID);
  10886. if (!element) {
  10887. return;
  10888. }
  10889. var cornerstone = _externalModules__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone;
  10890. var stackState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getToolState"])(element, 'stack');
  10891. if (!stackState) {
  10892. logger.error('Consumers must define stacks in their application if using segmentations in cornerstoneTools.');
  10893. return;
  10894. }
  10895. var stackData = stackState.data[0];
  10896. var enabledElement = cornerstone.getEnabledElement(element);
  10897. var currentImageIdIndex = stackData.currentImageIdIndex;
  10898. var _enabledElement$image = enabledElement.image,
  10899. rows = _enabledElement$image.rows,
  10900. columns = _enabledElement$image.columns;
  10901. var numberOfFrames = stackData.imageIds.length;
  10902. var firstImageId = stackData.imageIds[0];
  10903. var brushStackState = _state__WEBPACK_IMPORTED_MODULE_6__["default"].series[firstImageId];
  10904. var activeLabelmapIndex;
  10905. if (brushStackState) {
  10906. activeLabelmapIndex = brushStackState.activeLabelmapIndex;
  10907. if (!brushStackState.labelmaps3D[activeLabelmapIndex]) {
  10908. var size = rows * columns * numberOfFrames;
  10909. Object(_addLabelmap3D__WEBPACK_IMPORTED_MODULE_3__["default"])(brushStackState, activeLabelmapIndex, size);
  10910. }
  10911. if (!brushStackState.labelmaps3D[activeLabelmapIndex].labelmaps2D[currentImageIdIndex]) {
  10912. Object(_addLabelmap2D__WEBPACK_IMPORTED_MODULE_4__["default"])(brushStackState, activeLabelmapIndex, currentImageIdIndex, rows, columns);
  10913. }
  10914. } else {
  10915. activeLabelmapIndex = 0;
  10916. _state__WEBPACK_IMPORTED_MODULE_6__["default"].series[firstImageId] = {
  10917. activeLabelmapIndex: activeLabelmapIndex,
  10918. labelmaps3D: []
  10919. };
  10920. brushStackState = _state__WEBPACK_IMPORTED_MODULE_6__["default"].series[firstImageId];
  10921. var _size = rows * columns * numberOfFrames;
  10922. Object(_addLabelmap3D__WEBPACK_IMPORTED_MODULE_3__["default"])(brushStackState, activeLabelmapIndex, _size);
  10923. Object(_addLabelmap2D__WEBPACK_IMPORTED_MODULE_4__["default"])(brushStackState, activeLabelmapIndex, currentImageIdIndex, rows, columns);
  10924. }
  10925. var labelmap3D = brushStackState.labelmaps3D[activeLabelmapIndex];
  10926. return {
  10927. labelmap2D: labelmap3D.labelmaps2D[currentImageIdIndex],
  10928. labelmap3D: labelmap3D,
  10929. currentImageIdIndex: currentImageIdIndex,
  10930. activeLabelmapIndex: activeLabelmapIndex
  10931. };
  10932. }
  10933. /**
  10934. * Returns a `Labelmap2D` view of a `Labelmap3D` for the given `imageIdIndex`.
  10935. * Creates and caches it if it doesn't yet exist.
  10936. *
  10937. * @param {Labelmap3D} labelmap3D The `Labelmap3D` object.
  10938. * @param {number} imageIdIndex The imageId Index.
  10939. * @param {number} rows The number of rows.
  10940. * @param {number} columns The number of columns.
  10941. * @returns {null}
  10942. */
  10943. function getLabelmap2DByImageIdIndex(labelmap3D, imageIdIndex, rows, columns) {
  10944. if (!labelmap3D.labelmaps2D[imageIdIndex]) {
  10945. var _getModule = Object(_index_js__WEBPACK_IMPORTED_MODULE_8__["getModule"])('segmentation'),
  10946. configuration = _getModule.configuration;
  10947. var sliceLength = rows * columns;
  10948. var elementOffset = sliceLength * imageIdIndex;
  10949. var pixelData;
  10950. switch (configuration.arrayType) {
  10951. case UINT_16_ARRAY:
  10952. pixelData = new Uint16Array(labelmap3D.buffer, elementOffset * 2, // 2 bytes/voxel
  10953. sliceLength);
  10954. break;
  10955. case FLOAT_32_ARRAY:
  10956. pixelData = new Float32Array(labelmap3D.buffer, elementOffset * 4, // 4 bytes/voxel
  10957. sliceLength);
  10958. break;
  10959. default:
  10960. throw new Error("Unsupported Array Type ".concat(configuration.arrayType));
  10961. }
  10962. labelmap3D.labelmaps2D[imageIdIndex] = {
  10963. pixelData: pixelData,
  10964. segmentsOnLabelmap: Object(_getSegmentsOnPixeldata__WEBPACK_IMPORTED_MODULE_2__["default"])(pixelData)
  10965. };
  10966. }
  10967. return labelmap3D.labelmaps2D[imageIdIndex];
  10968. }
  10969. /***/ }),
  10970. /***/ "./store/modules/segmentationModule/getLabelmapBuffers.js":
  10971. /*!****************************************************************!*\
  10972. !*** ./store/modules/segmentationModule/getLabelmapBuffers.js ***!
  10973. \****************************************************************/
  10974. /*! exports provided: getLabelmapBuffers, getActiveLabelmapBuffer */
  10975. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  10976. "use strict";
  10977. __webpack_require__.r(__webpack_exports__);
  10978. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLabelmapBuffers", function() { return getLabelmapBuffers; });
  10979. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getActiveLabelmapBuffer", function() { return getActiveLabelmapBuffer; });
  10980. /* harmony import */ var _getElement__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getElement */ "./store/modules/segmentationModule/getElement.js");
  10981. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  10982. /* harmony import */ var _getLabelmaps3D__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./getLabelmaps3D */ "./store/modules/segmentationModule/getLabelmaps3D.js");
  10983. /* harmony import */ var _state__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./state */ "./store/modules/segmentationModule/state.js");
  10984. /* harmony import */ var _arrayTypes__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./arrayTypes */ "./store/modules/segmentationModule/arrayTypes.js");
  10985. /* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../index.js */ "./store/index.js");
  10986. var UINT_16_ARRAY = _arrayTypes__WEBPACK_IMPORTED_MODULE_4__["default"].UINT_16_ARRAY,
  10987. FLOAT_32_ARRAY = _arrayTypes__WEBPACK_IMPORTED_MODULE_4__["default"].FLOAT_32_ARRAY;
  10988. /**
  10989. * GetLabelmapBuffers - Returns the `buffer` of each `Labelmap3D` associated
  10990. * with the `BrushStackState` displayed on the element, or a specific
  10991. * one if `labelmapIndex` is defined.
  10992. *
  10993. * @param {HTMLElement|string} elementOrEnabledElementUID The cornerstone enabled
  10994. * element or its UUID.
  10995. * @param {type} [labelmapIndex] Optional filtering to only return one labelmap.
  10996. * @returns {Object|Object[]} An array of objects containing the `labelmapIndex`, and the corresponding buffer and `colorLUT`.
  10997. * Only one object if `labelmapIndex` was specified.
  10998. *
  10999. */
  11000. function getLabelmapBuffers(elementOrEnabledElementUID, labelmapIndex) {
  11001. var element = Object(_getElement__WEBPACK_IMPORTED_MODULE_0__["default"])(elementOrEnabledElementUID);
  11002. if (!element) {
  11003. return;
  11004. }
  11005. var _getLabelmaps3D = Object(_getLabelmaps3D__WEBPACK_IMPORTED_MODULE_2__["default"])(element),
  11006. labelmaps3D = _getLabelmaps3D.labelmaps3D;
  11007. if (!labelmaps3D) {
  11008. return [];
  11009. }
  11010. var _getModule = Object(_index_js__WEBPACK_IMPORTED_MODULE_5__["getModule"])('segmentation'),
  11011. configuration = _getModule.configuration;
  11012. var type;
  11013. var bytesPerVoxel;
  11014. switch (configuration.arrayType) {
  11015. case UINT_16_ARRAY:
  11016. type = 'Uint16Array';
  11017. bytesPerVoxel = '2';
  11018. break;
  11019. case FLOAT_32_ARRAY:
  11020. type = 'Float32Array';
  11021. bytesPerVoxel = '4';
  11022. break;
  11023. default:
  11024. throw new Error("Unsupported Array Type ".concat(configuration.arrayType));
  11025. }
  11026. var colorLutTables = _state__WEBPACK_IMPORTED_MODULE_3__["default"].colorLutTables;
  11027. if (labelmapIndex !== undefined) {
  11028. var labelmap3D = labelmaps3D[labelmapIndex];
  11029. if (labelmap3D) {
  11030. return {
  11031. labelmapIndex: labelmapIndex,
  11032. bytesPerVoxel: bytesPerVoxel,
  11033. type: type,
  11034. buffer: labelmap3D.buffer,
  11035. colorLUT: colorLutTables[labelmap3D.colorLUTIndex]
  11036. };
  11037. }
  11038. return;
  11039. }
  11040. var labelmapBuffers = [];
  11041. for (var i = 0; i < labelmaps3D.length; i++) {
  11042. var _labelmap3D = labelmaps3D[i];
  11043. if (_labelmap3D) {
  11044. labelmapBuffers.push({
  11045. labelmapIndex: i,
  11046. bytesPerVoxel: 2,
  11047. buffer: _labelmap3D.buffer,
  11048. colorLUT: colorLutTables[_labelmap3D.colorLUTIndex]
  11049. });
  11050. }
  11051. }
  11052. return labelmapBuffers;
  11053. }
  11054. /**
  11055. * Returns the `buffer` corresponding to the active `Labelmap3D` associated with the
  11056. * `BrushStackState` displayed onv the element.
  11057. *
  11058. * @param {HTMLElement|string} elementOrEnabledElementUID The cornerstone enabled
  11059. * element or its UUID.
  11060. * @returns {Object} An object containing the `labelmapIndex` and
  11061. * corresponding `buffer`.
  11062. */
  11063. function getActiveLabelmapBuffer(elementOrEnabledElementUID) {
  11064. var element = Object(_getElement__WEBPACK_IMPORTED_MODULE_0__["default"])(elementOrEnabledElementUID);
  11065. if (!element) {
  11066. return;
  11067. }
  11068. var stackState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getToolState"])(element, 'stack');
  11069. var imageIds = stackState.data[0].imageIds;
  11070. var firstImageId = imageIds[0];
  11071. var brushStackState = _state__WEBPACK_IMPORTED_MODULE_3__["default"].series[firstImageId];
  11072. if (!brushStackState) {
  11073. return;
  11074. }
  11075. var activeLabelmapIndex = brushStackState.activeLabelmapIndex;
  11076. return getLabelmapBuffers(element, activeLabelmapIndex);
  11077. }
  11078. /***/ }),
  11079. /***/ "./store/modules/segmentationModule/getLabelmapStats.js":
  11080. /*!**************************************************************!*\
  11081. !*** ./store/modules/segmentationModule/getLabelmapStats.js ***!
  11082. \**************************************************************/
  11083. /*! exports provided: default, _calculateLabelmapStats */
  11084. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  11085. "use strict";
  11086. __webpack_require__.r(__webpack_exports__);
  11087. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getLabelmapStats; });
  11088. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_calculateLabelmapStats", function() { return _calculateLabelmapStats; });
  11089. /* harmony import */ var _getElement__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getElement */ "./store/modules/segmentationModule/getElement.js");
  11090. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  11091. /* harmony import */ var _state__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./state */ "./store/modules/segmentationModule/state.js");
  11092. /* harmony import */ var _externalModules__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../externalModules */ "./externalModules.js");
  11093. /* harmony import */ var _util_logger__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../util/logger */ "./util/logger.js");
  11094. var logger = Object(_util_logger__WEBPACK_IMPORTED_MODULE_4__["getLogger"])('store:modules:segmentationModule:getLabelmapStats');
  11095. /**
  11096. * Returns the maximum pixel value, mean and standard deviation of the segment
  11097. * given by the `segmentIndex` and `labelmapIndex`.
  11098. *
  11099. * @param {HTMLElement|string} elementOrEnabledElementUID The cornerstone enabled
  11100. * element or its UUID.
  11101. * @param {number} segmentIndex The segment index to query.
  11102. * @param {number} labelmapIndex The `labelmapIndex` of the `Labelmap3D` to query.
  11103. * Defaults to the activeLabelmapIndex if not given.
  11104. * @returns {Promise|null} A promise that resolves to an object containing
  11105. * the maximum pixel value, the mean and the standard deviation.
  11106. * Returns null if no cornerstone element is found.
  11107. */
  11108. function getLabelmapStats(elementOrEnabledElementUID, segmentIndex, labelmapIndex) {
  11109. var cornerstone = _externalModules__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstone;
  11110. var element = Object(_getElement__WEBPACK_IMPORTED_MODULE_0__["default"])(elementOrEnabledElementUID);
  11111. if (!element) {
  11112. return null;
  11113. }
  11114. var stackState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getToolState"])(element, 'stack');
  11115. var imageIds = stackState.data[0].imageIds;
  11116. var firstImageId = imageIds[0];
  11117. return new Promise(function (resolve) {
  11118. var brushStackState = _state__WEBPACK_IMPORTED_MODULE_2__["default"].series[firstImageId];
  11119. if (!brushStackState) {
  11120. resolve(null);
  11121. }
  11122. var _getImagePlanes2 = _getImagePlanes(imageIds),
  11123. sufficientMetadata = _getImagePlanes2.sufficientMetadata,
  11124. imagePlanes = _getImagePlanes2.imagePlanes;
  11125. if (!sufficientMetadata) {
  11126. logger.warn('Insufficient imagePlaneModule information to calculate volume statistics.');
  11127. resolve(null);
  11128. }
  11129. labelmapIndex = labelmapIndex === undefined ? brushStackState.activeLabelmapIndex : labelmapIndex;
  11130. var labelmap3D = brushStackState.labelmaps3D[labelmapIndex];
  11131. var imagePromises = [];
  11132. for (var i = 0; i < imageIds.length; i++) {
  11133. imagePromises.push(cornerstone.loadAndCacheImage(imageIds[i]));
  11134. }
  11135. Promise.all(imagePromises).then(function (images) {
  11136. var stats = _calculateLabelmapStats(labelmap3D, images, imagePlanes, segmentIndex);
  11137. resolve(stats);
  11138. });
  11139. });
  11140. }
  11141. /**
  11142. *
  11143. * @param {string[]} imageIds An array of cornerstone imageIds.
  11144. * @returns {Object} An object containing an array of per-frame imagePlane metadata,
  11145. * and a flag indicating if the metadata was present.
  11146. */
  11147. function _getImagePlanes(imageIds) {
  11148. var imagePlanes = [];
  11149. var cornerstone = _externalModules__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstone;
  11150. var metadataProvider = cornerstone.metaData;
  11151. var sufficientMetadata = true;
  11152. for (var i = 0; i < imageIds.length; i++) {
  11153. var imagePlaneModule = metadataProvider.get('imagePlaneModule', imageIds[i]);
  11154. if (!imagePlaneModule) {
  11155. sufficientMetadata = false;
  11156. break;
  11157. }
  11158. imagePlanes.push(imagePlaneModule);
  11159. }
  11160. return {
  11161. sufficientMetadata: sufficientMetadata,
  11162. imagePlanes: imagePlanes
  11163. };
  11164. }
  11165. /**
  11166. *
  11167. * @param {Labelmap3D} labelmap3D The labelmap3D object.
  11168. * @param {Object[]} images An array of cornerstone images.
  11169. * @param {Object[]} imagePlanes An array of the per-frame imagePlane metadata.
  11170. * @param {number} segmentIndex
  11171. *
  11172. * @returns {Object} Statistics object containing the volume in mm^3; and the
  11173. * min, max, mean and stdev of the segmented voxels.
  11174. */
  11175. function _calculateLabelmapStats(labelmap3D, images, imagePlanes, segmentIndex) {
  11176. var voxelsPerFrame = _getVoxelsPerFrameForSegment(labelmap3D, images, imagePlanes, segmentIndex);
  11177. var volumeWeightedMean = 0;
  11178. var max = voxelsPerFrame[0].values[0];
  11179. var min = max;
  11180. var volume = 0; // Calculate Min, Max, volume and mean.
  11181. for (var i = 0; i < voxelsPerFrame.length; i++) {
  11182. var _voxelsPerFrame$i = voxelsPerFrame[i],
  11183. values = _voxelsPerFrame$i.values,
  11184. voxelInMM3 = _voxelsPerFrame$i.voxelInMM3;
  11185. volume += voxelInMM3 * values.length;
  11186. var sum = 0;
  11187. values.forEach(function (value) {
  11188. if (value > max) {
  11189. max = value;
  11190. } else if (value < min) {
  11191. min = value;
  11192. }
  11193. sum += value;
  11194. });
  11195. volumeWeightedMean += sum * voxelInMM3;
  11196. }
  11197. volumeWeightedMean /= volume;
  11198. var volumeWeightedStDev = 0; // Calculate the volume weigthed standard deviation.
  11199. for (var _i = 0; _i < voxelsPerFrame.length; _i++) {
  11200. var _voxelsPerFrame$_i = voxelsPerFrame[_i],
  11201. values = _voxelsPerFrame$_i.values,
  11202. voxelInMM3 = _voxelsPerFrame$_i.voxelInMM3;
  11203. var stdDevSum = 0;
  11204. values.forEach(function (value) {
  11205. stdDevSum += Math.pow(value - volumeWeightedMean, 2);
  11206. });
  11207. volumeWeightedStDev += stdDevSum * voxelInMM3;
  11208. }
  11209. volumeWeightedStDev /= volume;
  11210. volumeWeightedStDev = Math.sqrt(volumeWeightedStDev);
  11211. return {
  11212. volume: volume,
  11213. mean: volumeWeightedMean,
  11214. stdDev: volumeWeightedStDev,
  11215. max: max,
  11216. min: min
  11217. };
  11218. }
  11219. /**
  11220. * Returns an array of voxel values masked by the segment for each frame,
  11221. * as well as the real world volume of a voxel on that frame.
  11222. *
  11223. * @param {Labelmap3D} labelmap3D The `Labelmap3D` object.
  11224. * @param {Object[]} images An array of cornerstone images.
  11225. * @param {Object[]} imagePlanes An array of the per-frame imagePlane metadata.
  11226. * @param {number} segmentIndex The index of the segment to check.
  11227. *
  11228. * @returns {Object[]} An array of voxel values and voxel volumes per frame.
  11229. */
  11230. function _getVoxelsPerFrameForSegment(labelmap3D, images, imagePlanes, segmentIndex) {
  11231. var _images$ = images[0],
  11232. rowPixelSpacing = _images$.rowPixelSpacing,
  11233. columnPixelSpacing = _images$.columnPixelSpacing;
  11234. var labelmaps2D = labelmap3D.labelmaps2D;
  11235. var voxelsPerFrame = [];
  11236. for (var i = 0; i < labelmaps2D.length; i++) {
  11237. var labelmap2D = labelmaps2D[i];
  11238. if (labelmap2D && labelmap2D.segmentsOnLabelmap.includes(segmentIndex)) {
  11239. var sliceThickness = _getSliceThickness(images, imagePlanes, i);
  11240. var voxelInMM3 = sliceThickness * rowPixelSpacing * columnPixelSpacing;
  11241. var segmentationPixelData = labelmap2D.pixelData;
  11242. var imagePixelData = images[i].getPixelData();
  11243. var values = []; // Iterate over segmentationPixelData and count voxels.
  11244. for (var p = 0; p < segmentationPixelData.length; p++) {
  11245. if (segmentationPixelData[p] === segmentIndex) {
  11246. values.push(imagePixelData[p]);
  11247. }
  11248. }
  11249. voxelsPerFrame.push({
  11250. voxelInMM3: voxelInMM3,
  11251. values: values
  11252. });
  11253. }
  11254. }
  11255. return voxelsPerFrame;
  11256. }
  11257. /**
  11258. * Estimates the slice thickness given the image position patient of adjacent frames.
  11259. * For the edges the slice thickness is assumed to be the perpendicular distance to the closest frame.
  11260. * For all other frames the slice thickness is taken to be the sum of half of the distance to the frame above and below.
  11261. *
  11262. * Voxels on the first or last frame are assumed to be full occupied.
  11263. *
  11264. * @param {Object[]} images An array of cornerstone images.
  11265. * @param {Object[]} imagePlanes An array of the per-frame imagePlane metadata.
  11266. * @param {number} frameIndex The index of the frame to get the slice thickness for.
  11267. *
  11268. * @returns {number}
  11269. */
  11270. function _getSliceThickness(images, imagePlanes, frameIndex) {
  11271. var numberOfSlices = images.length;
  11272. var ipp = imagePlanes[frameIndex].imagePositionPatient; // Special cases: Edge of volume - Assume thickness is the distance
  11273. // between the current slice and the closest slice as this is all the information we have.
  11274. if (frameIndex === 0) {
  11275. var _ippAbove = imagePlanes[frameIndex + 1].imagePositionPatient;
  11276. return distanceBetweenSlices(ipp, _ippAbove);
  11277. } else if (frameIndex === numberOfSlices - 1) {
  11278. var _ippBelow = imagePlanes[frameIndex - 1].imagePositionPatient;
  11279. return distanceBetweenSlices(ipp, _ippBelow);
  11280. } // Estimate slice thickness from the two adjacent slices.
  11281. var ippBelow = imagePlanes[frameIndex - 1].imagePositionPatient;
  11282. var ippAbove = imagePlanes[frameIndex + 1].imagePositionPatient;
  11283. return (distanceBetweenSlices(ipp, ippBelow) + distanceBetweenSlices(ipp, ippAbove)) / 2;
  11284. }
  11285. /**
  11286. * Returns the ditance between two imagePostionPatient coordinates.
  11287. *
  11288. * @param {number[]} ipp1 The first image position patient array.
  11289. * @param {number[]} ipp2 The second image position patient array.
  11290. */
  11291. function distanceBetweenSlices(ipp1, ipp2) {
  11292. return Math.sqrt(Math.pow(ipp1[0] - ipp2[0], 2) + Math.pow(ipp1[1] - ipp2[1], 2) + Math.pow(ipp1[2] - ipp2[2], 2));
  11293. }
  11294. /***/ }),
  11295. /***/ "./store/modules/segmentationModule/getLabelmaps3D.js":
  11296. /*!************************************************************!*\
  11297. !*** ./store/modules/segmentationModule/getLabelmaps3D.js ***!
  11298. \************************************************************/
  11299. /*! exports provided: default, getLabelmap3D */
  11300. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  11301. "use strict";
  11302. __webpack_require__.r(__webpack_exports__);
  11303. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getLabelmaps3D; });
  11304. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLabelmap3D", function() { return getLabelmap3D; });
  11305. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  11306. /* harmony import */ var _getElement__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getElement */ "./store/modules/segmentationModule/getElement.js");
  11307. /* harmony import */ var _state__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./state */ "./store/modules/segmentationModule/state.js");
  11308. /* harmony import */ var _util_logger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../util/logger */ "./util/logger.js");
  11309. var logger = Object(_util_logger__WEBPACK_IMPORTED_MODULE_3__["getLogger"])('store:modules:segmentationModule:getLabelmaps3D');
  11310. /**
  11311. * Returns the `Labelmap3D` objects associated with the series displayed
  11312. * in the element, the `activeLabelmapIndex` and the `currentImageIdIndex`.
  11313. *
  11314. * @param {HTMLElement|string} elementOrEnabledElementUID The cornerstone enabled
  11315. * element or its UUID.
  11316. * @returns {Object} An object containing `Labelmap3D` objects,
  11317. * the `activeLabelmapIndex` amd the `currentImageIdIndex`.
  11318. */
  11319. function getLabelmaps3D(elementOrEnabledElementUID) {
  11320. var element = Object(_getElement__WEBPACK_IMPORTED_MODULE_1__["default"])(elementOrEnabledElementUID);
  11321. if (!element) {
  11322. return;
  11323. }
  11324. var stackState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_0__["getToolState"])(element, 'stack');
  11325. if (!stackState) {
  11326. logger.error('Consumers must define stacks in their application if using segmentations in cornerstoneTools.');
  11327. return;
  11328. }
  11329. var stackData = stackState.data[0];
  11330. var firstImageId = stackData.imageIds[0];
  11331. var brushStackState = _state__WEBPACK_IMPORTED_MODULE_2__["default"].series[firstImageId];
  11332. var labelmaps3D;
  11333. var activeLabelmapIndex;
  11334. if (brushStackState) {
  11335. labelmaps3D = brushStackState.labelmaps3D;
  11336. activeLabelmapIndex = brushStackState.activeLabelmapIndex;
  11337. }
  11338. return {
  11339. labelmaps3D: labelmaps3D,
  11340. activeLabelmapIndex: activeLabelmapIndex,
  11341. currentImageIdIndex: stackData.currentImageIdIndex
  11342. };
  11343. }
  11344. /**
  11345. * Returns a single `Labelmap3D` object associated with the series displayed
  11346. * in the element.
  11347. *
  11348. * @param {HTMLElement|string} elementOrEnabledElementUID The cornerstone enabled
  11349. * element or its UUID.
  11350. * @param {number} [labelmapIndex] The index of the `Labelmap3D` to retrieve. Defaults to
  11351. * the `activeLabelmapIndex`.
  11352. * @returns {Object} A `Labelmap3D` object.
  11353. */
  11354. function getLabelmap3D(elementOrEnabledElementUID, labelmapIndex) {
  11355. var _getLabelmaps3D = getLabelmaps3D(elementOrEnabledElementUID),
  11356. labelmaps3D = _getLabelmaps3D.labelmaps3D,
  11357. activeLabelmapIndex = _getLabelmaps3D.activeLabelmapIndex;
  11358. labelmapIndex = labelmapIndex !== undefined ? labelmapIndex : activeLabelmapIndex;
  11359. return labelmaps3D[labelmapIndex];
  11360. }
  11361. /***/ }),
  11362. /***/ "./store/modules/segmentationModule/getSegmentOfActiveLabelmapAtEvent.js":
  11363. /*!*******************************************************************************!*\
  11364. !*** ./store/modules/segmentationModule/getSegmentOfActiveLabelmapAtEvent.js ***!
  11365. \*******************************************************************************/
  11366. /*! exports provided: default */
  11367. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  11368. "use strict";
  11369. __webpack_require__.r(__webpack_exports__);
  11370. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getSegmentOfActiveLabelmapAtEvent; });
  11371. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  11372. /* harmony import */ var _state__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./state */ "./store/modules/segmentationModule/state.js");
  11373. /* harmony import */ var _util_isPointInImage__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../util/isPointInImage */ "./util/isPointInImage.js");
  11374. /* harmony import */ var _util_logger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../util/logger */ "./util/logger.js");
  11375. var logger = Object(_util_logger__WEBPACK_IMPORTED_MODULE_3__["getLogger"])('store:modules:segmentationModule:getSegmentOfActiveLabelmapAtEvent');
  11376. /**
  11377. * Returns the segmentIndex at the event position and its corresponding metadata.
  11378. * @param {Object} evt A cornerstone event with a currentPoints property.
  11379. *
  11380. * @returns {Object} An `Object` with the `segmentIndex` and its `metadata`.
  11381. */
  11382. function getSegmentOfActiveLabelmapAtEvent(evt) {
  11383. var eventData = evt.detail;
  11384. var element = eventData.element,
  11385. image = eventData.image,
  11386. currentPoints = eventData.currentPoints;
  11387. if (!currentPoints) {
  11388. logger.warn('Not a cornerstone input event.');
  11389. return;
  11390. }
  11391. var cols = image.width;
  11392. var rows = image.height;
  11393. if (!element) {
  11394. return;
  11395. }
  11396. var stackState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_0__["getToolState"])(element, 'stack');
  11397. var stackData = stackState.data[0];
  11398. var currentImageIdIndex = stackData.currentImageIdIndex;
  11399. var firstImageId = stackData.imageIds[0];
  11400. var brushStackState = _state__WEBPACK_IMPORTED_MODULE_1__["default"].series[firstImageId];
  11401. var activeLabelmapIndex = brushStackState.activeLabelmapIndex;
  11402. var labelmap3D = brushStackState.labelmaps3D[activeLabelmapIndex];
  11403. if (!labelmap3D) {
  11404. // No labelmap3D === no segment here.
  11405. return;
  11406. }
  11407. var labelmap2D = labelmap3D.labelmaps2D[currentImageIdIndex];
  11408. if (!labelmap2D) {
  11409. // No labelmap on this imageId === no segment here.
  11410. return;
  11411. }
  11412. var pixelData = labelmap2D.pixelData;
  11413. var _currentPoints$image = currentPoints.image,
  11414. x = _currentPoints$image.x,
  11415. y = _currentPoints$image.y;
  11416. x = Math.floor(x);
  11417. y = Math.floor(y);
  11418. if (Object(_util_isPointInImage__WEBPACK_IMPORTED_MODULE_2__["default"])({
  11419. x: x,
  11420. y: y
  11421. }, rows, cols)) {
  11422. var segmentIndex = pixelData[y * cols + x];
  11423. if (segmentIndex === 0) {
  11424. return;
  11425. }
  11426. return {
  11427. segmentIndex: segmentIndex,
  11428. metadata: labelmap3D.metadata[segmentIndex]
  11429. };
  11430. } // Outside image === no segment here.
  11431. return;
  11432. }
  11433. /***/ }),
  11434. /***/ "./store/modules/segmentationModule/getSegmentsOnPixeldata.js":
  11435. /*!********************************************************************!*\
  11436. !*** ./store/modules/segmentationModule/getSegmentsOnPixeldata.js ***!
  11437. \********************************************************************/
  11438. /*! exports provided: default */
  11439. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  11440. "use strict";
  11441. __webpack_require__.r(__webpack_exports__);
  11442. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getSegmentsOnPixelData; });
  11443. /* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "../node_modules/@babel/runtime/helpers/toConsumableArray.js");
  11444. /* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__);
  11445. /**
  11446. * Returns an array of the segment indicies present on the `pixelData`.
  11447. * @param {UInt16Array|Float32Array} pixelData The pixel data array.
  11448. */
  11449. function getSegmentsOnPixelData(pixelData) {
  11450. return _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(new Set(pixelData));
  11451. }
  11452. /***/ }),
  11453. /***/ "./store/modules/segmentationModule/history.js":
  11454. /*!*****************************************************!*\
  11455. !*** ./store/modules/segmentationModule/history.js ***!
  11456. \*****************************************************/
  11457. /*! exports provided: pushState, undo, redo */
  11458. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  11459. "use strict";
  11460. __webpack_require__.r(__webpack_exports__);
  11461. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pushState", function() { return pushState; });
  11462. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "undo", function() { return undo; });
  11463. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "redo", function() { return redo; });
  11464. /* harmony import */ var _getLabelmaps3D__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getLabelmaps3D */ "./store/modules/segmentationModule/getLabelmaps3D.js");
  11465. /* harmony import */ var _util_logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../util/logger */ "./util/logger.js");
  11466. /* harmony import */ var _externalModules__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../externalModules */ "./externalModules.js");
  11467. var logger = Object(_util_logger__WEBPACK_IMPORTED_MODULE_1__["getLogger"])('util:segmentation:labelmap3DHistory');
  11468. function pushState(element, operations, labelmapIndex) {
  11469. var labelmap3D = Object(_getLabelmaps3D__WEBPACK_IMPORTED_MODULE_0__["getLabelmap3D"])(element, labelmapIndex);
  11470. labelmap3D.undo.push(operations);
  11471. labelmap3D.redo = [];
  11472. }
  11473. function undo(element, labelmapIndex) {
  11474. var labelmap3D = Object(_getLabelmaps3D__WEBPACK_IMPORTED_MODULE_0__["getLabelmap3D"])(element, labelmapIndex);
  11475. var undo = labelmap3D.undo,
  11476. redo = labelmap3D.redo;
  11477. if (!undo.length) {
  11478. logger.warn('No undos left.');
  11479. return;
  11480. } // Pop last set of operations from undo.
  11481. var operations = undo.pop(); // Undo operations.
  11482. applyState(labelmap3D, operations, 1); // Push set of operations to redo.
  11483. redo.push(operations);
  11484. _externalModules__WEBPACK_IMPORTED_MODULE_2__["default"].cornerstone.updateImage(element);
  11485. }
  11486. function redo(element, labelmapIndex) {
  11487. var labelmap3D = Object(_getLabelmaps3D__WEBPACK_IMPORTED_MODULE_0__["getLabelmap3D"])(element, labelmapIndex);
  11488. var undo = labelmap3D.undo,
  11489. redo = labelmap3D.redo;
  11490. if (!redo.length) {
  11491. logger.warn('No redos left.');
  11492. return;
  11493. } // Pop last set of operations from redo.
  11494. var operations = redo.pop(); // Redo operations.
  11495. applyState(labelmap3D, operations, 2); // Push set of operations to undo.
  11496. undo.push(operations);
  11497. _externalModules__WEBPACK_IMPORTED_MODULE_2__["default"].cornerstone.updateImage(element);
  11498. }
  11499. function applyState(labelmap3D, operations, replaceIndex) {
  11500. var labelmaps2D = labelmap3D.labelmaps2D;
  11501. operations.forEach(function (operation) {
  11502. var imageIdIndex = operation.imageIdIndex,
  11503. diff = operation.diff;
  11504. var labelmap2D = labelmaps2D[imageIdIndex];
  11505. var pixelData = labelmap2D.pixelData;
  11506. for (var i = 0; i < diff.length; i++) {
  11507. var diffI = diff[i];
  11508. pixelData[diffI[0]] = diffI[replaceIndex];
  11509. }
  11510. });
  11511. }
  11512. /***/ }),
  11513. /***/ "./store/modules/segmentationModule/index.js":
  11514. /*!***************************************************!*\
  11515. !*** ./store/modules/segmentationModule/index.js ***!
  11516. \***************************************************/
  11517. /*! exports provided: default */
  11518. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  11519. "use strict";
  11520. __webpack_require__.r(__webpack_exports__);
  11521. /* harmony import */ var _metadata__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./metadata */ "./store/modules/segmentationModule/metadata.js");
  11522. /* harmony import */ var _activeLabelmapIndex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./activeLabelmapIndex */ "./store/modules/segmentationModule/activeLabelmapIndex.js");
  11523. /* harmony import */ var _activeSegmentIndex__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./activeSegmentIndex */ "./store/modules/segmentationModule/activeSegmentIndex.js");
  11524. /* harmony import */ var _segmentVisibility_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./segmentVisibility.js */ "./store/modules/segmentationModule/segmentVisibility.js");
  11525. /* harmony import */ var _getLabelmapBuffers__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./getLabelmapBuffers */ "./store/modules/segmentationModule/getLabelmapBuffers.js");
  11526. /* harmony import */ var _setLabelmap3D_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./setLabelmap3D.js */ "./store/modules/segmentationModule/setLabelmap3D.js");
  11527. /* harmony import */ var _getLabelmapStats__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./getLabelmapStats */ "./store/modules/segmentationModule/getLabelmapStats.js");
  11528. /* harmony import */ var _getLabelmaps3D__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./getLabelmaps3D */ "./store/modules/segmentationModule/getLabelmaps3D.js");
  11529. /* harmony import */ var _getLabelmap2D__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./getLabelmap2D */ "./store/modules/segmentationModule/getLabelmap2D.js");
  11530. /* harmony import */ var _getSegmentOfActiveLabelmapAtEvent__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./getSegmentOfActiveLabelmapAtEvent */ "./store/modules/segmentationModule/getSegmentOfActiveLabelmapAtEvent.js");
  11531. /* harmony import */ var _colorLUT__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./colorLUT */ "./store/modules/segmentationModule/colorLUT.js");
  11532. /* harmony import */ var _getBrushColor__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./getBrushColor */ "./store/modules/segmentationModule/getBrushColor.js");
  11533. /* harmony import */ var _getSegmentsOnPixeldata__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./getSegmentsOnPixeldata */ "./store/modules/segmentationModule/getSegmentsOnPixeldata.js");
  11534. /* harmony import */ var _deleteSegment__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./deleteSegment */ "./store/modules/segmentationModule/deleteSegment.js");
  11535. /* harmony import */ var _state__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./state */ "./store/modules/segmentationModule/state.js");
  11536. /* harmony import */ var _defaultConfiguration__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./defaultConfiguration */ "./store/modules/segmentationModule/defaultConfiguration.js");
  11537. /* harmony import */ var _history__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./history */ "./store/modules/segmentationModule/history.js");
  11538. /* harmony import */ var _setRadius__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./setRadius */ "./store/modules/segmentationModule/setRadius.js");
  11539. /**
  11540. * A map of `firstImageId` to associated `BrushStackState`, where
  11541. * `firstImageId` is the `imageId` of the first image in a stack.
  11542. *
  11543. * @typedef {Object} Series
  11544. */
  11545. /**
  11546. * @typedef {Object} BrushStackState An object defining a set of 3D labelmaps
  11547. * associated with a specific cornerstone stack.
  11548. * @property {number} activeLabelmapIndex The index of the active `Labelmap3D`.
  11549. * @property {Labelmap3D[]} labelmaps3D An array of `Labelmap3D` objects.
  11550. */
  11551. /**
  11552. * A 3D labelmap object which stores the labelmap data for an entire stack of cornerstone images.
  11553. *
  11554. * @typedef {Object} Labelmap3D An object defining a 3D labelmap.
  11555. * @property {ArrayBuffer} buffer An array buffer to store the pixel data of the `Labelmap3D` (2 bytes/voxel for Uint16 and 4 bytes/voxel for Float32).
  11556. * @property {Labelmap2D[]} labelmaps2D array of `labelmap2D` views on the `buffer`, indexed by in-stack
  11557. * image positions.
  11558. * @property {Object[]} metadata An array of metadata per segment. Metadata is optional and its form is
  11559. * application specific.
  11560. * @property {number} activeSegmentIndex The index of the active segment for this `Labelmap3D`.
  11561. * @property {number} colorLUTIndex The index of the color LUT to use when displaying this `Labelmap3D`.
  11562. * @property {boolean[]} segmentsHidden The visibility of segments on this labelmap.
  11563. * If an element is `true`, the element is hidden. If it `false|undefined`, the segment is visible.
  11564. * @property {Object[]} undo A history of operations that can be reversed.
  11565. * @property {Object[]} redo A history of reverted operations, so that an undo can be reversed.
  11566. * Is cleared when changes are made to the labelmap.
  11567. */
  11568. /**
  11569. * A 2D labelmap object which accesses only one frame's worth of data from its parent `Labelmap3D`.
  11570. *
  11571. * @typedef {Object} Labelmap2D An object defining a 2D view on a section of a `Labelmap3D`'s `buffer`.
  11572. * @property {Uint16Array|Float32Array} pixelData A 2D view on a section of the parent `Labelmap3D`'s `buffer`.
  11573. * @property {number[]} segmentsOnLabelmap An array of segments present in the `pixelData`.
  11574. */
  11575. /**
  11576. * OnRegisterCallback - Initialise a single default colorLUT when cornerstoneTools is initialised.
  11577. *
  11578. * @returns {null}
  11579. */
  11580. function onRegisterCallback() {
  11581. Object(_colorLUT__WEBPACK_IMPORTED_MODULE_10__["default"])(0);
  11582. }
  11583. /* harmony default export */ __webpack_exports__["default"] = ({
  11584. state: _state__WEBPACK_IMPORTED_MODULE_14__["default"],
  11585. configuration: _defaultConfiguration__WEBPACK_IMPORTED_MODULE_15__["default"],
  11586. onRegisterCallback: onRegisterCallback,
  11587. getters: {
  11588. metadata: _metadata__WEBPACK_IMPORTED_MODULE_0__["getMetadata"],
  11589. labelmap3D: _getLabelmaps3D__WEBPACK_IMPORTED_MODULE_7__["getLabelmap3D"],
  11590. labelmaps3D: _getLabelmaps3D__WEBPACK_IMPORTED_MODULE_7__["default"],
  11591. activeLabelmapIndex: _activeLabelmapIndex__WEBPACK_IMPORTED_MODULE_1__["getActiveLabelmapIndex"],
  11592. activeSegmentIndex: _activeSegmentIndex__WEBPACK_IMPORTED_MODULE_2__["getActiveSegmentIndex"],
  11593. isSegmentVisible: _segmentVisibility_js__WEBPACK_IMPORTED_MODULE_3__["isSegmentVisible"],
  11594. labelmap2D: _getLabelmap2D__WEBPACK_IMPORTED_MODULE_8__["default"],
  11595. labelmap2DByImageIdIndex: _getLabelmap2D__WEBPACK_IMPORTED_MODULE_8__["getLabelmap2DByImageIdIndex"],
  11596. labelmapStats: _getLabelmapStats__WEBPACK_IMPORTED_MODULE_6__["default"],
  11597. segmentOfActiveLabelmapAtEvent: _getSegmentOfActiveLabelmapAtEvent__WEBPACK_IMPORTED_MODULE_9__["default"],
  11598. brushColor: _getBrushColor__WEBPACK_IMPORTED_MODULE_11__["default"],
  11599. labelmapBuffers: _getLabelmapBuffers__WEBPACK_IMPORTED_MODULE_4__["getLabelmapBuffers"],
  11600. activeLabelmapBuffer: _getLabelmapBuffers__WEBPACK_IMPORTED_MODULE_4__["getActiveLabelmapBuffer"],
  11601. colorLUT: _colorLUT__WEBPACK_IMPORTED_MODULE_10__["getColorLUT"],
  11602. colorForSegmentIndexColorLUT: _colorLUT__WEBPACK_IMPORTED_MODULE_10__["getColorForSegmentIndexColorLUT"]
  11603. },
  11604. setters: {
  11605. metadata: _metadata__WEBPACK_IMPORTED_MODULE_0__["setMetadata"],
  11606. labelmap3DForElement: _setLabelmap3D_js__WEBPACK_IMPORTED_MODULE_5__["setLabelmap3DForElement"],
  11607. labelmap3DByFirstImageId: _setLabelmap3D_js__WEBPACK_IMPORTED_MODULE_5__["setLabelmap3DByFirstImageId"],
  11608. incrementActiveSegmentIndex: _activeSegmentIndex__WEBPACK_IMPORTED_MODULE_2__["incrementActiveSegmentIndex"],
  11609. decrementActiveSegmentIndex: _activeSegmentIndex__WEBPACK_IMPORTED_MODULE_2__["decrementActiveSegmentIndex"],
  11610. activeSegmentIndex: _activeSegmentIndex__WEBPACK_IMPORTED_MODULE_2__["setActiveSegmentIndex"],
  11611. toggleSegmentVisibility: _segmentVisibility_js__WEBPACK_IMPORTED_MODULE_3__["toggleSegmentVisibility"],
  11612. updateSegmentsOnLabelmap2D: function updateSegmentsOnLabelmap2D(labelmap2D) {
  11613. labelmap2D.segmentsOnLabelmap = Object(_getSegmentsOnPixeldata__WEBPACK_IMPORTED_MODULE_12__["default"])(labelmap2D.pixelData);
  11614. },
  11615. deleteSegment: _deleteSegment__WEBPACK_IMPORTED_MODULE_13__["default"],
  11616. colorLUT: _colorLUT__WEBPACK_IMPORTED_MODULE_10__["default"],
  11617. colorLUTIndexForLabelmap3D: _colorLUT__WEBPACK_IMPORTED_MODULE_10__["setColorLUTIndexForLabelmap3D"],
  11618. colorForSegmentIndexOfColorLUT: _colorLUT__WEBPACK_IMPORTED_MODULE_10__["setColorForSegmentIndexOfColorLUT"],
  11619. activeLabelmapIndex: _activeLabelmapIndex__WEBPACK_IMPORTED_MODULE_1__["setActiveLabelmapIndex"],
  11620. radius: _setRadius__WEBPACK_IMPORTED_MODULE_17__["default"],
  11621. pushState: _history__WEBPACK_IMPORTED_MODULE_16__["pushState"],
  11622. undo: _history__WEBPACK_IMPORTED_MODULE_16__["undo"],
  11623. redo: _history__WEBPACK_IMPORTED_MODULE_16__["redo"]
  11624. }
  11625. });
  11626. /***/ }),
  11627. /***/ "./store/modules/segmentationModule/metadata.js":
  11628. /*!******************************************************!*\
  11629. !*** ./store/modules/segmentationModule/metadata.js ***!
  11630. \******************************************************/
  11631. /*! exports provided: getMetadata, setMetadata */
  11632. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  11633. "use strict";
  11634. __webpack_require__.r(__webpack_exports__);
  11635. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getMetadata", function() { return getMetadata; });
  11636. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setMetadata", function() { return setMetadata; });
  11637. /* harmony import */ var _getElement__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getElement */ "./store/modules/segmentationModule/getElement.js");
  11638. /* harmony import */ var _addLabelmap3D__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./addLabelmap3D */ "./store/modules/segmentationModule/addLabelmap3D.js");
  11639. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  11640. /* harmony import */ var _externalModules__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../externalModules */ "./externalModules.js");
  11641. /* harmony import */ var _util_logger__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../util/logger */ "./util/logger.js");
  11642. /* harmony import */ var _state__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./state */ "./store/modules/segmentationModule/state.js");
  11643. var logger = Object(_util_logger__WEBPACK_IMPORTED_MODULE_4__["getLogger"])('store:modules:segmentationModule:metadata');
  11644. /**
  11645. * GetMetadata - Returns the metadata object for a particular segment if
  11646. * segmentIndex is specified, otherwise returns an array of all segment metadata
  11647. * for the labelmap.
  11648. *
  11649. * @param {HTMLElement|string} elementOrEnabledElementUID The cornerstone enabled
  11650. * element or its UUID.
  11651. * @param {number} [labelmapIndex] If undefined, defaults to the active
  11652. * labelmap index.
  11653. * @param {number} [segmentIndex] The segment index.
  11654. * @returns {Object|Object[]} A metadata object or an array of
  11655. * metadata objects.
  11656. */
  11657. function getMetadata(elementOrEnabledElementUID, labelmapIndex, segmentIndex) {
  11658. var element = Object(_getElement__WEBPACK_IMPORTED_MODULE_0__["default"])(elementOrEnabledElementUID);
  11659. if (!element) {
  11660. return;
  11661. }
  11662. var stackState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_2__["getToolState"])(element, 'stack');
  11663. var stackData = stackState.data[0];
  11664. var firstImageId = stackData.imageIds[0];
  11665. var brushStackState = _state__WEBPACK_IMPORTED_MODULE_5__["default"].series[firstImageId];
  11666. if (!brushStackState) {
  11667. logger.warn("brushStackState is undefined");
  11668. return;
  11669. }
  11670. labelmapIndex = labelmapIndex === undefined ? brushStackState.activeLabelmapIndex : labelmapIndex;
  11671. if (!brushStackState.labelmaps3D[labelmapIndex]) {
  11672. logger.warn("No labelmap3D of labelmap index ".concat(labelmapIndex, " on stack."));
  11673. return;
  11674. }
  11675. var labelmap3D = brushStackState.labelmaps3D[labelmapIndex];
  11676. if (segmentIndex === undefined) {
  11677. return labelmap3D.metadata;
  11678. }
  11679. return labelmap3D.metadata[segmentIndex];
  11680. }
  11681. /**
  11682. * SetMetadata - Sets the metadata object for a particular segment of a
  11683. * `Labelmap3D`.
  11684. *
  11685. * @param {HTMLElement|string} elementOrEnabledElementUID The cornerstone enabled
  11686. * element or its UUID.
  11687. * @param {number} labelmapIndex = 0 The labelmap index.
  11688. * @param {number} segmentIndex The segment index.
  11689. * @param {Object} metadata The metadata object to set.
  11690. * @returns {null}
  11691. */
  11692. function setMetadata(elementOrEnabledElementUID) {
  11693. var labelmapIndex = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
  11694. var segmentIndex = arguments.length > 2 ? arguments[2] : undefined;
  11695. var metadata = arguments.length > 3 ? arguments[3] : undefined;
  11696. var element = Object(_getElement__WEBPACK_IMPORTED_MODULE_0__["default"])(elementOrEnabledElementUID);
  11697. if (!element) {
  11698. return;
  11699. }
  11700. var cornerstone = _externalModules__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstone;
  11701. var stackState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_2__["getToolState"])(element, 'stack');
  11702. var stackData = stackState.data[0];
  11703. var firstImageId = stackData.imageIds[0];
  11704. var brushStackState = _state__WEBPACK_IMPORTED_MODULE_5__["default"].series[firstImageId];
  11705. if (!brushStackState) {
  11706. _state__WEBPACK_IMPORTED_MODULE_5__["default"].series[firstImageId] = {
  11707. labelmapIndex: labelmapIndex,
  11708. labelmaps3D: []
  11709. };
  11710. brushStackState = _state__WEBPACK_IMPORTED_MODULE_5__["default"].series[firstImageId];
  11711. }
  11712. if (!brushStackState.labelmaps3D[labelmapIndex]) {
  11713. var enabledElement = cornerstone.getEnabledElement(element);
  11714. var _enabledElement$image = enabledElement.image,
  11715. rows = _enabledElement$image.rows,
  11716. columns = _enabledElement$image.columns;
  11717. var numberOfFrames = stackData.imageIds.length;
  11718. var size = rows * columns * numberOfFrames;
  11719. Object(_addLabelmap3D__WEBPACK_IMPORTED_MODULE_1__["default"])(brushStackState, labelmapIndex, size);
  11720. }
  11721. var labelmap3D = brushStackState.labelmaps3D[labelmapIndex];
  11722. labelmap3D.metadata[segmentIndex] = metadata;
  11723. }
  11724. /***/ }),
  11725. /***/ "./store/modules/segmentationModule/segmentVisibility.js":
  11726. /*!***************************************************************!*\
  11727. !*** ./store/modules/segmentationModule/segmentVisibility.js ***!
  11728. \***************************************************************/
  11729. /*! exports provided: isSegmentVisible, toggleSegmentVisibility */
  11730. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  11731. "use strict";
  11732. __webpack_require__.r(__webpack_exports__);
  11733. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isSegmentVisible", function() { return isSegmentVisible; });
  11734. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "toggleSegmentVisibility", function() { return toggleSegmentVisibility; });
  11735. /* harmony import */ var _getElement__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getElement */ "./store/modules/segmentationModule/getElement.js");
  11736. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  11737. /* harmony import */ var _state__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./state */ "./store/modules/segmentationModule/state.js");
  11738. /* harmony import */ var _util_logger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../util/logger */ "./util/logger.js");
  11739. var logger = Object(_util_logger__WEBPACK_IMPORTED_MODULE_3__["getLogger"])('store:modules:segmentationModule:segmentVisibility');
  11740. /**
  11741. * Returns if a segment is visible.
  11742. *
  11743. * @param {HTMLElement|string} elementOrEnabledElementUID The cornerstone enabled
  11744. * element or its UUID.
  11745. * @param {number} segmentIndex The segment index.
  11746. * @param {number} [labelmapIndex] If undefined, defaults to the active
  11747. * labelmap index.
  11748. * @returns {boolean} True if the segment is visible.
  11749. */
  11750. function isSegmentVisible(elementOrEnabledElementUID, segmentIndex, labelmapIndex) {
  11751. if (!segmentIndex) {
  11752. return;
  11753. }
  11754. var element = Object(_getElement__WEBPACK_IMPORTED_MODULE_0__["default"])(elementOrEnabledElementUID);
  11755. if (!element) {
  11756. return;
  11757. }
  11758. var stackState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getToolState"])(element, 'stack');
  11759. var stackData = stackState.data[0];
  11760. var firstImageId = stackData.imageIds[0];
  11761. var brushStackState = _state__WEBPACK_IMPORTED_MODULE_2__["default"].series[firstImageId];
  11762. if (!brushStackState) {
  11763. logger.warn("brushStackState is undefined");
  11764. return;
  11765. }
  11766. labelmapIndex = labelmapIndex === undefined ? brushStackState.activeLabelmapIndex : labelmapIndex;
  11767. if (!brushStackState.labelmaps3D[labelmapIndex]) {
  11768. logger.warn("No labelmap3D of labelmap index ".concat(labelmapIndex, " on stack."));
  11769. return;
  11770. }
  11771. var labelmap3D = brushStackState.labelmaps3D[labelmapIndex];
  11772. var visible = !labelmap3D.segmentsHidden[segmentIndex];
  11773. return visible;
  11774. }
  11775. /**
  11776. * Toggles the visability of a segment.
  11777. *
  11778. * @param {HTMLElement|string} elementOrEnabledElementUID The cornerstone enabled
  11779. * element or its UUID.
  11780. * @param {number} segmentIndex The segment index.
  11781. * @param {number} [labelmapIndex] If undefined, defaults to the active
  11782. * labelmap index.
  11783. * @returns {boolean} True if the segment is now visible.
  11784. */
  11785. function toggleSegmentVisibility(elementOrEnabledElementUID, segmentIndex, labelmapIndex) {
  11786. if (!segmentIndex) {
  11787. return;
  11788. }
  11789. var element = Object(_getElement__WEBPACK_IMPORTED_MODULE_0__["default"])(elementOrEnabledElementUID);
  11790. if (!element) {
  11791. return;
  11792. }
  11793. var stackState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getToolState"])(element, 'stack');
  11794. var stackData = stackState.data[0];
  11795. var firstImageId = stackData.imageIds[0];
  11796. var brushStackState = _state__WEBPACK_IMPORTED_MODULE_2__["default"].series[firstImageId];
  11797. if (!brushStackState) {
  11798. logger.warn("brushStackState is undefined");
  11799. return;
  11800. }
  11801. labelmapIndex = labelmapIndex === undefined ? brushStackState.activeLabelmapIndex : labelmapIndex;
  11802. if (!brushStackState.labelmaps3D[labelmapIndex]) {
  11803. logger.warn("No labelmap3D of labelmap index ".concat(labelmapIndex, " on stack."));
  11804. return;
  11805. }
  11806. var labelmap3D = brushStackState.labelmaps3D[labelmapIndex];
  11807. var segmentsHidden = labelmap3D.segmentsHidden;
  11808. segmentsHidden[segmentIndex] = !segmentsHidden[segmentIndex];
  11809. return !segmentsHidden[segmentIndex];
  11810. }
  11811. /***/ }),
  11812. /***/ "./store/modules/segmentationModule/setLabelmap3D.js":
  11813. /*!***********************************************************!*\
  11814. !*** ./store/modules/segmentationModule/setLabelmap3D.js ***!
  11815. \***********************************************************/
  11816. /*! exports provided: setLabelmap3DByFirstImageId, setLabelmap3DForElement */
  11817. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  11818. "use strict";
  11819. __webpack_require__.r(__webpack_exports__);
  11820. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setLabelmap3DByFirstImageId", function() { return setLabelmap3DByFirstImageId; });
  11821. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setLabelmap3DForElement", function() { return setLabelmap3DForElement; });
  11822. /* harmony import */ var _getElement__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getElement */ "./store/modules/segmentationModule/getElement.js");
  11823. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  11824. /* harmony import */ var _state__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./state */ "./store/modules/segmentationModule/state.js");
  11825. /* harmony import */ var _getSegmentsOnPixeldata__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./getSegmentsOnPixeldata */ "./store/modules/segmentationModule/getSegmentsOnPixeldata.js");
  11826. /* harmony import */ var _util_segmentation__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../util/segmentation */ "./util/segmentation/index.js");
  11827. /* harmony import */ var _arrayTypes__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./arrayTypes */ "./store/modules/segmentationModule/arrayTypes.js");
  11828. /* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../index.js */ "./store/index.js");
  11829. var UINT_16_ARRAY = _arrayTypes__WEBPACK_IMPORTED_MODULE_5__["default"].UINT_16_ARRAY,
  11830. FLOAT_32_ARRAY = _arrayTypes__WEBPACK_IMPORTED_MODULE_5__["default"].FLOAT_32_ARRAY;
  11831. /**
  11832. * Takes a 16-bit encoded `ArrayBuffer` and stores it as a `Labelmap3D` for the
  11833. * `BrushStackState` associated with the element.
  11834. *
  11835. * @param {HTMLElement|string} elementOrEnabledElementUID The cornerstone
  11836. * enabled element or its UUID.
  11837. * @param {ArrayBuffer} buffer
  11838. * @param {number} labelmapIndex The index to store the labelmap under.
  11839. * @param {Object[]} metadata = [] Any metadata about the segments.
  11840. * @param {number[][]} [segmentsOnLabelmapArray] An array of array of segments on each imageIdIndex.
  11841. * If not present, is calculated.
  11842. * @param {colorLUTIndex} [colorLUTIndex = 0] The index of the colorLUT to use to render the segmentation.
  11843. * @returns {null}
  11844. */
  11845. function setLabelmap3DForElement(elementOrEnabledElementUID, buffer, labelmapIndex) {
  11846. var metadata = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];
  11847. var segmentsOnLabelmapArray = arguments.length > 4 ? arguments[4] : undefined;
  11848. var colorLUTIndex = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0;
  11849. var element = Object(_getElement__WEBPACK_IMPORTED_MODULE_0__["default"])(elementOrEnabledElementUID);
  11850. if (!element) {
  11851. return;
  11852. }
  11853. var stackState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getToolState"])(element, 'stack');
  11854. var numberOfFrames = stackState.data[0].imageIds.length;
  11855. var firstImageId = stackState.data[0].imageIds[0];
  11856. setLabelmap3DByFirstImageId(firstImageId, buffer, labelmapIndex, metadata, numberOfFrames, segmentsOnLabelmapArray, colorLUTIndex);
  11857. Object(_util_segmentation__WEBPACK_IMPORTED_MODULE_4__["triggerLabelmapModifiedEvent"])(element, labelmapIndex);
  11858. }
  11859. /**
  11860. * Takes an 16-bit encoded `ArrayBuffer` and stores it as a `Labelmap3D` for
  11861. * the `BrushStackState` associated with the firstImageId.
  11862. *
  11863. * @param {HTMLElement|string} firstImageId The firstImageId of the series to
  11864. * store the segmentation on.
  11865. * @param {ArrayBuffer} buffer
  11866. * @param {number} labelmapIndex The index to store the labelmap under.
  11867. * @param {Object[]} metadata = [] Any metadata about the segments.
  11868. * @param {number} numberOfFrames The number of frames, required to set up the
  11869. * relevant labelmap2D views.
  11870. * @param {number[][]} [segmentsOnLabelmapArray] An array of array of segments on each imageIdIndex.
  11871. * If not present, is calculated.
  11872. * @param {colorLUTIndex} [colorLUTIndex = 0] The index of the colorLUT to use to render the segmentation.
  11873. * @returns {null}
  11874. */
  11875. function setLabelmap3DByFirstImageId(firstImageId, buffer, labelmapIndex) {
  11876. var metadata = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : [];
  11877. var numberOfFrames = arguments.length > 4 ? arguments[4] : undefined;
  11878. var segmentsOnLabelmapArray = arguments.length > 5 ? arguments[5] : undefined;
  11879. var colorLUTIndex = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : 0;
  11880. var _getModule = Object(_index_js__WEBPACK_IMPORTED_MODULE_6__["getModule"])('segmentation'),
  11881. configuration = _getModule.configuration;
  11882. var brushStackState = _state__WEBPACK_IMPORTED_MODULE_2__["default"].series[firstImageId];
  11883. if (!brushStackState) {
  11884. _state__WEBPACK_IMPORTED_MODULE_2__["default"].series[firstImageId] = {
  11885. activeLabelmapIndex: labelmapIndex,
  11886. labelmaps3D: []
  11887. };
  11888. brushStackState = _state__WEBPACK_IMPORTED_MODULE_2__["default"].series[firstImageId];
  11889. }
  11890. brushStackState.labelmaps3D[labelmapIndex] = {
  11891. buffer: buffer,
  11892. labelmaps2D: [],
  11893. metadata: metadata,
  11894. activeSegmentIndex: 1,
  11895. colorLUTIndex: colorLUTIndex,
  11896. segmentsHidden: [],
  11897. undo: [],
  11898. redo: []
  11899. };
  11900. var labelmaps2D = brushStackState.labelmaps3D[labelmapIndex].labelmaps2D;
  11901. var slicelengthInBytes = buffer.byteLength / numberOfFrames;
  11902. for (var i = 0; i < numberOfFrames; i++) {
  11903. var pixelData = void 0;
  11904. switch (configuration.arrayType) {
  11905. case UINT_16_ARRAY:
  11906. pixelData = new Uint16Array(buffer, slicelengthInBytes * i, // 2 bytes/voxel
  11907. slicelengthInBytes / 2);
  11908. break;
  11909. case FLOAT_32_ARRAY:
  11910. pixelData = new Float32Array(buffer, slicelengthInBytes * i, slicelengthInBytes / 4);
  11911. break;
  11912. default:
  11913. throw new Error("Unsupported Array Type ".concat(configuration.arrayType));
  11914. }
  11915. var segmentsOnLabelmap = segmentsOnLabelmapArray ? segmentsOnLabelmapArray[i] : Object(_getSegmentsOnPixeldata__WEBPACK_IMPORTED_MODULE_3__["default"])(pixelData);
  11916. if (segmentsOnLabelmap && segmentsOnLabelmap.some(function (segment) {
  11917. return segment;
  11918. })) {
  11919. labelmaps2D[i] = {
  11920. pixelData: pixelData,
  11921. segmentsOnLabelmap: segmentsOnLabelmap
  11922. };
  11923. }
  11924. }
  11925. }
  11926. /***/ }),
  11927. /***/ "./store/modules/segmentationModule/setRadius.js":
  11928. /*!*******************************************************!*\
  11929. !*** ./store/modules/segmentationModule/setRadius.js ***!
  11930. \*******************************************************/
  11931. /*! exports provided: default */
  11932. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  11933. "use strict";
  11934. __webpack_require__.r(__webpack_exports__);
  11935. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return setRadius; });
  11936. /* harmony import */ var _index__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../index */ "./store/index.js");
  11937. function setRadius(newRadius) {
  11938. var _getModule = Object(_index__WEBPACK_IMPORTED_MODULE_0__["getModule"])('segmentation'),
  11939. configuration = _getModule.configuration;
  11940. configuration.radius = Math.min(Math.max(newRadius, configuration.minRadius), configuration.maxRadius);
  11941. }
  11942. /***/ }),
  11943. /***/ "./store/modules/segmentationModule/state.js":
  11944. /*!***************************************************!*\
  11945. !*** ./store/modules/segmentationModule/state.js ***!
  11946. \***************************************************/
  11947. /*! exports provided: default */
  11948. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  11949. "use strict";
  11950. __webpack_require__.r(__webpack_exports__);
  11951. // Internal state of the brush module.
  11952. var state = {
  11953. series: {},
  11954. colorLutTables: []
  11955. };
  11956. /* harmony default export */ __webpack_exports__["default"] = (state);
  11957. /***/ }),
  11958. /***/ "./store/removeTool.js":
  11959. /*!*****************************!*\
  11960. !*** ./store/removeTool.js ***!
  11961. \*****************************/
  11962. /*! exports provided: removeTool, removeToolForElement */
  11963. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  11964. "use strict";
  11965. __webpack_require__.r(__webpack_exports__);
  11966. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeTool", function() { return removeTool; });
  11967. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeToolForElement", function() { return removeToolForElement; });
  11968. /* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index.js */ "./store/index.js");
  11969. /**
  11970. * Deactivates and removes the tool from the target element with the provided name
  11971. *
  11972. * @export
  11973. * @public
  11974. * @method
  11975. * @name removeToolForElement
  11976. * @param {HTMLElement} element The element.
  11977. * @param {string} toolName The name of the tool.
  11978. * @returns {void}
  11979. */
  11980. var removeToolForElement = function removeToolForElement(element, toolName) {
  11981. var toolIndex = _index_js__WEBPACK_IMPORTED_MODULE_0__["default"].state.tools.findIndex(function (tool) {
  11982. return tool.element === element && tool.name === toolName;
  11983. });
  11984. if (toolIndex >= 0) {
  11985. _index_js__WEBPACK_IMPORTED_MODULE_0__["default"].state.tools.splice(toolIndex, 1);
  11986. }
  11987. };
  11988. /**
  11989. * Removes all tools from all enabled elements with the provided name.
  11990. *
  11991. * @export
  11992. * @public
  11993. * @method
  11994. * @name removeTool
  11995. * @param {string} toolName The name of the tool.
  11996. * @returns {void}
  11997. */
  11998. var removeTool = function removeTool(toolName) {
  11999. _removeToolGlobally(toolName);
  12000. _index_js__WEBPACK_IMPORTED_MODULE_0__["default"].state.enabledElements.forEach(function (element) {
  12001. removeToolForElement(element, toolName);
  12002. });
  12003. };
  12004. /**
  12005. * Removes tool with matching name from globally registered tools.
  12006. * Requires `globalToolSyncEnabled` to be set to true
  12007. *
  12008. * @private
  12009. * @method
  12010. * @name removeToolGlobally
  12011. * @param {string} toolName The name of the tool to remove.
  12012. * @returns {void}
  12013. */
  12014. var _removeToolGlobally = function _removeToolGlobally(toolName) {
  12015. var _getModule = Object(_index_js__WEBPACK_IMPORTED_MODULE_0__["getModule"])('globalConfiguration'),
  12016. configuration = _getModule.configuration;
  12017. if (!configuration.globalToolSyncEnabled) {
  12018. return;
  12019. }
  12020. if (_index_js__WEBPACK_IMPORTED_MODULE_0__["default"].state.globalTools[toolName]) {
  12021. delete _index_js__WEBPACK_IMPORTED_MODULE_0__["default"].state.globalTools[toolName];
  12022. }
  12023. };
  12024. /***/ }),
  12025. /***/ "./store/setToolCursor.js":
  12026. /*!********************************!*\
  12027. !*** ./store/setToolCursor.js ***!
  12028. \********************************/
  12029. /*! exports provided: setToolCursor, resetToolCursor, hideToolCursor */
  12030. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  12031. "use strict";
  12032. __webpack_require__.r(__webpack_exports__);
  12033. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setToolCursor", function() { return setToolCursor; });
  12034. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resetToolCursor", function() { return resetToolCursor; });
  12035. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hideToolCursor", function() { return hideToolCursor; });
  12036. /* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index.js */ "./store/index.js");
  12037. var globalConfiguration = _index_js__WEBPACK_IMPORTED_MODULE_0__["modules"].globalConfiguration;
  12038. /**
  12039. * Creates an SVG Cursor for the target element
  12040. *
  12041. * @param {HTMLElement} element - The DOM Element to draw on
  12042. * @param {MouseCursor} svgCursor - The cursor.
  12043. * @returns {void}
  12044. */
  12045. function setToolCursor(element, svgCursor) {
  12046. if (!globalConfiguration.configuration.showSVGCursors) {
  12047. return;
  12048. } // TODO: (state vs options) Exit if cursor wasn't updated
  12049. // TODO: Exit if invalid options to create cursor
  12050. // Note: Max size of an SVG cursor is 128x128, default is 32x32.
  12051. var cursorBlob = svgCursor.getIconWithPointerSVG();
  12052. var mousePoint = svgCursor.mousePoint;
  12053. var svgCursorUrl = window.URL.createObjectURL(cursorBlob);
  12054. element.style.cursor = "url('".concat(svgCursorUrl, "') ").concat(mousePoint, ", auto");
  12055. _index_js__WEBPACK_IMPORTED_MODULE_0__["state"].svgCursorUrl = svgCursorUrl;
  12056. }
  12057. function resetToolCursor(element) {
  12058. _clearStateAndSetCursor(element, 'initial');
  12059. }
  12060. function hideToolCursor(element) {
  12061. if (!globalConfiguration.configuration.showSVGCursors) {
  12062. return;
  12063. }
  12064. _clearStateAndSetCursor(element, 'none');
  12065. }
  12066. function _clearStateAndSetCursor(element, cursorSeting) {
  12067. if (_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].svgCursorUrl) {
  12068. window.URL.revokeObjectURL(_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].svgCursorUrl);
  12069. }
  12070. _index_js__WEBPACK_IMPORTED_MODULE_0__["state"].svgCursorUrl = null;
  12071. element.style.cursor = cursorSeting;
  12072. }
  12073. /***/ }),
  12074. /***/ "./store/setToolMode.js":
  12075. /*!******************************!*\
  12076. !*** ./store/setToolMode.js ***!
  12077. \******************************/
  12078. /*! exports provided: setToolActive, setToolActiveForElement, setToolDisabled, setToolDisabledForElement, setToolEnabled, setToolEnabledForElement, setToolPassive, setToolPassiveForElement, setToolMode, setToolModeForElement, _getNormalizedOptions, _mergeMouseButtonMask */
  12079. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  12080. "use strict";
  12081. __webpack_require__.r(__webpack_exports__);
  12082. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setToolActive", function() { return setToolActive; });
  12083. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setToolActiveForElement", function() { return setToolActiveForElement; });
  12084. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setToolDisabled", function() { return setToolDisabled; });
  12085. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setToolDisabledForElement", function() { return setToolDisabledForElement; });
  12086. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setToolEnabled", function() { return setToolEnabled; });
  12087. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setToolEnabledForElement", function() { return setToolEnabledForElement; });
  12088. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setToolPassive", function() { return setToolPassive; });
  12089. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setToolPassiveForElement", function() { return setToolPassiveForElement; });
  12090. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setToolMode", function() { return setToolMode; });
  12091. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setToolModeForElement", function() { return setToolModeForElement; });
  12092. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_getNormalizedOptions", function() { return _getNormalizedOptions; });
  12093. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_mergeMouseButtonMask", function() { return _mergeMouseButtonMask; });
  12094. /* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../events.js */ "./events.js");
  12095. /* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../util/triggerEvent.js */ "./util/triggerEvent.js");
  12096. /* harmony import */ var _getToolForElement_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./getToolForElement.js */ "./store/getToolForElement.js");
  12097. /* harmony import */ var _setToolCursor_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./setToolCursor.js */ "./store/setToolCursor.js");
  12098. /* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/logger.js */ "./util/logger.js");
  12099. /* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./index.js */ "./store/index.js");
  12100. var globalConfiguration = Object(_index_js__WEBPACK_IMPORTED_MODULE_5__["getModule"])('globalConfiguration');
  12101. var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_4__["getLogger"])('store:setToolMode');
  12102. /**
  12103. * Sets a tool's state, with the provided toolName and element, to 'active'. Active tools are rendered,
  12104. * respond to user input, and can create new data.
  12105. *
  12106. * @public
  12107. * @function setToolActiveForElement
  12108. * @memberof CornerstoneTools
  12109. *
  12110. * @example <caption>Setting a tool 'active' for a specific interaction type.</caption>
  12111. * // Sets length tool to Active
  12112. * setToolActiveForElement(element, 'Length', {
  12113. * mouseButtonMask: 1
  12114. * }, ['Mouse'])
  12115. * @example <caption>Setting a tool 'active' for all interaction types.</caption>
  12116. * // Sets length tool to Active
  12117. * setToolActiveForElement(element, 'Length', {
  12118. * mouseButtonMask: 1
  12119. * })
  12120. * @param {HTMLElement} element
  12121. * @param {string} toolName
  12122. * @param {(Object|string[]|number)} options
  12123. * @param {(string[])} interactionTypes
  12124. * @returns {undefined}
  12125. */
  12126. var setToolActiveForElement = function setToolActiveForElement(element, toolName, options, interactionTypes) {
  12127. // If interactionTypes was passed in via options
  12128. if (interactionTypes === undefined && Array.isArray(options)) {
  12129. interactionTypes = options;
  12130. options = null;
  12131. }
  12132. var tool = Object(_getToolForElement_js__WEBPACK_IMPORTED_MODULE_2__["default"])(element, toolName);
  12133. if (tool) {
  12134. _resolveInputConflicts(element, tool, options, interactionTypes); // Iterate over specific interaction types and set active
  12135. // This is used as a secondary check on active tools to find the active "parts" of the tool
  12136. tool.supportedInteractionTypes.forEach(function (interactionType) {
  12137. if (interactionTypes === undefined || interactionTypes.includes(interactionType)) {
  12138. options["is".concat(interactionType, "Active")] = true;
  12139. } else {
  12140. options["is".concat(interactionType, "Active")] = false;
  12141. }
  12142. });
  12143. if (globalConfiguration.configuration.showSVGCursors && tool.supportedInteractionTypes.includes('Mouse')) {
  12144. _setToolCursorIfPrimary(element, options, tool);
  12145. }
  12146. } // Resume normal behavior
  12147. setToolModeForElement('active', null, element, toolName, options);
  12148. };
  12149. function _setToolCursorIfPrimary(element, options, tool) {
  12150. var mouseButtonMask;
  12151. if (typeof options === 'number') {
  12152. mouseButtonMask = [options];
  12153. } else {
  12154. mouseButtonMask = options.mouseButtonMask;
  12155. }
  12156. if (mouseButtonMask.includes(1)) {
  12157. if (tool.svgCursor) {
  12158. Object(_setToolCursor_js__WEBPACK_IMPORTED_MODULE_3__["setToolCursor"])(tool.element, tool.svgCursor);
  12159. } else if (tool.hideDefaultCursor) {
  12160. Object(_setToolCursor_js__WEBPACK_IMPORTED_MODULE_3__["hideToolCursor"])(element);
  12161. } else {
  12162. Object(_setToolCursor_js__WEBPACK_IMPORTED_MODULE_3__["resetToolCursor"])(element);
  12163. }
  12164. }
  12165. }
  12166. /**
  12167. * Sets all tool's state, with the provided toolName, to 'active'. Active tools are rendered,
  12168. * respond to user input, and can create new data.
  12169. * @public
  12170. * @function setToolActive
  12171. * @memberof CornerstoneTools
  12172. *
  12173. * @param {string} toolName
  12174. * @param {(Object|string[]|number)} options
  12175. * @param {(string[])} interactionTypes
  12176. * @returns {undefined}
  12177. */
  12178. var setToolActive = function setToolActive(toolName, options, interactionTypes) {
  12179. _trackGlobalToolModeChange('active', toolName, options, interactionTypes);
  12180. _index_js__WEBPACK_IMPORTED_MODULE_5__["default"].state.enabledElements.forEach(function (element) {
  12181. setToolActiveForElement(element, toolName, options, interactionTypes);
  12182. });
  12183. };
  12184. /**
  12185. * Sets a tool's state, with the provided toolName and element, to 'disabled'. Disabled tools are not rendered,
  12186. * and do not respond to user input
  12187. * @public
  12188. * @function setToolDisabledForElement
  12189. * @memberof CornerstoneTools
  12190. *
  12191. * @param {HTMLElement} element
  12192. * @param {string} toolName
  12193. * @param {(Object|number)} options
  12194. * @returns {undefined}
  12195. */
  12196. var setToolDisabledForElement = setToolModeForElement.bind(null, 'disabled', null);
  12197. /**
  12198. * Sets all tool's state, with the provided toolName, to 'disabled'. Disabled tools are not rendered,
  12199. * and do not respond to user input
  12200. * @public
  12201. * @function setToolDisabled
  12202. * @memberof CornerstoneTools
  12203. *
  12204. * @param {string} toolName
  12205. * @param {(Object|number)} options
  12206. * @returns {undefined}
  12207. */
  12208. var setToolDisabled = setToolMode.bind(null, 'disabled', null);
  12209. /**
  12210. * Sets a tool's state, with the provided toolName and element, to 'enabled'. Enabled tools are rendered,
  12211. * but do not respond to user input
  12212. * @public
  12213. * @function setToolEnabledForElement
  12214. * @memberof CornerstoneTools
  12215. *
  12216. * @param {HTMLElement} element
  12217. * @param {string} toolName
  12218. * @param {(Object|number)} options
  12219. * @returns {undefined}
  12220. */
  12221. var setToolEnabledForElement = setToolModeForElement.bind(null, 'enabled', null);
  12222. /**
  12223. * Sets all tool's state, with the provided toolName, to 'enabled'. Enabled tools are rendered,
  12224. * but do not respond to user input
  12225. * @public
  12226. * @function setToolEnabled
  12227. * @memberof CornerstoneTools
  12228. *
  12229. * @param {string} toolName
  12230. * @param {(Object|number)} options
  12231. * @returns {undefined}
  12232. */
  12233. var setToolEnabled = setToolMode.bind(null, 'enabled', null);
  12234. /**
  12235. * Sets a tool's state, with the provided toolName and element, to 'passive'. Passive tools are rendered and respond to user input,
  12236. * but do not create new measurements or annotations.
  12237. * @public
  12238. * @function setToolPassiveForElement
  12239. * @memberof CornerstoneTools
  12240. *
  12241. * @param {HTMLElement} element
  12242. * @param {string} toolName
  12243. * @param {(Object|number)} options
  12244. * @returns {undefined}
  12245. */
  12246. var setToolPassiveForElement = setToolModeForElement.bind(null, 'passive', _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOOL_DEACTIVATED);
  12247. /**
  12248. * Sets all tool's state, with the provided toolName, to 'passive'. Passive tools are rendered and respond to user input,
  12249. * but do not create new measurements or annotations.
  12250. * @public
  12251. * @function setToolPassive
  12252. * @memberof CornerstoneTools
  12253. *
  12254. * @param {string} toolName
  12255. * @param {(Object|number)} options
  12256. * @returns {undefined}
  12257. */
  12258. var setToolPassive = setToolMode.bind(null, 'passive', _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOOL_DEACTIVATED);
  12259. /**
  12260. * An internal method that helps make sure we change tool mode in a consistent
  12261. * way
  12262. * @private
  12263. * @function setToolModeForElement
  12264. *
  12265. * @param {string} mode
  12266. * @param {string} changeEvent
  12267. * @param {HTMLElement} element
  12268. * @param {string} toolName
  12269. * @param {(Object|number[]|number)} options
  12270. * @returns {undefined}
  12271. */
  12272. function setToolModeForElement(mode, changeEvent, element, toolName, options) {
  12273. var tool = Object(_getToolForElement_js__WEBPACK_IMPORTED_MODULE_2__["default"])(element, toolName);
  12274. if (!tool) {
  12275. logger.warn('Unable to find tool "%s" for enabledElement', toolName);
  12276. return;
  12277. }
  12278. options = _getNormalizedOptions(options); // Keep the same if not an array (undefined)
  12279. // Reset if empty array
  12280. // Merge if array contains any bindings
  12281. if (Array.isArray(options.mouseButtonMask) && options.mouseButtonMask.length !== 0 && Array.isArray(tool.options.mouseButtonMask)) {
  12282. options.mouseButtonMask = _mergeMouseButtonMask(options.mouseButtonMask, tool.options.mouseButtonMask);
  12283. } // Set mode & options
  12284. tool.mode = mode;
  12285. tool.mergeOptions(options); // Call tool's hook for this event, if one exists
  12286. if (tool["".concat(mode, "Callback")]) {
  12287. tool["".concat(mode, "Callback")](element, options);
  12288. } // Emit event indicating tool state change
  12289. if (changeEvent) {
  12290. var statusChangeEventData = {
  12291. options: options,
  12292. toolName: toolName,
  12293. toolType: toolName,
  12294. // Deprecation notice: toolType will be replaced by toolName
  12295. type: changeEvent
  12296. };
  12297. Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element, changeEvent, statusChangeEventData);
  12298. } // Trigger Update
  12299. // Todo: don't error out if image hasn't been loaded...
  12300. // Cornerstone.updateImage(element);
  12301. }
  12302. /**
  12303. * A helper/quick way to set a tool's mode for all canvases
  12304. *
  12305. * @private
  12306. * @function setToolMode
  12307. *
  12308. * @param {string} mode
  12309. * @param {string} changeEvent
  12310. * @param {string} toolName
  12311. * @param {(Object|number)} options
  12312. * @returns {undefined}
  12313. */
  12314. function setToolMode(mode, changeEvent, toolName, options) {
  12315. _trackGlobalToolModeChange(mode, toolName, options);
  12316. _index_js__WEBPACK_IMPORTED_MODULE_5__["default"].state.enabledElements.forEach(function (element) {
  12317. setToolModeForElement(mode, changeEvent, element, toolName, options);
  12318. });
  12319. }
  12320. /**
  12321. * Find tool's that conflict with the incoming tool's mouse/touch bindings and
  12322. * resolve those conflicts.
  12323. *
  12324. * @private
  12325. * @function _resolveInputConflicts
  12326. *
  12327. * @param {HTMLElement} element
  12328. * @param {Object} tool
  12329. * @param {(Object|number)} options
  12330. * @param {(Array)} interactionTypes
  12331. * @returns {undefined}
  12332. */
  12333. function _resolveInputConflicts(element, tool, options, interactionTypes) {
  12334. // Iterate over the interaction types our tool supports.
  12335. // For each one we intend to activate, check for potential conflicts
  12336. // And resolve them
  12337. tool.supportedInteractionTypes.forEach(function (interactionType) {
  12338. if (interactionTypes === undefined || interactionTypes.includes(interactionType)) {
  12339. var inputResolver = _inputResolvers[interactionType];
  12340. if (inputResolver) {
  12341. inputResolver(tool, element, options);
  12342. } else {
  12343. logger.warn('Unable to resolve input conflicts for type %s', interactionType);
  12344. }
  12345. }
  12346. });
  12347. var activeToolsForElement = _index_js__WEBPACK_IMPORTED_MODULE_5__["default"].state.tools.filter(function (t) {
  12348. return t.element === element && t.mode === 'active' && t.supportedInteractionTypes.length > 0;
  12349. });
  12350. activeToolsForElement.forEach(function (t) {
  12351. var toolHasAnyActiveInteractionType = false;
  12352. t.supportedInteractionTypes.forEach(function (interactionType) {
  12353. if (t.options["is".concat(interactionType, "Active")]) {
  12354. toolHasAnyActiveInteractionType = true;
  12355. }
  12356. });
  12357. if (!toolHasAnyActiveInteractionType) {
  12358. logger.log("Setting tool %s's to PASSIVE", t.name);
  12359. setToolPassiveForElement(element, t.name);
  12360. }
  12361. });
  12362. }
  12363. /**
  12364. * Resolves conflicting active tools when activating a tool for mouse interaction
  12365. * @private
  12366. * @function _resolveMouseInputConflicts
  12367. *
  12368. * @param {Object} tool
  12369. * @param {HTMLElement} element
  12370. * @param {(Object|number)} options
  12371. * @returns {undefined}
  12372. */
  12373. function _resolveMouseInputConflicts(tool, element, options) {
  12374. var mouseButtonMask = _getNormalizedOptions(options).mouseButtonMask;
  12375. var hasMouseButtonMask = Array.isArray(mouseButtonMask) && mouseButtonMask.length > 0;
  12376. if (!hasMouseButtonMask) {
  12377. return;
  12378. }
  12379. var activeToolWithMatchingMouseButtonMask = _index_js__WEBPACK_IMPORTED_MODULE_5__["default"].state.tools.find(function (t) {
  12380. return t.element === element && t.mode === 'active' && t.options.isMouseActive === true && Array.isArray(t.options.mouseButtonMask) && t.options.mouseButtonMask.some(function (v) {
  12381. return mouseButtonMask.includes(v);
  12382. });
  12383. });
  12384. if (activeToolWithMatchingMouseButtonMask) {
  12385. // Remove collissions
  12386. activeToolWithMatchingMouseButtonMask.options.mouseButtonMask = activeToolWithMatchingMouseButtonMask.options.mouseButtonMask.filter(function (mask) {
  12387. return !mouseButtonMask.includes(mask);
  12388. }); // If no remaining bindings, set inactive
  12389. if (activeToolWithMatchingMouseButtonMask.options.mouseButtonMask.length === 0) {
  12390. activeToolWithMatchingMouseButtonMask.options.isMouseActive = false;
  12391. }
  12392. }
  12393. }
  12394. /**
  12395. * Resolves conflicting active tools when activating a tool for touch interaction
  12396. * @private
  12397. * @function _resolveTouchInputConflicts
  12398. *
  12399. * @param {Object} tool
  12400. * @param {HTMLElement} element
  12401. * @returns {undefined}
  12402. */
  12403. function _resolveTouchInputConflicts(tool, element) {
  12404. var activeTouchTool = _index_js__WEBPACK_IMPORTED_MODULE_5__["default"].state.tools.find(function (t) {
  12405. return t.element === element && t.mode === 'active' && t.options.isTouchActive === true;
  12406. });
  12407. var activeMultiTouchToolWithOneTouchPointer = _index_js__WEBPACK_IMPORTED_MODULE_5__["default"].state.tools.find(function (t) {
  12408. return t.element === element && t.mode === 'active' && t.options.isMultiTouchActive === true && t.configuration.touchPointers === 1;
  12409. });
  12410. if (activeTouchTool) {
  12411. logger.log("Setting tool %s's isTouchActive to false", activeTouchTool.name);
  12412. activeTouchTool.options.isTouchActive = false;
  12413. }
  12414. if (activeMultiTouchToolWithOneTouchPointer) {
  12415. logger.log("Setting tool %s's isTouchActive to false", activeMultiTouchToolWithOneTouchPointer.name);
  12416. activeMultiTouchToolWithOneTouchPointer.options.isMultiTouchActive = false;
  12417. }
  12418. }
  12419. /**
  12420. * Resolves conflicting active tools when activating a tool for MultiTouch interaction
  12421. * @private
  12422. * @function _resolveMultiTouchInputConflicts
  12423. *
  12424. * @param {Object} tool
  12425. * @param {HTMLElement} element
  12426. * @returns {undefined}
  12427. */
  12428. function _resolveMultiTouchInputConflicts(tool, element) {
  12429. var activeMultiTouchTool = _index_js__WEBPACK_IMPORTED_MODULE_5__["default"].state.tools.find(function (t) {
  12430. return t.element === element && t.mode === 'active' && t.options.isMultiTouchActive === true && t.configuration.touchPointers === tool.configuration.touchPointers;
  12431. });
  12432. var activeTouchTool;
  12433. if (tool.configuration.touchPointers === 1) {
  12434. activeTouchTool = _index_js__WEBPACK_IMPORTED_MODULE_5__["default"].state.tools.find(function (t) {
  12435. return t.element === element && t.mode === 'active' && t.options.isTouchActive === true;
  12436. });
  12437. }
  12438. if (activeMultiTouchTool) {
  12439. logger.log("Setting tool %s's isMultiTouchActive to false", activeMultiTouchTool.name);
  12440. activeMultiTouchTool.options.isMultiTouchActive = false;
  12441. }
  12442. if (activeTouchTool) {
  12443. logger.log("Setting tool %s's isTouchActive to false", activeTouchTool.name);
  12444. activeTouchTool.options.isTouchActive = false;
  12445. }
  12446. }
  12447. /**
  12448. * If the incoming tool isTouchActive, find any conflicting tools
  12449. * and set their isTouchActive to false to avoid conflicts.
  12450. *
  12451. * @private
  12452. * @function _resolveGenericInputConflicts
  12453. *
  12454. * @param {string} interactionType
  12455. * @param {Object} tool
  12456. * @param {HTMLElement} element
  12457. * @param {(Object|number)} options
  12458. * @returns {undefined}
  12459. */
  12460. function _resolveGenericInputConflicts(interactionType, tool, element) {
  12461. var interactionTypeFlag = "is".concat(interactionType, "Active");
  12462. var activeToolWithActiveInteractionType = _index_js__WEBPACK_IMPORTED_MODULE_5__["default"].state.tools.find(function (t) {
  12463. return t.element === element && t.mode === 'active' && t.options[interactionTypeFlag] === true;
  12464. });
  12465. if (activeToolWithActiveInteractionType) {
  12466. logger.log("Setting tool %s's %s to false", activeToolWithActiveInteractionType.name, interactionTypeFlag);
  12467. activeToolWithActiveInteractionType.options[interactionTypeFlag] = false;
  12468. }
  12469. }
  12470. function _trackGlobalToolModeChange(mode, toolName, options, interactionTypes) {
  12471. if (!globalConfiguration.configuration.globalToolSyncEnabled) {
  12472. return;
  12473. } // Update Tool History
  12474. var historyEvent = {
  12475. mode: mode,
  12476. args: [toolName, options]
  12477. };
  12478. if (interactionTypes) {
  12479. historyEvent.push(interactionTypes);
  12480. }
  12481. _index_js__WEBPACK_IMPORTED_MODULE_5__["default"].state.globalToolChangeHistory.push(historyEvent);
  12482. var arbitraryChangeHistoryLimit = 50;
  12483. if (_index_js__WEBPACK_IMPORTED_MODULE_5__["default"].state.globalToolChangeHistory.length > arbitraryChangeHistoryLimit) {
  12484. _index_js__WEBPACK_IMPORTED_MODULE_5__["default"].state.globalToolChangeHistory.shift();
  12485. } // Update ActiveBindings Array
  12486. var globalTool = _index_js__WEBPACK_IMPORTED_MODULE_5__["default"].state.globalTools[toolName];
  12487. if (!globalTool) {
  12488. logger.warn("setToolMode call for tool not available globally: ".concat(toolName));
  12489. return;
  12490. }
  12491. if (mode === 'active') {
  12492. var stringBindings = _determineStringBindings(toolName, options, interactionTypes); // Remove the incoming bindings from all global tools
  12493. Object.keys(_index_js__WEBPACK_IMPORTED_MODULE_5__["default"].state.globalTools).forEach(function (key) {
  12494. var tool = _index_js__WEBPACK_IMPORTED_MODULE_5__["default"].state.globalTools[key];
  12495. tool.activeBindings = tool.activeBindings.filter(function (binding) {
  12496. return !stringBindings.includes(binding);
  12497. });
  12498. }); // @HACK: Clear mouse bindings
  12499. if (stringBindings.some(function (binding) {
  12500. return binding.includes('Mouse-DELETE');
  12501. })) {
  12502. globalTool.activeBindings = globalTool.activeBindings.filter(function (binding) {
  12503. return !binding.includes('Mouse');
  12504. });
  12505. stringBindings = stringBindings.filter(function (binding) {
  12506. return !binding.includes('Mouse');
  12507. });
  12508. }
  12509. globalTool.activeBindings = globalTool.activeBindings.concat(stringBindings);
  12510. } else {
  12511. globalTool.activeBindings = [];
  12512. }
  12513. }
  12514. function _determineStringBindings(toolName, options, interactionTypes) {
  12515. if (interactionTypes === undefined && Array.isArray(options)) {
  12516. interactionTypes = options;
  12517. options = null;
  12518. }
  12519. var stringBindings = [];
  12520. var globalTool = _index_js__WEBPACK_IMPORTED_MODULE_5__["default"].state.globalTools[toolName];
  12521. if (globalTool) {
  12522. // eslint-disable-next-line new-cap
  12523. var tool = new globalTool.tool(globalTool.props);
  12524. tool.supportedInteractionTypes.forEach(function (interactionType) {
  12525. if (interactionTypes === undefined || interactionTypes.includes(interactionType)) {
  12526. if (interactionType === 'Mouse') {
  12527. var mouseButtonMasks = _getNormalizedOptions(options).mouseButtonMask; // Add or delete
  12528. if (Array.isArray(mouseButtonMasks) && mouseButtonMasks.length > 0) {
  12529. mouseButtonMasks.forEach(function (mask) {
  12530. return stringBindings.push("".concat(interactionType, "-").concat(mask));
  12531. });
  12532. } else if (Array.isArray(mouseButtonMasks) && mouseButtonMasks.length === 0) {
  12533. stringBindings.push("".concat(interactionType, "-DELETE"));
  12534. }
  12535. } else if (interactionType === 'MultiTouch') {
  12536. stringBindings.push("".concat(interactionType, "-").concat(tool.configuration.touchPointers));
  12537. } else {
  12538. stringBindings.push(interactionType);
  12539. }
  12540. }
  12541. });
  12542. }
  12543. return stringBindings;
  12544. }
  12545. var _inputResolvers = {
  12546. Mouse: _resolveMouseInputConflicts,
  12547. MouseWheel: _resolveGenericInputConflicts.bind(undefined, 'MouseWheel'),
  12548. Touch: _resolveTouchInputConflicts,
  12549. TouchPinch: _resolveGenericInputConflicts.bind(undefined, 'TouchPinch'),
  12550. TouchRotate: _resolveGenericInputConflicts.bind(undefined, 'TouchRotate'),
  12551. DoubleTap: _resolveGenericInputConflicts.bind(undefined, 'DoubleTap'),
  12552. MultiTouch: _resolveMultiTouchInputConflicts
  12553. };
  12554. function _getNormalizedOptions(options) {
  12555. if (Array.isArray(options)) {
  12556. // If options is an array assume the array is the mouseButtonMask array
  12557. options = {
  12558. mouseButtonMask: options
  12559. };
  12560. } else if (options !== Object(options)) {
  12561. // And if it's something other than an object, assume options is
  12562. // a single mouseButtonMask
  12563. options = {
  12564. mouseButtonMask: [options]
  12565. };
  12566. } // If there is still no 'mouseButtonMask' default it to an empty array
  12567. if (!options.hasOwnProperty('mouseButtonMask')) {
  12568. options.mouseButtonMask = [];
  12569. }
  12570. if (!Array.isArray(options.mouseButtonMask)) {
  12571. options.mouseButtonMask = [options.mouseButtonMask];
  12572. } // Now filter out anything that is not an number or is the number 0
  12573. options.mouseButtonMask = options.mouseButtonMask.filter(function (o) {
  12574. return typeof o === 'number' && o !== 0;
  12575. });
  12576. return options;
  12577. }
  12578. function _mergeMouseButtonMask(newMask, oldMask) {
  12579. // Merges and removes duplicates
  12580. return newMask.concat(oldMask).reduce(function (acc, m) {
  12581. if (acc.indexOf(m) === -1) {
  12582. acc.push(m);
  12583. }
  12584. return acc;
  12585. }, []);
  12586. }
  12587. /***/ }),
  12588. /***/ "./store/setToolOptions.js":
  12589. /*!*********************************!*\
  12590. !*** ./store/setToolOptions.js ***!
  12591. \*********************************/
  12592. /*! exports provided: setToolOptions, setToolOptionsForElement */
  12593. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  12594. "use strict";
  12595. __webpack_require__.r(__webpack_exports__);
  12596. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setToolOptions", function() { return setToolOptions; });
  12597. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setToolOptionsForElement", function() { return setToolOptionsForElement; });
  12598. /* harmony import */ var _getToolForElement_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getToolForElement.js */ "./store/getToolForElement.js");
  12599. /* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./index.js */ "./store/index.js");
  12600. /**
  12601. * Sets the options of a tool on a specific element.
  12602. * @export
  12603. * @public
  12604. * @method
  12605. * @name setToolOptionsForElement
  12606. *
  12607. * @param {HTMLElement} element The element.
  12608. * @param {string} toolName The name of the tool.
  12609. * @param {Object} options The options to set.
  12610. * @returns {void}
  12611. */
  12612. var setToolOptionsForElement = function setToolOptionsForElement(element, toolName, options) {
  12613. var tool = Object(_getToolForElement_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element, toolName);
  12614. if (tool) {
  12615. tool.mergeOptions(options);
  12616. }
  12617. };
  12618. /**
  12619. * Sets the options of a tool for all elements.
  12620. * @export
  12621. * @public
  12622. * @method
  12623. * @name setToolOptions
  12624. *
  12625. * @param {string} toolName
  12626. * @param {Object} options
  12627. * @returns {void}
  12628. */
  12629. var setToolOptions = function setToolOptions(toolName, options) {
  12630. _index_js__WEBPACK_IMPORTED_MODULE_1__["state"].enabledElements.forEach(function (element) {
  12631. setToolOptionsForElement(element, toolName, options);
  12632. });
  12633. };
  12634. /***/ }),
  12635. /***/ "./synchronization/Synchronizer.js":
  12636. /*!*****************************************!*\
  12637. !*** ./synchronization/Synchronizer.js ***!
  12638. \*****************************************/
  12639. /*! exports provided: default */
  12640. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  12641. "use strict";
  12642. __webpack_require__.r(__webpack_exports__);
  12643. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
  12644. /* harmony import */ var _util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../util/convertToVector3.js */ "./util/convertToVector3.js");
  12645. /* harmony import */ var _toolOptions_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../toolOptions.js */ "./toolOptions.js");
  12646. /**
  12647. * Return an array filtered to only its unique members
  12648. *
  12649. * @private
  12650. * @param {Array} array - The array to filter
  12651. * @returns {Array}
  12652. */
  12653. function unique(array) {
  12654. return array.filter(function (value, index, self) {
  12655. return self.indexOf(value) === index;
  12656. });
  12657. }
  12658. /**
  12659. * Synchronize target and source elements when an event fires on the source element
  12660. * @export @public constructor
  12661. * @name Synchronizer
  12662. *
  12663. * @param {String} event - The event(s) that will trigger synchronization. Separate multiple events by a space
  12664. * @param {Function} handler - The function that will make the necessary changes to the target element in order to synchronize it with the source element
  12665. * @returns {void}
  12666. */
  12667. function Synchronizer(event, handler) {
  12668. var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone;
  12669. var that = this;
  12670. var sourceElements = []; // Source elements fire the events we want to synchronize to
  12671. var targetElements = []; // Target elements we want to synchronize to source elements
  12672. var ignoreFiredEvents = false;
  12673. var initialData = {};
  12674. var eventHandler = handler;
  12675. this.enabled = true;
  12676. /**
  12677. * Update the event handler to perform synchronization
  12678. * @param {Function} handler - The event handler function
  12679. * @returns {void}
  12680. */
  12681. this.setHandler = function (handler) {
  12682. eventHandler = handler;
  12683. };
  12684. /**
  12685. * Return a reference to the event handler function
  12686. * @returns {Function}
  12687. */
  12688. this.getHandler = function () {
  12689. return eventHandler;
  12690. };
  12691. /**
  12692. * Calculate the initial distances between the source image and each
  12693. * of the target images
  12694. * @returns {void}
  12695. */
  12696. this.getDistances = function () {
  12697. if (!sourceElements.length || !targetElements.length) {
  12698. return;
  12699. }
  12700. var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone;
  12701. initialData.distances = {};
  12702. initialData.imageIds = {
  12703. sourceElements: [],
  12704. targetElements: []
  12705. };
  12706. sourceElements.forEach(function (sourceElement) {
  12707. var sourceEnabledElement = cornerstone.getEnabledElement(sourceElement);
  12708. if (!sourceEnabledElement || !sourceEnabledElement.image) {
  12709. return;
  12710. }
  12711. var sourceImageId = sourceEnabledElement.image.imageId;
  12712. var sourceImagePlane = cornerstone.metaData.get('imagePlaneModule', sourceImageId);
  12713. if (!sourceImagePlane || !sourceImagePlane.imagePositionPatient) {
  12714. return;
  12715. }
  12716. var sourceImagePosition = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__["default"])(sourceImagePlane.imagePositionPatient);
  12717. if (initialData.hasOwnProperty(sourceEnabledElement)) {
  12718. return;
  12719. }
  12720. initialData.distances[sourceImageId] = {};
  12721. initialData.imageIds.sourceElements.push(sourceImageId);
  12722. targetElements.forEach(function (targetElement) {
  12723. var targetEnabledElement = cornerstone.getEnabledElement(targetElement);
  12724. if (!targetEnabledElement || !targetEnabledElement.image) {
  12725. return;
  12726. }
  12727. var targetImageId = targetEnabledElement.image.imageId;
  12728. initialData.imageIds.targetElements.push(targetImageId);
  12729. if (sourceElement === targetElement) {
  12730. return;
  12731. }
  12732. if (sourceImageId === targetImageId) {
  12733. return;
  12734. }
  12735. if (initialData.distances[sourceImageId].hasOwnProperty(targetImageId)) {
  12736. return;
  12737. }
  12738. var targetImagePlane = cornerstone.metaData.get('imagePlaneModule', targetImageId);
  12739. if (!targetImagePlane || !targetImagePlane.imagePositionPatient) {
  12740. return;
  12741. }
  12742. var targetImagePosition = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__["default"])(targetImagePlane.imagePositionPatient);
  12743. initialData.distances[sourceImageId][targetImageId] = targetImagePosition.clone().sub(sourceImagePosition);
  12744. });
  12745. if (!Object.keys(initialData.distances[sourceImageId]).length) {
  12746. delete initialData.distances[sourceImageId];
  12747. }
  12748. });
  12749. };
  12750. /**
  12751. * Gather necessary event data and call synchronization handler
  12752. *
  12753. * @private
  12754. * @param {HTMLElement} sourceElement - The source element for the event
  12755. * @param {Object} eventData - The data object for the source event
  12756. * @returns {void}
  12757. */
  12758. this.fireEvent = function (sourceElement, eventData) {
  12759. var isDisabled = !that.enabled;
  12760. var noElements = !sourceElements.length || !targetElements.length;
  12761. if (isDisabled || noElements) {
  12762. return;
  12763. }
  12764. ignoreFiredEvents = true;
  12765. targetElements.forEach(function (targetElement) {
  12766. var targetIndex = targetElements.indexOf(targetElement);
  12767. if (targetIndex === -1) {
  12768. return;
  12769. }
  12770. var targetImageId = initialData.imageIds.targetElements[targetIndex];
  12771. var sourceIndex = sourceElements.indexOf(sourceElement);
  12772. if (sourceIndex === -1) {
  12773. return;
  12774. }
  12775. var sourceImageId = initialData.imageIds.sourceElements[sourceIndex];
  12776. var positionDifference;
  12777. if (sourceImageId === targetImageId) {
  12778. positionDifference = 0;
  12779. } else if (initialData.distances[sourceImageId] !== undefined) {
  12780. positionDifference = initialData.distances[sourceImageId][targetImageId];
  12781. }
  12782. eventHandler(that, sourceElement, targetElement, eventData, positionDifference);
  12783. });
  12784. ignoreFiredEvents = false;
  12785. };
  12786. /**
  12787. * Call fireEvent if not ignoring events, and pass along event data
  12788. *
  12789. * @private
  12790. * @param {Event} e - The source event object
  12791. * @returns {void}
  12792. */
  12793. this.onEvent = function (e) {
  12794. var eventData = e.detail;
  12795. if (ignoreFiredEvents === true) {
  12796. return;
  12797. }
  12798. that.fireEvent(e.currentTarget, eventData);
  12799. };
  12800. /**
  12801. * Add a source element to this synchronizer
  12802. *
  12803. * @param {HTMLElement} element - The new source element
  12804. * @returns {void}
  12805. */
  12806. this.addSource = function (element) {
  12807. // Return if this element was previously added
  12808. var index = sourceElements.indexOf(element);
  12809. if (index !== -1) {
  12810. return;
  12811. } // Add to our list of enabled elements
  12812. sourceElements.push(element); // Subscribe to the event
  12813. event.split(' ').forEach(function (oneEvent) {
  12814. element.addEventListener(oneEvent, that.onEvent);
  12815. }); // Update the initial distances between elements
  12816. that.getDistances();
  12817. that.updateDisableHandlers();
  12818. };
  12819. /**
  12820. * Add a target element to this synchronizer
  12821. *
  12822. * @param {HTMLElement} element - The new target element to be synchronized
  12823. * @returns {void}
  12824. */
  12825. this.addTarget = function (element) {
  12826. // Return if this element was previously added
  12827. var index = targetElements.indexOf(element);
  12828. if (index !== -1) {
  12829. return;
  12830. } // Add to our list of enabled elements
  12831. targetElements.push(element); // Update the initial distances between elements
  12832. that.getDistances(); // Invoke the handler for this new target element
  12833. eventHandler(that, element, element, 0);
  12834. that.updateDisableHandlers();
  12835. };
  12836. /**
  12837. * Add an element to this synchronizer as both a source and a target
  12838. *
  12839. * @param {HTMLElement} element - The new element
  12840. * @returns {void}
  12841. */
  12842. this.add = function (element) {
  12843. that.addSource(element);
  12844. that.addTarget(element);
  12845. };
  12846. /**
  12847. * Remove a source element from this synchronizer
  12848. *
  12849. * @param {HTMLElement} element - The element to be removed
  12850. * @returns {void}
  12851. */
  12852. this.removeSource = function (element) {
  12853. // Find the index of this element
  12854. var index = sourceElements.indexOf(element);
  12855. if (index === -1) {
  12856. return;
  12857. } // Remove this element from the array
  12858. sourceElements.splice(index, 1); // Stop listening for the event
  12859. event.split(' ').forEach(function (oneEvent) {
  12860. element.removeEventListener(oneEvent, that.onEvent);
  12861. }); // Update the initial distances between elements
  12862. that.getDistances(); // Update everyone listening for events
  12863. that.fireEvent(element);
  12864. that.updateDisableHandlers();
  12865. };
  12866. /**
  12867. * Remove a target element from this synchronizer
  12868. *
  12869. * @param {HTMLElement} element - The element to be removed
  12870. * @returns {void}
  12871. */
  12872. this.removeTarget = function (element) {
  12873. // Find the index of this element
  12874. var index = targetElements.indexOf(element);
  12875. if (index === -1) {
  12876. return;
  12877. } // Remove this element from the array
  12878. targetElements.splice(index, 1); // Update the initial distances between elements
  12879. that.getDistances(); // Invoke the handler for the removed target
  12880. eventHandler(that, element, element, 0);
  12881. that.updateDisableHandlers();
  12882. };
  12883. /**
  12884. * Remove an element from this synchronizer as both a target and source
  12885. *
  12886. * @param {HTMLElement} element - The element to be removed
  12887. * @returns {void}
  12888. */
  12889. this.remove = function (element) {
  12890. that.removeTarget(element);
  12891. that.removeSource(element);
  12892. };
  12893. /**
  12894. * Get the array of source elements
  12895. *
  12896. * @returns {HTMLElement[]}
  12897. */
  12898. this.getSourceElements = function () {
  12899. return sourceElements;
  12900. };
  12901. /**
  12902. * Get the array of target elements
  12903. *
  12904. * @returns {HTMLElement[]}
  12905. */
  12906. this.getTargetElements = function () {
  12907. return targetElements;
  12908. };
  12909. /**
  12910. * Display an image while halting synchronization
  12911. *
  12912. * @param {HTMLElement} element - The element containing the image
  12913. * @param {Object} image - The cornerstone image object
  12914. * @param {Object} viewport - The cornerstone viewport object
  12915. * @returns {void}
  12916. */
  12917. this.displayImage = function (element, image, viewport) {
  12918. ignoreFiredEvents = true;
  12919. _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.displayImage(element, image, viewport);
  12920. ignoreFiredEvents = false;
  12921. };
  12922. /**
  12923. * Update a viewport while halting synchronization
  12924. *
  12925. * @param {HTMLElement} element - The target element
  12926. * @param {Object} viewport - The new cornerstone viewport object
  12927. * @returns {void}
  12928. */
  12929. this.setViewport = function (element, viewport) {
  12930. ignoreFiredEvents = true;
  12931. _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.setViewport(element, viewport);
  12932. ignoreFiredEvents = false;
  12933. };
  12934. /**
  12935. * Remove an element from the synchronizer based on an event from that element
  12936. *
  12937. * @private
  12938. * @param {Event} e - The event whose element will be removed
  12939. * @returns {void}
  12940. */
  12941. function disableHandler(e) {
  12942. var element = e.detail.element;
  12943. that.remove(element);
  12944. Object(_toolOptions_js__WEBPACK_IMPORTED_MODULE_2__["clearToolOptionsByElement"])(element);
  12945. }
  12946. /**
  12947. * Add an event listener to each element that can remove it from the synchronizer
  12948. * @returns {void}
  12949. */
  12950. this.updateDisableHandlers = function () {
  12951. var elements = unique(sourceElements.concat(targetElements));
  12952. elements.forEach(function (element) {
  12953. element.removeEventListener(_externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.EVENTS.ELEMENT_DISABLED, disableHandler);
  12954. element.addEventListener(_externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.EVENTS.ELEMENT_DISABLED, disableHandler);
  12955. });
  12956. };
  12957. /**
  12958. * Remove all elements from this synchronizer
  12959. * @returns {void}
  12960. */
  12961. this.destroy = function () {
  12962. var elements = unique(sourceElements.concat(targetElements));
  12963. elements.forEach(function (element) {
  12964. that.remove(element);
  12965. });
  12966. };
  12967. }
  12968. /* harmony default export */ __webpack_exports__["default"] = (Synchronizer);
  12969. /***/ }),
  12970. /***/ "./synchronization/panZoomSynchronizer.js":
  12971. /*!************************************************!*\
  12972. !*** ./synchronization/panZoomSynchronizer.js ***!
  12973. \************************************************/
  12974. /*! exports provided: default */
  12975. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  12976. "use strict";
  12977. __webpack_require__.r(__webpack_exports__);
  12978. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
  12979. /**
  12980. * Synchronize the target zoom and pan to match the source
  12981. * @export
  12982. * @public
  12983. * @method
  12984. * @name panZoomSynchronizer
  12985. *
  12986. * @param {Object} synchronizer - The Synchronizer instance that attaches this
  12987. * handler to an event
  12988. * @param {HTMLElement} sourceElement - The source element for the zoom and pan values
  12989. * @param {HTMLElement} targetElement - The target element
  12990. * @returns {void}
  12991. */
  12992. /* harmony default export */ __webpack_exports__["default"] = (function (synchronizer, sourceElement, targetElement) {
  12993. // Ignore the case where the source and target are the same enabled element
  12994. if (targetElement === sourceElement) {
  12995. return;
  12996. }
  12997. var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone; // Get the source and target viewports
  12998. var sourceViewport = cornerstone.getViewport(sourceElement);
  12999. var targetViewport = cornerstone.getViewport(targetElement); // Do nothing if the scale and translation are the same
  13000. if (targetViewport.scale === sourceViewport.scale && targetViewport.translation.x === sourceViewport.translation.x && targetViewport.translation.y === sourceViewport.translation.y) {
  13001. return;
  13002. } // Scale and/or translation are different, sync them
  13003. targetViewport.scale = sourceViewport.scale;
  13004. targetViewport.translation.x = sourceViewport.translation.x;
  13005. targetViewport.translation.y = sourceViewport.translation.y;
  13006. synchronizer.setViewport(targetElement, targetViewport);
  13007. });
  13008. /***/ }),
  13009. /***/ "./synchronization/stackImageIndexSynchronizer.js":
  13010. /*!********************************************************!*\
  13011. !*** ./synchronization/stackImageIndexSynchronizer.js ***!
  13012. \********************************************************/
  13013. /*! exports provided: default */
  13014. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  13015. "use strict";
  13016. __webpack_require__.r(__webpack_exports__);
  13017. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
  13018. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  13019. /* harmony import */ var _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../stateManagement/loadHandlerManager.js */ "./stateManagement/loadHandlerManager.js");
  13020. /* harmony import */ var _util_clip_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../util/clip.js */ "./util/clip.js");
  13021. /**
  13022. * Synchronize the target stack to the index closest to the source stack's index
  13023. * @export
  13024. * @public
  13025. * @method
  13026. * @name stackImageIndexSynchronizer
  13027. *
  13028. * @param {Object} synchronizer - The Synchronizer instance that attaches this
  13029. * handler to an event
  13030. * @param {HTMLElement} sourceElement - The source element for the index value
  13031. * @param {HTMLElement} targetElement - The target element
  13032. * @returns {void}
  13033. */
  13034. /* harmony default export */ __webpack_exports__["default"] = (function (synchronizer, sourceElement, targetElement) {
  13035. // Ignore the case where the source and target are the same enabled element
  13036. if (targetElement === sourceElement) {
  13037. return;
  13038. }
  13039. var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone;
  13040. var sourceStackToolDataSource = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getToolState"])(sourceElement, 'stack');
  13041. var sourceStackData = sourceStackToolDataSource.data[0];
  13042. var targetStackToolDataSource = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getToolState"])(targetElement, 'stack');
  13043. var targetStackData = targetStackToolDataSource.data[0];
  13044. var newImageIdIndex = sourceStackData.currentImageIdIndex; // Clamp the index
  13045. newImageIdIndex = Object(_util_clip_js__WEBPACK_IMPORTED_MODULE_3__["default"])(newImageIdIndex, 0, targetStackData.imageIds.length - 1); // Do nothing if the index has not changed
  13046. if (newImageIdIndex === targetStackData.currentImageIdIndex) {
  13047. return;
  13048. }
  13049. var startLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].getStartLoadHandler(targetElement);
  13050. var endLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].getEndLoadHandler(targetElement);
  13051. var errorLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].getErrorLoadingHandler(targetElement);
  13052. if (startLoadingHandler) {
  13053. startLoadingHandler(targetElement);
  13054. }
  13055. var loader;
  13056. if (targetStackData.preventCache === true) {
  13057. loader = cornerstone.loadImage(targetStackData.imageIds[newImageIdIndex]);
  13058. } else {
  13059. loader = cornerstone.loadAndCacheImage(targetStackData.imageIds[newImageIdIndex]);
  13060. }
  13061. loader.then(function (image) {
  13062. var viewport = cornerstone.getViewport(targetElement);
  13063. targetStackData.currentImageIdIndex = newImageIdIndex;
  13064. synchronizer.displayImage(targetElement, image, viewport);
  13065. if (endLoadingHandler) {
  13066. endLoadingHandler(targetElement, image);
  13067. }
  13068. }, function (error) {
  13069. var imageId = targetStackData.imageIds[newImageIdIndex];
  13070. if (errorLoadingHandler) {
  13071. errorLoadingHandler(targetElement, imageId, error);
  13072. }
  13073. });
  13074. });
  13075. /***/ }),
  13076. /***/ "./synchronization/stackImagePositionOffsetSynchronizer.js":
  13077. /*!*****************************************************************!*\
  13078. !*** ./synchronization/stackImagePositionOffsetSynchronizer.js ***!
  13079. \*****************************************************************/
  13080. /*! exports provided: default */
  13081. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  13082. "use strict";
  13083. __webpack_require__.r(__webpack_exports__);
  13084. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
  13085. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  13086. /* harmony import */ var _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../stateManagement/loadHandlerManager.js */ "./stateManagement/loadHandlerManager.js");
  13087. /* harmony import */ var _util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../util/convertToVector3.js */ "./util/convertToVector3.js");
  13088. // In the future we will want to have a way to manually register links sets of the same orientation (e.g. an axial link set from a prior with an axial link set of a current). The user could do this by scrolling the two stacks to a similar location and then doing a user action (e.g. right click link) at which point the system will capture the delta between the image position (patient) of both stacks and use that to sync them. This offset will need to be adjustable.
  13089. /**
  13090. * Calculate a position in space that is offset from the source image's position,
  13091. * and synchronize the target stack to the image that is closest to that position.
  13092. * @export
  13093. * @public
  13094. * @method
  13095. * @name stackImagePositionOffsetSynchronizer
  13096. *
  13097. * @param {Object} synchronizer - The Synchronizer instance that attaches this
  13098. * handler to an event
  13099. * @param {HTMLElement} sourceElement - The source element
  13100. * @param {HTMLElement} targetElement - The target element
  13101. * @param {Object} eventData - The data object from the triggering event
  13102. * @param {Object} positionDifference - An object with { x, y, z } values that will be
  13103. * added to the source image's coordinates
  13104. * @returns {void}
  13105. */
  13106. /* harmony default export */ __webpack_exports__["default"] = (function (synchronizer, sourceElement, targetElement, eventData, positionDifference) {
  13107. // Ignore the case where the source and target are the same enabled element
  13108. if (targetElement === sourceElement) {
  13109. return;
  13110. }
  13111. var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone;
  13112. var sourceStackData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getToolState"])(sourceElement, 'stack').data[0];
  13113. var sourceImageId = sourceStackData.imageIds[sourceStackData.currentImageIdIndex];
  13114. var sourceImagePlane = cornerstone.metaData.get('imagePlaneModule', sourceImageId);
  13115. if (sourceImagePlane === undefined || sourceImagePlane.imagePositionPatient === undefined) {
  13116. return;
  13117. }
  13118. var sourceImagePosition = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_3__["default"])(sourceImagePlane.imagePositionPatient);
  13119. var stackToolDataSource = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getToolState"])(targetElement, 'stack');
  13120. var stackData = stackToolDataSource.data[0];
  13121. var minDistance = Number.MAX_VALUE;
  13122. var newImageIdIndex = -1;
  13123. if (!positionDifference) {
  13124. return;
  13125. }
  13126. var finalPosition = sourceImagePosition.clone().add(positionDifference);
  13127. stackData.imageIds.forEach(function (imageId, index) {
  13128. var imagePlane = cornerstone.metaData.get('imagePlaneModule', imageId);
  13129. if (imagePlane === undefined || imagePlane.imagePositionPatient === undefined) {
  13130. return;
  13131. }
  13132. var imagePosition = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_3__["default"])(imagePlane.imagePositionPatient);
  13133. var distance = finalPosition.distanceToSquared(imagePosition);
  13134. if (distance < minDistance) {
  13135. minDistance = distance;
  13136. newImageIdIndex = index;
  13137. }
  13138. });
  13139. if (newImageIdIndex === stackData.currentImageIdIndex || newImageIdIndex === -1) {
  13140. return;
  13141. }
  13142. var startLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].getStartLoadHandler(targetElement);
  13143. var endLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].getEndLoadHandler(targetElement);
  13144. var errorLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].getErrorLoadingHandler(targetElement);
  13145. stackData.currentImageIdIndex = newImageIdIndex;
  13146. var newImageId = stackData.imageIds[newImageIdIndex];
  13147. if (startLoadingHandler) {
  13148. startLoadingHandler(targetElement);
  13149. }
  13150. var loader;
  13151. if (stackData.preventCache === true) {
  13152. loader = cornerstone.loadImage(newImageId);
  13153. } else {
  13154. loader = cornerstone.loadAndCacheImage(newImageId);
  13155. }
  13156. loader.then(function (image) {
  13157. var viewport = cornerstone.getViewport(targetElement);
  13158. if (stackData.currentImageIdIndex !== newImageIdIndex) {
  13159. return;
  13160. }
  13161. synchronizer.displayImage(targetElement, image, viewport);
  13162. if (endLoadingHandler) {
  13163. endLoadingHandler(targetElement, image);
  13164. }
  13165. }, function (error) {
  13166. var imageId = stackData.imageIds[newImageIdIndex];
  13167. if (errorLoadingHandler) {
  13168. errorLoadingHandler(targetElement, imageId, error);
  13169. }
  13170. });
  13171. });
  13172. /***/ }),
  13173. /***/ "./synchronization/stackImagePositionSynchronizer.js":
  13174. /*!***********************************************************!*\
  13175. !*** ./synchronization/stackImagePositionSynchronizer.js ***!
  13176. \***********************************************************/
  13177. /*! exports provided: default */
  13178. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  13179. "use strict";
  13180. __webpack_require__.r(__webpack_exports__);
  13181. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
  13182. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  13183. /* harmony import */ var _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../stateManagement/loadHandlerManager.js */ "./stateManagement/loadHandlerManager.js");
  13184. /* harmony import */ var _util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../util/convertToVector3.js */ "./util/convertToVector3.js");
  13185. /**
  13186. * Synchronize the target stack to the image closest to the source image's position
  13187. * @export
  13188. * @public
  13189. * @method
  13190. * @name stackImagePositionSynchronizer
  13191. *
  13192. * @param {Object} synchronizer - The Synchronizer instance that attaches this
  13193. * handler to an event
  13194. * @param {HTMLElement} sourceElement - The source element for the image position
  13195. * @param {HTMLElement} targetElement - The target element
  13196. * @returns {void}
  13197. */
  13198. /* harmony default export */ __webpack_exports__["default"] = (function (synchronizer, sourceElement, targetElement) {
  13199. // Ignore the case where the source and target are the same enabled element
  13200. if (targetElement === sourceElement) {
  13201. return;
  13202. }
  13203. var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone;
  13204. var sourceStackData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getToolState"])(sourceElement, 'stack').data[0];
  13205. var sourceImageId = sourceStackData.imageIds[sourceStackData.currentImageIdIndex];
  13206. var sourceImagePlane = cornerstone.metaData.get('imagePlaneModule', sourceImageId);
  13207. if (sourceImagePlane === undefined || sourceImagePlane.imagePositionPatient === undefined) {
  13208. // Console.log('No position found for image ' + sourceImage.imageId);
  13209. return;
  13210. }
  13211. var sourceImagePosition = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_3__["default"])(sourceImagePlane.imagePositionPatient);
  13212. var stackToolDataSource = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getToolState"])(targetElement, 'stack');
  13213. var stackData = stackToolDataSource.data[0];
  13214. var minDistance = Number.MAX_VALUE;
  13215. var newImageIdIndex = -1;
  13216. stackData.imageIds.forEach(function (imageId, index) {
  13217. var imagePlane = cornerstone.metaData.get('imagePlaneModule', imageId);
  13218. if (imagePlane === undefined || imagePlane.imagePositionPatient === undefined) {
  13219. // Console.log('No position found for image ' + imageId);
  13220. return;
  13221. }
  13222. var imagePosition = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_3__["default"])(imagePlane.imagePositionPatient);
  13223. var distance = imagePosition.distanceToSquared(sourceImagePosition); // Console.log(index + '=' + distance);
  13224. if (distance < minDistance) {
  13225. minDistance = distance;
  13226. newImageIdIndex = index;
  13227. }
  13228. });
  13229. if (newImageIdIndex === stackData.currentImageIdIndex) {
  13230. return;
  13231. }
  13232. var startLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].getStartLoadHandler(targetElement);
  13233. var endLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].getEndLoadHandler(targetElement);
  13234. var errorLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].getErrorLoadingHandler(targetElement);
  13235. stackData.currentImageIdIndex = newImageIdIndex;
  13236. var newImageId = stackData.imageIds[newImageIdIndex];
  13237. if (startLoadingHandler) {
  13238. startLoadingHandler(targetElement);
  13239. }
  13240. if (newImageIdIndex !== -1) {
  13241. var loader;
  13242. if (stackData.preventCache === true) {
  13243. loader = cornerstone.loadImage(newImageId);
  13244. } else {
  13245. loader = cornerstone.loadAndCacheImage(newImageId);
  13246. }
  13247. loader.then(function (image) {
  13248. var viewport = cornerstone.getViewport(targetElement);
  13249. if (stackData.currentImageIdIndex !== newImageIdIndex) {
  13250. return;
  13251. }
  13252. synchronizer.displayImage(targetElement, image, viewport);
  13253. if (endLoadingHandler) {
  13254. endLoadingHandler(targetElement, image);
  13255. }
  13256. }, function (error) {
  13257. var imageId = stackData.imageIds[newImageIdIndex];
  13258. if (errorLoadingHandler) {
  13259. errorLoadingHandler(targetElement, imageId, error);
  13260. }
  13261. });
  13262. }
  13263. });
  13264. /***/ }),
  13265. /***/ "./synchronization/stackScrollSynchronizer.js":
  13266. /*!****************************************************!*\
  13267. !*** ./synchronization/stackScrollSynchronizer.js ***!
  13268. \****************************************************/
  13269. /*! exports provided: default */
  13270. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  13271. "use strict";
  13272. __webpack_require__.r(__webpack_exports__);
  13273. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
  13274. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  13275. /* harmony import */ var _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../stateManagement/loadHandlerManager.js */ "./stateManagement/loadHandlerManager.js");
  13276. /* harmony import */ var _util_clip_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../util/clip.js */ "./util/clip.js");
  13277. /**
  13278. * Propogate scrolling actions from the source element to the target element.
  13279. * @export
  13280. * @public
  13281. * @method
  13282. * @name stackScrollSynchronizer
  13283. *
  13284. * @param {Object} synchronizer - The Synchronizer instance that attaches this
  13285. * handler to an event
  13286. * @param {HTMLElement} sourceElement - The source element for the scroll event
  13287. * @param {HTMLElement} targetElement - The target element
  13288. * @param {Object} eventData - The data object from the triggering event
  13289. * @returns {void}
  13290. */
  13291. /* harmony default export */ __webpack_exports__["default"] = (function (synchronizer, sourceElement, targetElement, eventData) {
  13292. // If the target and source are the same, stop
  13293. if (sourceElement === targetElement) {
  13294. return;
  13295. } // If there is no event, or direction is 0, stop
  13296. if (!eventData || !eventData.direction) {
  13297. return;
  13298. }
  13299. var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone; // Get the stack of the target viewport
  13300. var stackToolDataSource = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getToolState"])(targetElement, 'stack');
  13301. var stackData = stackToolDataSource.data[0]; // Get the new index for the stack
  13302. var newImageIdIndex = stackData.currentImageIdIndex + eventData.direction; // Ensure the index does not exceed the bounds of the stack
  13303. newImageIdIndex = Object(_util_clip_js__WEBPACK_IMPORTED_MODULE_3__["default"])(newImageIdIndex, 0, stackData.imageIds.length - 1); // If the index has not changed, stop here
  13304. if (stackData.currentImageIdIndex === newImageIdIndex) {
  13305. return;
  13306. }
  13307. var startLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].getStartLoadHandler(targetElement);
  13308. var endLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].getEndLoadHandler(targetElement);
  13309. var errorLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].getErrorLoadingHandler(targetElement);
  13310. stackData.currentImageIdIndex = newImageIdIndex;
  13311. var newImageId = stackData.imageIds[newImageIdIndex];
  13312. if (startLoadingHandler) {
  13313. startLoadingHandler(targetElement);
  13314. }
  13315. var loader;
  13316. if (stackData.preventCache === true) {
  13317. loader = cornerstone.loadImage(newImageId);
  13318. } else {
  13319. loader = cornerstone.loadAndCacheImage(newImageId);
  13320. }
  13321. loader.then(function (image) {
  13322. var viewport = cornerstone.getViewport(targetElement);
  13323. if (stackData.currentImageIdIndex !== newImageIdIndex) {
  13324. return;
  13325. }
  13326. synchronizer.displayImage(targetElement, image, viewport);
  13327. if (endLoadingHandler) {
  13328. endLoadingHandler(targetElement, image);
  13329. }
  13330. }, function (error) {
  13331. var imageId = stackData.imageIds[newImageIdIndex];
  13332. if (errorLoadingHandler) {
  13333. errorLoadingHandler(targetElement, imageId, error);
  13334. }
  13335. });
  13336. });
  13337. /***/ }),
  13338. /***/ "./synchronization/updateImageSynchronizer.js":
  13339. /*!****************************************************!*\
  13340. !*** ./synchronization/updateImageSynchronizer.js ***!
  13341. \****************************************************/
  13342. /*! exports provided: default */
  13343. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  13344. "use strict";
  13345. __webpack_require__.r(__webpack_exports__);
  13346. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
  13347. /**
  13348. * Redraw target image immediately any time handler is called from source element.
  13349. * @export
  13350. * @public
  13351. * @method
  13352. * @name updateImageSynchronizer
  13353. *
  13354. * @param {Object} synchronizer - The Synchronizer instance that attaches this
  13355. * handler to an event
  13356. * @param {HTMLElement} sourceElement - The source element
  13357. * @param {HTMLElement} targetElement - The target element
  13358. * @returns {void}
  13359. */
  13360. /* harmony default export */ __webpack_exports__["default"] = (function (synchronizer, sourceElement, targetElement) {
  13361. // Ignore the case where the source and target are the same enabled element
  13362. if (targetElement === sourceElement) {
  13363. return;
  13364. }
  13365. _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.updateImage(targetElement);
  13366. });
  13367. /***/ }),
  13368. /***/ "./synchronization/wwwcSynchronizer.js":
  13369. /*!*********************************************!*\
  13370. !*** ./synchronization/wwwcSynchronizer.js ***!
  13371. \*********************************************/
  13372. /*! exports provided: default */
  13373. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  13374. "use strict";
  13375. __webpack_require__.r(__webpack_exports__);
  13376. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
  13377. /**
  13378. * Synchronize the target viewport ww/wc to match the source element.
  13379. * @export
  13380. * @public
  13381. * @method
  13382. * @name wwwcSynchronizer
  13383. *
  13384. * @param {Object} synchronizer - The Synchronizer instance that attaches this
  13385. * handler to an event
  13386. * @param {HTMLElement} sourceElement - The source element for the ww/wc values
  13387. * @param {HTMLElement} targetElement - The target element
  13388. * @returns {void}
  13389. */
  13390. /* harmony default export */ __webpack_exports__["default"] = (function (synchronizer, sourceElement, targetElement) {
  13391. // Ignore the case where the source and target are the same enabled element
  13392. if (targetElement === sourceElement) {
  13393. return;
  13394. }
  13395. var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone; // Get the source and target viewports
  13396. var sourceViewport = cornerstone.getViewport(sourceElement);
  13397. var targetViewport = cornerstone.getViewport(targetElement); // Do nothing if the ww/wc already match
  13398. if (targetViewport.voi.windowWidth === sourceViewport.voi.windowWidth && targetViewport.voi.windowCenter === sourceViewport.voi.windowCenter && targetViewport.invert === sourceViewport.invert) {
  13399. return;
  13400. } // Www/wc are different, sync them
  13401. targetViewport.voi.windowWidth = sourceViewport.voi.windowWidth;
  13402. targetViewport.voi.windowCenter = sourceViewport.voi.windowCenter;
  13403. targetViewport.invert = sourceViewport.invert;
  13404. synchronizer.setViewport(targetElement, targetViewport);
  13405. });
  13406. /***/ }),
  13407. /***/ "./thirdParty/register.js":
  13408. /*!********************************!*\
  13409. !*** ./thirdParty/register.js ***!
  13410. \********************************/
  13411. /*! exports provided: default */
  13412. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  13413. "use strict";
  13414. __webpack_require__.r(__webpack_exports__);
  13415. /* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "../node_modules/@babel/runtime/helpers/typeof.js");
  13416. /* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__);
  13417. /* harmony import */ var _registerModule_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./registerModule.js */ "./thirdParty/registerModule.js");
  13418. /* harmony import */ var _registerMixin_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./registerMixin.js */ "./thirdParty/registerMixin.js");
  13419. /* harmony import */ var _registerItem_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./registerItem.js */ "./thirdParty/registerItem.js");
  13420. /* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/logger.js */ "./util/logger.js");
  13421. var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_4__["getLogger"])('thirdParty:register');
  13422. /**
  13423. * Register an item or module to cornerstoneTools.
  13424. * @export
  13425. * @public
  13426. * @method
  13427. * @name register
  13428. *
  13429. * @param {string} type The type of the item/module.
  13430. * @param {string} name The name of the item/module.
  13431. * @param {Object|function} item The item/module itself.
  13432. * @param {boolean} [overwrite=false] Whether an item/module should be
  13433. * overwritten, should it have the same name.
  13434. * @returns {void}
  13435. */
  13436. /* harmony default export */ __webpack_exports__["default"] = (function (type, name, item) {
  13437. var overwrite = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
  13438. if (!isValidInput(type, name, item)) {
  13439. return;
  13440. }
  13441. switch (type) {
  13442. case 'module':
  13443. Object(_registerModule_js__WEBPACK_IMPORTED_MODULE_1__["default"])(name, item, overwrite);
  13444. break;
  13445. case 'mixin':
  13446. Object(_registerMixin_js__WEBPACK_IMPORTED_MODULE_2__["default"])(name, item, overwrite);
  13447. break;
  13448. default:
  13449. Object(_registerItem_js__WEBPACK_IMPORTED_MODULE_3__["default"])(type, name, item, overwrite);
  13450. }
  13451. });
  13452. /**
  13453. * Returns true if the item is valid, this avoids
  13454. * clogging up the library with invalid data.
  13455. * @private
  13456. * @method
  13457. * @name isValidInput
  13458. *
  13459. * @param {string} type The type of the item/module.
  13460. * @param {string} name The name of the item/module.
  13461. * @param {Object|function} item The item/module itself.
  13462. * @returns {boolean} Whether the input is valid.
  13463. */
  13464. function isValidInput(type, name, item) {
  13465. if (!type) {
  13466. logger.warn('The type must be given in order to register.');
  13467. return false;
  13468. }
  13469. if (!name) {
  13470. logger.warn("The %s must have a name in order to register.", type);
  13471. return false;
  13472. }
  13473. if (_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default()(item) !== 'object' && typeof item !== 'function') {
  13474. logger.warn("The %s is a %s, it should be an Object or a function.", item, _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default()(item));
  13475. return false;
  13476. }
  13477. return true;
  13478. }
  13479. /***/ }),
  13480. /***/ "./thirdParty/registerItem.js":
  13481. /*!************************************!*\
  13482. !*** ./thirdParty/registerItem.js ***!
  13483. \************************************/
  13484. /*! exports provided: default */
  13485. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  13486. "use strict";
  13487. __webpack_require__.r(__webpack_exports__);
  13488. /* harmony import */ var _lib_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../lib.js */ "./lib.js");
  13489. /* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../util/logger.js */ "./util/logger.js");
  13490. var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_1__["getLogger"])('thirdParty:registerType');
  13491. /**
  13492. * Register an item to cornerstoneTools.
  13493. * @export
  13494. * @private
  13495. * @method
  13496. * @name registerItem
  13497. *
  13498. * @param {string} type The type of the item.
  13499. * @param {string} name The name of the item.
  13500. * @param {Object|function} item The item itself.
  13501. * @param {boolean} [overwrite=false] Whether an item should be overwritten,
  13502. * should it have the same name.
  13503. * @returns {void}
  13504. */
  13505. /* harmony default export */ __webpack_exports__["default"] = (function (type, name, item) {
  13506. var overwrite = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
  13507. var itemKey = "".concat(type, "/").concat(name);
  13508. var alreadyRegistered = isItemNameRegistered(itemKey);
  13509. if (alreadyRegistered && !overwrite) {
  13510. logger.warn('%s is already registered', itemKey);
  13511. return;
  13512. }
  13513. if (alreadyRegistered) {
  13514. logger.warn('Overwriting %s', itemKey);
  13515. }
  13516. _lib_js__WEBPACK_IMPORTED_MODULE_0__["lib"][itemKey] = item;
  13517. });
  13518. function isItemNameRegistered(itemKey) {
  13519. return _lib_js__WEBPACK_IMPORTED_MODULE_0__["lib"][itemKey] !== undefined;
  13520. }
  13521. /***/ }),
  13522. /***/ "./thirdParty/registerMixin.js":
  13523. /*!*************************************!*\
  13524. !*** ./thirdParty/registerMixin.js ***!
  13525. \*************************************/
  13526. /*! exports provided: default */
  13527. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  13528. "use strict";
  13529. __webpack_require__.r(__webpack_exports__);
  13530. /* harmony import */ var _lib_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../lib.js */ "./lib.js");
  13531. /* harmony import */ var _mixins_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../mixins/index.js */ "./mixins/index.js");
  13532. /* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../util/logger.js */ "./util/logger.js");
  13533. var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_2__["getLogger"])('thirdParty:registerMixin');
  13534. /**
  13535. * Register an mixin to cornerstoneTools.
  13536. * @export
  13537. * @private
  13538. * @method
  13539. * @name registerMixin
  13540. *
  13541. * @param {string} name The name of the mixin.
  13542. * @param {Object} mixin The mixin itself.
  13543. * @param {boolean} [overwrite=false] Whether an mixin should be overwritten,
  13544. * should it have the same name.
  13545. * @returns {void}
  13546. */
  13547. /* harmony default export */ __webpack_exports__["default"] = (function (name, mixin) {
  13548. var overwrite = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
  13549. var alreadyRegistered = isMixinRegistered(name);
  13550. if (alreadyRegistered && !overwrite) {
  13551. logger.warn('mixins/%s is already registered', name);
  13552. return;
  13553. }
  13554. if (alreadyRegistered) {
  13555. logger.warn('Overwriting mixins/%s', name);
  13556. } // Register to the mixins object
  13557. _mixins_index_js__WEBPACK_IMPORTED_MODULE_1__["default"][name] = mixin; // Reference the mixin from the library so it can be exported externally.
  13558. _lib_js__WEBPACK_IMPORTED_MODULE_0__["lib"]["mixins/".concat(name)] = _mixins_index_js__WEBPACK_IMPORTED_MODULE_1__["default"][name];
  13559. });
  13560. function isMixinRegistered(name) {
  13561. return _mixins_index_js__WEBPACK_IMPORTED_MODULE_1__["default"][name] !== undefined;
  13562. }
  13563. /***/ }),
  13564. /***/ "./thirdParty/registerModule.js":
  13565. /*!**************************************!*\
  13566. !*** ./thirdParty/registerModule.js ***!
  13567. \**************************************/
  13568. /*! exports provided: default */
  13569. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  13570. "use strict";
  13571. __webpack_require__.r(__webpack_exports__);
  13572. /* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../store/index.js */ "./store/index.js");
  13573. /* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../util/logger.js */ "./util/logger.js");
  13574. var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_1__["getLogger"])('thirdParty:registerModule');
  13575. /**
  13576. * Register a module.
  13577. * @export
  13578. * @private
  13579. * @method
  13580. * @name registerModule
  13581. *
  13582. * @param {string} name The name of the module.
  13583. * @param {Object} newModule The module to register.
  13584. * @param {boolean} [overwrite] Whether a module should be overwritten,
  13585. * should it have the same name.
  13586. * @returns {void}
  13587. */
  13588. /* harmony default export */ __webpack_exports__["default"] = (function (name, newModule) {
  13589. var overwrite = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
  13590. var alreadyRegistered = isModuleNameRegistered(name);
  13591. if (alreadyRegistered && !overwrite) {
  13592. logger.warn('A module with the name %s is already registered', name);
  13593. return;
  13594. }
  13595. if (alreadyRegistered) {
  13596. logger.warn('Overwriting module %s', name);
  13597. }
  13598. _store_index_js__WEBPACK_IMPORTED_MODULE_0__["modules"][name] = newModule;
  13599. if (typeof _store_index_js__WEBPACK_IMPORTED_MODULE_0__["modules"][name].onRegisterCallback === 'function') {
  13600. _store_index_js__WEBPACK_IMPORTED_MODULE_0__["modules"][name].onRegisterCallback();
  13601. }
  13602. });
  13603. function isModuleNameRegistered(name) {
  13604. return _store_index_js__WEBPACK_IMPORTED_MODULE_0__["modules"][name] !== undefined;
  13605. }
  13606. /***/ }),
  13607. /***/ "./thirdParty/registerSome.js":
  13608. /*!************************************!*\
  13609. !*** ./thirdParty/registerSome.js ***!
  13610. \************************************/
  13611. /*! exports provided: default */
  13612. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  13613. "use strict";
  13614. __webpack_require__.r(__webpack_exports__);
  13615. /* harmony import */ var _register_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./register.js */ "./thirdParty/register.js");
  13616. /**
  13617. * Register an array of items and/or modules to cornerstoneTools.
  13618. * @export
  13619. * @public
  13620. * @method
  13621. * @name registerSome
  13622. *
  13623. * @param {Object[]} items An array of items/modules to register.
  13624. * @param {boolean} [overwrite=false] Whether an item/module should be
  13625. * overwritten, should it have the same name.
  13626. * @returns {void}
  13627. */
  13628. /* harmony default export */ __webpack_exports__["default"] = (function (items) {
  13629. var overwrite = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
  13630. items.forEach(function (_ref) {
  13631. var type = _ref.type,
  13632. name = _ref.name,
  13633. item = _ref.item;
  13634. Object(_register_js__WEBPACK_IMPORTED_MODULE_0__["default"])(type, name, item, overwrite);
  13635. });
  13636. });
  13637. /***/ }),
  13638. /***/ "./toolOptions.js":
  13639. /*!************************!*\
  13640. !*** ./toolOptions.js ***!
  13641. \************************/
  13642. /*! exports provided: getToolOptions, setToolOptions, clearToolOptions, clearToolOptionsByToolType, clearToolOptionsByToolName, clearToolOptionsByElement */
  13643. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  13644. "use strict";
  13645. __webpack_require__.r(__webpack_exports__);
  13646. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getToolOptions", function() { return getToolOptions; });
  13647. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setToolOptions", function() { return setToolOptions; });
  13648. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clearToolOptions", function() { return clearToolOptions; });
  13649. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clearToolOptionsByToolType", function() { return clearToolOptionsByToolType; });
  13650. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clearToolOptionsByToolName", function() { return clearToolOptionsByToolName; });
  13651. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clearToolOptionsByElement", function() { return clearToolOptionsByElement; });
  13652. var elementToolOptions = {};
  13653. /**
  13654. * Retrieve the options object associated with a particular toolName and element
  13655. * @export
  13656. * @public
  13657. * @method
  13658. * @name getToolOptions
  13659. *
  13660. * @param {string} toolName Tool name identifier of the target options object
  13661. * @param {HTMLElement} element Element of the target options object
  13662. *
  13663. * @returns {Object} Target options object (empty if not yet set)
  13664. */
  13665. function getToolOptions(toolName, element) {
  13666. if (!elementToolOptions[toolName]) {
  13667. return {};
  13668. }
  13669. var toolOptions = elementToolOptions[toolName];
  13670. var optionsObject = toolOptions.find(function (toolOptionObject) {
  13671. return toolOptionObject.element === element;
  13672. });
  13673. if (!optionsObject) {
  13674. return {};
  13675. }
  13676. return optionsObject.options;
  13677. }
  13678. /**
  13679. * Set the options object associated with a particular toolName and element.
  13680. * @export
  13681. * @public
  13682. * @method
  13683. * @name setToolOptions
  13684. *
  13685. * @param {string} toolName Tool name identifier of the target options object.
  13686. * @param {HTMLElement} element Element of the target options object.
  13687. * @param {Object} options Options object to store at target.
  13688. * @returns {void}
  13689. */
  13690. function setToolOptions(toolName, element, options) {
  13691. if (!elementToolOptions[toolName]) {
  13692. elementToolOptions[toolName] = [{
  13693. element: element,
  13694. options: options
  13695. }];
  13696. return;
  13697. }
  13698. var toolOptions = elementToolOptions[toolName];
  13699. var index = toolOptions.findIndex(function (toolOptionObject) {
  13700. return toolOptionObject.element === element;
  13701. });
  13702. if (index === -1) {
  13703. elementToolOptions[toolName].push({
  13704. element: element,
  13705. options: options
  13706. });
  13707. } else {
  13708. var elementOptions = elementToolOptions[toolName][index].options || {};
  13709. elementToolOptions[toolName][index].options = Object.assign(elementOptions, options);
  13710. }
  13711. }
  13712. /**
  13713. * Clear the options object associated with a particular toolName and element.
  13714. * @export
  13715. * @public
  13716. * @method
  13717. * @name clearToolOptions
  13718. *
  13719. * @param {string} toolName Tool name identifier of the target options object.
  13720. * @param {HTMLElement} element Element of the target options object.
  13721. * @returns {void}
  13722. */
  13723. function clearToolOptions(toolName, element) {
  13724. var toolOptions = elementToolOptions[toolName];
  13725. if (toolOptions) {
  13726. elementToolOptions[toolName] = toolOptions.filter(function (toolOptionObject) {
  13727. return toolOptionObject.element !== element;
  13728. });
  13729. }
  13730. }
  13731. /**
  13732. * Clear the options objects associated with a particular toolType.
  13733. *
  13734. * Deprecation notice: use clearToolOptionsByToolName instead
  13735. * @deprecated
  13736. *
  13737. * @export
  13738. * @public
  13739. * @method
  13740. * @name clearToolOptionsByToolType
  13741. *
  13742. * @param {string} toolType Tool type identifier of the target options objects.
  13743. * @returns {void}
  13744. */
  13745. function clearToolOptionsByToolType(toolType) {
  13746. return clearToolOptionsByToolName(toolType);
  13747. }
  13748. /**
  13749. * Clear the options objects associated with a particular toolName.
  13750. * @export
  13751. * @public
  13752. * @method
  13753. * @name clearToolOptionsByToolName
  13754. *
  13755. * @param {string} toolName Tool name identifier of the target options objects.
  13756. * @returns {void}
  13757. */
  13758. function clearToolOptionsByToolName(toolName) {
  13759. delete elementToolOptions[toolName];
  13760. }
  13761. /**
  13762. * Clear the options objects associated with a particular element.
  13763. * @export
  13764. * @public
  13765. * @method
  13766. * @name clearToolOptionsByElement
  13767. *
  13768. * @param {HTMLElement} element Element of the target options objects.
  13769. * @returns {void}
  13770. */
  13771. function clearToolOptionsByElement(element) {
  13772. for (var toolName in elementToolOptions) {
  13773. elementToolOptions[toolName] = elementToolOptions[toolName].filter(function (toolOptionObject) {
  13774. return toolOptionObject.element !== element;
  13775. });
  13776. }
  13777. }
  13778. /***/ }),
  13779. /***/ "./tools/CrosshairsTool.js":
  13780. /*!*********************************!*\
  13781. !*** ./tools/CrosshairsTool.js ***!
  13782. \*********************************/
  13783. /*! exports provided: default */
  13784. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  13785. "use strict";
  13786. __webpack_require__.r(__webpack_exports__);
  13787. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return CrosshairsTool; });
  13788. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
  13789. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
  13790. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
  13791. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
  13792. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
  13793. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
  13794. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
  13795. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
  13796. /* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js");
  13797. /* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__);
  13798. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
  13799. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__);
  13800. /* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js");
  13801. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js");
  13802. /* harmony import */ var _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../stateManagement/loadHandlerManager.js */ "./stateManagement/loadHandlerManager.js");
  13803. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  13804. /* harmony import */ var _util_pointProjector_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../util/pointProjector.js */ "./util/pointProjector.js");
  13805. /* harmony import */ var _util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../util/convertToVector3.js */ "./util/convertToVector3.js");
  13806. /* harmony import */ var _toolOptions_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../toolOptions.js */ "./toolOptions.js");
  13807. /* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./cursors/index.js */ "./tools/cursors/index.js");
  13808. /**
  13809. * @public
  13810. * @class CrosshairsTool
  13811. * @memberof Tools
  13812. *
  13813. * @classdesc Tool for finding the slice in another element corresponding to the
  13814. * image position in a synchronized image series.
  13815. * @extends Tools.Base.BaseTool
  13816. */
  13817. var CrosshairsTool =
  13818. /*#__PURE__*/
  13819. function (_BaseTool) {
  13820. _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(CrosshairsTool, _BaseTool);
  13821. function CrosshairsTool() {
  13822. var _this;
  13823. var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  13824. _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, CrosshairsTool);
  13825. var defaultProps = {
  13826. name: 'Crosshairs',
  13827. supportedInteractionTypes: ['Mouse', 'Touch'],
  13828. svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_13__["crosshairsCursor"]
  13829. };
  13830. _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(CrosshairsTool).call(this, props, defaultProps));
  13831. _this.preMouseDownCallback = _this._chooseLocation.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  13832. _this.mouseDragCallback = _this._chooseLocation.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  13833. _this.touchDragCallback = _this._chooseLocation.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  13834. return _this;
  13835. }
  13836. _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(CrosshairsTool, [{
  13837. key: "_chooseLocation",
  13838. value: function _chooseLocation(evt) {
  13839. var eventData = evt.detail;
  13840. var element = eventData.element; // Prevent CornerstoneToolsTouchStartActive from killing any press events
  13841. evt.stopImmediatePropagation(); // If we have no toolData for this element, return immediately as there is nothing to do
  13842. var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_9__["getToolState"])(element, this.name);
  13843. if (!toolData) {
  13844. return;
  13845. } // Get current element target information
  13846. var sourceElement = element;
  13847. var sourceEnabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.getEnabledElement(sourceElement);
  13848. var sourceImageId = sourceEnabledElement.image.imageId;
  13849. var sourceImagePlane = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.metaData.get('imagePlaneModule', sourceImageId);
  13850. if (!sourceImagePlane) {
  13851. return;
  13852. } // Get currentPoints from mouse cursor on selected element
  13853. var sourceImagePoint = eventData.currentPoints.image; // Transfer this to a patientPoint given imagePlane metadata
  13854. var patientPoint = Object(_util_pointProjector_js__WEBPACK_IMPORTED_MODULE_10__["imagePointToPatientPoint"])(sourceImagePoint, sourceImagePlane); // Get the enabled elements associated with this synchronization context
  13855. var syncContext = toolData.data[0].synchronizationContext;
  13856. var enabledElements = syncContext.getSourceElements(); // Iterate over each synchronized element
  13857. enabledElements.forEach(function (targetElement) {
  13858. // Don't do anything if the target is the same as the source
  13859. if (targetElement === sourceElement) {
  13860. return;
  13861. }
  13862. var minDistance = Number.MAX_VALUE;
  13863. var newImageIdIndex = -1;
  13864. var stackToolDataSource = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_9__["getToolState"])(targetElement, 'stack');
  13865. if (stackToolDataSource === undefined) {
  13866. return;
  13867. }
  13868. var stackData = stackToolDataSource.data[0]; // Find within the element's stack the closest image plane to selected location
  13869. stackData.imageIds.forEach(function (imageId, index) {
  13870. var imagePlane = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.metaData.get('imagePlaneModule', imageId); // Skip if the image plane is not ready
  13871. if (!imagePlane || !imagePlane.imagePositionPatient || !imagePlane.rowCosines || !imagePlane.columnCosines) {
  13872. return;
  13873. }
  13874. var imagePosition = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_11__["default"])(imagePlane.imagePositionPatient);
  13875. var row = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_11__["default"])(imagePlane.rowCosines);
  13876. var column = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_11__["default"])(imagePlane.columnCosines);
  13877. var normal = column.clone().cross(row.clone());
  13878. var distance = Math.abs(normal.clone().dot(imagePosition) - normal.clone().dot(patientPoint));
  13879. if (distance < minDistance) {
  13880. minDistance = distance;
  13881. newImageIdIndex = index;
  13882. }
  13883. });
  13884. if (newImageIdIndex === stackData.currentImageIdIndex) {
  13885. return;
  13886. } // Switch the loaded image to the required image
  13887. if (newImageIdIndex !== -1 && stackData.imageIds[newImageIdIndex] !== undefined) {
  13888. var startLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_8__["default"].getStartLoadHandler(targetElement);
  13889. var endLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_8__["default"].getEndLoadHandler(targetElement);
  13890. var errorLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_8__["default"].getErrorLoadingHandler(targetElement);
  13891. if (startLoadingHandler) {
  13892. startLoadingHandler(targetElement);
  13893. }
  13894. var loader;
  13895. if (stackData.preventCache === true) {
  13896. loader = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.loadImage(stackData.imageIds[newImageIdIndex]);
  13897. } else {
  13898. loader = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.loadAndCacheImage(stackData.imageIds[newImageIdIndex]);
  13899. }
  13900. loader.then(function (image) {
  13901. var viewport = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.getViewport(targetElement);
  13902. stackData.currentImageIdIndex = newImageIdIndex;
  13903. _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.displayImage(targetElement, image, viewport);
  13904. if (endLoadingHandler) {
  13905. endLoadingHandler(targetElement, image);
  13906. }
  13907. }, function (error) {
  13908. var imageId = stackData.imageIds[newImageIdIndex];
  13909. if (errorLoadingHandler) {
  13910. errorLoadingHandler(targetElement, imageId, error);
  13911. }
  13912. });
  13913. }
  13914. });
  13915. }
  13916. }, {
  13917. key: "activeCallback",
  13918. value: function activeCallback(element, _ref) {
  13919. var mouseButtonMask = _ref.mouseButtonMask,
  13920. synchronizationContext = _ref.synchronizationContext;
  13921. Object(_toolOptions_js__WEBPACK_IMPORTED_MODULE_12__["setToolOptions"])(this.name, element, {
  13922. mouseButtonMask: mouseButtonMask
  13923. }); // Clear any currently existing toolData
  13924. Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_9__["clearToolState"])(element, this.name);
  13925. Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_9__["addToolState"])(element, this.name, {
  13926. synchronizationContext: synchronizationContext
  13927. });
  13928. }
  13929. }]);
  13930. return CrosshairsTool;
  13931. }(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]);
  13932. /***/ }),
  13933. /***/ "./tools/DoubleTapFitToWindowTool.js":
  13934. /*!*******************************************!*\
  13935. !*** ./tools/DoubleTapFitToWindowTool.js ***!
  13936. \*******************************************/
  13937. /*! exports provided: default */
  13938. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  13939. "use strict";
  13940. __webpack_require__.r(__webpack_exports__);
  13941. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return DoubleTapFitToWindowTool; });
  13942. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
  13943. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
  13944. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
  13945. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
  13946. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
  13947. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
  13948. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
  13949. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
  13950. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
  13951. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
  13952. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
  13953. /* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js");
  13954. /**
  13955. * @public
  13956. * @class DoubleTapFitToWindowTool
  13957. * @memberof Tools
  13958. *
  13959. * @classdesc Tool which calls the external cornerstone.fitToWindow() function
  13960. * on double tap.
  13961. * @extends Tools.Base.BaseTool
  13962. */
  13963. var DoubleTapFitToWindowTool =
  13964. /*#__PURE__*/
  13965. function (_BaseTool) {
  13966. _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(DoubleTapFitToWindowTool, _BaseTool);
  13967. function DoubleTapFitToWindowTool() {
  13968. var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  13969. _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, DoubleTapFitToWindowTool);
  13970. var defaultProps = {
  13971. name: 'DoubleTapFitToWindow',
  13972. supportedInteractionTypes: ['DoubleTap']
  13973. };
  13974. return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(DoubleTapFitToWindowTool).call(this, props, defaultProps));
  13975. }
  13976. _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(DoubleTapFitToWindowTool, [{
  13977. key: "doubleTapCallback",
  13978. value: function doubleTapCallback(evt) {
  13979. var eventData = evt.detail;
  13980. _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.fitToWindow(eventData.element);
  13981. }
  13982. }]);
  13983. return DoubleTapFitToWindowTool;
  13984. }(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]);
  13985. /***/ }),
  13986. /***/ "./tools/DragProbeTool.js":
  13987. /*!********************************!*\
  13988. !*** ./tools/DragProbeTool.js ***!
  13989. \********************************/
  13990. /*! exports provided: default */
  13991. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  13992. "use strict";
  13993. __webpack_require__.r(__webpack_exports__);
  13994. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return DragProbeTool; });
  13995. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
  13996. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
  13997. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
  13998. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
  13999. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
  14000. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
  14001. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
  14002. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
  14003. /* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js");
  14004. /* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__);
  14005. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
  14006. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__);
  14007. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
  14008. /* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js");
  14009. /* harmony import */ var _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../stateManagement/textStyle.js */ "./stateManagement/textStyle.js");
  14010. /* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../stateManagement/toolColors.js */ "./stateManagement/toolColors.js");
  14011. /* harmony import */ var _util_getRGBPixels_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../util/getRGBPixels.js */ "./util/getRGBPixels.js");
  14012. /* harmony import */ var _util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../util/calculateSUV.js */ "./util/calculateSUV.js");
  14013. /* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../drawing/index.js */ "./drawing/index.js");
  14014. /* harmony import */ var _drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../drawing/drawTextBox.js */ "./drawing/drawTextBox.js");
  14015. /* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./cursors/index.js */ "./tools/cursors/index.js");
  14016. /**
  14017. * @public
  14018. * @class DragProbeTool
  14019. * @memberof Tools
  14020. *
  14021. * @classdesc Tool which provides a probe of the image data at the
  14022. * input position on drag.
  14023. * @extends Tools.Base.BaseTool
  14024. */
  14025. var DragProbeTool =
  14026. /*#__PURE__*/
  14027. function (_BaseTool) {
  14028. _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(DragProbeTool, _BaseTool);
  14029. function DragProbeTool() {
  14030. var _this;
  14031. var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  14032. _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, DragProbeTool);
  14033. var defaultProps = {
  14034. name: 'DragProbe',
  14035. strategies: {
  14036. default: defaultStrategy,
  14037. minimal: minimalStrategy
  14038. },
  14039. defaultStrategy: 'default',
  14040. supportedInteractionTypes: ['Mouse', 'Touch'],
  14041. svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_14__["probeCursor"]
  14042. };
  14043. _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(DragProbeTool).call(this, props, defaultProps));
  14044. _this.touchDragCallback = _this._movingEventCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  14045. _this.touchEndCallback = _this._endMovingEventCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  14046. _this.mouseDragCallback = _this._movingEventCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  14047. _this.mouseUpCallback = _this._endMovingEventCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  14048. _this.dragEventData = {};
  14049. return _this;
  14050. }
  14051. _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(DragProbeTool, [{
  14052. key: "_movingEventCallback",
  14053. value: function _movingEventCallback(evt) {
  14054. var eventData = evt.detail;
  14055. var element = eventData.element;
  14056. this.dragEventData = eventData;
  14057. _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.updateImage(element);
  14058. }
  14059. }, {
  14060. key: "_endMovingEventCallback",
  14061. value: function _endMovingEventCallback(evt) {
  14062. var eventData = evt.detail;
  14063. var element = eventData.element;
  14064. this.dragEventData = {};
  14065. _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.updateImage(element);
  14066. }
  14067. }, {
  14068. key: "renderToolData",
  14069. value: function renderToolData(evt) {
  14070. if (!this.dragEventData.currentPoints) {
  14071. return;
  14072. }
  14073. if (evt && evt.detail && Boolean(Object.keys(this.dragEventData.currentPoints).length)) {
  14074. evt.detail.currentPoints = this.dragEventData.currentPoints;
  14075. this.applyActiveStrategy(evt);
  14076. }
  14077. }
  14078. }]);
  14079. return DragProbeTool;
  14080. }(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_7__["default"]);
  14081. /**
  14082. * Default strategy will pick the exactly point of mouse/touch interact and display the probe data.
  14083. *
  14084. * @param {Object} evt Image rendered event
  14085. * @returns {void}
  14086. */
  14087. function defaultStrategy(evt) {
  14088. var config = this.configuration;
  14089. var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone;
  14090. var eventData = evt.detail;
  14091. var element = eventData.element,
  14092. image = eventData.image,
  14093. currentPoints = eventData.currentPoints,
  14094. canvasContext = eventData.canvasContext;
  14095. var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_12__["getNewContext"])(canvasContext.canvas);
  14096. var color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__["default"].getActiveColor();
  14097. var fontHeight = _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_8__["default"].getFontSize();
  14098. var x = Math.round(currentPoints.image.x);
  14099. var y = Math.round(currentPoints.image.y);
  14100. if (x < 0 || y < 0 || x >= image.columns || y >= image.rows) {
  14101. return;
  14102. }
  14103. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_12__["draw"])(context, function (context) {
  14104. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_12__["setShadow"])(context, config);
  14105. var text = "".concat(x, ", ").concat(y);
  14106. var storedPixels;
  14107. var str;
  14108. if (image.color) {
  14109. storedPixels = Object(_util_getRGBPixels_js__WEBPACK_IMPORTED_MODULE_10__["default"])(element, x, y, 1, 1);
  14110. str = "R: ".concat(storedPixels[0], " G: ").concat(storedPixels[1], " B: ").concat(storedPixels[2], " A: ").concat(storedPixels[3]);
  14111. } else {
  14112. storedPixels = cornerstone.getStoredPixels(element, x, y, 1, 1);
  14113. var sp = storedPixels[0];
  14114. var mo = sp * image.slope + image.intercept;
  14115. var suv = Object(_util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_11__["default"])(image, sp); // Draw text
  14116. str = "SP: ".concat(sp, " MO: ").concat(parseFloat(mo.toFixed(3)));
  14117. if (suv) {
  14118. str += " SUV: ".concat(parseFloat(suv.toFixed(3)));
  14119. }
  14120. } // Draw text 5px away from cursor
  14121. var textCoords = {
  14122. x: currentPoints.canvas.x + 5,
  14123. y: currentPoints.canvas.y - 5
  14124. };
  14125. Object(_drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_13__["default"])(context, str, textCoords.x, textCoords.y + fontHeight + 5, color);
  14126. Object(_drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_13__["default"])(context, text, textCoords.x, textCoords.y, color);
  14127. });
  14128. }
  14129. /**
  14130. * Minimal strategy will position a circle and use the center of the circle to calculate and display probe data.
  14131. *
  14132. * @param {Object} evt Image rendered event
  14133. * @returns {void}
  14134. */
  14135. function minimalStrategy(evt) {
  14136. var config = this.configuration;
  14137. var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone;
  14138. var eventData = evt.detail;
  14139. var element = eventData.element,
  14140. image = eventData.image,
  14141. currentPoints = eventData.currentPoints,
  14142. canvasContext = eventData.canvasContext,
  14143. isTouchEvent = eventData.isTouchEvent;
  14144. var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_12__["getNewContext"])(canvasContext.canvas);
  14145. var color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__["default"].getActiveColor();
  14146. var pageCoordY = currentPoints.page.y - _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_8__["default"].getFontSize() / 2;
  14147. if (isTouchEvent) {
  14148. pageCoordY = currentPoints.page.y - _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_8__["default"].getFontSize() * 4;
  14149. }
  14150. var toolCoords = cornerstone.pageToPixel(element, currentPoints.page.x, pageCoordY);
  14151. if (toolCoords.x < 0 || toolCoords.y < 0 || toolCoords.x >= image.columns || toolCoords.y >= image.rows) {
  14152. return;
  14153. }
  14154. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_12__["draw"])(context, function (context) {
  14155. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_12__["setShadow"])(context, config);
  14156. var seriesModule = cornerstone.metaData.get('generalSeriesModule', image.imageId);
  14157. var modality = seriesModule && seriesModule.modality;
  14158. var storedPixels;
  14159. var text = '';
  14160. if (image.color) {
  14161. storedPixels = Object(_util_getRGBPixels_js__WEBPACK_IMPORTED_MODULE_10__["default"])(element, toolCoords.x, toolCoords.y, 1, 1);
  14162. text = "R: ".concat(storedPixels[0], " G: ").concat(storedPixels[1], " B: ").concat(storedPixels[2]);
  14163. } else {
  14164. storedPixels = cornerstone.getStoredPixels(element, toolCoords.x, toolCoords.y, 1, 1);
  14165. var sp = storedPixels[0];
  14166. var mo = sp * image.slope + image.intercept;
  14167. var modalityPixelValueText = parseFloat(mo.toFixed(2));
  14168. if (modality === 'CT') {
  14169. text += "HU: ".concat(modalityPixelValueText);
  14170. } else if (modality === 'PT') {
  14171. text += modalityPixelValueText;
  14172. var suv = Object(_util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_11__["default"])(image, sp);
  14173. if (suv) {
  14174. text += " SUV: ".concat(parseFloat(suv.toFixed(2)));
  14175. }
  14176. } else {
  14177. text += modalityPixelValueText;
  14178. }
  14179. } // Prepare text
  14180. var textCoords = cornerstone.pixelToCanvas(element, toolCoords); // Translate the x/y away from the cursor
  14181. var translation = {
  14182. x: 12,
  14183. y: -(_stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_8__["default"].getFontSize() + 10) / 2
  14184. };
  14185. var handleRadius = 6;
  14186. var padding = 5;
  14187. var width = Object(_drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_13__["textBoxWidth"])(context, text, padding);
  14188. if (isTouchEvent) {
  14189. translation = {
  14190. x: -width / 2,
  14191. y: -_stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_8__["default"].getFontSize() - 10 - 2 * handleRadius
  14192. };
  14193. }
  14194. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_12__["drawCircle"])(context, element, textCoords, handleRadius, {
  14195. color: color
  14196. }, 'canvas');
  14197. Object(_drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_13__["default"])(context, text, textCoords.x + translation.x, textCoords.y + translation.y, color);
  14198. });
  14199. }
  14200. /***/ }),
  14201. /***/ "./tools/EraserTool.js":
  14202. /*!*****************************!*\
  14203. !*** ./tools/EraserTool.js ***!
  14204. \*****************************/
  14205. /*! exports provided: default */
  14206. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  14207. "use strict";
  14208. __webpack_require__.r(__webpack_exports__);
  14209. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return EraserTool; });
  14210. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
  14211. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
  14212. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
  14213. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
  14214. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
  14215. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
  14216. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
  14217. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
  14218. /* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js");
  14219. /* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__);
  14220. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
  14221. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__);
  14222. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
  14223. /* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js");
  14224. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  14225. /* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../store/index.js */ "./store/index.js");
  14226. /* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./cursors/index.js */ "./tools/cursors/index.js");
  14227. /**
  14228. * @public
  14229. * @class EraserTool
  14230. * @memberof Tools
  14231. *
  14232. * @classdesc Tool for deleting the data of other Annotation Tools.
  14233. * @extends Tools.Base.BaseTool
  14234. */
  14235. var EraserTool =
  14236. /*#__PURE__*/
  14237. function (_BaseTool) {
  14238. _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(EraserTool, _BaseTool);
  14239. function EraserTool() {
  14240. var _this;
  14241. var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  14242. _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, EraserTool);
  14243. var defaultProps = {
  14244. name: 'Eraser',
  14245. supportedInteractionTypes: ['Mouse', 'Touch'],
  14246. svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_10__["eraserCursor"]
  14247. };
  14248. _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(EraserTool).call(this, props, defaultProps));
  14249. _this.preMouseDownCallback = _this._deleteAllNearbyTools.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  14250. _this.preTouchStartCallback = _this._deleteAllNearbyTools.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  14251. return _this;
  14252. }
  14253. _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(EraserTool, [{
  14254. key: "_deleteAllNearbyTools",
  14255. value: function _deleteAllNearbyTools(evt) {
  14256. var coords = evt.detail.currentPoints.canvas;
  14257. var element = evt.detail.element;
  14258. _store_index_js__WEBPACK_IMPORTED_MODULE_9__["state"].tools.forEach(function (tool) {
  14259. var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_8__["getToolState"])(element, tool.name);
  14260. if (toolState) {
  14261. // Modifying in a foreach? Probably not ideal
  14262. toolState.data.forEach(function (data) {
  14263. if (typeof tool.pointNearTool === 'function' && tool.pointNearTool(element, data, coords)) {
  14264. Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_8__["removeToolState"])(element, tool.name, data);
  14265. _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.updateImage(element);
  14266. }
  14267. });
  14268. }
  14269. });
  14270. var consumeEvent = true;
  14271. return consumeEvent;
  14272. }
  14273. }]);
  14274. return EraserTool;
  14275. }(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_7__["default"]);
  14276. /***/ }),
  14277. /***/ "./tools/FreehandRoiSculptorTool.js":
  14278. /*!******************************************!*\
  14279. !*** ./tools/FreehandRoiSculptorTool.js ***!
  14280. \******************************************/
  14281. /*! exports provided: default */
  14282. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  14283. "use strict";
  14284. __webpack_require__.r(__webpack_exports__);
  14285. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return FreehandRoiSculptorTool; });
  14286. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
  14287. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
  14288. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
  14289. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
  14290. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
  14291. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
  14292. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
  14293. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
  14294. /* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js");
  14295. /* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__);
  14296. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
  14297. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__);
  14298. /* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../events.js */ "./events.js");
  14299. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
  14300. /* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../stateManagement/toolColors.js */ "./stateManagement/toolColors.js");
  14301. /* harmony import */ var _drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../drawing/drawHandles.js */ "./drawing/drawHandles.js");
  14302. /* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../store/index.js */ "./store/index.js");
  14303. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  14304. /* harmony import */ var _util_clip_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../util/clip.js */ "./util/clip.js");
  14305. /* harmony import */ var _store_getToolForElement_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../store/getToolForElement.js */ "./store/getToolForElement.js");
  14306. /* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js");
  14307. /* harmony import */ var _store_setToolCursor_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../store/setToolCursor.js */ "./store/setToolCursor.js");
  14308. /* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./cursors/index.js */ "./tools/cursors/index.js");
  14309. /* harmony import */ var _util_freehand_index_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../util/freehand/index.js */ "./util/freehand/index.js");
  14310. var FreehandHandleData = _util_freehand_index_js__WEBPACK_IMPORTED_MODULE_17__["default"].FreehandHandleData;
  14311. /**
  14312. * @public
  14313. * @class FreehandRoiSculptorTool
  14314. * @memberof Tools
  14315. *
  14316. * @classdesc Tool for easily sculpting annotations drawn with
  14317. * the FreehandRoiTool.
  14318. * @extends Tools.Base.BaseTool
  14319. */
  14320. var FreehandRoiSculptorTool =
  14321. /*#__PURE__*/
  14322. function (_BaseTool) {
  14323. _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(FreehandRoiSculptorTool, _BaseTool);
  14324. function FreehandRoiSculptorTool() {
  14325. var _this;
  14326. var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  14327. _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, FreehandRoiSculptorTool);
  14328. var defaultProps = {
  14329. name: 'FreehandRoiSculptor',
  14330. referencedToolName: 'FreehandRoi',
  14331. supportedInteractionTypes: ['Mouse', 'Touch', 'DoubleTap'],
  14332. mixins: ['activeOrDisabledBinaryTool'],
  14333. configuration: getDefaultFreehandRoiSculptorToolConfiguration(),
  14334. svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_16__["freehandRoiSculptorCursor"]
  14335. };
  14336. _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(FreehandRoiSculptorTool).call(this, props, defaultProps));
  14337. _this.updateOnMouseMove = true;
  14338. _this.isMultiPartTool = true;
  14339. _this.referencedToolName = _this.initialConfiguration.referencedToolName;
  14340. _this._active = false; // Create bound functions for private event loop.
  14341. _this.activeMouseUpCallback = _this.activeMouseUpCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  14342. _this.activeTouchEndCallback = _this.activeTouchEndCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  14343. _this.activeMouseDragCallback = _this.activeMouseDragCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  14344. return _this;
  14345. }
  14346. _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(FreehandRoiSculptorTool, [{
  14347. key: "renderToolData",
  14348. value: function renderToolData(evt) {
  14349. var eventData = evt.detail;
  14350. if (this.configuration.currentTool === null) {
  14351. return false;
  14352. }
  14353. var element = eventData.element;
  14354. var config = this.configuration;
  14355. var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_11__["getToolState"])(element, this.referencedToolName);
  14356. var data = toolState.data[config.currentTool];
  14357. if (!data) {
  14358. return false;
  14359. }
  14360. if (this._active) {
  14361. var context = eventData.canvasContext.canvas.getContext('2d');
  14362. var options = {
  14363. color: this.configuration.dragColor,
  14364. fill: null,
  14365. handleRadius: this._toolSizeCanvas
  14366. };
  14367. Object(_drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_9__["default"])(context, eventData, this.configuration.mouseLocation.handles, options);
  14368. } else if (this.configuration.showCursorOnHover && !this._recentTouchEnd) {
  14369. this._renderHoverCursor(evt);
  14370. }
  14371. }
  14372. }, {
  14373. key: "doubleClickCallback",
  14374. value: function doubleClickCallback(evt) {
  14375. var eventData = evt.detail;
  14376. this._selectFreehandTool(eventData);
  14377. _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(eventData.element);
  14378. }
  14379. }, {
  14380. key: "doubleTapCallback",
  14381. value: function doubleTapCallback(evt) {
  14382. var eventData = evt.detail;
  14383. this._selectFreehandTool(eventData);
  14384. _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(eventData.element);
  14385. }
  14386. }, {
  14387. key: "preTouchStartCallback",
  14388. value: function preTouchStartCallback(evt) {
  14389. this._initialiseSculpting(evt);
  14390. return true;
  14391. }
  14392. /**
  14393. * Event handler for MOUSE_DOWN.
  14394. *
  14395. * @param {Object} evt - The event.
  14396. * @returns {boolean}
  14397. */
  14398. }, {
  14399. key: "preMouseDownCallback",
  14400. value: function preMouseDownCallback(evt) {
  14401. if (!this.options.mouseButtonMask.includes(evt.detail.buttons)) {
  14402. return;
  14403. }
  14404. this._initialiseSculpting(evt);
  14405. return true;
  14406. }
  14407. /**
  14408. * Event handler for MOUSE_DRAG during the active loop.
  14409. *
  14410. * @event
  14411. * @param {Object} evt - The event.
  14412. * @returns {void}
  14413. */
  14414. }, {
  14415. key: "activeMouseDragCallback",
  14416. value: function activeMouseDragCallback(evt) {
  14417. var config = this.configuration;
  14418. if (!this._active) {
  14419. return;
  14420. }
  14421. var eventData = evt.detail;
  14422. var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_11__["getToolState"])(eventData.element, this.referencedToolName);
  14423. if (!toolState) {
  14424. return;
  14425. }
  14426. var points = toolState.data[config.currentTool].handles.points; // Set the mouseLocation handle
  14427. this._getMouseLocation(eventData);
  14428. this._sculpt(eventData, points); // Update the image
  14429. _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(eventData.element);
  14430. }
  14431. /**
  14432. * Event handler for MOUSE_UP during the active loop.
  14433. *
  14434. * @param {Object} evt - The event.
  14435. * @returns {void}
  14436. */
  14437. }, {
  14438. key: "activeMouseUpCallback",
  14439. value: function activeMouseUpCallback(evt) {
  14440. this._activeEnd(evt);
  14441. }
  14442. /**
  14443. * Event handler for TOUCH_END during the active loop.
  14444. *
  14445. * @param {Object} evt - The event.
  14446. * @returns {void}
  14447. */
  14448. }, {
  14449. key: "activeTouchEndCallback",
  14450. value: function activeTouchEndCallback(evt) {
  14451. this._activeEnd(evt);
  14452. this._deselectAllTools(evt);
  14453. this._recentTouchEnd = true;
  14454. }
  14455. }, {
  14456. key: "_activeEnd",
  14457. value: function _activeEnd(evt) {
  14458. var eventData = evt.detail;
  14459. var element = eventData.element;
  14460. var config = this.configuration;
  14461. this._active = false;
  14462. _store_index_js__WEBPACK_IMPORTED_MODULE_10__["state"].isMultiPartToolActive = false;
  14463. this._getMouseLocation(eventData);
  14464. this._invalidateToolData(eventData);
  14465. config.mouseUpRender = true;
  14466. this._deactivateSculpt(element); // Update the image
  14467. _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(eventData.element);
  14468. preventPropagation(evt);
  14469. }
  14470. /**
  14471. * Renders the cursor
  14472. *
  14473. * @private
  14474. * @param {type} evt description
  14475. * @returns {void}
  14476. */
  14477. }, {
  14478. key: "_renderHoverCursor",
  14479. value: function _renderHoverCursor(evt) {
  14480. var eventData = evt.detail;
  14481. var element = eventData.element;
  14482. var context = eventData.canvasContext.canvas.getContext('2d');
  14483. var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_11__["getToolState"])(element, this.referencedToolName);
  14484. var data = toolState.data[this.configuration.currentTool];
  14485. this._recentTouchEnd = false;
  14486. var coords;
  14487. if (this.configuration.mouseUpRender) {
  14488. coords = this.configuration.mouseLocation.handles.start;
  14489. this.configuration.mouseUpRender = false;
  14490. } else {
  14491. coords = _store_index_js__WEBPACK_IMPORTED_MODULE_10__["state"].mousePositionImage;
  14492. }
  14493. var freehandRoiTool = Object(_store_getToolForElement_js__WEBPACK_IMPORTED_MODULE_13__["default"])(element, this.referencedToolName);
  14494. var radiusCanvas = freehandRoiTool.distanceFromPointCanvas(element, data, coords);
  14495. this.configuration.mouseLocation.handles.start.x = coords.x;
  14496. this.configuration.mouseLocation.handles.start.y = coords.y;
  14497. if (this.configuration.limitRadiusOutsideRegion) {
  14498. var unlimitedRadius = radiusCanvas;
  14499. radiusCanvas = this._limitCursorRadiusCanvas(eventData, radiusCanvas); // Fade if distant
  14500. if (unlimitedRadius > this.configuration.hoverCursorFadeDistance * radiusCanvas) {
  14501. context.globalAlpha = this.configuration.hoverCursorFadeAlpha;
  14502. }
  14503. }
  14504. var options = {
  14505. fill: null,
  14506. color: this.configuration.hoverColor,
  14507. handleRadius: radiusCanvas
  14508. };
  14509. Object(_drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_9__["default"])(context, eventData, this.configuration.mouseLocation.handles, options);
  14510. if (this.configuration.limitRadiusOutsideRegion) {
  14511. context.globalAlpha = 1.0; // Reset drawing alpha for other draw calls.
  14512. }
  14513. }
  14514. /**
  14515. * Event handler for NEW_IMAGE event.
  14516. *
  14517. * @public
  14518. * @param {Object} evt - The event.
  14519. * @returns {void}
  14520. */
  14521. }, {
  14522. key: "newImageCallback",
  14523. value: function newImageCallback(evt) {
  14524. this._deselectAllTools(evt);
  14525. }
  14526. /**
  14527. * Event handler for switching mode to enabled.
  14528. *
  14529. * @public
  14530. * @param {Object} evt - The event.
  14531. * @returns {void}
  14532. */
  14533. }, {
  14534. key: "enabledCallback",
  14535. value: function enabledCallback(evt) {
  14536. this._deselectAllTools(evt);
  14537. }
  14538. /**
  14539. * Event handler for switching mode to passive.
  14540. *
  14541. * @public
  14542. * @param {Object} evt - The event.
  14543. * @returns {void}
  14544. */
  14545. }, {
  14546. key: "passiveCallback",
  14547. value: function passiveCallback(evt) {
  14548. this._deselectAllTools(evt);
  14549. }
  14550. /**
  14551. * Event handler for switching mode to disabled.
  14552. *
  14553. * @public
  14554. * @param {Object} evt - The event.
  14555. * @returns {void}
  14556. */
  14557. }, {
  14558. key: "disabledCallback",
  14559. value: function disabledCallback(evt) {
  14560. this._deselectAllTools(evt);
  14561. }
  14562. /**
  14563. * Select the freehand tool to be edited.
  14564. *
  14565. * @private
  14566. * @param {Object} eventData - Data object associated with the event.
  14567. * @returns {void}
  14568. */
  14569. }, {
  14570. key: "_selectFreehandTool",
  14571. value: function _selectFreehandTool(eventData) {
  14572. var config = this.configuration;
  14573. var element = eventData.element;
  14574. var closestToolIndex = this._getClosestFreehandToolOnElement(element, eventData);
  14575. if (closestToolIndex === undefined) {
  14576. return;
  14577. }
  14578. config.currentTool = closestToolIndex;
  14579. Object(_store_setToolCursor_js__WEBPACK_IMPORTED_MODULE_15__["hideToolCursor"])(element);
  14580. }
  14581. /**
  14582. * Activate the selected freehand tool and deactivate others.
  14583. *
  14584. * @private
  14585. * @param {Object} element - The parent element of the freehand tool.
  14586. * @param {Number} toolIndex - The ID of the freehand tool.
  14587. * @returns {void}
  14588. */
  14589. }, {
  14590. key: "_activateFreehandTool",
  14591. value: function _activateFreehandTool(element, toolIndex) {
  14592. var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_11__["getToolState"])(element, this.referencedToolName);
  14593. var data = toolState.data;
  14594. var config = this.configuration;
  14595. config.currentTool = toolIndex;
  14596. for (var i = 0; i < data.length; i++) {
  14597. if (i === toolIndex) {
  14598. data[i].active = true;
  14599. } else {
  14600. data[i].active = false;
  14601. }
  14602. }
  14603. }
  14604. /**
  14605. * Choose the tool radius from the mouse position relative to the active freehand
  14606. * tool, and begin sculpting.
  14607. *
  14608. * @private
  14609. * @param {Object} evt - The event.
  14610. * @returns {void}
  14611. */
  14612. }, {
  14613. key: "_initialiseSculpting",
  14614. value: function _initialiseSculpting(evt) {
  14615. var eventData = evt.detail;
  14616. var config = this.configuration;
  14617. var element = eventData.element;
  14618. if (config.currentTool === null) {
  14619. this._selectFreehandTool(eventData);
  14620. if (config.currentTool === null) {
  14621. return;
  14622. }
  14623. }
  14624. this._active = true; // Interupt event dispatcher
  14625. _store_index_js__WEBPACK_IMPORTED_MODULE_10__["state"].isMultiPartToolActive = true;
  14626. this._configureToolSize(eventData);
  14627. this._getMouseLocation(eventData);
  14628. this._activateFreehandTool(element, config.currentTool);
  14629. this._activateSculpt(element);
  14630. _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(eventData.element);
  14631. }
  14632. /**
  14633. * Sculpts the freehand ROI with the circular freehandSculpter tool, moving,
  14634. * adding and removing handles as necessary.
  14635. *
  14636. * @private
  14637. * @param {Object} eventData - Data object associated with the event.
  14638. * @param {Object} points - Array of points.
  14639. * @returns {void}
  14640. */
  14641. }, {
  14642. key: "_sculpt",
  14643. value: function _sculpt(eventData, points) {
  14644. var config = this.configuration;
  14645. this._sculptData = {
  14646. element: eventData.element,
  14647. image: eventData.image,
  14648. mousePoint: eventData.currentPoints.image,
  14649. points: points,
  14650. toolSize: this._toolSizeImage,
  14651. minSpacing: config.minSpacing,
  14652. maxSpacing: Math.max(this._toolSizeImage, config.minSpacing * 2)
  14653. }; // Push existing handles radially away from tool.
  14654. var pushedHandles = this._pushHandles(); // Insert new handles in sparsely populated areas of the
  14655. // Pushed part of the contour.
  14656. if (pushedHandles.first !== undefined) {
  14657. this._insertNewHandles(pushedHandles); // If any handles have been pushed very close together or even overlap,
  14658. // Combine these into a single handle.
  14659. this._consolidateHandles();
  14660. }
  14661. }
  14662. /**
  14663. * _pushHandles -Pushes the points radially away from the mouse if they are
  14664. * contained within the circle defined by the freehandSculpter's toolSize and
  14665. * the mouse position.
  14666. *
  14667. * @returns {Object} The first and last pushedHandles.
  14668. */
  14669. }, {
  14670. key: "_pushHandles",
  14671. value: function _pushHandles() {
  14672. var _this$_sculptData = this._sculptData,
  14673. points = _this$_sculptData.points,
  14674. mousePoint = _this$_sculptData.mousePoint,
  14675. toolSize = _this$_sculptData.toolSize;
  14676. var pushedHandles = {};
  14677. for (var i = 0; i < points.length; i++) {
  14678. var distanceToHandle = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstoneMath.point.distance(points[i], mousePoint);
  14679. if (distanceToHandle > toolSize) {
  14680. continue;
  14681. } // Push point if inside circle, to edge of circle.
  14682. this._pushOneHandle(i, distanceToHandle);
  14683. if (pushedHandles.first === undefined) {
  14684. pushedHandles.first = i;
  14685. pushedHandles.last = i;
  14686. } else {
  14687. pushedHandles.last = i;
  14688. }
  14689. }
  14690. return pushedHandles;
  14691. }
  14692. /**
  14693. * Pushes one handle.
  14694. *
  14695. * @private
  14696. * @param {number} i - The index of the handle to push.
  14697. * @param {number} distanceToHandle - The distance between the mouse cursor and the handle.
  14698. * @returns {void}
  14699. */
  14700. }, {
  14701. key: "_pushOneHandle",
  14702. value: function _pushOneHandle(i, distanceToHandle) {
  14703. var _this$_sculptData2 = this._sculptData,
  14704. points = _this$_sculptData2.points,
  14705. mousePoint = _this$_sculptData2.mousePoint,
  14706. toolSize = _this$_sculptData2.toolSize,
  14707. image = _this$_sculptData2.image;
  14708. var handle = points[i];
  14709. var directionUnitVector = {
  14710. x: (handle.x - mousePoint.x) / distanceToHandle,
  14711. y: (handle.y - mousePoint.y) / distanceToHandle
  14712. };
  14713. var position = {
  14714. x: mousePoint.x + toolSize * directionUnitVector.x,
  14715. y: mousePoint.y + toolSize * directionUnitVector.y
  14716. };
  14717. Object(_util_clip_js__WEBPACK_IMPORTED_MODULE_12__["clipToBox"])(position, image);
  14718. handle.x = position.x;
  14719. handle.y = position.y; // Push lines
  14720. var lastHandleIndex = this.constructor._getPreviousHandleIndex(i, points.length);
  14721. points[lastHandleIndex].lines.pop();
  14722. points[lastHandleIndex].lines.push(handle);
  14723. }
  14724. /**
  14725. * Inserts additional handles in sparsely sampled regions of the contour. The
  14726. * new handles are placed on the circle defined by the the freehandSculpter's
  14727. * toolSize and the mouse position.
  14728. * @private
  14729. * @param {Array} pushedHandles
  14730. * @returns {void}
  14731. */
  14732. }, {
  14733. key: "_insertNewHandles",
  14734. value: function _insertNewHandles(pushedHandles) {
  14735. var indiciesToInsertAfter = this._findNewHandleIndicies(pushedHandles);
  14736. var newIndexModifier = 0;
  14737. for (var i = 0; i < indiciesToInsertAfter.length; i++) {
  14738. var insertIndex = indiciesToInsertAfter[i] + 1 + newIndexModifier;
  14739. this._insertHandleRadially(insertIndex);
  14740. newIndexModifier++;
  14741. }
  14742. }
  14743. /**
  14744. * Returns an array of indicies that describe where new handles should be
  14745. * inserted (where the distance between subsequent handles is >
  14746. * config.maxSpacing).
  14747. *
  14748. * @private
  14749. * @param {Object} pushedHandles - The first and last handles that were pushed.
  14750. * @returns {Object} An array of indicies that describe where new handles should be inserted.
  14751. */
  14752. }, {
  14753. key: "_findNewHandleIndicies",
  14754. value: function _findNewHandleIndicies(pushedHandles) {
  14755. var _this$_sculptData3 = this._sculptData,
  14756. points = _this$_sculptData3.points,
  14757. maxSpacing = _this$_sculptData3.maxSpacing;
  14758. var indiciesToInsertAfter = [];
  14759. for (var i = pushedHandles.first; i <= pushedHandles.last; i++) {
  14760. this._checkSpacing(i, points, indiciesToInsertAfter, maxSpacing);
  14761. }
  14762. var pointAfterLast = this.constructor._getNextHandleIndex(pushedHandles.last, points.length); // Check points before and after those pushed.
  14763. if (pointAfterLast !== pushedHandles.first) {
  14764. this._checkSpacing(pointAfterLast, points, indiciesToInsertAfter, maxSpacing);
  14765. var pointBeforeFirst = this.constructor._getPreviousHandleIndex(pushedHandles.first, points.length);
  14766. if (pointBeforeFirst !== pointAfterLast) {
  14767. this._checkSpacing(pointBeforeFirst, points, indiciesToInsertAfter, maxSpacing);
  14768. }
  14769. }
  14770. return indiciesToInsertAfter;
  14771. }
  14772. /**
  14773. * _checkSpacing - description
  14774. *@modifies indiciesToInsertAfter
  14775. *
  14776. * @param {number} i - The index to check.
  14777. * @param {Object} points - The points.
  14778. * @param {Array} indiciesToInsertAfter - The working list of indicies to insert new points after.
  14779. * @param {number} maxSpacing
  14780. * @returns {void}
  14781. */
  14782. }, {
  14783. key: "_checkSpacing",
  14784. value: function _checkSpacing(i, points, indiciesToInsertAfter, maxSpacing) {
  14785. var nextHandleIndex = this.constructor._getNextHandleIndex(i, points.length);
  14786. var distanceToNextHandle = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstoneMath.point.distance(points[i], points[nextHandleIndex]);
  14787. if (distanceToNextHandle > maxSpacing) {
  14788. indiciesToInsertAfter.push(i);
  14789. }
  14790. }
  14791. /**
  14792. * Inserts a handle on the surface of the circle defined by toolSize and the
  14793. * mousePoint.
  14794. *
  14795. * @private
  14796. * @param {number} insertIndex - The index to insert the new handle.
  14797. * @returns {void}
  14798. */
  14799. }, {
  14800. key: "_insertHandleRadially",
  14801. value: function _insertHandleRadially(insertIndex) {
  14802. var points = this._sculptData.points;
  14803. var previousIndex = insertIndex - 1;
  14804. var nextIndex = this.constructor._getNextHandleIndexBeforeInsert(insertIndex, points.length);
  14805. var insertPosition = this._getInsertPosition(insertIndex, previousIndex, nextIndex);
  14806. var handleData = new FreehandHandleData(insertPosition);
  14807. points.splice(insertIndex, 0, handleData); // Add the line from the previous handle to the inserted handle (note the tool is now one increment longer)
  14808. points[previousIndex].lines.pop();
  14809. points[previousIndex].lines.push(points[insertIndex]);
  14810. _util_freehand_index_js__WEBPACK_IMPORTED_MODULE_17__["default"].addLine(points, insertIndex);
  14811. }
  14812. /**
  14813. * Checks for any close points and consolidates these to a
  14814. * single point.
  14815. *
  14816. * @private
  14817. * @returns {void}
  14818. */
  14819. }, {
  14820. key: "_consolidateHandles",
  14821. value: function _consolidateHandles() {
  14822. var points = this._sculptData.points; // Don't merge handles if it would destroy the polygon.
  14823. if (points.length <= 3) {
  14824. return;
  14825. }
  14826. var closePairs = this._findCloseHandlePairs();
  14827. this._mergeCloseHandles(closePairs);
  14828. }
  14829. /**
  14830. * Finds pairs of close handles with seperations < config.minSpacing. No handle
  14831. * is included in more than one pair, to avoid spurious deletion of densely
  14832. * populated regions of the contour (see mergeCloseHandles).
  14833. *
  14834. * @private
  14835. * @returns {Array} An array of close pairs in points.
  14836. */
  14837. }, {
  14838. key: "_findCloseHandlePairs",
  14839. value: function _findCloseHandlePairs() {
  14840. var _this$_sculptData4 = this._sculptData,
  14841. points = _this$_sculptData4.points,
  14842. minSpacing = _this$_sculptData4.minSpacing;
  14843. var closePairs = [];
  14844. var length = points.length;
  14845. for (var i = 0; i < length; i++) {
  14846. var nextHandleIndex = this.constructor._getNextHandleIndex(i, points.length);
  14847. var distanceToNextHandle = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstoneMath.point.distance(points[i], points[nextHandleIndex]);
  14848. if (distanceToNextHandle < minSpacing) {
  14849. var pair = [i, nextHandleIndex];
  14850. closePairs.push(pair); // Don't check last node if first in pair to avoid double counting.
  14851. if (i === 0) {
  14852. length -= 1;
  14853. } // Don't double count pairs in order to prevent your polygon collapsing to a singularity.
  14854. i++;
  14855. }
  14856. }
  14857. return closePairs;
  14858. }
  14859. /**
  14860. * Merges points given a list of close pairs. The points are merged in an
  14861. * iterative fashion to prevent generating a singularity in some edge cases.
  14862. *
  14863. * @private
  14864. * @param {Array} closePairs - An array of pairs of handle indicies.
  14865. * @returns {void}
  14866. */
  14867. }, {
  14868. key: "_mergeCloseHandles",
  14869. value: function _mergeCloseHandles(closePairs) {
  14870. var removedIndexModifier = 0;
  14871. for (var i = 0; i < closePairs.length; i++) {
  14872. var pair = this.constructor._getCorrectedPair(closePairs[i], removedIndexModifier);
  14873. this._combineHandles(pair);
  14874. removedIndexModifier++;
  14875. } // Recursively remove problem childs
  14876. var newClosePairs = this._findCloseHandlePairs();
  14877. if (newClosePairs.length) {
  14878. this._mergeCloseHandles(newClosePairs);
  14879. }
  14880. }
  14881. /**
  14882. * Combines two handles defined by the indicies in handlePairs.
  14883. *
  14884. * @private
  14885. * @param {Object} handlePair - A pair of handle indicies.
  14886. * @returns {void}
  14887. */
  14888. }, {
  14889. key: "_combineHandles",
  14890. value: function _combineHandles(handlePair) {
  14891. var _this$_sculptData5 = this._sculptData,
  14892. points = _this$_sculptData5.points,
  14893. image = _this$_sculptData5.image; // Calculate combine position: half way between the handles.
  14894. var midPoint = {
  14895. x: (points[handlePair[0]].x + points[handlePair[1]].x) / 2.0,
  14896. y: (points[handlePair[0]].y + points[handlePair[1]].y) / 2.0
  14897. };
  14898. Object(_util_clip_js__WEBPACK_IMPORTED_MODULE_12__["clipToBox"])(midPoint, image); // Move first point to midpoint
  14899. points[handlePair[0]].x = midPoint.x;
  14900. points[handlePair[0]].y = midPoint.y; // Link first point to handle that second point links to.
  14901. var handleAfterPairIndex = this.constructor._getNextHandleIndex(handlePair[1], points.length);
  14902. points[handlePair[0]].lines.pop();
  14903. points[handlePair[0]].lines.push(points[handleAfterPairIndex]); // Remove the latter handle
  14904. points.splice(handlePair[1], 1);
  14905. }
  14906. /**
  14907. * Calculates the distance to the closest handle in the tool, and stores the
  14908. * result in this._toolSizeImage and this._toolSizeCanvas.
  14909. *
  14910. * @private
  14911. * @param {Object} eventData - Data object associated with the event.
  14912. * @returns {void}
  14913. */
  14914. }, {
  14915. key: "_configureToolSize",
  14916. value: function _configureToolSize(eventData) {
  14917. var element = eventData.element;
  14918. var config = this.configuration;
  14919. var toolIndex = config.currentTool;
  14920. var coords = eventData.currentPoints.image;
  14921. var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_11__["getToolState"])(element, this.referencedToolName);
  14922. var data = toolState.data[toolIndex];
  14923. var freehandRoiTool = Object(_store_getToolForElement_js__WEBPACK_IMPORTED_MODULE_13__["default"])(element, this.referencedToolName);
  14924. var radiusImage = freehandRoiTool.distanceFromPoint(element, data, coords);
  14925. var radiusCanvas = freehandRoiTool.distanceFromPointCanvas(element, data, coords); // Check if should limit maximum size.
  14926. if (config.limitRadiusOutsideRegion) {
  14927. radiusImage = this._limitCursorRadiusImage(eventData, radiusImage);
  14928. radiusCanvas = this._limitCursorRadiusCanvas(eventData, radiusCanvas);
  14929. }
  14930. this._toolSizeImage = radiusImage;
  14931. this._toolSizeCanvas = radiusCanvas;
  14932. }
  14933. /**
  14934. * Gets the current mouse location and stores it in the configuration object.
  14935. *
  14936. * @private
  14937. * @param {Object} eventData - The data assoicated with the event.
  14938. * @returns {void}
  14939. */
  14940. }, {
  14941. key: "_getMouseLocation",
  14942. value: function _getMouseLocation(eventData) {
  14943. var config = this.configuration;
  14944. config.mouseLocation.handles.start.x = eventData.currentPoints.image.x;
  14945. config.mouseLocation.handles.start.y = eventData.currentPoints.image.y;
  14946. Object(_util_clip_js__WEBPACK_IMPORTED_MODULE_12__["clipToBox"])(config.mouseLocation.handles.start, eventData.image);
  14947. }
  14948. /**
  14949. * Attaches event listeners to the element such that is is visible, modifiable, and new data can be created.
  14950. *
  14951. * @private
  14952. * @param {Object} element - The viewport element to attach event listeners to.
  14953. * @modifies {element}
  14954. * @returns {void}
  14955. */
  14956. }, {
  14957. key: "_activateSculpt",
  14958. value: function _activateSculpt(element) {
  14959. this._deactivateSculpt(element); // Begin activeMouseDragCallback loop - call activeMouseUpCallback at end of drag or straight away if just a click.
  14960. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].MOUSE_UP, this.activeMouseUpCallback);
  14961. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].MOUSE_CLICK, this.activeMouseUpCallback);
  14962. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].MOUSE_DRAG, this.activeMouseDragCallback);
  14963. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].TOUCH_END, this.activeTouchEndCallback);
  14964. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].TOUCH_TAP, this.activeTouchEndCallback);
  14965. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].TOUCH_DRAG, this.activeMouseDragCallback);
  14966. _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(element);
  14967. }
  14968. /**
  14969. * Removes event listeners from the element.
  14970. *
  14971. * @private
  14972. * @param {Object} element - The viewport element to remove event listeners from.
  14973. * @modifies {element}
  14974. * @returns {void}
  14975. */
  14976. }, {
  14977. key: "_deactivateSculpt",
  14978. value: function _deactivateSculpt(element) {
  14979. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].MOUSE_UP, this.activeMouseUpCallback);
  14980. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].MOUSE_CLICK, this.activeMouseUpCallback);
  14981. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].MOUSE_DRAG, this.activeMouseDragCallback);
  14982. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].TOUCH_END, this.activeTouchEndCallback);
  14983. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].TOUCH_TAP, this.activeTouchEndCallback);
  14984. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].TOUCH_DRAG, this.activeMouseDragCallback);
  14985. _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(element);
  14986. }
  14987. /**
  14988. * Invalidate the freehand tool data, tirggering re-calculation of statistics.
  14989. *
  14990. * @private
  14991. * @param {Object} eventData - Data object associated with the event.
  14992. * @returns {void}
  14993. */
  14994. }, {
  14995. key: "_invalidateToolData",
  14996. value: function _invalidateToolData(eventData) {
  14997. var config = this.configuration;
  14998. var element = eventData.element;
  14999. var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_11__["getToolState"])(element, this.referencedToolName);
  15000. var data = toolData.data[config.currentTool];
  15001. data.invalidated = true;
  15002. }
  15003. /**
  15004. * Deactivates all freehand ROIs and change currentTool to null
  15005. *
  15006. * @private
  15007. * @param {Object} evt - The event.
  15008. * @returns {void}
  15009. */
  15010. // eslint-disable-next-line no-unused-vars
  15011. }, {
  15012. key: "_deselectAllTools",
  15013. value: function _deselectAllTools(evt) {
  15014. var config = this.configuration;
  15015. var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_11__["getToolState"])(this.element, this.referencedToolName);
  15016. config.currentTool = null;
  15017. if (toolData) {
  15018. for (var i = 0; i < toolData.data.length; i++) {
  15019. toolData.data[i].active = false;
  15020. }
  15021. }
  15022. Object(_store_setToolCursor_js__WEBPACK_IMPORTED_MODULE_15__["setToolCursor"])(this.element, this.svgCursor);
  15023. _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(this.element);
  15024. }
  15025. /**
  15026. * Given a pair of indicies, and the number of points already removed,
  15027. * convert to the correct live indicies.
  15028. *
  15029. * @private
  15030. * @static
  15031. * @param {Object} pair A pairs of handle indicies.
  15032. * @param {Number} removedIndexModifier The number of handles already removed.
  15033. * @returns {Object} The corrected pair of handle indicies.
  15034. */
  15035. }, {
  15036. key: "_limitCursorRadiusCanvas",
  15037. /**
  15038. * Limits the cursor radius so that it its maximum area is the same as the
  15039. * ROI being sculpted (in canvas coordinates).
  15040. *
  15041. * @private
  15042. * @param {Object} eventData Data object associated with the event.
  15043. * @param {Number} radiusCanvas The distance from the mouse to the ROI
  15044. * in canvas coordinates.
  15045. * @returns {Number} The limited radius in canvas coordinates.
  15046. */
  15047. value: function _limitCursorRadiusCanvas(eventData, radiusCanvas) {
  15048. return this._limitCursorRadius(eventData, radiusCanvas, true);
  15049. }
  15050. /**
  15051. * Limits the cursor radius so that it its maximum area is the same as the
  15052. * ROI being sculpted (in image coordinates).
  15053. *
  15054. * @private
  15055. * @param {Object} eventData Data object associated with the event.
  15056. * @param {Number} radiusImage The distance from the mouse to the ROI
  15057. * in image coordinates.
  15058. * @returns {Number} The limited radius in image coordinates.
  15059. */
  15060. }, {
  15061. key: "_limitCursorRadiusImage",
  15062. value: function _limitCursorRadiusImage(eventData, radiusImage) {
  15063. return this._limitCursorRadius(eventData, radiusImage, false);
  15064. }
  15065. /**
  15066. * Limits the cursor radius so that it its maximum area is the same as the
  15067. * ROI being sculpted.
  15068. *
  15069. * @private
  15070. * @param {Object} eventData Data object associated with the event.
  15071. * @param {Number} radius The distance from the mouse to the ROI.
  15072. * @param {Boolean} canvasCoords Whether the calculation should be performed
  15073. * In canvas coordinates.
  15074. * @returns {Number} The limited radius.
  15075. */
  15076. }, {
  15077. key: "_limitCursorRadius",
  15078. value: function _limitCursorRadius(eventData, radius) {
  15079. var canvasCoords = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
  15080. var element = eventData.element;
  15081. var image = eventData.image;
  15082. var config = this.configuration;
  15083. var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_11__["getToolState"])(element, this.referencedToolName);
  15084. var data = toolState.data[config.currentTool];
  15085. var areaModifier = 1.0;
  15086. if (canvasCoords) {
  15087. var topLeft = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.pixelToCanvas(element, {
  15088. x: 0,
  15089. y: 0
  15090. });
  15091. var bottomRight = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.pixelToCanvas(element, {
  15092. x: image.width,
  15093. y: image.height
  15094. });
  15095. var canvasArea = (bottomRight.x - topLeft.x) * (bottomRight.y - topLeft.y);
  15096. areaModifier = canvasArea / (image.width * image.height);
  15097. }
  15098. var area = data.area * areaModifier;
  15099. var maxRadius = Math.pow(area / Math.PI, 0.5);
  15100. return Math.min(radius, maxRadius);
  15101. }
  15102. /**
  15103. * Finds the nearest handle to the mouse cursor for all freehand
  15104. * data on the element.
  15105. *
  15106. * @private
  15107. * @param {Object} element - The element.
  15108. * @param {Object} eventData - Data object associated with the event.
  15109. * @returns {Number} The tool index of the closest freehand tool.
  15110. */
  15111. }, {
  15112. key: "_getClosestFreehandToolOnElement",
  15113. value: function _getClosestFreehandToolOnElement(element, eventData) {
  15114. var freehand = Object(_store_getToolForElement_js__WEBPACK_IMPORTED_MODULE_13__["default"])(element, this.referencedToolName);
  15115. var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_11__["getToolState"])(element, this.referencedToolName);
  15116. if (!toolState) {
  15117. return;
  15118. }
  15119. var data = toolState.data;
  15120. var pixelCoords = eventData.currentPoints.image;
  15121. var closest = {
  15122. distance: Infinity,
  15123. toolIndex: null
  15124. };
  15125. for (var i = 0; i < data.length; i++) {
  15126. var distanceFromToolI = freehand.distanceFromPoint(element, data[i], pixelCoords);
  15127. if (distanceFromToolI === -1) {
  15128. continue;
  15129. }
  15130. if (distanceFromToolI < closest.distance) {
  15131. closest.distance = distanceFromToolI;
  15132. closest.toolIndex = i;
  15133. }
  15134. }
  15135. return closest.toolIndex;
  15136. }
  15137. /**
  15138. * Returns the next handle index.
  15139. *
  15140. * @private
  15141. * @static
  15142. * @param {Number} i - The handle index.
  15143. * @param {Number} length - The length of the polygon.
  15144. * @returns {Number} The next handle index.
  15145. */
  15146. }, {
  15147. key: "_getInsertPosition",
  15148. /**
  15149. * Calculates the position that a new handle should be inserted.
  15150. *
  15151. * @private
  15152. * @static
  15153. * @param {Number} insertIndex - The index to insert the new handle.
  15154. * @param {Number} previousIndex - The previous index.
  15155. * @param {Number} nextIndex - The next index.
  15156. * @returns {Object} The position the handle should be inserted.
  15157. */
  15158. value: function _getInsertPosition(insertIndex, previousIndex, nextIndex) {
  15159. var _this$_sculptData6 = this._sculptData,
  15160. points = _this$_sculptData6.points,
  15161. toolSize = _this$_sculptData6.toolSize,
  15162. mousePoint = _this$_sculptData6.mousePoint,
  15163. image = _this$_sculptData6.image; // Calculate insert position: half way between the handles, then pushed out
  15164. // Radially to the edge of the freehandSculpter.
  15165. var midPoint = {
  15166. x: (points[previousIndex].x + points[nextIndex].x) / 2.0,
  15167. y: (points[previousIndex].y + points[nextIndex].y) / 2.0
  15168. };
  15169. var distanceToMidPoint = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstoneMath.point.distance(mousePoint, midPoint);
  15170. var insertPosition;
  15171. if (distanceToMidPoint < toolSize) {
  15172. var directionUnitVector = {
  15173. x: (midPoint.x - mousePoint.x) / distanceToMidPoint,
  15174. y: (midPoint.y - mousePoint.y) / distanceToMidPoint
  15175. };
  15176. insertPosition = {
  15177. x: mousePoint.x + toolSize * directionUnitVector.x,
  15178. y: mousePoint.y + toolSize * directionUnitVector.y
  15179. };
  15180. } else {
  15181. insertPosition = midPoint;
  15182. }
  15183. Object(_util_clip_js__WEBPACK_IMPORTED_MODULE_12__["clipToBox"])(insertPosition, image);
  15184. return insertPosition;
  15185. } // ===================================================================
  15186. // Public Configuration API. .
  15187. // ===================================================================
  15188. }, {
  15189. key: "minSpacing",
  15190. get: function get() {
  15191. return this.configuration.minSpacing;
  15192. },
  15193. set: function set(value) {
  15194. if (typeof value !== 'number') {
  15195. throw new Error('Attempting to set freehandSculpter minSpacing to a value other than a number.');
  15196. }
  15197. this.configuration.minSpacing = value;
  15198. }
  15199. }, {
  15200. key: "maxSpacing",
  15201. get: function get() {
  15202. return this.configuration.maxSpacing;
  15203. },
  15204. set: function set(value) {
  15205. if (typeof value !== 'number') {
  15206. throw new Error('Attempting to set freehandSculpter maxSpacing to a value other than a number.');
  15207. }
  15208. this.configuration.maxSpacing = value;
  15209. }
  15210. }, {
  15211. key: "showCursorOnHover",
  15212. get: function get() {
  15213. return this.configuration.showCursorOnHover;
  15214. },
  15215. set: function set(value) {
  15216. if (typeof value !== 'boolean') {
  15217. throw new Error('Attempting to set freehandSculpter showCursorOnHover to a value other than a boolean.');
  15218. }
  15219. this.configuration.showCursorOnHover = value;
  15220. _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(this.element);
  15221. }
  15222. }, {
  15223. key: "limitRadiusOutsideRegion",
  15224. get: function get() {
  15225. return this.configuration.limitRadiusOutsideRegion;
  15226. },
  15227. set: function set(value) {
  15228. if (typeof value !== 'boolean') {
  15229. throw new Error('Attempting to set freehandSculpter limitRadiusOutsideRegion to a value other than a boolean.');
  15230. }
  15231. this.configuration.limitRadiusOutsideRegion = value;
  15232. _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(this.element);
  15233. }
  15234. }, {
  15235. key: "hoverCursorFadeAlpha",
  15236. get: function get() {
  15237. return this.configuration.hoverCursorFadeAlpha;
  15238. },
  15239. set: function set(value) {
  15240. if (typeof value !== 'number') {
  15241. throw new Error('Attempting to set freehandSculpter hoverCursorFadeAlpha to a value other than a number.');
  15242. } // Clamp the value from 0 to 1.
  15243. value = Math.max(Math.min(value, 1.0), 0.0);
  15244. this.configuration.hoverCursorFadeAlpha = value;
  15245. _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(this.element);
  15246. }
  15247. }, {
  15248. key: "hoverCursorFadeDistance",
  15249. get: function get() {
  15250. return this.configuration.hoverCursorFadeDistance;
  15251. },
  15252. set: function set(value) {
  15253. if (typeof value !== 'number') {
  15254. throw new Error('Attempting to set freehandSculpter hoverCursorFadeDistance to a value other than a number.');
  15255. } // Don't allow to fade a distances smaller than the tool's radius.
  15256. value = Math.max(value, 1.0);
  15257. this.configuration.hoverCursorFadeDistance = value;
  15258. _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(this.element);
  15259. }
  15260. }], [{
  15261. key: "_getCorrectedPair",
  15262. value: function _getCorrectedPair(pair, removedIndexModifier) {
  15263. var correctedPair = [pair[0] - removedIndexModifier, pair[1] - removedIndexModifier]; // Deal with edge case of last node + first node.
  15264. if (correctedPair[1] < 0) {
  15265. correctedPair[1] = 0;
  15266. }
  15267. return correctedPair;
  15268. }
  15269. }, {
  15270. key: "_getNextHandleIndex",
  15271. value: function _getNextHandleIndex(i, length) {
  15272. if (i === length - 1) {
  15273. return 0;
  15274. }
  15275. return i + 1;
  15276. }
  15277. /**
  15278. * Returns the previous handle index.
  15279. *
  15280. * @private
  15281. * @static
  15282. * @param {Number} i - The handle index.
  15283. * @param {Number} length - The length of the polygon.
  15284. * @returns {Number} The previous handle index.
  15285. */
  15286. }, {
  15287. key: "_getPreviousHandleIndex",
  15288. value: function _getPreviousHandleIndex(i, length) {
  15289. if (i === 0) {
  15290. return length - 1;
  15291. }
  15292. return i - 1;
  15293. }
  15294. /**
  15295. * Returns the next handle index, with a correction considering a handle is
  15296. * about to be inserted.
  15297. *
  15298. * @private
  15299. * @static
  15300. * @param {Number} insertIndex - The index in which the handle is being inserted.
  15301. * @param {Number} length - The length of the polygon.
  15302. * @returns {Number} The next handle index.
  15303. */
  15304. }, {
  15305. key: "_getNextHandleIndexBeforeInsert",
  15306. value: function _getNextHandleIndexBeforeInsert(insertIndex, length) {
  15307. if (insertIndex === length) {
  15308. return 0;
  15309. } // Index correction here: The line bellow is correct, as we haven't inserted our handle yet!
  15310. return insertIndex;
  15311. }
  15312. }]);
  15313. return FreehandRoiSculptorTool;
  15314. }(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_14__["default"]);
  15315. /**
  15316. * Returns the default freehandRoiSculptorTool configuration.
  15317. *
  15318. * @returns {Object} The default configuration object.
  15319. */
  15320. function getDefaultFreehandRoiSculptorToolConfiguration() {
  15321. return {
  15322. mouseLocation: {
  15323. handles: {
  15324. start: {
  15325. highlight: true,
  15326. active: true
  15327. }
  15328. }
  15329. },
  15330. minSpacing: 1,
  15331. currentTool: null,
  15332. dragColor: _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_8__["default"].getActiveColor(),
  15333. hoverColor: _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_8__["default"].getToolColor(),
  15334. /* --- Hover options ---
  15335. showCursorOnHover: Shows a preview of the sculpting radius on hover.
  15336. limitRadiusOutsideRegion: Limit max toolsize outside the subject ROI based
  15337. on subject ROI area.
  15338. hoverCursorFadeAlpha: Alpha to fade to when tool very distant from
  15339. subject ROI.
  15340. hoverCursorFadeDistance: Distance from ROI in which to fade the hoverCursor
  15341. (in units of radii).
  15342. */
  15343. showCursorOnHover: true,
  15344. limitRadiusOutsideRegion: true,
  15345. hoverCursorFadeAlpha: 0.5,
  15346. hoverCursorFadeDistance: 1.2
  15347. };
  15348. }
  15349. function preventPropagation(evt) {
  15350. evt.stopImmediatePropagation();
  15351. evt.stopPropagation();
  15352. evt.preventDefault();
  15353. }
  15354. /***/ }),
  15355. /***/ "./tools/MagnifyTool.js":
  15356. /*!******************************!*\
  15357. !*** ./tools/MagnifyTool.js ***!
  15358. \******************************/
  15359. /*! exports provided: default */
  15360. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  15361. "use strict";
  15362. __webpack_require__.r(__webpack_exports__);
  15363. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return MagnifyTool; });
  15364. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
  15365. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
  15366. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
  15367. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
  15368. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
  15369. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
  15370. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
  15371. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
  15372. /* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js");
  15373. /* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__);
  15374. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
  15375. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__);
  15376. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
  15377. /* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../drawing/index.js */ "./drawing/index.js");
  15378. /* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js");
  15379. /* harmony import */ var _store_setToolCursor_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../store/setToolCursor.js */ "./store/setToolCursor.js");
  15380. /* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./cursors/index.js */ "./tools/cursors/index.js");
  15381. /**
  15382. * @public
  15383. * @class MagnifyTool
  15384. * @memberof Tools
  15385. *
  15386. * @classdesc Tool for inspecting a region at increased magnification.
  15387. * @extends Tools.Base.BaseTool
  15388. */
  15389. var MagnifyTool =
  15390. /*#__PURE__*/
  15391. function (_BaseTool) {
  15392. _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(MagnifyTool, _BaseTool);
  15393. function MagnifyTool() {
  15394. var _this;
  15395. var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  15396. _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, MagnifyTool);
  15397. var defaultProps = {
  15398. name: 'Magnify',
  15399. supportedInteractionTypes: ['Mouse', 'Touch'],
  15400. configuration: {
  15401. magnifySize: 300,
  15402. magnificationLevel: 2
  15403. },
  15404. svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_10__["magnifyCursor"]
  15405. };
  15406. _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(MagnifyTool).call(this, props, defaultProps));
  15407. _this.zoomCanvas = undefined;
  15408. _this.zoomElement = undefined; // Mode Callbacks: (element, options)
  15409. _this.activeCallback = _this._createMagnificationCanvas.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  15410. _this.enabledCallback = _this._createMagnificationCanvas.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  15411. _this.disabledCallback = _this._destroyMagnificationCanvas.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); // Touch
  15412. _this.postTouchStartCallback = _this._addMagnifyingGlass.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  15413. _this.touchDragCallback = _this._updateMagnifyingGlass.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  15414. _this.touchEndCallback = _this._removeMagnifyingGlass.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  15415. _this.touchDragEndCallback = _this._removeMagnifyingGlass.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); // Mouse
  15416. _this.postMouseDownCallback = _this._addMagnifyingGlass.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  15417. _this.mouseDragCallback = _this._updateMagnifyingGlass.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  15418. _this.mouseUpCallback = _this._removeMagnifyingGlass.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); // On quick clicks, mouseUp does not fire, but this does
  15419. _this.mouseClickCallback = _this._removeMagnifyingGlass.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); // Misc
  15420. _this.newImageCallback = _this._drawMagnificationTool.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  15421. return _this;
  15422. }
  15423. _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(MagnifyTool, [{
  15424. key: "_addMagnifyingGlass",
  15425. value: function _addMagnifyingGlass(evt) {
  15426. var _this2 = this;
  15427. // Ignore until next event
  15428. this._removeZoomElement();
  15429. this._drawZoomedElement(evt); // On next frame
  15430. window.requestAnimationFrame(function () {
  15431. return _this2._drawMagnificationTool(evt);
  15432. });
  15433. Object(_store_setToolCursor_js__WEBPACK_IMPORTED_MODULE_9__["hideToolCursor"])(evt.detail.element);
  15434. evt.preventDefault();
  15435. evt.stopPropagation();
  15436. }
  15437. }, {
  15438. key: "_updateMagnifyingGlass",
  15439. value: function _updateMagnifyingGlass(evt) {
  15440. this._drawMagnificationTool(evt);
  15441. evt.preventDefault();
  15442. evt.stopPropagation();
  15443. }
  15444. }, {
  15445. key: "_removeMagnifyingGlass",
  15446. value: function _removeMagnifyingGlass(evt) {
  15447. var element = evt.detail.element; // Re-enable the mouse cursor
  15448. Object(_store_setToolCursor_js__WEBPACK_IMPORTED_MODULE_9__["setToolCursor"])(this.element, this.svgCursor);
  15449. element.querySelector('.magnifyTool').style.display = 'none';
  15450. this._removeZoomElement();
  15451. }
  15452. }, {
  15453. key: "_drawMagnificationTool",
  15454. value: function _drawMagnificationTool(evt) {
  15455. var element = evt.detail.element;
  15456. var magnifyCanvas = element.querySelector('.magnifyTool');
  15457. if (!magnifyCanvas) {
  15458. this._createMagnificationCanvas(element);
  15459. }
  15460. if (this.zoomCanvas === undefined) {
  15461. return;
  15462. } // The 'not' magnifyTool class here is necessary because cornerstone places
  15463. // No classes of it's own on the canvas we want to select
  15464. var canvas = element.querySelector('canvas:not(.magnifyTool)');
  15465. var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["getNewContext"])(magnifyCanvas); // Calculate the on-canvas location of the mouse pointer / touch
  15466. var canvasLocation = _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.pixelToCanvas(evt.detail.element, evt.detail.currentPoints.image); // Shrink magnifier to smallest canvas dimension if smaller than desired magnifier size
  15467. var magnifySize = Math.min(this.configuration.magnifySize, canvas.width, canvas.height);
  15468. var magnificationLevel = this.configuration.magnificationLevel;
  15469. magnifyCanvas.width = magnifySize;
  15470. magnifyCanvas.height = magnifySize; // Constrain drag movement to zoomed image boundaries
  15471. canvasLocation.x = Math.max(canvasLocation.x, 0.5 * magnifySize / magnificationLevel);
  15472. canvasLocation.x = Math.min(canvasLocation.x, canvas.width - 0.5 * magnifySize / magnificationLevel);
  15473. canvasLocation.y = Math.max(canvasLocation.y, 0.5 * magnifySize / magnificationLevel);
  15474. canvasLocation.y = Math.min(canvasLocation.y, canvas.height - 0.5 * magnifySize / magnificationLevel);
  15475. var copyFrom = {
  15476. x: canvasLocation.x * magnificationLevel - 0.5 * magnifySize,
  15477. y: canvasLocation.y * magnificationLevel - 0.5 * magnifySize
  15478. };
  15479. copyFrom.x = Math.max(copyFrom.x, 0);
  15480. copyFrom.y = Math.max(copyFrom.y, 0);
  15481. context.drawImage(this.zoomCanvas, copyFrom.x, copyFrom.y, magnifySize, magnifySize, 0, 0, magnifySize, magnifySize); // Place the magnification tool at the same location as the pointer
  15482. var touchOffset = evt.detail.isTouchEvent ? 120 : 0;
  15483. var magnifyPosition = {
  15484. top: Math.max(canvasLocation.y - 0.5 * magnifySize - touchOffset, 0),
  15485. left: Math.max(canvasLocation.x - 0.5 * magnifySize, 0)
  15486. }; // Get full magnifier dimensions with borders
  15487. var magnifierBox = magnifyCanvas.getBoundingClientRect(); // Constrain magnifier to canvas boundaries
  15488. magnifyPosition.top = Math.min(magnifyPosition.top, canvas.height - magnifierBox.height);
  15489. magnifyPosition.left = Math.min(magnifyPosition.left, canvas.width - magnifierBox.width);
  15490. magnifyCanvas.style.top = "".concat(magnifyPosition.top, "px");
  15491. magnifyCanvas.style.left = "".concat(magnifyPosition.left, "px");
  15492. magnifyCanvas.style.display = 'block';
  15493. }
  15494. /**
  15495. * Creates a cornerstone enabled element, and renders the target image at the
  15496. * desired magnification level using it.
  15497. *
  15498. * @private
  15499. * @param {*} evt
  15500. * @returns {void}
  15501. */
  15502. }, {
  15503. key: "_drawZoomedElement",
  15504. value: function _drawZoomedElement(evt) {
  15505. var element = evt.detail.element;
  15506. var enabledElement = evt.detail.enabledElement;
  15507. if (enabledElement === undefined) {
  15508. enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.getEnabledElement(element);
  15509. }
  15510. var magnificationLevel = this.configuration.magnificationLevel;
  15511. var origCanvas = enabledElement.canvas;
  15512. var image = enabledElement.image; // Create a new cornerstone enabledElement
  15513. if (!this.zoomElement) {
  15514. this.zoomElement = document.createElement('div');
  15515. this.zoomElement.width = origCanvas.width * magnificationLevel;
  15516. this.zoomElement.height = origCanvas.height * magnificationLevel;
  15517. _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.enable(this.zoomElement, enabledElement.options);
  15518. }
  15519. var zoomEnabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.getEnabledElement(this.zoomElement);
  15520. var viewport = _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.getViewport(enabledElement.element);
  15521. this.zoomCanvas = zoomEnabledElement.canvas;
  15522. this.zoomCanvas.width = origCanvas.width * magnificationLevel;
  15523. this.zoomCanvas.height = origCanvas.height * magnificationLevel;
  15524. zoomEnabledElement.viewport = Object.assign({}, viewport); // Update it's viewport to render at desired magnification level
  15525. viewport.scale *= magnificationLevel;
  15526. _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.displayImage(this.zoomElement, image);
  15527. _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.setViewport(this.zoomElement, viewport); // To do enable annotation tools for zoomElement
  15528. }
  15529. /**
  15530. * Removes the canvas and associated enabled element that's
  15531. * used to render the zoomed image.
  15532. * @returns {void}
  15533. */
  15534. }, {
  15535. key: "_removeZoomElement",
  15536. value: function _removeZoomElement() {
  15537. if (this.zoomElement !== undefined) {
  15538. _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.disable(this.zoomElement);
  15539. this.zoomElement = undefined;
  15540. this.zoomCanvas = undefined;
  15541. }
  15542. }
  15543. /**
  15544. * The canvas used to render the zoomed image.
  15545. * It will be displayed and clipped inside the magnifying glass frame/element.
  15546. *
  15547. * @private
  15548. *
  15549. * @param {*} element
  15550. * @returns {void}
  15551. */
  15552. }, {
  15553. key: "_createMagnificationCanvas",
  15554. value: function _createMagnificationCanvas(element) {
  15555. // If the magnifying glass canvas doesn't already exist
  15556. if (element.querySelector('.magnifyTool') === null) {
  15557. // Create a canvas and append it as a child to the element
  15558. var magnifyCanvas = document.createElement('canvas'); // The magnifyTool class is used to find the canvas later on
  15559. // Make sure position is absolute so the canvas can follow the mouse / touch
  15560. magnifyCanvas.classList.add('magnifyTool');
  15561. magnifyCanvas.width = this.configuration.magnifySize;
  15562. magnifyCanvas.height = this.configuration.magnifySize;
  15563. magnifyCanvas.style.position = 'absolute';
  15564. magnifyCanvas.style.display = 'none';
  15565. element.appendChild(magnifyCanvas);
  15566. }
  15567. }
  15568. /**
  15569. *
  15570. *
  15571. * @param {*} element
  15572. * @returns {void}
  15573. */
  15574. }, {
  15575. key: "_destroyMagnificationCanvas",
  15576. value: function _destroyMagnificationCanvas(element) {
  15577. var magnifyCanvas = element.querySelector('.magnifyTool');
  15578. if (magnifyCanvas) {
  15579. element.removeChild(magnifyCanvas);
  15580. }
  15581. }
  15582. }]);
  15583. return MagnifyTool;
  15584. }(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_8__["default"]);
  15585. /***/ }),
  15586. /***/ "./tools/OrientationMarkersTool.js":
  15587. /*!*****************************************!*\
  15588. !*** ./tools/OrientationMarkersTool.js ***!
  15589. \*****************************************/
  15590. /*! exports provided: default */
  15591. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  15592. "use strict";
  15593. __webpack_require__.r(__webpack_exports__);
  15594. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return OrientationMarkersTool; });
  15595. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
  15596. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
  15597. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
  15598. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
  15599. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
  15600. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
  15601. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
  15602. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
  15603. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
  15604. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
  15605. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
  15606. /* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js");
  15607. /* harmony import */ var _orientation_index_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../orientation/index.js */ "./orientation/index.js");
  15608. /* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../drawing/index.js */ "./drawing/index.js");
  15609. /* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../stateManagement/toolColors.js */ "./stateManagement/toolColors.js");
  15610. /* harmony import */ var _drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../drawing/drawTextBox.js */ "./drawing/drawTextBox.js");
  15611. // Drawing
  15612. /**
  15613. * @public
  15614. * @class OrientationMarkersTool
  15615. * @memberof Tools
  15616. *
  15617. * @classdesc Tool for displaying orientation markers on the image.
  15618. * @extends Tools.Base.BaseTool
  15619. */
  15620. var OrientationMarkersTool =
  15621. /*#__PURE__*/
  15622. function (_BaseTool) {
  15623. _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(OrientationMarkersTool, _BaseTool);
  15624. function OrientationMarkersTool() {
  15625. var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  15626. _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, OrientationMarkersTool);
  15627. var defaultProps = {
  15628. name: 'OrientationMarkers',
  15629. configuration: {
  15630. drawAllMarkers: true
  15631. },
  15632. mixins: ['enabledOrDisabledBinaryTool']
  15633. };
  15634. return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(OrientationMarkersTool).call(this, props, defaultProps));
  15635. }
  15636. _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(OrientationMarkersTool, [{
  15637. key: "enabledCallback",
  15638. value: function enabledCallback(element) {
  15639. this.forceImageUpdate(element);
  15640. }
  15641. }, {
  15642. key: "disabledCallback",
  15643. value: function disabledCallback(element) {
  15644. this.forceImageUpdate(element);
  15645. }
  15646. }, {
  15647. key: "forceImageUpdate",
  15648. value: function forceImageUpdate(element) {
  15649. var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone;
  15650. var enabledElement = cornerstone.getEnabledElement(element);
  15651. if (enabledElement.image) {
  15652. cornerstone.updateImage(element);
  15653. }
  15654. }
  15655. }, {
  15656. key: "renderToolData",
  15657. value: function renderToolData(evt) {
  15658. var eventData = evt.detail;
  15659. var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_8__["getNewContext"])(eventData.canvasContext.canvas);
  15660. var element = eventData.element;
  15661. var markers = getOrientationMarkers(element);
  15662. if (!markers) {
  15663. return;
  15664. }
  15665. var coords = getOrientationMarkerPositions(element, markers);
  15666. var color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__["default"].getToolColor();
  15667. var textWidths = {
  15668. top: Object(_drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_10__["textBoxWidth"])(context, markers.top, 0),
  15669. left: Object(_drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_10__["textBoxWidth"])(context, markers.left, 0),
  15670. right: Object(_drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_10__["textBoxWidth"])(context, markers.right, 0),
  15671. bottom: Object(_drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_10__["textBoxWidth"])(context, markers.bottom, 0),
  15672. height: Object(_drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_10__["textBoxWidth"])(context, 'M', 0) // Trick to get an approximation of the height of the text
  15673. };
  15674. drawTopLeftText(context, markers, coords, textWidths, color);
  15675. if (this.configuration.drawAllMarkers) {
  15676. drawBottomRightText(context, markers, coords, textWidths, color);
  15677. }
  15678. }
  15679. }]);
  15680. return OrientationMarkersTool;
  15681. }(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]);
  15682. var drawTopLeftText = function drawTopLeftText(context, markers, coords, textWidths, color) {
  15683. Object(_drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_10__["default"])(context, markers.top, coords.top.x - textWidths.top / 2, coords.top.y, color);
  15684. Object(_drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_10__["default"])(context, markers.left, coords.left.x - textWidths.left / 2, coords.left.y, color);
  15685. };
  15686. var drawBottomRightText = function drawBottomRightText(context, markers, coords, textWidths, color) {
  15687. Object(_drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_10__["default"])(context, markers.right, coords.right.x - textWidths.right, coords.right.y, color);
  15688. Object(_drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_10__["default"])(context, markers.bottom, coords.bottom.x - textWidths.bottom / 2, coords.bottom.y - textWidths.height, color);
  15689. };
  15690. var getOrientationMarkers = function getOrientationMarkers(element) {
  15691. var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone;
  15692. var enabledElement = cornerstone.getEnabledElement(element);
  15693. var imagePlane = cornerstone.metaData.get('imagePlaneModule', enabledElement.image.imageId);
  15694. if (!imagePlane || !imagePlane.rowCosines || !imagePlane.columnCosines) {
  15695. return;
  15696. }
  15697. var row = _orientation_index_js__WEBPACK_IMPORTED_MODULE_7__["default"].getOrientationString(imagePlane.rowCosines);
  15698. var column = _orientation_index_js__WEBPACK_IMPORTED_MODULE_7__["default"].getOrientationString(imagePlane.columnCosines);
  15699. var oppositeRow = _orientation_index_js__WEBPACK_IMPORTED_MODULE_7__["default"].invertOrientationString(row);
  15700. var oppositeColumn = _orientation_index_js__WEBPACK_IMPORTED_MODULE_7__["default"].invertOrientationString(column);
  15701. return {
  15702. top: oppositeColumn,
  15703. bottom: column,
  15704. left: oppositeRow,
  15705. right: row
  15706. };
  15707. };
  15708. var getOrientationMarkerPositions = function getOrientationMarkerPositions(element) {
  15709. var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.getEnabledElement(element);
  15710. var top = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pixelToCanvas(element, {
  15711. x: enabledElement.image.width / 2,
  15712. y: 5
  15713. });
  15714. var bottom = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pixelToCanvas(element, {
  15715. x: enabledElement.image.width / 2,
  15716. y: enabledElement.image.height - 15
  15717. });
  15718. var left = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pixelToCanvas(element, {
  15719. x: 5,
  15720. y: enabledElement.image.height / 2
  15721. });
  15722. var right = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pixelToCanvas(element, {
  15723. x: enabledElement.image.width - 10,
  15724. y: enabledElement.image.height / 2
  15725. });
  15726. return {
  15727. top: top,
  15728. bottom: bottom,
  15729. left: left,
  15730. right: right
  15731. };
  15732. };
  15733. /***/ }),
  15734. /***/ "./tools/OverlayTool.js":
  15735. /*!******************************!*\
  15736. !*** ./tools/OverlayTool.js ***!
  15737. \******************************/
  15738. /*! exports provided: default */
  15739. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  15740. "use strict";
  15741. __webpack_require__.r(__webpack_exports__);
  15742. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return OverlayTool; });
  15743. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
  15744. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
  15745. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
  15746. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
  15747. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
  15748. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
  15749. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
  15750. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
  15751. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
  15752. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
  15753. /* harmony import */ var _store_index__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../store/index */ "./store/index.js");
  15754. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
  15755. /* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js");
  15756. var globalConfiguration = _store_index__WEBPACK_IMPORTED_MODULE_5__["modules"].globalConfiguration;
  15757. /**
  15758. *
  15759. * http://dicom.nema.org/dicom/2013/output/chtml/part03/sect_C.9.html
  15760. *
  15761. * @public
  15762. * @class Overlay
  15763. * @memberof Tools
  15764. *
  15765. * @classdesc Tool for displaying a scale overlay on the image. Uses viewport.overlayColor to set the default colour.
  15766. * @extends Tools.Base.BaseTool
  15767. */
  15768. var OverlayTool =
  15769. /*#__PURE__*/
  15770. function (_BaseTool) {
  15771. _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(OverlayTool, _BaseTool);
  15772. function OverlayTool() {
  15773. var _this;
  15774. var configuration = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  15775. _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, OverlayTool);
  15776. var defaultConfig = {
  15777. name: 'Overlay',
  15778. configuration: {},
  15779. mixins: ['enabledOrDisabledBinaryTool']
  15780. };
  15781. var initialConfiguration = Object.assign(defaultConfig, configuration);
  15782. _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(OverlayTool).call(this, initialConfiguration));
  15783. _this.initialConfiguration = initialConfiguration;
  15784. return _this;
  15785. }
  15786. _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(OverlayTool, [{
  15787. key: "enabledCallback",
  15788. value: function enabledCallback(element) {
  15789. this.forceImageUpdate(element);
  15790. }
  15791. }, {
  15792. key: "disabledCallback",
  15793. value: function disabledCallback(element) {
  15794. this.forceImageUpdate(element);
  15795. }
  15796. }, {
  15797. key: "forceImageUpdate",
  15798. value: function forceImageUpdate(element) {
  15799. var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.getEnabledElement(element);
  15800. if (enabledElement.image) {
  15801. _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.updateImage(element);
  15802. }
  15803. }
  15804. }, {
  15805. key: "setupRender",
  15806. value: function setupRender(image) {
  15807. if (!image) {
  15808. return;
  15809. }
  15810. var overlayPlaneMetadata = _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.metaData.get('overlayPlaneModule', image.imageId);
  15811. if (!overlayPlaneMetadata || !overlayPlaneMetadata.overlays || !overlayPlaneMetadata.overlays.length) {
  15812. return;
  15813. }
  15814. return overlayPlaneMetadata;
  15815. }
  15816. }, {
  15817. key: "setupViewport",
  15818. value: function setupViewport(viewport) {
  15819. if (viewport.overlayColor === undefined) {
  15820. viewport.overlayColor = globalConfiguration.configuration.overlayColor || 'white';
  15821. } // Allow turning off overlays by setting overlayColor to false
  15822. if (viewport.overlayColor === false) {
  15823. return;
  15824. }
  15825. return true;
  15826. }
  15827. }, {
  15828. key: "renderToolData",
  15829. value: function renderToolData(evt) {
  15830. var eventData = evt.detail;
  15831. var enabledElement = eventData.enabledElement,
  15832. image = eventData.image,
  15833. viewport = eventData.viewport,
  15834. canvasContext = eventData.canvasContext;
  15835. var overlayPlaneMetadata = this.setupRender(image);
  15836. if (!eventData || !enabledElement || !overlayPlaneMetadata) {
  15837. return;
  15838. }
  15839. if (!this.setupViewport(viewport)) {
  15840. return;
  15841. }
  15842. var imageWidth = image.columns;
  15843. var imageHeight = image.rows;
  15844. overlayPlaneMetadata.overlays.forEach(function (overlay) {
  15845. if (overlay.visible === false) {
  15846. return;
  15847. }
  15848. var layerCanvas = document.createElement('canvas');
  15849. layerCanvas.width = imageWidth;
  15850. layerCanvas.height = imageHeight;
  15851. var layerContext = layerCanvas.getContext('2d');
  15852. layerContext.fillStyle = overlay.fillStyle || viewport.overlayColor;
  15853. if (overlay.type === 'R') {
  15854. layerContext.fillRect(0, 0, layerCanvas.width, layerCanvas.height);
  15855. layerContext.globalCompositeOperation = 'xor';
  15856. }
  15857. var i = 0;
  15858. for (var y = 0; y < overlay.rows; y++) {
  15859. for (var x = 0; x < overlay.columns; x++) {
  15860. if (overlay.pixelData[i++] > 0) {
  15861. layerContext.fillRect(x, y, 1, 1);
  15862. }
  15863. }
  15864. } // Guard against non-number values
  15865. var overlayX = !isNaN(parseFloat(overlay.x)) && isFinite(overlay.x) ? overlay.x : 0;
  15866. var overlayY = !isNaN(parseFloat(overlay.y)) && isFinite(overlay.y) ? overlay.y : 0; // Draw the overlay layer onto the canvas
  15867. canvasContext.drawImage(layerCanvas, overlayX, overlayY);
  15868. });
  15869. }
  15870. }]);
  15871. return OverlayTool;
  15872. }(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_7__["default"]);
  15873. /***/ }),
  15874. /***/ "./tools/PanMultiTouchTool.js":
  15875. /*!************************************!*\
  15876. !*** ./tools/PanMultiTouchTool.js ***!
  15877. \************************************/
  15878. /*! exports provided: default */
  15879. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  15880. "use strict";
  15881. __webpack_require__.r(__webpack_exports__);
  15882. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return PanMultiTouchTool; });
  15883. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
  15884. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
  15885. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
  15886. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
  15887. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
  15888. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
  15889. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
  15890. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
  15891. /* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js");
  15892. /* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__);
  15893. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
  15894. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__);
  15895. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
  15896. /* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js");
  15897. /**
  15898. * @public
  15899. * @class PanMultiTouchTool
  15900. * @memberof Tools
  15901. *
  15902. * @classdesc Tool for panning the image using multi-touch.
  15903. * @extends Tools.Base.BaseTool
  15904. */
  15905. var PanMultiTouchTool =
  15906. /*#__PURE__*/
  15907. function (_BaseTool) {
  15908. _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(PanMultiTouchTool, _BaseTool);
  15909. function PanMultiTouchTool() {
  15910. var _this;
  15911. var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  15912. _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, PanMultiTouchTool);
  15913. var defaultProps = {
  15914. name: 'PanMultiTouch',
  15915. supportedInteractionTypes: ['MultiTouch'],
  15916. configuration: {
  15917. touchPointers: 2
  15918. }
  15919. };
  15920. _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(PanMultiTouchTool).call(this, props, defaultProps)); // Touch
  15921. _this.multiTouchDragCallback = _this._dragCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  15922. return _this;
  15923. }
  15924. _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(PanMultiTouchTool, [{
  15925. key: "_dragCallback",
  15926. value: function _dragCallback(evt) {
  15927. var eventData = evt.detail;
  15928. var element = eventData.element,
  15929. viewport = eventData.viewport;
  15930. if (eventData.numPointers === this.configuration.touchPointers) {
  15931. var translation = this._getTranslation(eventData);
  15932. this._applyTranslation(viewport, translation);
  15933. _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.setViewport(element, viewport);
  15934. }
  15935. }
  15936. }, {
  15937. key: "_getTranslation",
  15938. value: function _getTranslation(eventData) {
  15939. var viewport = eventData.viewport,
  15940. image = eventData.image,
  15941. deltaPoints = eventData.deltaPoints;
  15942. var widthScale = viewport.scale;
  15943. var heightScale = viewport.scale;
  15944. if (image.rowPixelSpacing < image.columnPixelSpacing) {
  15945. widthScale *= image.columnPixelSpacing / image.rowPixelSpacing;
  15946. } else if (image.columnPixelSpacing < image.rowPixelSpacing) {
  15947. heightScale *= image.rowPixelSpacing / image.columnPixelSpacing;
  15948. }
  15949. return {
  15950. x: deltaPoints.page.x / widthScale,
  15951. y: deltaPoints.page.y / heightScale
  15952. };
  15953. }
  15954. }, {
  15955. key: "_applyTranslation",
  15956. value: function _applyTranslation(viewport, translation) {
  15957. viewport.translation.x += translation.x;
  15958. viewport.translation.y += translation.y;
  15959. }
  15960. }]);
  15961. return PanMultiTouchTool;
  15962. }(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_7__["default"]);
  15963. /***/ }),
  15964. /***/ "./tools/PanTool.js":
  15965. /*!**************************!*\
  15966. !*** ./tools/PanTool.js ***!
  15967. \**************************/
  15968. /*! exports provided: default */
  15969. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  15970. "use strict";
  15971. __webpack_require__.r(__webpack_exports__);
  15972. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return PanTool; });
  15973. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
  15974. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
  15975. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
  15976. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
  15977. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
  15978. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
  15979. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
  15980. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
  15981. /* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js");
  15982. /* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__);
  15983. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
  15984. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__);
  15985. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js");
  15986. /* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js");
  15987. /* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./cursors/index.js */ "./tools/cursors/index.js");
  15988. /**
  15989. * @public
  15990. * @class PanTool
  15991. * @memberof Tools
  15992. *
  15993. * @classdesc Tool for panning the image.
  15994. * @extends Tools.Base.BaseTool
  15995. */
  15996. var PanTool =
  15997. /*#__PURE__*/
  15998. function (_BaseTool) {
  15999. _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(PanTool, _BaseTool);
  16000. function PanTool() {
  16001. var _this;
  16002. var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  16003. _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, PanTool);
  16004. var defaultProps = {
  16005. name: 'Pan',
  16006. supportedInteractionTypes: ['Mouse', 'Touch'],
  16007. svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_8__["panCursor"]
  16008. };
  16009. _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(PanTool).call(this, props, defaultProps)); // Touch
  16010. _this.touchDragCallback = _this._dragCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); // Mouse
  16011. _this.mouseDragCallback = _this._dragCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  16012. return _this;
  16013. }
  16014. _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(PanTool, [{
  16015. key: "_dragCallback",
  16016. value: function _dragCallback(evt) {
  16017. var eventData = evt.detail;
  16018. var element = eventData.element,
  16019. viewport = eventData.viewport;
  16020. var translation = this._getTranslation(eventData);
  16021. this._applyTranslation(viewport, translation);
  16022. _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.setViewport(element, viewport);
  16023. }
  16024. }, {
  16025. key: "_getTranslation",
  16026. value: function _getTranslation(eventData) {
  16027. var viewport = eventData.viewport,
  16028. image = eventData.image,
  16029. deltaPoints = eventData.deltaPoints;
  16030. var widthScale = viewport.scale;
  16031. var heightScale = viewport.scale;
  16032. if (image.rowPixelSpacing < image.columnPixelSpacing) {
  16033. widthScale *= image.columnPixelSpacing / image.rowPixelSpacing;
  16034. } else if (image.columnPixelSpacing < image.rowPixelSpacing) {
  16035. heightScale *= image.rowPixelSpacing / image.columnPixelSpacing;
  16036. }
  16037. return {
  16038. x: deltaPoints.page.x / widthScale,
  16039. y: deltaPoints.page.y / heightScale
  16040. };
  16041. }
  16042. }, {
  16043. key: "_applyTranslation",
  16044. value: function _applyTranslation(viewport, translation) {
  16045. viewport.translation.x += translation.x;
  16046. viewport.translation.y += translation.y;
  16047. }
  16048. }]);
  16049. return PanTool;
  16050. }(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_7__["default"]);
  16051. /***/ }),
  16052. /***/ "./tools/ReferenceLinesTool.js":
  16053. /*!*************************************!*\
  16054. !*** ./tools/ReferenceLinesTool.js ***!
  16055. \*************************************/
  16056. /*! exports provided: default */
  16057. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  16058. "use strict";
  16059. __webpack_require__.r(__webpack_exports__);
  16060. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ReferenceLinesTool; });
  16061. /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "../node_modules/@babel/runtime/regenerator/index.js");
  16062. /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__);
  16063. /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "../node_modules/@babel/runtime/helpers/asyncToGenerator.js");
  16064. /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__);
  16065. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
  16066. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_2__);
  16067. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
  16068. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_3__);
  16069. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
  16070. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_4__);
  16071. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
  16072. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_5__);
  16073. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
  16074. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_6__);
  16075. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js");
  16076. /* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js");
  16077. /* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../drawing/index.js */ "./drawing/index.js");
  16078. /* harmony import */ var _referenceLines_renderActiveReferenceLine_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./referenceLines/renderActiveReferenceLine.js */ "./tools/referenceLines/renderActiveReferenceLine.js");
  16079. /* harmony import */ var _util_wait_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../util/wait.js */ "./util/wait.js");
  16080. /* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../util/logger.js */ "./util/logger.js");
  16081. var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_12__["getLogger"])('tools:ReferenceLinesTool');
  16082. /**
  16083. * When enabled, this tool will display references lines for each source
  16084. * enabledElement in the provided synchronizer. This tool can also be configured
  16085. * to use a custom renderer for alternative reference line rendering behavior
  16086. *
  16087. * TODO: Need to watch for configuration changes to update ToolState
  16088. * TODO:
  16089. *
  16090. * @export @public @class
  16091. * @name ReferenceLinesTool
  16092. * @classdesc Tool for displaying reference lines of other enabledElements
  16093. * @extends Tools.Base.BaseTool
  16094. */
  16095. var ReferenceLinesTool =
  16096. /*#__PURE__*/
  16097. function (_BaseTool) {
  16098. _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_6___default()(ReferenceLinesTool, _BaseTool);
  16099. function ReferenceLinesTool() {
  16100. var _this;
  16101. var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  16102. _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_2___default()(this, ReferenceLinesTool);
  16103. var defaultProps = {
  16104. name: 'ReferenceLines',
  16105. mixins: ['enabledOrDisabledBinaryTool'],
  16106. configuration: {
  16107. renderer: _referenceLines_renderActiveReferenceLine_js__WEBPACK_IMPORTED_MODULE_10__["default"]
  16108. }
  16109. };
  16110. _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_4___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_5___default()(ReferenceLinesTool).call(this, props, defaultProps));
  16111. _this.renderer = null;
  16112. _this.synchronizationContext = null;
  16113. return _this;
  16114. }
  16115. _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_3___default()(ReferenceLinesTool, [{
  16116. key: "enabledCallback",
  16117. value: function () {
  16118. var _enabledCallback = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()(
  16119. /*#__PURE__*/
  16120. _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(element) {
  16121. var _ref,
  16122. synchronizationContext,
  16123. renderer,
  16124. enabledElement,
  16125. _args = arguments;
  16126. return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) {
  16127. while (1) {
  16128. switch (_context.prev = _context.next) {
  16129. case 0:
  16130. _ref = _args.length > 1 && _args[1] !== undefined ? _args[1] : {}, synchronizationContext = _ref.synchronizationContext;
  16131. renderer = this.configuration.renderer;
  16132. _context.next = 4;
  16133. return Object(_util_wait_js__WEBPACK_IMPORTED_MODULE_11__["waitForEnabledElementImageToLoad"])(element);
  16134. case 4:
  16135. enabledElement = _context.sent;
  16136. if (!(!enabledElement || !renderer || !synchronizationContext)) {
  16137. _context.next = 8;
  16138. break;
  16139. }
  16140. // TODO: Unable to add tool state, image never loaded.
  16141. // Should we `setToolDisabledForElement` here?
  16142. logger.warn("Unable to enable ".concat(this.name, ". Exiting enable callback. Tool will be enabled, but will not render."));
  16143. return _context.abrupt("return");
  16144. case 8:
  16145. this.renderer = renderer;
  16146. this.synchronizationContext = synchronizationContext;
  16147. this.forceImageUpdate(element);
  16148. case 11:
  16149. case "end":
  16150. return _context.stop();
  16151. }
  16152. }
  16153. }, _callee, this);
  16154. }));
  16155. function enabledCallback(_x) {
  16156. return _enabledCallback.apply(this, arguments);
  16157. }
  16158. return enabledCallback;
  16159. }()
  16160. }, {
  16161. key: "disabledCallback",
  16162. value: function disabledCallback(element) {
  16163. this.forceImageUpdate(element);
  16164. }
  16165. }, {
  16166. key: "forceImageUpdate",
  16167. value: function forceImageUpdate(element) {
  16168. var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.getEnabledElement(element);
  16169. if (enabledElement.image) {
  16170. _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(element);
  16171. }
  16172. }
  16173. }, {
  16174. key: "renderToolData",
  16175. value: function renderToolData(evt) {
  16176. var _this2 = this;
  16177. var eventData = evt.detail; // No renderer or synch context? Adios
  16178. if (!this.renderer || !this.synchronizationContext) {
  16179. return;
  16180. } // Get the enabled elements associated with this synchronization context and draw them
  16181. var enabledElements = this.synchronizationContext.getSourceElements();
  16182. var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_9__["getNewContext"])(eventData.canvasContext.canvas);
  16183. _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.setToPixelCoordinateSystem(eventData.enabledElement, context);
  16184. enabledElements.forEach(function (referenceEnabledElement) {
  16185. // Don't draw ourselves
  16186. if (referenceEnabledElement === evt.currentTarget) {
  16187. return;
  16188. } // Render it
  16189. _this2.renderer(context, eventData, evt.currentTarget, referenceEnabledElement);
  16190. });
  16191. }
  16192. }]);
  16193. return ReferenceLinesTool;
  16194. }(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_8__["default"]);
  16195. /***/ }),
  16196. /***/ "./tools/RotateTool.js":
  16197. /*!*****************************!*\
  16198. !*** ./tools/RotateTool.js ***!
  16199. \*****************************/
  16200. /*! exports provided: default */
  16201. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  16202. "use strict";
  16203. __webpack_require__.r(__webpack_exports__);
  16204. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return RotateTool; });
  16205. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
  16206. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
  16207. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
  16208. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
  16209. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
  16210. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
  16211. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
  16212. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
  16213. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
  16214. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
  16215. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js");
  16216. /* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js");
  16217. /* harmony import */ var _util_angleBetweenPoints_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../util/angleBetweenPoints.js */ "./util/angleBetweenPoints.js");
  16218. /* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./cursors/index.js */ "./tools/cursors/index.js");
  16219. /**
  16220. * @public
  16221. * @class RotateTool
  16222. * @memberof Tools
  16223. *
  16224. * @classdesc Tool for rotating the image.
  16225. * @extends Tools.Base.BaseTool
  16226. */
  16227. var RotateTool =
  16228. /*#__PURE__*/
  16229. function (_BaseTool) {
  16230. _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(RotateTool, _BaseTool);
  16231. function RotateTool() {
  16232. var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  16233. _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, RotateTool);
  16234. var defaultProps = {
  16235. name: 'Rotate',
  16236. strategies: {
  16237. default: defaultStrategy,
  16238. horizontal: horizontalStrategy,
  16239. vertical: verticalStrategy
  16240. },
  16241. defaultStrategy: 'default',
  16242. supportedInteractionTypes: ['Mouse', 'Touch'],
  16243. configuration: {
  16244. roundAngles: false,
  16245. flipHorizontal: false,
  16246. flipVertical: false,
  16247. rotateScale: 1
  16248. },
  16249. svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_8__["rotateCursor"]
  16250. };
  16251. return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(RotateTool).call(this, props, defaultProps));
  16252. }
  16253. _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(RotateTool, [{
  16254. key: "touchDragCallback",
  16255. value: function touchDragCallback(evt) {
  16256. this.dragCallback(evt);
  16257. }
  16258. }, {
  16259. key: "mouseDragCallback",
  16260. value: function mouseDragCallback(evt) {
  16261. this.dragCallback(evt);
  16262. }
  16263. }, {
  16264. key: "postMouseDownCallback",
  16265. value: function postMouseDownCallback(evt) {
  16266. this.initialRotation = evt.detail.viewport.rotation;
  16267. }
  16268. }, {
  16269. key: "dragCallback",
  16270. value: function dragCallback(evt) {
  16271. evt.detail.viewport.initialRotation = this.initialRotation;
  16272. this.applyActiveStrategy(evt);
  16273. _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.setViewport(evt.detail.element, evt.detail.viewport);
  16274. }
  16275. }]);
  16276. return RotateTool;
  16277. }(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]);
  16278. function defaultStrategy(evt) {
  16279. var _this$configuration = this.configuration,
  16280. roundAngles = _this$configuration.roundAngles,
  16281. rotateScale = _this$configuration.rotateScale;
  16282. var _evt$detail = evt.detail,
  16283. element = _evt$detail.element,
  16284. viewport = _evt$detail.viewport,
  16285. startPoints = _evt$detail.startPoints,
  16286. currentPoints = _evt$detail.currentPoints;
  16287. var initialRotation = viewport.initialRotation ? viewport.initialRotation : viewport.rotation; // Calculate the center of the image
  16288. var rect = element.getBoundingClientRect(element);
  16289. var width = element.clientWidth,
  16290. height = element.clientHeight;
  16291. var scale = viewport.scale,
  16292. translation = viewport.translation;
  16293. var centerPoints = {
  16294. x: rect.left + width / 2 + translation.x * scale,
  16295. y: rect.top + height / 2 + translation.y * scale
  16296. };
  16297. var angleInfo = Object(_util_angleBetweenPoints_js__WEBPACK_IMPORTED_MODULE_7__["default"])(centerPoints, startPoints.client, currentPoints.client);
  16298. angleInfo.angle *= rotateScale;
  16299. if (roundAngles) {
  16300. angleInfo.angle = Math.ceil(angleInfo.angle);
  16301. }
  16302. if (angleInfo.direction < 0) {
  16303. angleInfo.angle = -angleInfo.angle;
  16304. }
  16305. viewport.rotation = initialRotation + angleInfo.angle;
  16306. }
  16307. function horizontalStrategy(evt) {
  16308. var _this$configuration2 = this.configuration,
  16309. roundAngles = _this$configuration2.roundAngles,
  16310. flipHorizontal = _this$configuration2.flipHorizontal,
  16311. rotateScale = _this$configuration2.rotateScale;
  16312. var _evt$detail2 = evt.detail,
  16313. viewport = _evt$detail2.viewport,
  16314. startPoints = _evt$detail2.startPoints,
  16315. currentPoints = _evt$detail2.currentPoints;
  16316. var initialRotation = viewport.initialRotation;
  16317. var initialPointX = startPoints.client.x;
  16318. var currentPointX = currentPoints.client.x;
  16319. var angle = (currentPointX - initialPointX) * rotateScale;
  16320. if (roundAngles) {
  16321. angle = Math.round(Math.abs(angle)) * (angle > 0 ? 1 : -1);
  16322. }
  16323. if (flipHorizontal) {
  16324. angle = -angle;
  16325. }
  16326. viewport.rotation = initialRotation + angle;
  16327. }
  16328. function verticalStrategy(evt) {
  16329. var _this$configuration3 = this.configuration,
  16330. roundAngles = _this$configuration3.roundAngles,
  16331. flipVertical = _this$configuration3.flipVertical,
  16332. rotateScale = _this$configuration3.rotateScale;
  16333. var _evt$detail3 = evt.detail,
  16334. viewport = _evt$detail3.viewport,
  16335. startPoints = _evt$detail3.startPoints,
  16336. currentPoints = _evt$detail3.currentPoints;
  16337. var initialRotation = viewport.initialRotation;
  16338. var initialPointY = startPoints.client.y;
  16339. var currentPointY = currentPoints.client.y;
  16340. var angle = (currentPointY - initialPointY) * rotateScale;
  16341. if (roundAngles) {
  16342. angle = Math.round(Math.abs(angle)) * (angle > 0 ? 1 : -1);
  16343. }
  16344. if (flipVertical) {
  16345. angle = -angle;
  16346. }
  16347. viewport.rotation = initialRotation + angle;
  16348. }
  16349. /***/ }),
  16350. /***/ "./tools/RotateTouchTool.js":
  16351. /*!**********************************!*\
  16352. !*** ./tools/RotateTouchTool.js ***!
  16353. \**********************************/
  16354. /*! exports provided: default */
  16355. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  16356. "use strict";
  16357. __webpack_require__.r(__webpack_exports__);
  16358. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return RotateTouchTool; });
  16359. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
  16360. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
  16361. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
  16362. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
  16363. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
  16364. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
  16365. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
  16366. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
  16367. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
  16368. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
  16369. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js");
  16370. /* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js");
  16371. /**
  16372. * @public
  16373. * @class RotateTouchTool
  16374. * @memberof Tools
  16375. *
  16376. * @classdesc Tool for rotating the image using touch.
  16377. * @extends Tools.Base.BaseTool
  16378. */
  16379. var RotateTouchTool =
  16380. /*#__PURE__*/
  16381. function (_BaseTool) {
  16382. _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(RotateTouchTool, _BaseTool);
  16383. function RotateTouchTool() {
  16384. var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  16385. _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, RotateTouchTool);
  16386. var defaultProps = {
  16387. name: 'RotateTouch',
  16388. supportedInteractionTypes: ['TouchRotate']
  16389. };
  16390. return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(RotateTouchTool).call(this, props, defaultProps));
  16391. }
  16392. _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(RotateTouchTool, [{
  16393. key: "touchRotateCallback",
  16394. value: function touchRotateCallback(evt) {
  16395. var eventData = evt.detail;
  16396. var element = eventData.element,
  16397. viewport = eventData.viewport,
  16398. rotation = eventData.rotation;
  16399. viewport.rotation += rotation;
  16400. _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.setViewport(element, viewport);
  16401. }
  16402. }]);
  16403. return RotateTouchTool;
  16404. }(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]);
  16405. /***/ }),
  16406. /***/ "./tools/ScaleOverlayTool.js":
  16407. /*!***********************************!*\
  16408. !*** ./tools/ScaleOverlayTool.js ***!
  16409. \***********************************/
  16410. /*! exports provided: default */
  16411. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  16412. "use strict";
  16413. __webpack_require__.r(__webpack_exports__);
  16414. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ScaleOverlayTool; });
  16415. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
  16416. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
  16417. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
  16418. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
  16419. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
  16420. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
  16421. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
  16422. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
  16423. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
  16424. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
  16425. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
  16426. /* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js");
  16427. /* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../drawing/index.js */ "./drawing/index.js");
  16428. /* harmony import */ var _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../stateManagement/toolStyle.js */ "./stateManagement/toolStyle.js");
  16429. /* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../stateManagement/toolColors.js */ "./stateManagement/toolColors.js");
  16430. /* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../util/logger.js */ "./util/logger.js");
  16431. // Drawing
  16432. var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_10__["getLogger"])('tools:ScaleOverlayTool');
  16433. /**
  16434. * @public
  16435. * @class ScaleOverlayTool
  16436. * @memberof Tools
  16437. *
  16438. * @classdesc Tool for displaying a scale overlay on the image.
  16439. * @extends Tools.Base.BaseTool
  16440. */
  16441. var ScaleOverlayTool =
  16442. /*#__PURE__*/
  16443. function (_BaseTool) {
  16444. _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(ScaleOverlayTool, _BaseTool);
  16445. function ScaleOverlayTool() {
  16446. var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  16447. _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, ScaleOverlayTool);
  16448. var defaultProps = {
  16449. name: 'ScaleOverlay',
  16450. configuration: {
  16451. minorTickLength: 12.5,
  16452. majorTickLength: 25
  16453. },
  16454. mixins: ['enabledOrDisabledBinaryTool']
  16455. };
  16456. return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(ScaleOverlayTool).call(this, props, defaultProps));
  16457. }
  16458. _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(ScaleOverlayTool, [{
  16459. key: "enabledCallback",
  16460. value: function enabledCallback(element) {
  16461. this.forceImageUpdate(element);
  16462. }
  16463. }, {
  16464. key: "disabledCallback",
  16465. value: function disabledCallback(element) {
  16466. this.forceImageUpdate(element);
  16467. }
  16468. }, {
  16469. key: "forceImageUpdate",
  16470. value: function forceImageUpdate(element) {
  16471. var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.getEnabledElement(element);
  16472. if (enabledElement.image) {
  16473. _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.updateImage(element);
  16474. }
  16475. }
  16476. }, {
  16477. key: "renderToolData",
  16478. value: function renderToolData(evt) {
  16479. var eventData = evt.detail;
  16480. var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["getNewContext"])(eventData.canvasContext.canvas);
  16481. var image = eventData.image,
  16482. viewport = eventData.viewport,
  16483. element = eventData.element;
  16484. var rowPixelSpacing = image.rowPixelSpacing;
  16485. var colPixelSpacing = image.columnPixelSpacing;
  16486. var imagePlane = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.metaData.get('imagePlaneModule', image.imageId);
  16487. if (imagePlane) {
  16488. rowPixelSpacing = imagePlane.rowPixelSpacing || imagePlane.rowImagePixelSpacing;
  16489. colPixelSpacing = imagePlane.columnPixelSpacing || imagePlane.colImagePixelSpacing;
  16490. } // Check whether pixel spacing is defined
  16491. if (!rowPixelSpacing || !colPixelSpacing) {
  16492. logger.warn("unable to define rowPixelSpacing or colPixelSpacing from data on ".concat(this.name, "'s renderToolData"));
  16493. return;
  16494. }
  16495. var canvasSize = {
  16496. width: context.canvas.width,
  16497. height: context.canvas.height
  16498. }; // Distance between intervals is 10mm
  16499. var verticalIntervalScale = 10.0 / rowPixelSpacing * viewport.scale;
  16500. var horizontalIntervalScale = 10.0 / colPixelSpacing * viewport.scale; // 0.1 and 0.05 gives margin to horizontal and vertical lines
  16501. var hscaleBounds = computeScaleBounds(canvasSize, 0.25, 0.05);
  16502. var vscaleBounds = computeScaleBounds(canvasSize, 0.05, 0.15);
  16503. if (!canvasSize.width || !canvasSize.height || !hscaleBounds || !vscaleBounds) {
  16504. return;
  16505. }
  16506. var color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__["default"].getToolColor();
  16507. var lineWidth = _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_8__["default"].getToolWidth();
  16508. var imageAttributes = Object.assign({}, {
  16509. hscaleBounds: hscaleBounds,
  16510. vscaleBounds: vscaleBounds,
  16511. verticalMinorTick: verticalIntervalScale,
  16512. horizontalMinorTick: horizontalIntervalScale,
  16513. verticalLine: {
  16514. start: {
  16515. x: vscaleBounds.bottomRight.x,
  16516. y: vscaleBounds.topLeft.y
  16517. },
  16518. end: {
  16519. x: vscaleBounds.bottomRight.x,
  16520. y: vscaleBounds.bottomRight.y
  16521. }
  16522. },
  16523. horizontalLine: {
  16524. start: {
  16525. x: hscaleBounds.topLeft.x,
  16526. y: hscaleBounds.bottomRight.y
  16527. },
  16528. end: {
  16529. x: hscaleBounds.bottomRight.x,
  16530. y: hscaleBounds.bottomRight.y
  16531. }
  16532. },
  16533. color: color,
  16534. lineWidth: lineWidth
  16535. }, this.configuration);
  16536. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["draw"])(context, function (context) {
  16537. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["setShadow"])(context, imageAttributes); // Draw vertical line
  16538. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["drawLine"])(context, element, imageAttributes.verticalLine.start, imageAttributes.verticalLine.end, {
  16539. color: imageAttributes.color,
  16540. lineWidth: imageAttributes.lineWidth
  16541. }, 'canvas');
  16542. drawVerticalScalebarIntervals(context, element, imageAttributes); // Draw horizontal line
  16543. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["drawLine"])(context, element, imageAttributes.horizontalLine.start, imageAttributes.horizontalLine.end, {
  16544. color: imageAttributes.color,
  16545. lineWidth: imageAttributes.lineWidth
  16546. }, 'canvas');
  16547. drawHorizontalScalebarIntervals(context, element, imageAttributes);
  16548. });
  16549. }
  16550. }]);
  16551. return ScaleOverlayTool;
  16552. }(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]);
  16553. /**
  16554. * Computes the max bound for scales on the image
  16555. * @param {{width: number, height: number}} canvasSize
  16556. * @param {number} horizontalReduction
  16557. * @param {number} verticalReduction
  16558. * @returns {Object.<string, { x:number, y:number }>}
  16559. */
  16560. var computeScaleBounds = function computeScaleBounds(canvasSize, horizontalReduction, verticalReduction) {
  16561. var hReduction = horizontalReduction * Math.min(1000, canvasSize.width);
  16562. var vReduction = verticalReduction * Math.min(1000, canvasSize.height);
  16563. var canvasBounds = {
  16564. left: hReduction,
  16565. top: vReduction,
  16566. width: canvasSize.width - 2 * hReduction,
  16567. height: canvasSize.height - 2 * vReduction
  16568. };
  16569. return {
  16570. topLeft: {
  16571. x: canvasBounds.left,
  16572. y: canvasBounds.top
  16573. },
  16574. bottomRight: {
  16575. x: canvasBounds.left + canvasBounds.width,
  16576. y: canvasBounds.top + canvasBounds.height
  16577. }
  16578. };
  16579. };
  16580. /**
  16581. * @param {CanvasRenderingContext2D} context
  16582. * @param {HTMLElement} element
  16583. * @param {Object} imageAttributes
  16584. * @returns {void}
  16585. */
  16586. var drawVerticalScalebarIntervals = function drawVerticalScalebarIntervals(context, element, imageAttributes) {
  16587. var i = 0;
  16588. while (imageAttributes.verticalLine.start.y + i * imageAttributes.verticalMinorTick <= imageAttributes.vscaleBounds.bottomRight.y) {
  16589. var color = imageAttributes.color,
  16590. lineWidth = imageAttributes.lineWidth;
  16591. var startPoint = {
  16592. x: imageAttributes.verticalLine.start.x,
  16593. y: imageAttributes.verticalLine.start.y + i * imageAttributes.verticalMinorTick
  16594. };
  16595. var endPoint = {
  16596. x: 0,
  16597. y: imageAttributes.verticalLine.start.y + i * imageAttributes.verticalMinorTick
  16598. };
  16599. if (i % 5 === 0) {
  16600. endPoint.x = imageAttributes.verticalLine.start.x - imageAttributes.majorTickLength;
  16601. } else {
  16602. endPoint.x = imageAttributes.verticalLine.start.x - imageAttributes.minorTickLength;
  16603. }
  16604. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["drawLine"])(context, element, startPoint, endPoint, {
  16605. color: color,
  16606. lineWidth: lineWidth
  16607. }, 'canvas');
  16608. i++;
  16609. }
  16610. };
  16611. /**
  16612. * @param {CanvasRenderingContext2D} context
  16613. * @param {HTMLElement} element
  16614. * @param {Object} imageAttributes
  16615. * @returns {void}
  16616. */
  16617. var drawHorizontalScalebarIntervals = function drawHorizontalScalebarIntervals(context, element, imageAttributes) {
  16618. var i = 0;
  16619. while (imageAttributes.horizontalLine.start.x + i * imageAttributes.horizontalMinorTick <= imageAttributes.hscaleBounds.bottomRight.x) {
  16620. var color = imageAttributes.color,
  16621. lineWidth = imageAttributes.lineWidth;
  16622. var startPoint = {
  16623. x: imageAttributes.horizontalLine.start.x + i * imageAttributes.horizontalMinorTick,
  16624. y: imageAttributes.horizontalLine.start.y
  16625. };
  16626. var endPoint = {
  16627. x: imageAttributes.horizontalLine.start.x + i * imageAttributes.horizontalMinorTick,
  16628. y: 0
  16629. };
  16630. if (i % 5 === 0) {
  16631. endPoint.y = imageAttributes.horizontalLine.start.y - imageAttributes.majorTickLength;
  16632. } else {
  16633. endPoint.y = imageAttributes.horizontalLine.start.y - imageAttributes.minorTickLength;
  16634. }
  16635. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["drawLine"])(context, element, startPoint, endPoint, {
  16636. color: color,
  16637. lineWidth: lineWidth
  16638. }, 'canvas');
  16639. i++;
  16640. }
  16641. };
  16642. /***/ }),
  16643. /***/ "./tools/StackScrollMouseWheelTool.js":
  16644. /*!********************************************!*\
  16645. !*** ./tools/StackScrollMouseWheelTool.js ***!
  16646. \********************************************/
  16647. /*! exports provided: default */
  16648. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  16649. "use strict";
  16650. __webpack_require__.r(__webpack_exports__);
  16651. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return StackScrollMouseWheelTool; });
  16652. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
  16653. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
  16654. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
  16655. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
  16656. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
  16657. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
  16658. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
  16659. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
  16660. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
  16661. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
  16662. /* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js");
  16663. /* harmony import */ var _util_scroll_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../util/scroll.js */ "./util/scroll.js");
  16664. /**
  16665. * @public
  16666. * @class StackScrollMouseWheelTool
  16667. * @memberof Tools
  16668. *
  16669. * @classdesc Tool for scrolling through a series using the mouse wheel.
  16670. * @extends Tools.Base.BaseTool
  16671. */
  16672. var StackScrollMouseWheelTool =
  16673. /*#__PURE__*/
  16674. function (_BaseTool) {
  16675. _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(StackScrollMouseWheelTool, _BaseTool);
  16676. function StackScrollMouseWheelTool() {
  16677. var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  16678. _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, StackScrollMouseWheelTool);
  16679. var defaultProps = {
  16680. name: 'StackScrollMouseWheel',
  16681. supportedInteractionTypes: ['MouseWheel'],
  16682. configuration: {
  16683. loop: false,
  16684. allowSkipping: true,
  16685. invert: false
  16686. }
  16687. };
  16688. return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(StackScrollMouseWheelTool).call(this, props, defaultProps));
  16689. }
  16690. _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(StackScrollMouseWheelTool, [{
  16691. key: "mouseWheelCallback",
  16692. value: function mouseWheelCallback(evt) {
  16693. var _evt$detail = evt.detail,
  16694. images = _evt$detail.direction,
  16695. element = _evt$detail.element;
  16696. var _this$configuration = this.configuration,
  16697. loop = _this$configuration.loop,
  16698. allowSkipping = _this$configuration.allowSkipping,
  16699. invert = _this$configuration.invert;
  16700. var direction = invert ? -images : images;
  16701. Object(_util_scroll_js__WEBPACK_IMPORTED_MODULE_6__["default"])(element, direction, loop, allowSkipping);
  16702. }
  16703. }]);
  16704. return StackScrollMouseWheelTool;
  16705. }(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_5__["default"]);
  16706. /***/ }),
  16707. /***/ "./tools/StackScrollMultiTouchTool.js":
  16708. /*!********************************************!*\
  16709. !*** ./tools/StackScrollMultiTouchTool.js ***!
  16710. \********************************************/
  16711. /*! exports provided: default */
  16712. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  16713. "use strict";
  16714. __webpack_require__.r(__webpack_exports__);
  16715. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return StackScrollMultiTouchTool; });
  16716. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
  16717. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
  16718. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
  16719. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
  16720. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
  16721. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
  16722. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
  16723. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
  16724. /* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js");
  16725. /* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__);
  16726. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
  16727. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__);
  16728. /* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js");
  16729. /* harmony import */ var _util_scroll_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../util/scroll.js */ "./util/scroll.js");
  16730. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  16731. /* harmony import */ var _toolOptions_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../toolOptions.js */ "./toolOptions.js");
  16732. /**
  16733. * @public
  16734. * @class StackScrollMultiTouchTool
  16735. * @memberof Tools
  16736. *
  16737. * @classdesc Tool for scrolling through a series using multi-touch.
  16738. * @extends Tools.Base.BaseTool
  16739. */
  16740. var StackScrollMultiTouchTool =
  16741. /*#__PURE__*/
  16742. function (_BaseTool) {
  16743. _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(StackScrollMultiTouchTool, _BaseTool);
  16744. function StackScrollMultiTouchTool() {
  16745. var _this;
  16746. var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  16747. _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, StackScrollMultiTouchTool);
  16748. var defaultProps = {
  16749. name: 'StackScrollMultiTouch',
  16750. supportedInteractionTypes: ['MultiTouch'],
  16751. configuration: {
  16752. loop: false,
  16753. allowSkipping: true,
  16754. touchPointers: 3
  16755. }
  16756. };
  16757. _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(StackScrollMultiTouchTool).call(this, props, defaultProps));
  16758. _this.multiTouchDragCallback = _this._dragCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  16759. return _this;
  16760. }
  16761. _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(StackScrollMultiTouchTool, [{
  16762. key: "_dragCallback",
  16763. value: function _dragCallback(evt) {
  16764. var eventData = evt.detail;
  16765. if (eventData.numPointers === this.configuration.touchPointers) {
  16766. var element = eventData.element,
  16767. deltaPoints = eventData.deltaPoints;
  16768. var _this$configuration = this.configuration,
  16769. loop = _this$configuration.loop,
  16770. allowSkipping = _this$configuration.allowSkipping;
  16771. var options = Object(_toolOptions_js__WEBPACK_IMPORTED_MODULE_9__["getToolOptions"])(this.name, element);
  16772. var pixelsPerImage = this._getPixelPerImage(element);
  16773. var deltaY = this._getDeltaY(element, deltaPoints.page.y);
  16774. if (!pixelsPerImage) {
  16775. return;
  16776. }
  16777. if (Math.abs(deltaY) >= pixelsPerImage) {
  16778. var imageIdIndexOffset = Math.round(deltaY / pixelsPerImage);
  16779. Object(_util_scroll_js__WEBPACK_IMPORTED_MODULE_7__["default"])(element, imageIdIndexOffset, loop, allowSkipping);
  16780. options.deltaY = deltaY % pixelsPerImage;
  16781. } else {
  16782. options.deltaY = deltaY;
  16783. }
  16784. Object(_toolOptions_js__WEBPACK_IMPORTED_MODULE_9__["setToolOptions"])(this.name, element, options);
  16785. }
  16786. }
  16787. }, {
  16788. key: "_getDeltaY",
  16789. value: function _getDeltaY(element, deltaPointsY) {
  16790. var options = Object(_toolOptions_js__WEBPACK_IMPORTED_MODULE_9__["getToolOptions"])(this.name, element);
  16791. var deltaY = options.deltaY || 0;
  16792. return deltaY + deltaPointsY;
  16793. }
  16794. }, {
  16795. key: "_getPixelPerImage",
  16796. value: function _getPixelPerImage(element) {
  16797. var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_8__["getToolState"])(element, 'stack');
  16798. if (!toolData || !toolData.data || !toolData.data.length) {
  16799. return;
  16800. }
  16801. var stackData = toolData.data[0];
  16802. var stackScrollSpeed = this.configuration.stackScrollSpeed; // The Math.max here makes it easier to mouseDrag-scroll small or really large image stacks
  16803. return stackScrollSpeed || Math.max(2, element.offsetHeight / Math.max(stackData.imageIds.length, 8));
  16804. }
  16805. }]);
  16806. return StackScrollMultiTouchTool;
  16807. }(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]);
  16808. /***/ }),
  16809. /***/ "./tools/StackScrollTool.js":
  16810. /*!**********************************!*\
  16811. !*** ./tools/StackScrollTool.js ***!
  16812. \**********************************/
  16813. /*! exports provided: default */
  16814. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  16815. "use strict";
  16816. __webpack_require__.r(__webpack_exports__);
  16817. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return StackScrollTool; });
  16818. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
  16819. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
  16820. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
  16821. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
  16822. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
  16823. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
  16824. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
  16825. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
  16826. /* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js");
  16827. /* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__);
  16828. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
  16829. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__);
  16830. /* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js");
  16831. /* harmony import */ var _util_scroll_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../util/scroll.js */ "./util/scroll.js");
  16832. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  16833. /* harmony import */ var _toolOptions_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../toolOptions.js */ "./toolOptions.js");
  16834. /* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./cursors/index.js */ "./tools/cursors/index.js");
  16835. /**
  16836. * @public
  16837. * @class StackScrollTool
  16838. * @memberof Tools
  16839. *
  16840. * @classdesc Tool for scrolling through a series.
  16841. * @extends Tools.Base.BaseTool
  16842. */
  16843. var StackScrollTool =
  16844. /*#__PURE__*/
  16845. function (_BaseTool) {
  16846. _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(StackScrollTool, _BaseTool);
  16847. function StackScrollTool() {
  16848. var _this;
  16849. var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  16850. _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, StackScrollTool);
  16851. var defaultProps = {
  16852. name: 'StackScroll',
  16853. supportedInteractionTypes: ['Mouse', 'Touch'],
  16854. configuration: {
  16855. loop: false,
  16856. allowSkipping: true
  16857. },
  16858. svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_10__["stackScrollCursor"]
  16859. };
  16860. _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(StackScrollTool).call(this, props, defaultProps));
  16861. _this.mouseDragCallback = _this._dragCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  16862. _this.touchDragCallback = _this._dragCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  16863. return _this;
  16864. }
  16865. _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(StackScrollTool, [{
  16866. key: "_dragCallback",
  16867. value: function _dragCallback(evt) {
  16868. var eventData = evt.detail;
  16869. var element = eventData.element,
  16870. deltaPoints = eventData.deltaPoints;
  16871. var _this$configuration = this.configuration,
  16872. loop = _this$configuration.loop,
  16873. allowSkipping = _this$configuration.allowSkipping;
  16874. var options = Object(_toolOptions_js__WEBPACK_IMPORTED_MODULE_9__["getToolOptions"])(this.name, element);
  16875. var pixelsPerImage = this._getPixelPerImage(element);
  16876. var deltaY = this._getDeltaY(element, deltaPoints.page.y);
  16877. if (!pixelsPerImage) {
  16878. return;
  16879. }
  16880. if (Math.abs(deltaY) >= pixelsPerImage) {
  16881. var imageIdIndexOffset = Math.round(deltaY / pixelsPerImage);
  16882. Object(_util_scroll_js__WEBPACK_IMPORTED_MODULE_7__["default"])(element, imageIdIndexOffset, loop, allowSkipping);
  16883. options.deltaY = deltaY % pixelsPerImage;
  16884. } else {
  16885. options.deltaY = deltaY;
  16886. }
  16887. Object(_toolOptions_js__WEBPACK_IMPORTED_MODULE_9__["setToolOptions"])(this.name, element, options);
  16888. }
  16889. }, {
  16890. key: "_getDeltaY",
  16891. value: function _getDeltaY(element, deltaPointsY) {
  16892. var options = Object(_toolOptions_js__WEBPACK_IMPORTED_MODULE_9__["getToolOptions"])(this.name, element);
  16893. var deltaY = options.deltaY || 0;
  16894. return deltaY + deltaPointsY;
  16895. }
  16896. }, {
  16897. key: "_getPixelPerImage",
  16898. value: function _getPixelPerImage(element) {
  16899. var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_8__["getToolState"])(element, 'stack');
  16900. if (!toolData || !toolData.data || !toolData.data.length) {
  16901. return;
  16902. }
  16903. var stackData = toolData.data[0];
  16904. var stackScrollSpeed = this.configuration.stackScrollSpeed; // The Math.max here makes it easier to mouseDrag-scroll small or really large image stacks
  16905. return stackScrollSpeed || Math.max(2, element.offsetHeight / Math.max(stackData.imageIds.length, 8));
  16906. }
  16907. }]);
  16908. return StackScrollTool;
  16909. }(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]);
  16910. /***/ }),
  16911. /***/ "./tools/WwwcRegionTool.js":
  16912. /*!*********************************!*\
  16913. !*** ./tools/WwwcRegionTool.js ***!
  16914. \*********************************/
  16915. /*! exports provided: default */
  16916. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  16917. "use strict";
  16918. __webpack_require__.r(__webpack_exports__);
  16919. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return WwwcRegionTool; });
  16920. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
  16921. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
  16922. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
  16923. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
  16924. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
  16925. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
  16926. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
  16927. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
  16928. /* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js");
  16929. /* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__);
  16930. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
  16931. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__);
  16932. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
  16933. /* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js");
  16934. /* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../drawing/index.js */ "./drawing/index.js");
  16935. /* harmony import */ var _util_clip_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../util/clip.js */ "./util/clip.js");
  16936. /* harmony import */ var _util_getLuminance_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../util/getLuminance.js */ "./util/getLuminance.js");
  16937. /* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../stateManagement/toolColors.js */ "./stateManagement/toolColors.js");
  16938. /* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./cursors/index.js */ "./tools/cursors/index.js");
  16939. // Drawing
  16940. /**
  16941. * @public
  16942. * @class WwwcRegionTool
  16943. * @memberof Tools
  16944. *
  16945. * @classdesc Tool for setting wwwc based on a rectangular region.
  16946. * @extends Tools.Base.BaseTool
  16947. */
  16948. var WwwcRegionTool =
  16949. /*#__PURE__*/
  16950. function (_BaseTool) {
  16951. _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(WwwcRegionTool, _BaseTool);
  16952. /** @inheritdoc */
  16953. function WwwcRegionTool() {
  16954. var _this;
  16955. var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  16956. _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, WwwcRegionTool);
  16957. var defaultProps = {
  16958. name: 'WwwcRegion',
  16959. supportedInteractionTypes: ['Mouse', 'Touch'],
  16960. configuration: {
  16961. minWindowWidth: 10
  16962. },
  16963. svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_12__["wwwcRegionCursor"]
  16964. };
  16965. _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(WwwcRegionTool).call(this, props, defaultProps));
  16966. _this._resetHandles(); //
  16967. // Touch
  16968. //
  16969. /** @inheritdoc */
  16970. _this.postTouchStartCallback = _this._startOutliningRegion.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  16971. /** @inheritdoc */
  16972. _this.touchDragCallback = _this._setHandlesAndUpdate.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  16973. /** @inheritdoc */
  16974. _this.touchEndCallback = _this._applyStrategy.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); //
  16975. // MOUSE
  16976. //
  16977. /** @inheritdoc */
  16978. _this.postMouseDownCallback = _this._startOutliningRegion.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  16979. /** @inheritdoc */
  16980. _this.mouseClickCallback = _this._startOutliningRegion.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  16981. /** @inheritdoc */
  16982. _this.mouseDragCallback = _this._setHandlesAndUpdate.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  16983. /** @inheritdoc */
  16984. _this.mouseMoveCallback = _this._setHandlesAndUpdate.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  16985. /** @inheritdoc */
  16986. _this.mouseUpCallback = _this._applyStrategy.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  16987. return _this;
  16988. }
  16989. /**
  16990. * Render hook: draws the WWWCRegion's "box" when selecting
  16991. *
  16992. * @param {Cornerstone.event#cornerstoneimagerendered} evt cornerstoneimagerendered event
  16993. * @memberof Tools.WwwcRegionTool
  16994. * @returns {void}
  16995. */
  16996. _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(WwwcRegionTool, [{
  16997. key: "renderToolData",
  16998. value: function renderToolData(evt) {
  16999. var _this2 = this;
  17000. var eventData = evt.detail;
  17001. var element = eventData.element;
  17002. var color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_11__["default"].getColorIfActive({
  17003. active: true
  17004. });
  17005. var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_8__["getNewContext"])(eventData.canvasContext.canvas);
  17006. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_8__["draw"])(context, function (context) {
  17007. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_8__["drawRect"])(context, element, _this2.handles.start, _this2.handles.end, {
  17008. color: color
  17009. });
  17010. });
  17011. }
  17012. /**
  17013. * Sets the start handle point and claims the eventDispatcher event
  17014. *
  17015. * @private
  17016. * @param {*} evt // mousedown, touchstart, click
  17017. * @returns {Boolean} True
  17018. */
  17019. }, {
  17020. key: "_startOutliningRegion",
  17021. value: function _startOutliningRegion(evt) {
  17022. var consumeEvent = true;
  17023. var element = evt.detail.element;
  17024. var image = evt.detail.currentPoints.image;
  17025. if (_isEmptyObject(this.handles.start)) {
  17026. this.handles.start = image;
  17027. } else {
  17028. this.handles.end = image;
  17029. this._applyStrategy(evt);
  17030. }
  17031. _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.updateImage(element);
  17032. return consumeEvent;
  17033. }
  17034. /**
  17035. * This function will update the handles and updateImage to force re-draw
  17036. *
  17037. * @private
  17038. * @method _setHandlesAndUpdate
  17039. * @param {(CornerstoneTools.event#TOUCH_DRAG|CornerstoneTools.event#MOUSE_DRAG|CornerstoneTools.event#MOUSE_MOVE)} evt Interaction event emitted by an enabledElement
  17040. * @returns {void}
  17041. */
  17042. }, {
  17043. key: "_setHandlesAndUpdate",
  17044. value: function _setHandlesAndUpdate(evt) {
  17045. var element = evt.detail.element;
  17046. var image = evt.detail.currentPoints.image;
  17047. this.handles.end = image;
  17048. _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.updateImage(element);
  17049. }
  17050. /**
  17051. * Event handler for MOUSE_UP/TOUCH_END during handle drag event loop.
  17052. *
  17053. * @private
  17054. * @method _applyStrategy
  17055. * @param {(CornerstoneTools.event#MOUSE_UP|CornerstoneTools.event#TOUCH_END)} evt Interaction event emitted by an enabledElement
  17056. * @returns {void}
  17057. */
  17058. }, {
  17059. key: "_applyStrategy",
  17060. value: function _applyStrategy(evt) {
  17061. if (_isEmptyObject(this.handles.start) || _isEmptyObject(this.handles.end)) {
  17062. return;
  17063. }
  17064. evt.detail.handles = this.handles;
  17065. _applyWWWCRegion(evt, this.configuration);
  17066. this._resetHandles();
  17067. }
  17068. /**
  17069. * Sets the start and end handle points to empty objects
  17070. *
  17071. * @private
  17072. * @method _resetHandles
  17073. * @returns {undefined}
  17074. */
  17075. }, {
  17076. key: "_resetHandles",
  17077. value: function _resetHandles() {
  17078. this.handles = {
  17079. start: {},
  17080. end: {}
  17081. };
  17082. }
  17083. }]);
  17084. return WwwcRegionTool;
  17085. }(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_7__["default"]);
  17086. /**
  17087. * Helper to determine if an object has no keys and is the correct type (is empty)
  17088. *
  17089. * @private
  17090. * @function _isEmptyObject
  17091. * @param {Object} obj The object to check
  17092. * @returns {Boolean} true if the object is empty
  17093. */
  17094. var _isEmptyObject = function _isEmptyObject(obj) {
  17095. return Object.keys(obj).length === 0 && obj.constructor === Object;
  17096. };
  17097. /**
  17098. * Calculates the minimum and maximum value in the given pixel array
  17099. * and updates the viewport of the element in the event.
  17100. *
  17101. * @private
  17102. * @method _applyWWWCRegion
  17103. * @param {(CornerstoneTools.event#MOUSE_UP|CornerstoneTools.event#TOUCH_END)} evt Interaction event emitted by an enabledElement
  17104. * @param {Object} config The tool's configuration object
  17105. * @returns {void}
  17106. */
  17107. var _applyWWWCRegion = function _applyWWWCRegion(evt, config) {
  17108. var eventData = evt.detail;
  17109. var image = eventData.image,
  17110. element = eventData.element;
  17111. var _evt$detail$handles = evt.detail.handles,
  17112. startPoint = _evt$detail$handles.start,
  17113. endPoint = _evt$detail$handles.end; // Get the rectangular region defined by the handles
  17114. var left = Math.min(startPoint.x, endPoint.x);
  17115. var top = Math.min(startPoint.y, endPoint.y);
  17116. var width = Math.abs(startPoint.x - endPoint.x);
  17117. var height = Math.abs(startPoint.y - endPoint.y); // Bound the rectangle so we don't get undefined pixels
  17118. left = Object(_util_clip_js__WEBPACK_IMPORTED_MODULE_9__["default"])(left, 0, image.width);
  17119. top = Object(_util_clip_js__WEBPACK_IMPORTED_MODULE_9__["default"])(top, 0, image.height);
  17120. width = Math.floor(Math.min(width, Math.abs(image.width - left)));
  17121. height = Math.floor(Math.min(height, Math.abs(image.height - top))); // Get the pixel data in the rectangular region
  17122. var pixelLuminanceData = Object(_util_getLuminance_js__WEBPACK_IMPORTED_MODULE_10__["default"])(element, left, top, width, height); // Calculate the minimum and maximum pixel values
  17123. var minMaxMean = _calculateMinMaxMean(pixelLuminanceData, image.minPixelValue, image.maxPixelValue); // Adjust the viewport window width and center based on the calculated values
  17124. var viewport = eventData.viewport;
  17125. if (config.minWindowWidth === undefined) {
  17126. config.minWindowWidth = 10;
  17127. }
  17128. viewport.voi.windowWidth = Math.max(Math.abs(minMaxMean.max - minMaxMean.min), config.minWindowWidth);
  17129. viewport.voi.windowCenter = minMaxMean.mean; // Unset any existing VOI LUT
  17130. viewport.voiLUT = undefined;
  17131. _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.setViewport(element, viewport);
  17132. _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.updateImage(element);
  17133. };
  17134. /**
  17135. * Calculates the minimum, maximum, and mean value in the given pixel array
  17136. *
  17137. * @private
  17138. * @method _calculateMinMaxMean
  17139. * @param {number[]} pixelLuminance array of pixel luminance values
  17140. * @param {number} globalMin starting "min" valie
  17141. * @param {bumber} globalMax starting "max" value
  17142. * @returns {Object} {min: number, max: number, mean: number }
  17143. */
  17144. var _calculateMinMaxMean = function _calculateMinMaxMean(pixelLuminance, globalMin, globalMax) {
  17145. var numPixels = pixelLuminance.length;
  17146. var min = globalMax;
  17147. var max = globalMin;
  17148. var sum = 0;
  17149. if (numPixels < 2) {
  17150. return {
  17151. min: min,
  17152. max: max,
  17153. mean: (globalMin + globalMax) / 2
  17154. };
  17155. }
  17156. for (var index = 0; index < numPixels; index++) {
  17157. var spv = pixelLuminance[index];
  17158. min = Math.min(min, spv);
  17159. max = Math.max(max, spv);
  17160. sum += spv;
  17161. }
  17162. return {
  17163. min: min,
  17164. max: max,
  17165. mean: sum / numPixels
  17166. };
  17167. };
  17168. /***/ }),
  17169. /***/ "./tools/WwwcTool.js":
  17170. /*!***************************!*\
  17171. !*** ./tools/WwwcTool.js ***!
  17172. \***************************/
  17173. /*! exports provided: default */
  17174. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  17175. "use strict";
  17176. __webpack_require__.r(__webpack_exports__);
  17177. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return WwwcTool; });
  17178. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
  17179. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
  17180. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
  17181. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
  17182. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
  17183. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
  17184. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
  17185. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
  17186. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
  17187. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
  17188. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
  17189. /* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js");
  17190. /* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./cursors/index.js */ "./tools/cursors/index.js");
  17191. /**
  17192. * @public
  17193. * @class WwwcTool
  17194. * @memberof Tools
  17195. *
  17196. * @classdesc Tool for setting wwwc by dragging with mouse/touch.
  17197. * @extends Tools.Base.BaseTool
  17198. */
  17199. var WwwcTool =
  17200. /*#__PURE__*/
  17201. function (_BaseTool) {
  17202. _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(WwwcTool, _BaseTool);
  17203. function WwwcTool() {
  17204. var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  17205. _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, WwwcTool);
  17206. var defaultProps = {
  17207. name: 'Wwwc',
  17208. strategies: {
  17209. basicLevelingStrategy: basicLevelingStrategy
  17210. },
  17211. supportedInteractionTypes: ['Mouse', 'Touch'],
  17212. configuration: {
  17213. orientation: 0
  17214. },
  17215. svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_7__["wwwcCursor"]
  17216. };
  17217. return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(WwwcTool).call(this, props, defaultProps));
  17218. }
  17219. _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(WwwcTool, [{
  17220. key: "mouseDragCallback",
  17221. value: function mouseDragCallback(evt) {
  17222. this.applyActiveStrategy(evt);
  17223. _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.setViewport(evt.detail.element, evt.detail.viewport);
  17224. }
  17225. }, {
  17226. key: "touchDragCallback",
  17227. value: function touchDragCallback(evt) {
  17228. // Prevent CornerstoneToolsTouchStartActive from killing any press events
  17229. evt.stopImmediatePropagation();
  17230. this.applyActiveStrategy(evt);
  17231. _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.setViewport(evt.detail.element, evt.detail.viewport);
  17232. }
  17233. }]);
  17234. return WwwcTool;
  17235. }(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]);
  17236. /**
  17237. * Here we normalize the ww/wc adjustments so the same number of on screen pixels
  17238. * adjusts the same percentage of the dynamic range of the image. This is needed to
  17239. * provide consistency for the ww/wc tool regardless of the dynamic range (e.g. an 8 bit
  17240. * image will feel the same as a 16 bit image would)
  17241. *
  17242. * @param {Object} evt
  17243. * @param {Object} { orienttion }
  17244. * @returns {void}
  17245. */
  17246. function basicLevelingStrategy(evt) {
  17247. var orientation = this.configuration.orientation;
  17248. var eventData = evt.detail;
  17249. var maxVOI = eventData.image.maxPixelValue * eventData.image.slope + eventData.image.intercept;
  17250. var minVOI = eventData.image.minPixelValue * eventData.image.slope + eventData.image.intercept;
  17251. var imageDynamicRange = maxVOI - minVOI;
  17252. var multiplier = imageDynamicRange / 1024;
  17253. var deltaX = eventData.deltaPoints.page.x * multiplier;
  17254. var deltaY = eventData.deltaPoints.page.y * multiplier;
  17255. if (orientation === 0) {
  17256. eventData.viewport.voi.windowWidth += deltaX;
  17257. eventData.viewport.voi.windowCenter += deltaY;
  17258. } else {
  17259. eventData.viewport.voi.windowWidth += deltaY;
  17260. eventData.viewport.voi.windowCenter += deltaX;
  17261. } // Unset any existing VOI LUT
  17262. eventData.viewport.voiLUT = undefined;
  17263. }
  17264. /***/ }),
  17265. /***/ "./tools/ZoomMouseWheelTool.js":
  17266. /*!*************************************!*\
  17267. !*** ./tools/ZoomMouseWheelTool.js ***!
  17268. \*************************************/
  17269. /*! exports provided: default */
  17270. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  17271. "use strict";
  17272. __webpack_require__.r(__webpack_exports__);
  17273. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ZoomMouseWheelTool; });
  17274. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
  17275. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
  17276. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
  17277. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
  17278. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
  17279. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
  17280. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
  17281. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
  17282. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
  17283. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
  17284. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js");
  17285. /* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js");
  17286. /* harmony import */ var _util_zoom_index_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../util/zoom/index.js */ "./util/zoom/index.js");
  17287. /**
  17288. * @public
  17289. * @class ZoomMouseWheelTool
  17290. * @memberof Tools
  17291. *
  17292. * @classdesc Tool for changing magnification with the mouse wheel.
  17293. * @extends Tools.Base.BaseTool
  17294. */
  17295. var ZoomMouseWheelTool =
  17296. /*#__PURE__*/
  17297. function (_BaseTool) {
  17298. _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(ZoomMouseWheelTool, _BaseTool);
  17299. function ZoomMouseWheelTool() {
  17300. var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  17301. _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, ZoomMouseWheelTool);
  17302. var defaultProps = {
  17303. name: 'ZoomMouseWheel',
  17304. supportedInteractionTypes: ['MouseWheel'],
  17305. configuration: {
  17306. minScale: 0.25,
  17307. maxScale: 20.0,
  17308. invert: false
  17309. }
  17310. };
  17311. return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(ZoomMouseWheelTool).call(this, props, defaultProps));
  17312. }
  17313. _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(ZoomMouseWheelTool, [{
  17314. key: "mouseWheelCallback",
  17315. value: function mouseWheelCallback(evt) {
  17316. var _evt$detail = evt.detail,
  17317. element = _evt$detail.element,
  17318. viewport = _evt$detail.viewport,
  17319. spinY = _evt$detail.spinY;
  17320. var _this$configuration = this.configuration,
  17321. invert = _this$configuration.invert,
  17322. maxScale = _this$configuration.maxScale,
  17323. minScale = _this$configuration.minScale;
  17324. var ticks = invert ? spinY / 4 : -spinY / 4;
  17325. var updatedViewport = Object(_util_zoom_index_js__WEBPACK_IMPORTED_MODULE_7__["changeViewportScale"])(viewport, ticks, {
  17326. maxScale: maxScale,
  17327. minScale: minScale
  17328. });
  17329. _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.setViewport(element, updatedViewport);
  17330. }
  17331. }]);
  17332. return ZoomMouseWheelTool;
  17333. }(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]);
  17334. /***/ }),
  17335. /***/ "./tools/ZoomTool.js":
  17336. /*!***************************!*\
  17337. !*** ./tools/ZoomTool.js ***!
  17338. \***************************/
  17339. /*! exports provided: default */
  17340. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  17341. "use strict";
  17342. __webpack_require__.r(__webpack_exports__);
  17343. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ZoomTool; });
  17344. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
  17345. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
  17346. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
  17347. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
  17348. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
  17349. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
  17350. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
  17351. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
  17352. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
  17353. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
  17354. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
  17355. /* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js");
  17356. /* harmony import */ var _util_clip_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../util/clip.js */ "./util/clip.js");
  17357. /* harmony import */ var _util_zoom_index_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../util/zoom/index.js */ "./util/zoom/index.js");
  17358. /* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./cursors/index.js */ "./tools/cursors/index.js");
  17359. var correctShift = _util_zoom_index_js__WEBPACK_IMPORTED_MODULE_8__["default"].correctShift,
  17360. changeViewportScale = _util_zoom_index_js__WEBPACK_IMPORTED_MODULE_8__["default"].changeViewportScale;
  17361. /**
  17362. * @public
  17363. * @class ZoomTool
  17364. * @memberof Tools
  17365. *
  17366. * @classdesc Tool for changing magnification.
  17367. * @extends Tools.Base.BaseTool
  17368. */
  17369. var ZoomTool =
  17370. /*#__PURE__*/
  17371. function (_BaseTool) {
  17372. _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(ZoomTool, _BaseTool);
  17373. function ZoomTool() {
  17374. var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  17375. _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, ZoomTool);
  17376. var defaultProps = {
  17377. name: 'Zoom',
  17378. strategies: {
  17379. default: defaultStrategy,
  17380. translate: translateStrategy,
  17381. zoomToCenter: zoomToCenterStrategy
  17382. },
  17383. defaultStrategy: 'default',
  17384. supportedInteractionTypes: ['Mouse', 'Touch'],
  17385. configuration: {
  17386. invert: false,
  17387. preventZoomOutsideImage: false,
  17388. minScale: 0.25,
  17389. maxScale: 20.0
  17390. },
  17391. svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_9__["zoomCursor"]
  17392. };
  17393. return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(ZoomTool).call(this, props, defaultProps));
  17394. }
  17395. _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(ZoomTool, [{
  17396. key: "touchDragCallback",
  17397. value: function touchDragCallback(evt) {
  17398. dragCallback.call(this, evt);
  17399. }
  17400. }, {
  17401. key: "mouseDragCallback",
  17402. value: function mouseDragCallback(evt) {
  17403. dragCallback.call(this, evt);
  17404. }
  17405. }]);
  17406. return ZoomTool;
  17407. }(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]);
  17408. var dragCallback = function dragCallback(evt) {
  17409. var deltaY = evt.detail.deltaPoints.page.y;
  17410. if (!deltaY) {
  17411. return false;
  17412. }
  17413. this.applyActiveStrategy(evt, this.configuration);
  17414. _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.setViewport(evt.detail.element, evt.detail.viewport);
  17415. };
  17416. /**
  17417. * The default strategy keeps the target location fixed on the page
  17418. * as we zoom in/out.
  17419. *
  17420. * @param {*} evt
  17421. * @param {*} { invert, maxScale, minScale }
  17422. * @returns {void}
  17423. */
  17424. function defaultStrategy(evt) {
  17425. var _this$configuration = this.configuration,
  17426. invert = _this$configuration.invert,
  17427. maxScale = _this$configuration.maxScale,
  17428. minScale = _this$configuration.minScale;
  17429. var deltaY = evt.detail.deltaPoints.page.y;
  17430. var ticks = invert ? -deltaY / 100 : deltaY / 100;
  17431. var _evt$detail = evt.detail,
  17432. element = _evt$detail.element,
  17433. viewport = _evt$detail.viewport;
  17434. var _ref = [evt.detail.startPoints.page.x, evt.detail.startPoints.page.y, evt.detail.startPoints.image.x, evt.detail.startPoints.image.y],
  17435. startX = _ref[0],
  17436. startY = _ref[1],
  17437. imageX = _ref[2],
  17438. imageY = _ref[3]; // Calculate the new scale factor based on how far the mouse has changed
  17439. var updatedViewport = changeViewportScale(viewport, ticks, {
  17440. maxScale: maxScale,
  17441. minScale: minScale
  17442. });
  17443. _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.setViewport(element, updatedViewport); // Now that the scale has been updated, determine the offset we need to apply to the center so we can
  17444. // Keep the original start location in the same position
  17445. var newCoords = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pageToPixel(element, startX, startY); // The shift we will use is the difference between the original image coordinates of the point we've selected
  17446. // And the image coordinates of the same point on the page after the viewport scaling above has been performed
  17447. // This shift is in image coordinates, and is designed to keep the target location fixed on the page.
  17448. var shift = {
  17449. x: imageX - newCoords.x,
  17450. y: imageY - newCoords.y
  17451. }; // Correct the required shift using the viewport rotation and flip parameters
  17452. shift = correctShift(shift, updatedViewport); // Apply the shift to the Viewport's translation setting
  17453. viewport.translation.x -= shift.x;
  17454. viewport.translation.y -= shift.y;
  17455. }
  17456. function translateStrategy(evt) {
  17457. var _this$configuration2 = this.configuration,
  17458. invert = _this$configuration2.invert,
  17459. preventZoomOutsideImage = _this$configuration2.preventZoomOutsideImage,
  17460. maxScale = _this$configuration2.maxScale,
  17461. minScale = _this$configuration2.minScale;
  17462. var deltaY = evt.detail.deltaPoints.page.y;
  17463. var ticks = invert ? -deltaY / 100 : deltaY / 100;
  17464. var image = evt.detail.image;
  17465. var viewport = evt.detail.viewport;
  17466. var _ref2 = [evt.detail.startPoints.image.x, evt.detail.startPoints.image.y],
  17467. startX = _ref2[0],
  17468. startY = _ref2[1]; // Calculate the new scale factor based on how far the mouse has changed
  17469. // Note that in this case we don't need to update the viewport after the initial
  17470. // Zoom step since we aren't don't intend to keep the target position static on
  17471. // The page
  17472. var updatedViewport = changeViewportScale(viewport, ticks, {
  17473. maxScale: maxScale,
  17474. minScale: minScale
  17475. }); // Define the default shift to take place during this zoom step
  17476. var shift = {
  17477. x: 0,
  17478. y: 0
  17479. }; // Define the parameters for the translate strategy
  17480. var translateSpeed = 8;
  17481. var outwardsMinScaleToTranslate = 3;
  17482. var minTranslation = 0.01;
  17483. if (ticks < 0) {
  17484. // Zoom outwards from the image center
  17485. if (updatedViewport.scale < outwardsMinScaleToTranslate) {
  17486. // If the current translation is smaller than the minimum desired translation,
  17487. // Set the translation to zero
  17488. if (Math.abs(updatedViewport.translation.x) < minTranslation) {
  17489. updatedViewport.translation.x = 0;
  17490. } else {
  17491. shift.x = updatedViewport.translation.x / translateSpeed;
  17492. } // If the current translation is smaller than the minimum desired translation,
  17493. // Set the translation to zero
  17494. if (Math.abs(updatedViewport.translation.y) < minTranslation) {
  17495. updatedViewport.translation.y = 0;
  17496. } else {
  17497. shift.y = updatedViewport.translation.y / translateSpeed;
  17498. }
  17499. }
  17500. } else {
  17501. // Zoom inwards to the current image point
  17502. // Identify the coordinates of the point the user is trying to zoom into
  17503. // If we are not allowed to zoom outside the image, bound the user-selected position to
  17504. // A point inside the image
  17505. if (preventZoomOutsideImage) {
  17506. Object(_util_clip_js__WEBPACK_IMPORTED_MODULE_7__["clipToBox"])(evt.detail.startPoints.image, image);
  17507. } // Calculate the translation value that would place the desired image point in the center
  17508. // Of the viewport
  17509. var desiredTranslation = {
  17510. x: image.width / 2 - startX,
  17511. y: image.height / 2 - startY
  17512. }; // Correct the target location using the viewport rotation and flip parameters
  17513. desiredTranslation = correctShift(desiredTranslation, updatedViewport); // Calculate the difference between the current viewport translation value and the
  17514. // Final desired translation values
  17515. var distanceToDesired = {
  17516. x: updatedViewport.translation.x - desiredTranslation.x,
  17517. y: updatedViewport.translation.y - desiredTranslation.y
  17518. }; // If the current translation is smaller than the minimum desired translation,
  17519. // Stop translating in the x-direction
  17520. if (Math.abs(distanceToDesired.x) < minTranslation) {
  17521. updatedViewport.translation.x = desiredTranslation.x;
  17522. } else {
  17523. // Otherwise, shift the viewport by one step
  17524. shift.x = distanceToDesired.x / translateSpeed;
  17525. } // If the current translation is smaller than the minimum desired translation,
  17526. // Stop translating in the y-direction
  17527. if (Math.abs(distanceToDesired.y) < minTranslation) {
  17528. updatedViewport.translation.y = desiredTranslation.y;
  17529. } else {
  17530. // Otherwise, shift the viewport by one step
  17531. shift.y = distanceToDesired.y / translateSpeed;
  17532. }
  17533. } // Apply the shift to the Viewport's translation setting
  17534. updatedViewport.translation.x -= shift.x;
  17535. updatedViewport.translation.y -= shift.y;
  17536. }
  17537. function zoomToCenterStrategy(evt) {
  17538. var _this$configuration3 = this.configuration,
  17539. invert = _this$configuration3.invert,
  17540. maxScale = _this$configuration3.maxScale,
  17541. minScale = _this$configuration3.minScale;
  17542. var deltaY = evt.detail.deltaPoints.page.y;
  17543. var ticks = invert ? -deltaY / 100 : deltaY / 100;
  17544. var viewport = evt.detail.viewport; // Calculate the new scale factor based on how far the mouse has changed
  17545. changeViewportScale(viewport, ticks, {
  17546. maxScale: maxScale,
  17547. minScale: minScale
  17548. });
  17549. }
  17550. /***/ }),
  17551. /***/ "./tools/ZoomTouchPinchTool.js":
  17552. /*!*************************************!*\
  17553. !*** ./tools/ZoomTouchPinchTool.js ***!
  17554. \*************************************/
  17555. /*! exports provided: default */
  17556. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  17557. "use strict";
  17558. __webpack_require__.r(__webpack_exports__);
  17559. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ZoomTouchPinchTool; });
  17560. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
  17561. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
  17562. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
  17563. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
  17564. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
  17565. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
  17566. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
  17567. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
  17568. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
  17569. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
  17570. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js");
  17571. /* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js");
  17572. /* harmony import */ var _util_zoom_index_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../util/zoom/index.js */ "./util/zoom/index.js");
  17573. var correctShift = _util_zoom_index_js__WEBPACK_IMPORTED_MODULE_7__["default"].correctShift;
  17574. /**
  17575. *
  17576. *
  17577. * @public
  17578. * @class ZoomTouchPinchTool
  17579. * @memberof Tools
  17580. *
  17581. * @extends {BaseTool}
  17582. */
  17583. var ZoomTouchPinchTool =
  17584. /*#__PURE__*/
  17585. function (_BaseTool) {
  17586. _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(ZoomTouchPinchTool, _BaseTool);
  17587. function ZoomTouchPinchTool() {
  17588. var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  17589. _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, ZoomTouchPinchTool);
  17590. var defaultProps = {
  17591. name: 'ZoomTouchPinch',
  17592. // TODO: Do we need a better way to specify touchPinch?
  17593. supportedInteractionTypes: ['TouchPinch'],
  17594. configuration: {
  17595. minScale: 0.25,
  17596. maxScale: 20.0
  17597. }
  17598. };
  17599. return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(ZoomTouchPinchTool).call(this, props, defaultProps));
  17600. }
  17601. _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(ZoomTouchPinchTool, [{
  17602. key: "touchPinchCallback",
  17603. value: function touchPinchCallback(evt) {
  17604. var _evt$detail = evt.detail,
  17605. element = _evt$detail.element,
  17606. viewport = _evt$detail.viewport,
  17607. scaleChange = _evt$detail.scaleChange;
  17608. var _ref = [evt.detail.startPoints.page.x, evt.detail.startPoints.page.y, evt.detail.startPoints.image.x, evt.detail.startPoints.image.y],
  17609. pageStartX = _ref[0],
  17610. pageStartY = _ref[1],
  17611. imageStartX = _ref[2],
  17612. imageStartY = _ref[3];
  17613. var _this$configuration = this.configuration,
  17614. maxScale = _this$configuration.maxScale,
  17615. minScale = _this$configuration.minScale; // Change the scale based on the pinch gesture's scale change
  17616. viewport.scale += scaleChange * viewport.scale;
  17617. if (maxScale && viewport.scale > maxScale) {
  17618. viewport.scale = maxScale;
  17619. } else if (minScale && viewport.scale < minScale) {
  17620. viewport.scale = minScale;
  17621. }
  17622. _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.setViewport(element, viewport); // Now that the scale has been updated, determine the offset we need to apply to the center so we can
  17623. // Keep the original start location in the same position
  17624. var newCoords = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pageToPixel(element, pageStartX, pageStartY);
  17625. var shift = {
  17626. x: imageStartX - newCoords.x,
  17627. y: imageStartY - newCoords.y
  17628. };
  17629. shift = correctShift(shift, viewport);
  17630. viewport.translation.x -= shift.x;
  17631. viewport.translation.y -= shift.y;
  17632. _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.setViewport(element, viewport);
  17633. }
  17634. }]);
  17635. return ZoomTouchPinchTool;
  17636. }(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]);
  17637. /***/ }),
  17638. /***/ "./tools/annotation/AngleTool.js":
  17639. /*!***************************************!*\
  17640. !*** ./tools/annotation/AngleTool.js ***!
  17641. \***************************************/
  17642. /*! exports provided: default */
  17643. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  17644. "use strict";
  17645. __webpack_require__.r(__webpack_exports__);
  17646. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return AngleTool; });
  17647. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
  17648. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
  17649. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
  17650. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
  17651. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
  17652. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
  17653. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
  17654. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
  17655. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
  17656. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
  17657. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../../externalModules.js */ "./externalModules.js");
  17658. /* harmony import */ var _base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../base/BaseAnnotationTool.js */ "./tools/base/BaseAnnotationTool.js");
  17659. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  17660. /* harmony import */ var _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./../../stateManagement/toolStyle.js */ "./stateManagement/toolStyle.js");
  17661. /* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./../../stateManagement/toolColors.js */ "./stateManagement/toolColors.js");
  17662. /* harmony import */ var _manipulators_index_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./../../manipulators/index.js */ "./manipulators/index.js");
  17663. /* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./../../drawing/index.js */ "./drawing/index.js");
  17664. /* harmony import */ var _drawing_drawLinkedTextBox_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./../../drawing/drawLinkedTextBox.js */ "./drawing/drawLinkedTextBox.js");
  17665. /* harmony import */ var _drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./../../drawing/drawTextBox.js */ "./drawing/drawTextBox.js");
  17666. /* harmony import */ var _drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./../../drawing/drawHandles.js */ "./drawing/drawHandles.js");
  17667. /* harmony import */ var _util_lineSegDistance_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./../../util/lineSegDistance.js */ "./util/lineSegDistance.js");
  17668. /* harmony import */ var _util_roundToDecimal_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./../../util/roundToDecimal.js */ "./util/roundToDecimal.js");
  17669. /* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../cursors/index.js */ "./tools/cursors/index.js");
  17670. /* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../util/triggerEvent.js */ "./util/triggerEvent.js");
  17671. /* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../../events.js */ "./events.js");
  17672. /* harmony import */ var _util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../../util/getPixelSpacing */ "./util/getPixelSpacing.js");
  17673. /* harmony import */ var _util_throttle__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../../util/throttle */ "./util/throttle.js");
  17674. /* harmony import */ var _store_index__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../../store/index */ "./store/index.js");
  17675. // State
  17676. // Manipulators
  17677. // Drawing
  17678. /**
  17679. * @public
  17680. * @class AngleTool
  17681. * @memberof Tools.Annotation
  17682. * @classdesc Create and position an angle by placing three consecutive points.
  17683. * @extends Tools.Base.BaseAnnotationTool
  17684. * @hideconstructor
  17685. *
  17686. * @param {ToolConfiguration} [props={}]
  17687. */
  17688. var AngleTool =
  17689. /*#__PURE__*/
  17690. function (_BaseAnnotationTool) {
  17691. _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(AngleTool, _BaseAnnotationTool);
  17692. function AngleTool() {
  17693. var _this;
  17694. var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  17695. _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, AngleTool);
  17696. var defaultProps = {
  17697. name: 'Angle',
  17698. supportedInteractionTypes: ['Mouse', 'Touch'],
  17699. svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_17__["angleCursor"],
  17700. configuration: {
  17701. drawHandles: true,
  17702. drawHandlesOnHover: false,
  17703. hideHandlesIfMoving: false,
  17704. renderDashed: false
  17705. }
  17706. };
  17707. _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(AngleTool).call(this, props, defaultProps));
  17708. _this.preventNewMeasurement = false;
  17709. _this.throttledUpdateCachedStats = Object(_util_throttle__WEBPACK_IMPORTED_MODULE_21__["default"])(_this.updateCachedStats, 110);
  17710. return _this;
  17711. }
  17712. _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(AngleTool, [{
  17713. key: "createNewMeasurement",
  17714. value: function createNewMeasurement(eventData) {
  17715. // Create the measurement data for this tool with the end handle activated
  17716. return {
  17717. visible: true,
  17718. active: true,
  17719. color: undefined,
  17720. invalidated: true,
  17721. handles: {
  17722. start: {
  17723. x: eventData.currentPoints.image.x,
  17724. y: eventData.currentPoints.image.y,
  17725. highlight: true,
  17726. active: false
  17727. },
  17728. middle: {
  17729. x: eventData.currentPoints.image.x,
  17730. y: eventData.currentPoints.image.y,
  17731. highlight: true,
  17732. active: true
  17733. },
  17734. end: {
  17735. x: eventData.currentPoints.image.x,
  17736. y: eventData.currentPoints.image.y,
  17737. highlight: true,
  17738. active: false
  17739. },
  17740. textBox: {
  17741. active: false,
  17742. hasMoved: false,
  17743. movesIndependently: false,
  17744. drawnIndependently: true,
  17745. allowedOutsideImage: true,
  17746. hasBoundingBox: true
  17747. }
  17748. }
  17749. };
  17750. }
  17751. }, {
  17752. key: "pointNearTool",
  17753. value: function pointNearTool(element, data, coords) {
  17754. if (data.visible === false) {
  17755. return false;
  17756. }
  17757. return Object(_util_lineSegDistance_js__WEBPACK_IMPORTED_MODULE_15__["default"])(element, data.handles.start, data.handles.middle, coords) < 25 || Object(_util_lineSegDistance_js__WEBPACK_IMPORTED_MODULE_15__["default"])(element, data.handles.middle, data.handles.end, coords) < 25;
  17758. }
  17759. }, {
  17760. key: "updateCachedStats",
  17761. value: function updateCachedStats(image, element, data) {
  17762. var sideA = getSide(image, data.handles.middle, data.handles.start);
  17763. var sideB = getSide(image, data.handles.end, data.handles.middle);
  17764. var sideC = getSide(image, data.handles.end, data.handles.start);
  17765. var sideALength = length(sideA);
  17766. var sideBLength = length(sideB);
  17767. var sideCLength = length(sideC); // Cosine law
  17768. var angle = Math.acos((Math.pow(sideALength, 2) + Math.pow(sideBLength, 2) - Math.pow(sideCLength, 2)) / (2 * sideALength * sideBLength));
  17769. angle *= 180 / Math.PI;
  17770. data.rAngle = Object(_util_roundToDecimal_js__WEBPACK_IMPORTED_MODULE_16__["default"])(angle, 2);
  17771. data.invalidated = false;
  17772. }
  17773. }, {
  17774. key: "renderToolData",
  17775. value: function renderToolData(evt) {
  17776. var _this2 = this;
  17777. var eventData = evt.detail;
  17778. var enabledElement = eventData.enabledElement;
  17779. var _this$configuration = this.configuration,
  17780. handleRadius = _this$configuration.handleRadius,
  17781. drawHandlesOnHover = _this$configuration.drawHandlesOnHover,
  17782. hideHandlesIfMoving = _this$configuration.hideHandlesIfMoving,
  17783. renderDashed = _this$configuration.renderDashed; // If we have no toolData for this element, return immediately as there is nothing to do
  17784. var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_7__["getToolState"])(evt.currentTarget, this.name);
  17785. var lineDash = Object(_store_index__WEBPACK_IMPORTED_MODULE_22__["getModule"])('globalConfiguration').configuration.lineDash;
  17786. if (!toolData) {
  17787. return;
  17788. } // We have tool data for this element - iterate over each one and draw it
  17789. var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_11__["getNewContext"])(eventData.canvasContext.canvas);
  17790. var image = eventData.image,
  17791. element = eventData.element;
  17792. var _getPixelSpacing = Object(_util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_20__["default"])(image),
  17793. rowPixelSpacing = _getPixelSpacing.rowPixelSpacing,
  17794. colPixelSpacing = _getPixelSpacing.colPixelSpacing;
  17795. var lineWidth = _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_8__["default"].getToolWidth();
  17796. var _loop = function _loop(i) {
  17797. var data = toolData.data[i];
  17798. if (data.visible === false) {
  17799. return "continue";
  17800. }
  17801. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_11__["draw"])(context, function (context) {
  17802. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_11__["setShadow"])(context, _this2.configuration); // Differentiate the color of activation tool
  17803. var color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__["default"].getColorIfActive(data);
  17804. var handleStartCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pixelToCanvas(eventData.element, data.handles.start);
  17805. var handleMiddleCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pixelToCanvas(eventData.element, data.handles.middle);
  17806. var lineOptions = {
  17807. color: color
  17808. };
  17809. if (renderDashed) {
  17810. lineOptions.lineDash = lineDash;
  17811. }
  17812. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_11__["drawJoinedLines"])(context, eventData.element, data.handles.start, [data.handles.middle, data.handles.end], lineOptions); // Draw the handles
  17813. var handleOptions = {
  17814. color: color,
  17815. handleRadius: handleRadius,
  17816. drawHandlesIfActive: drawHandlesOnHover,
  17817. hideHandlesIfMoving: hideHandlesIfMoving
  17818. };
  17819. if (_this2.configuration.drawHandles) {
  17820. Object(_drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_14__["default"])(context, eventData, data.handles, handleOptions);
  17821. } // Update textbox stats
  17822. if (data.invalidated === true) {
  17823. if (data.rAngle) {
  17824. _this2.throttledUpdateCachedStats(image, element, data);
  17825. } else {
  17826. _this2.updateCachedStats(image, element, data);
  17827. }
  17828. }
  17829. if (data.rAngle) {
  17830. var text = textBoxText(data, rowPixelSpacing, colPixelSpacing);
  17831. var distance = 15;
  17832. var textCoords;
  17833. if (!data.handles.textBox.hasMoved) {
  17834. textCoords = {
  17835. x: handleMiddleCanvas.x,
  17836. y: handleMiddleCanvas.y
  17837. };
  17838. var padding = 5;
  17839. var textWidth = Object(_drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_13__["textBoxWidth"])(context, text, padding);
  17840. if (handleMiddleCanvas.x < handleStartCanvas.x) {
  17841. textCoords.x -= distance + textWidth + 10;
  17842. } else {
  17843. textCoords.x += distance;
  17844. }
  17845. var transform = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.internal.getTransform(enabledElement);
  17846. transform.invert();
  17847. var coords = transform.transformPoint(textCoords.x, textCoords.y);
  17848. data.handles.textBox.x = coords.x;
  17849. data.handles.textBox.y = coords.y;
  17850. }
  17851. Object(_drawing_drawLinkedTextBox_js__WEBPACK_IMPORTED_MODULE_12__["default"])(context, eventData.element, data.handles.textBox, text, data.handles, textBoxAnchorPoints, color, lineWidth, 0, true);
  17852. }
  17853. });
  17854. };
  17855. for (var i = 0; i < toolData.data.length; i++) {
  17856. var _ret = _loop(i);
  17857. if (_ret === "continue") continue;
  17858. }
  17859. function textBoxText(data, rowPixelSpacing, colPixelSpacing) {
  17860. var suffix = !rowPixelSpacing || !colPixelSpacing ? ' (isotropic)' : '';
  17861. var str = '00B0'; // Degrees symbol
  17862. return data.rAngle.toString() + String.fromCharCode(parseInt(str, 16)) + suffix;
  17863. }
  17864. function textBoxAnchorPoints(handles) {
  17865. return [handles.start, handles.middle, handles.end];
  17866. }
  17867. }
  17868. }, {
  17869. key: "addNewMeasurement",
  17870. value: function addNewMeasurement(evt, interactionType) {
  17871. var _this3 = this;
  17872. if (this.preventNewMeasurement) {
  17873. return;
  17874. }
  17875. this.preventNewMeasurement = true;
  17876. evt.preventDefault();
  17877. evt.stopPropagation();
  17878. var eventData = evt.detail;
  17879. var measurementData = this.createNewMeasurement(eventData);
  17880. var element = evt.detail.element; // Associate this data with this imageId so we can render it and manipulate it
  17881. Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_7__["addToolState"])(element, this.name, measurementData);
  17882. _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.updateImage(element); // Step 1, create start and second middle.
  17883. Object(_manipulators_index_js__WEBPACK_IMPORTED_MODULE_10__["moveNewHandle"])(eventData, this.name, measurementData, measurementData.handles.middle, this.options, interactionType, function (success) {
  17884. measurementData.active = false;
  17885. if (!success) {
  17886. Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_7__["removeToolState"])(element, _this3.name, measurementData);
  17887. _this3.preventNewMeasurement = false;
  17888. return;
  17889. }
  17890. measurementData.handles.end.active = true;
  17891. _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.updateImage(element); // Step 2, create end.
  17892. Object(_manipulators_index_js__WEBPACK_IMPORTED_MODULE_10__["moveNewHandle"])(eventData, _this3.name, measurementData, measurementData.handles.end, _this3.options, interactionType, function (success) {
  17893. if (success) {
  17894. measurementData.active = false;
  17895. _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.updateImage(element);
  17896. } else {
  17897. Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_7__["removeToolState"])(element, _this3.name, measurementData);
  17898. }
  17899. _this3.preventNewMeasurement = false;
  17900. _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.updateImage(element);
  17901. var modifiedEventData = {
  17902. toolName: _this3.name,
  17903. toolType: _this3.name,
  17904. // Deprecation notice: toolType will be replaced by toolName
  17905. element: element,
  17906. measurementData: measurementData
  17907. };
  17908. Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_18__["default"])(element, _events_js__WEBPACK_IMPORTED_MODULE_19__["default"].MEASUREMENT_COMPLETED, modifiedEventData);
  17909. });
  17910. });
  17911. }
  17912. }]);
  17913. return AngleTool;
  17914. }(_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]);
  17915. function length(vector) {
  17916. return Math.sqrt(Math.pow(vector.x, 2) + Math.pow(vector.y, 2));
  17917. }
  17918. function getSide(image, handleEnd, handleStart) {
  17919. var _getPixelSpacing2 = Object(_util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_20__["default"])(image),
  17920. rowPixelSpacing = _getPixelSpacing2.rowPixelSpacing,
  17921. colPixelSpacing = _getPixelSpacing2.colPixelSpacing;
  17922. return {
  17923. x: (handleEnd.x - handleStart.x) * (colPixelSpacing || 1),
  17924. y: (handleEnd.y - handleStart.y) * (rowPixelSpacing || 1)
  17925. };
  17926. }
  17927. /***/ }),
  17928. /***/ "./tools/annotation/ArrowAnnotateTool.js":
  17929. /*!***********************************************!*\
  17930. !*** ./tools/annotation/ArrowAnnotateTool.js ***!
  17931. \***********************************************/
  17932. /*! exports provided: default */
  17933. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  17934. "use strict";
  17935. __webpack_require__.r(__webpack_exports__);
  17936. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ArrowAnnotateTool; });
  17937. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
  17938. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
  17939. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
  17940. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
  17941. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
  17942. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
  17943. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
  17944. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
  17945. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
  17946. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
  17947. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../../externalModules.js */ "./externalModules.js");
  17948. /* harmony import */ var _base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../base/BaseAnnotationTool.js */ "./tools/base/BaseAnnotationTool.js");
  17949. /* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../../events.js */ "./events.js");
  17950. /* harmony import */ var _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./../../stateManagement/toolStyle.js */ "./stateManagement/toolStyle.js");
  17951. /* harmony import */ var _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./../../stateManagement/textStyle.js */ "./stateManagement/textStyle.js");
  17952. /* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./../../stateManagement/toolColors.js */ "./stateManagement/toolColors.js");
  17953. /* harmony import */ var _manipulators_index_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./../../manipulators/index.js */ "./manipulators/index.js");
  17954. /* harmony import */ var _util_pointInsideBoundingBox_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./../../util/pointInsideBoundingBox.js */ "./util/pointInsideBoundingBox.js");
  17955. /* harmony import */ var _util_lineSegDistance_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./../../util/lineSegDistance.js */ "./util/lineSegDistance.js");
  17956. /* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./../../util/triggerEvent.js */ "./util/triggerEvent.js");
  17957. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  17958. /* harmony import */ var _drawing_drawLinkedTextBox_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./../../drawing/drawLinkedTextBox.js */ "./drawing/drawLinkedTextBox.js");
  17959. /* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./../../drawing/index.js */ "./drawing/index.js");
  17960. /* harmony import */ var _drawing_drawArrow_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./../../drawing/drawArrow.js */ "./drawing/drawArrow.js");
  17961. /* harmony import */ var _drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./../../drawing/drawHandles.js */ "./drawing/drawHandles.js");
  17962. /* harmony import */ var _drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./../../drawing/drawTextBox.js */ "./drawing/drawTextBox.js");
  17963. /* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../cursors/index.js */ "./tools/cursors/index.js");
  17964. /* harmony import */ var _store_index__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../../store/index */ "./store/index.js");
  17965. /* eslint no-alert: 0 */
  17966. /**
  17967. * @public
  17968. * @class ArrowAnnotateTool
  17969. * @memberof Tools.Annotation
  17970. * @classdesc Create and position an arrow and label
  17971. * @extends Tools.Base.BaseAnnotationTool
  17972. */
  17973. var ArrowAnnotateTool =
  17974. /*#__PURE__*/
  17975. function (_BaseAnnotationTool) {
  17976. _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(ArrowAnnotateTool, _BaseAnnotationTool);
  17977. function ArrowAnnotateTool() {
  17978. var _this;
  17979. var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  17980. _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, ArrowAnnotateTool);
  17981. var defaultProps = {
  17982. name: 'ArrowAnnotate',
  17983. supportedInteractionTypes: ['Mouse', 'Touch'],
  17984. configuration: {
  17985. getTextCallback: getTextCallback,
  17986. changeTextCallback: changeTextCallback,
  17987. drawHandles: true,
  17988. drawHandlesOnHover: false,
  17989. hideHandlesIfMoving: false,
  17990. arrowFirst: true,
  17991. renderDashed: false,
  17992. allowEmptyLabel: false
  17993. },
  17994. svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_21__["arrowAnnotateCursor"]
  17995. };
  17996. _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(ArrowAnnotateTool).call(this, props, defaultProps));
  17997. _this.preventNewMeasurement = false;
  17998. return _this;
  17999. }
  18000. _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(ArrowAnnotateTool, [{
  18001. key: "createNewMeasurement",
  18002. value: function createNewMeasurement(evt) {
  18003. // Create the measurement data for this tool with the end handle activated
  18004. return {
  18005. visible: true,
  18006. active: true,
  18007. color: undefined,
  18008. handles: {
  18009. start: {
  18010. x: evt.detail.currentPoints.image.x,
  18011. y: evt.detail.currentPoints.image.y,
  18012. highlight: true,
  18013. active: false
  18014. },
  18015. end: {
  18016. x: evt.detail.currentPoints.image.x,
  18017. y: evt.detail.currentPoints.image.y,
  18018. highlight: true,
  18019. active: false
  18020. },
  18021. textBox: {
  18022. active: false,
  18023. hasMoved: false,
  18024. movesIndependently: false,
  18025. drawnIndependently: true,
  18026. allowedOutsideImage: true,
  18027. hasBoundingBox: true
  18028. }
  18029. }
  18030. };
  18031. }
  18032. }, {
  18033. key: "pointNearTool",
  18034. value: function pointNearTool(element, data, coords) {
  18035. if (data.visible === false) {
  18036. return false;
  18037. }
  18038. return Object(_util_lineSegDistance_js__WEBPACK_IMPORTED_MODULE_13__["default"])(element, data.handles.start, data.handles.end, coords) < 25;
  18039. }
  18040. }, {
  18041. key: "updateCachedStats",
  18042. value: function updateCachedStats() {// Implementing to satisfy BaseAnnotationTool
  18043. }
  18044. }, {
  18045. key: "renderToolData",
  18046. value: function renderToolData(evt) {
  18047. var _this2 = this;
  18048. var _evt$detail = evt.detail,
  18049. element = _evt$detail.element,
  18050. enabledElement = _evt$detail.enabledElement;
  18051. var _this$configuration = this.configuration,
  18052. handleRadius = _this$configuration.handleRadius,
  18053. drawHandlesOnHover = _this$configuration.drawHandlesOnHover,
  18054. hideHandlesIfMoving = _this$configuration.hideHandlesIfMoving,
  18055. renderDashed = _this$configuration.renderDashed; // If we have no toolData for this element, return immediately as there is nothing to do
  18056. var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_15__["getToolState"])(element, this.name);
  18057. if (!toolData) {
  18058. return;
  18059. } // We have tool data for this element - iterate over each one and draw it
  18060. var canvas = evt.detail.canvasContext.canvas;
  18061. var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_17__["getNewContext"])(canvas);
  18062. var lineWidth = _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_8__["default"].getToolWidth();
  18063. var lineDash;
  18064. if (renderDashed) {
  18065. lineDash = Object(_store_index__WEBPACK_IMPORTED_MODULE_22__["getModule"])('globalConfiguration').configuration.lineDash;
  18066. }
  18067. var _loop = function _loop(i) {
  18068. var data = toolData.data[i];
  18069. if (data.visible === false) {
  18070. return "continue";
  18071. }
  18072. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_17__["draw"])(context, function (context) {
  18073. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_17__["setShadow"])(context, _this2.configuration);
  18074. var color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_10__["default"].getColorIfActive(data); // Draw the arrow
  18075. var handleStartCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pixelToCanvas(element, data.handles.start);
  18076. var handleEndCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pixelToCanvas(element, data.handles.end); // Config.arrowFirst = false;
  18077. if (_this2.configuration.arrowFirst) {
  18078. Object(_drawing_drawArrow_js__WEBPACK_IMPORTED_MODULE_18__["default"])(context, handleEndCanvas, handleStartCanvas, color, lineWidth, lineDash);
  18079. } else {
  18080. Object(_drawing_drawArrow_js__WEBPACK_IMPORTED_MODULE_18__["default"])(context, handleStartCanvas, handleEndCanvas, color, lineWidth, lineDash);
  18081. }
  18082. var handleOptions = {
  18083. color: color,
  18084. handleRadius: handleRadius,
  18085. drawHandlesIfActive: drawHandlesOnHover,
  18086. hideHandlesIfMoving: hideHandlesIfMoving
  18087. };
  18088. if (_this2.configuration.drawHandles) {
  18089. Object(_drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_19__["default"])(context, evt.detail, data.handles, handleOptions);
  18090. }
  18091. var text = textBoxText(data); // Draw the text
  18092. if (text && text !== '') {
  18093. // Calculate the text coordinates.
  18094. var padding = 5;
  18095. var textWidth = Object(_drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_20__["textBoxWidth"])(context, text, padding);
  18096. var textHeight = _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_9__["default"].getFontSize() + 10;
  18097. var distance = Math.max(textWidth, textHeight) / 2 + 5;
  18098. if (handleEndCanvas.x < handleStartCanvas.x) {
  18099. distance = -distance;
  18100. }
  18101. if (!data.handles.textBox.hasMoved) {
  18102. var textCoords;
  18103. if (_this2.configuration.arrowFirst) {
  18104. textCoords = {
  18105. x: handleEndCanvas.x - textWidth / 2 + distance,
  18106. y: handleEndCanvas.y - textHeight / 2
  18107. };
  18108. } else {
  18109. // If the arrow is at the End position, the text should
  18110. // Be placed near the Start position
  18111. textCoords = {
  18112. x: handleStartCanvas.x - textWidth / 2 - distance,
  18113. y: handleStartCanvas.y - textHeight / 2
  18114. };
  18115. }
  18116. var transform = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.internal.getTransform(enabledElement);
  18117. transform.invert();
  18118. var coords = transform.transformPoint(textCoords.x, textCoords.y);
  18119. data.handles.textBox.x = coords.x;
  18120. data.handles.textBox.y = coords.y;
  18121. }
  18122. Object(_drawing_drawLinkedTextBox_js__WEBPACK_IMPORTED_MODULE_16__["default"])(context, element, data.handles.textBox, text, data.handles, textBoxAnchorPoints, color, lineWidth, 0, false);
  18123. }
  18124. });
  18125. };
  18126. for (var i = 0; i < toolData.data.length; i++) {
  18127. var _ret = _loop(i);
  18128. if (_ret === "continue") continue;
  18129. }
  18130. function textBoxText(data) {
  18131. return data.text;
  18132. }
  18133. function textBoxAnchorPoints(handles) {
  18134. var midpoint = {
  18135. x: (handles.start.x + handles.end.x) / 2,
  18136. y: (handles.start.y + handles.end.y) / 2
  18137. };
  18138. return [handles.start, midpoint, handles.end];
  18139. }
  18140. }
  18141. }, {
  18142. key: "addNewMeasurement",
  18143. value: function addNewMeasurement(evt, interactionType) {
  18144. var _this3 = this;
  18145. var element = evt.detail.element;
  18146. var measurementData = this.createNewMeasurement(evt);
  18147. var allowEmptyLabel = this.configuration.allowEmptyLabel; // Associate this data with this imageId so we can render it and manipulate it
  18148. Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_15__["addToolState"])(element, this.name, measurementData);
  18149. _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.updateImage(element);
  18150. Object(_manipulators_index_js__WEBPACK_IMPORTED_MODULE_11__["moveNewHandle"])(evt.detail, this.name, measurementData, measurementData.handles.end, this.options, interactionType, function (success) {
  18151. if (success) {
  18152. if (measurementData.text === undefined) {
  18153. _this3.configuration.getTextCallback(function (text) {
  18154. if (text || allowEmptyLabel) {
  18155. measurementData.text = text;
  18156. measurementData.active = false;
  18157. var modifiedEventData = {
  18158. toolName: _this3.name,
  18159. toolType: _this3.name,
  18160. // Deprecation notice: toolType will be replaced by toolName
  18161. element: element,
  18162. measurementData: measurementData
  18163. };
  18164. _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.updateImage(element);
  18165. Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_14__["default"])(element, _events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MEASUREMENT_COMPLETED, modifiedEventData);
  18166. } else {
  18167. Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_15__["removeToolState"])(element, _this3.name, measurementData);
  18168. }
  18169. }, evt.detail);
  18170. }
  18171. } else {
  18172. Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_15__["removeToolState"])(element, _this3.name, measurementData);
  18173. }
  18174. _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.updateImage(element);
  18175. });
  18176. }
  18177. }, {
  18178. key: "doubleClickCallback",
  18179. value: function doubleClickCallback(evt) {
  18180. return this._updateTextForNearbyAnnotation(evt);
  18181. }
  18182. }, {
  18183. key: "touchPressCallback",
  18184. value: function touchPressCallback(evt) {
  18185. return this._updateTextForNearbyAnnotation(evt);
  18186. }
  18187. }, {
  18188. key: "_updateTextForNearbyAnnotation",
  18189. value: function _updateTextForNearbyAnnotation(evt) {
  18190. var element = evt.detail.element;
  18191. var coords = evt.detail.currentPoints.canvas;
  18192. var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_15__["getToolState"])(element, this.name);
  18193. if (!toolState) {
  18194. return false;
  18195. }
  18196. for (var i = 0; i < toolState.data.length; i++) {
  18197. var data = toolState.data[i];
  18198. if (this.pointNearTool(element, data, coords) || Object(_util_pointInsideBoundingBox_js__WEBPACK_IMPORTED_MODULE_12__["default"])(data.handles.textBox, coords)) {
  18199. data.active = true;
  18200. _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.updateImage(element); // Allow relabelling via a callback
  18201. this.configuration.changeTextCallback(data, evt.detail, this._doneChangingTextCallback.bind(this, element, data));
  18202. evt.stopImmediatePropagation();
  18203. evt.preventDefault();
  18204. evt.stopPropagation();
  18205. return true;
  18206. }
  18207. }
  18208. }
  18209. }, {
  18210. key: "_doneChangingTextCallback",
  18211. value: function _doneChangingTextCallback(element, measurementData, updatedText, deleteTool) {
  18212. if (deleteTool === true) {
  18213. Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_15__["removeToolState"])(element, this.name, measurementData);
  18214. } else {
  18215. measurementData.text = updatedText;
  18216. }
  18217. measurementData.active = false;
  18218. _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.updateImage(element);
  18219. Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_14__["default"])(element, _events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MEASUREMENT_MODIFIED, {
  18220. toolName: this.name,
  18221. toolType: this.name,
  18222. // Deprecation notice: toolType will be replaced by toolName
  18223. element: element,
  18224. measurementData: measurementData
  18225. });
  18226. }
  18227. }]);
  18228. return ArrowAnnotateTool;
  18229. }(_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]);
  18230. function getTextCallback(doneChangingTextCallback) {
  18231. doneChangingTextCallback(prompt('Enter your annotation:'));
  18232. }
  18233. function changeTextCallback(data, eventData, doneChangingTextCallback) {
  18234. doneChangingTextCallback(prompt('Change your annotation:'));
  18235. }
  18236. /***/ }),
  18237. /***/ "./tools/annotation/BidirectionalTool.js":
  18238. /*!***********************************************!*\
  18239. !*** ./tools/annotation/BidirectionalTool.js ***!
  18240. \***********************************************/
  18241. /*! exports provided: default */
  18242. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  18243. "use strict";
  18244. __webpack_require__.r(__webpack_exports__);
  18245. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return BidirectionalTool; });
  18246. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
  18247. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
  18248. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
  18249. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
  18250. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
  18251. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
  18252. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
  18253. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
  18254. /* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js");
  18255. /* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__);
  18256. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
  18257. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__);
  18258. /* harmony import */ var _base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../base/BaseAnnotationTool.js */ "./tools/base/BaseAnnotationTool.js");
  18259. /* harmony import */ var _bidirectionalTool_createNewMeasurement_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./bidirectionalTool/createNewMeasurement.js */ "./tools/annotation/bidirectionalTool/createNewMeasurement.js");
  18260. /* harmony import */ var _bidirectionalTool_pointNearTool_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./bidirectionalTool/pointNearTool.js */ "./tools/annotation/bidirectionalTool/pointNearTool.js");
  18261. /* harmony import */ var _bidirectionalTool_renderToolData_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./bidirectionalTool/renderToolData.js */ "./tools/annotation/bidirectionalTool/renderToolData.js");
  18262. /* harmony import */ var _bidirectionalTool_addNewMeasurement_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./bidirectionalTool/addNewMeasurement.js */ "./tools/annotation/bidirectionalTool/addNewMeasurement.js");
  18263. /* harmony import */ var _bidirectionalTool_mouseMoveCallback_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./bidirectionalTool/mouseMoveCallback.js */ "./tools/annotation/bidirectionalTool/mouseMoveCallback.js");
  18264. /* harmony import */ var _bidirectionalTool_handleSelectedCallback_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./bidirectionalTool/handleSelectedCallback.js */ "./tools/annotation/bidirectionalTool/handleSelectedCallback.js");
  18265. /* harmony import */ var _bidirectionalTool_handleSelectedMouseCallback_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./bidirectionalTool/handleSelectedMouseCallback.js */ "./tools/annotation/bidirectionalTool/handleSelectedMouseCallback.js");
  18266. /* harmony import */ var _bidirectionalTool_handleSelectedTouchCallback_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./bidirectionalTool/handleSelectedTouchCallback.js */ "./tools/annotation/bidirectionalTool/handleSelectedTouchCallback.js");
  18267. /* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../cursors/index.js */ "./tools/cursors/index.js");
  18268. /* harmony import */ var _util_throttle__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../util/throttle */ "./util/throttle.js");
  18269. /* harmony import */ var _util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../util/getPixelSpacing */ "./util/getPixelSpacing.js");
  18270. /* harmony import */ var _bidirectionalTool_utils_calculateLongestAndShortestDiameters__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./bidirectionalTool/utils/calculateLongestAndShortestDiameters */ "./tools/annotation/bidirectionalTool/utils/calculateLongestAndShortestDiameters.js");
  18271. var emptyLocationCallback = function emptyLocationCallback(measurementData, eventData, doneCallback) {
  18272. return doneCallback();
  18273. };
  18274. /**
  18275. * @public
  18276. * @class BidirectionalTool
  18277. * @memberof Tools.Annotation
  18278. * @classdesc Create and position an annotation that measures the
  18279. * length and width of a region.
  18280. * @extends Tools.Base.BaseAnnotationTool
  18281. */
  18282. var BidirectionalTool =
  18283. /*#__PURE__*/
  18284. function (_BaseAnnotationTool) {
  18285. _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(BidirectionalTool, _BaseAnnotationTool);
  18286. function BidirectionalTool(props) {
  18287. var _this;
  18288. _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, BidirectionalTool);
  18289. var defaultProps = {
  18290. name: 'Bidirectional',
  18291. supportedInteractionTypes: ['Mouse', 'Touch'],
  18292. configuration: {
  18293. changeMeasurementLocationCallback: emptyLocationCallback,
  18294. getMeasurementLocationCallback: emptyLocationCallback,
  18295. textBox: '',
  18296. shadow: '',
  18297. drawHandles: true,
  18298. drawHandlesOnHover: true,
  18299. hideHandlesIfMoving: false,
  18300. renderDashed: false,
  18301. additionalData: []
  18302. },
  18303. svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_15__["bidirectionalCursor"]
  18304. };
  18305. _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(BidirectionalTool).call(this, props, defaultProps));
  18306. _this.throttledUpdateCachedStats = Object(_util_throttle__WEBPACK_IMPORTED_MODULE_16__["default"])(_this.updateCachedStats, 110);
  18307. _this.createNewMeasurement = _bidirectionalTool_createNewMeasurement_js__WEBPACK_IMPORTED_MODULE_7__["default"].bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  18308. _this.pointNearTool = _bidirectionalTool_pointNearTool_js__WEBPACK_IMPORTED_MODULE_8__["default"].bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  18309. _this.renderToolData = _bidirectionalTool_renderToolData_js__WEBPACK_IMPORTED_MODULE_9__["default"].bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  18310. _this.addNewMeasurement = _bidirectionalTool_addNewMeasurement_js__WEBPACK_IMPORTED_MODULE_10__["default"].bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  18311. _this._moveCallback = _bidirectionalTool_mouseMoveCallback_js__WEBPACK_IMPORTED_MODULE_11__["default"].bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  18312. _this.handleSelectedCallback = _bidirectionalTool_handleSelectedCallback_js__WEBPACK_IMPORTED_MODULE_12__["default"].bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  18313. _this.handleSelectedMouseCallback = _bidirectionalTool_handleSelectedMouseCallback_js__WEBPACK_IMPORTED_MODULE_13__["default"].bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  18314. _this.handleSelectedTouchCallback = _bidirectionalTool_handleSelectedTouchCallback_js__WEBPACK_IMPORTED_MODULE_14__["default"].bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  18315. return _this;
  18316. }
  18317. _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(BidirectionalTool, [{
  18318. key: "updateCachedStats",
  18319. value: function updateCachedStats(image, element, data) {
  18320. // Prevent updating other tools' data
  18321. if (data.toolName !== this.name) {
  18322. return;
  18323. }
  18324. var pixelSpacing = Object(_util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_17__["default"])(image);
  18325. var _calculateLongestAndS = Object(_bidirectionalTool_utils_calculateLongestAndShortestDiameters__WEBPACK_IMPORTED_MODULE_18__["default"])(data, pixelSpacing),
  18326. longestDiameter = _calculateLongestAndS.longestDiameter,
  18327. shortestDiameter = _calculateLongestAndS.shortestDiameter; // Set measurement text to show lesion table
  18328. data.longestDiameter = longestDiameter;
  18329. data.shortestDiameter = shortestDiameter;
  18330. data.invalidated = false;
  18331. }
  18332. }]);
  18333. return BidirectionalTool;
  18334. }(_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]);
  18335. /***/ }),
  18336. /***/ "./tools/annotation/CircleRoiTool.js":
  18337. /*!*******************************************!*\
  18338. !*** ./tools/annotation/CircleRoiTool.js ***!
  18339. \*******************************************/
  18340. /*! exports provided: default */
  18341. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  18342. "use strict";
  18343. __webpack_require__.r(__webpack_exports__);
  18344. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return CircleRoiTool; });
  18345. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
  18346. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
  18347. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
  18348. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
  18349. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
  18350. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
  18351. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
  18352. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
  18353. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
  18354. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
  18355. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../../externalModules.js */ "./externalModules.js");
  18356. /* harmony import */ var _base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../base/BaseAnnotationTool.js */ "./tools/base/BaseAnnotationTool.js");
  18357. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  18358. /* harmony import */ var _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./../../stateManagement/toolStyle.js */ "./stateManagement/toolStyle.js");
  18359. /* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./../../stateManagement/toolColors.js */ "./stateManagement/toolColors.js");
  18360. /* harmony import */ var _store_index__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../store/index */ "./store/index.js");
  18361. /* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./../../drawing/index.js */ "./drawing/index.js");
  18362. /* harmony import */ var _util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./../../util/calculateSUV.js */ "./util/calculateSUV.js");
  18363. /* harmony import */ var _util_ellipse_index_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./../../util/ellipse/index.js */ "./util/ellipse/index.js");
  18364. /* harmony import */ var _util_getROITextBoxCoords_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../util/getROITextBoxCoords.js */ "./util/getROITextBoxCoords.js");
  18365. /* harmony import */ var _util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./../../util/numbersWithCommas.js */ "./util/numbersWithCommas.js");
  18366. /* harmony import */ var _util_throttle_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./../../util/throttle.js */ "./util/throttle.js");
  18367. /* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../util/logger.js */ "./util/logger.js");
  18368. /* harmony import */ var _util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../util/getPixelSpacing */ "./util/getPixelSpacing.js");
  18369. /* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../cursors/index.js */ "./tools/cursors/index.js");
  18370. /* harmony import */ var _util_getCircleCoords__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../../util/getCircleCoords */ "./util/getCircleCoords.js");
  18371. // State
  18372. // Drawing
  18373. // Util
  18374. var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_17__["getLogger"])('tools:annotation:CircleRoiTool');
  18375. /**
  18376. * @public
  18377. * @class CircleRoiTool
  18378. * @memberof Tools.Annotation
  18379. * @classdesc Tool for drawing circular regions of interest, and measuring
  18380. * the statistics of the enclosed pixels.
  18381. * @extends Tools.Base.BaseAnnotationTool
  18382. */
  18383. var CircleRoiTool =
  18384. /*#__PURE__*/
  18385. function (_BaseAnnotationTool) {
  18386. _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(CircleRoiTool, _BaseAnnotationTool);
  18387. function CircleRoiTool() {
  18388. var _this;
  18389. var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  18390. _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, CircleRoiTool);
  18391. var defaultProps = {
  18392. name: 'CircleRoi',
  18393. supportedInteractionTypes: ['Mouse', 'Touch'],
  18394. svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_19__["circleRoiCursor"],
  18395. configuration: {
  18396. centerPointRadius: 0,
  18397. renderDashed: false,
  18398. hideHandlesIfMoving: false
  18399. }
  18400. };
  18401. _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(CircleRoiTool).call(this, props, defaultProps));
  18402. _this.throttledUpdateCachedStats = Object(_util_throttle_js__WEBPACK_IMPORTED_MODULE_16__["default"])(_this.updateCachedStats, 110);
  18403. return _this;
  18404. }
  18405. _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(CircleRoiTool, [{
  18406. key: "createNewMeasurement",
  18407. value: function createNewMeasurement(eventData) {
  18408. var goodEventData = eventData && eventData.currentPoints && eventData.currentPoints.image;
  18409. if (!goodEventData) {
  18410. logger.error("required eventData not supplied to tool ".concat(this.name, "'s createNewMeasurement"));
  18411. return;
  18412. }
  18413. return {
  18414. visible: true,
  18415. active: true,
  18416. color: undefined,
  18417. invalidated: true,
  18418. handles: {
  18419. start: {
  18420. x: eventData.currentPoints.image.x,
  18421. y: eventData.currentPoints.image.y,
  18422. highlight: true,
  18423. active: false
  18424. },
  18425. end: {
  18426. x: eventData.currentPoints.image.x,
  18427. y: eventData.currentPoints.image.y,
  18428. highlight: true,
  18429. active: true
  18430. },
  18431. initialRotation: eventData.viewport.rotation,
  18432. textBox: {
  18433. active: false,
  18434. hasMoved: false,
  18435. movesIndependently: false,
  18436. drawnIndependently: true,
  18437. allowedOutsideImage: true,
  18438. hasBoundingBox: true
  18439. }
  18440. }
  18441. };
  18442. }
  18443. }, {
  18444. key: "pointNearTool",
  18445. value: function pointNearTool(element, data, coords, interactionType) {
  18446. var hasStartAndEndHandles = data && data.handles && data.handles.start && data.handles.end;
  18447. var getDistance = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstoneMath.point.distance;
  18448. if (!hasStartAndEndHandles) {
  18449. logger.warn("invalid parameters supplied to tool ".concat(this.name, "'s pointNearTool"));
  18450. }
  18451. if (!hasStartAndEndHandles || data.visible === false) {
  18452. return false;
  18453. }
  18454. var distance = interactionType === 'mouse' ? 15 : 25;
  18455. var startCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pixelToCanvas(element, data.handles.start);
  18456. var endCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pixelToCanvas(element, data.handles.end); // StartCanvas is the center of the circle
  18457. var distanceFromCenter = getDistance(startCanvas, coords); // Getting radius of circle annotation in canvas
  18458. var radius = getDistance(startCanvas, endCanvas); // Checking if point is near the tool by comparing its distance from the center of the circle
  18459. return distanceFromCenter > radius - distance / 2 && distanceFromCenter < radius + distance / 2;
  18460. }
  18461. }, {
  18462. key: "updateCachedStats",
  18463. value: function updateCachedStats(image, element, data) {
  18464. var seriesModule = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.metaData.get('generalSeriesModule', image.imageId) || {};
  18465. var modality = seriesModule.modality;
  18466. var pixelSpacing = Object(_util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_18__["default"])(image);
  18467. var stats = _calculateStats(image, element, data.handles, modality, pixelSpacing);
  18468. data.cachedStats = stats;
  18469. data.invalidated = false;
  18470. }
  18471. }, {
  18472. key: "renderToolData",
  18473. value: function renderToolData(evt) {
  18474. var _this2 = this;
  18475. var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_7__["getToolState"])(evt.currentTarget, this.name);
  18476. if (!toolData) {
  18477. return;
  18478. }
  18479. var getDistance = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstoneMath.point.distance;
  18480. var eventData = evt.detail;
  18481. var image = eventData.image,
  18482. element = eventData.element,
  18483. canvasContext = eventData.canvasContext;
  18484. var lineWidth = _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_8__["default"].getToolWidth();
  18485. var _this$configuration = this.configuration,
  18486. handleRadius = _this$configuration.handleRadius,
  18487. drawHandlesOnHover = _this$configuration.drawHandlesOnHover,
  18488. hideHandlesIfMoving = _this$configuration.hideHandlesIfMoving,
  18489. renderDashed = _this$configuration.renderDashed,
  18490. centerPointRadius = _this$configuration.centerPointRadius;
  18491. var newContext = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_11__["getNewContext"])(canvasContext.canvas);
  18492. var _getPixelSpacing = Object(_util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_18__["default"])(image),
  18493. rowPixelSpacing = _getPixelSpacing.rowPixelSpacing,
  18494. colPixelSpacing = _getPixelSpacing.colPixelSpacing;
  18495. var lineDash = Object(_store_index__WEBPACK_IMPORTED_MODULE_10__["getModule"])('globalConfiguration').configuration.lineDash; // Meta
  18496. var seriesModule = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.metaData.get('generalSeriesModule', image.imageId) || {}; // Pixel Spacing
  18497. var modality = seriesModule.modality;
  18498. var hasPixelSpacing = rowPixelSpacing && colPixelSpacing;
  18499. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_11__["draw"])(newContext, function (context) {
  18500. // If we have tool data for this element, iterate over each set and draw it
  18501. for (var i = 0; i < toolData.data.length; i++) {
  18502. var data = toolData.data[i];
  18503. if (data.visible === false) {
  18504. continue;
  18505. } // Configure
  18506. var color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__["default"].getColorIfActive(data);
  18507. var handleOptions = {
  18508. color: color,
  18509. handleRadius: handleRadius,
  18510. drawHandlesIfActive: drawHandlesOnHover,
  18511. hideHandlesIfMoving: hideHandlesIfMoving
  18512. };
  18513. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_11__["setShadow"])(context, _this2.configuration);
  18514. var startCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pixelToCanvas(element, data.handles.start);
  18515. var endCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pixelToCanvas(element, data.handles.end); // Calculating the radius where startCanvas is the center of the circle to be drawn
  18516. var radius = getDistance(startCanvas, endCanvas);
  18517. var circleOptions = {
  18518. color: color
  18519. };
  18520. if (renderDashed) {
  18521. circleOptions.lineDash = lineDash;
  18522. } // Draw Circle
  18523. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_11__["drawCircle"])(context, element, data.handles.start, radius, circleOptions, 'pixel');
  18524. if (centerPointRadius && radius > 3 * centerPointRadius) {
  18525. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_11__["drawCircle"])(context, element, data.handles.start, centerPointRadius, circleOptions, 'pixel');
  18526. }
  18527. if (data.handles) {
  18528. data.handles.start.drawnIndependently = true;
  18529. data.handles.end.drawnIndependently = true;
  18530. }
  18531. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_11__["drawHandles"])(context, eventData, data.handles, handleOptions); // Update textbox stats
  18532. if (data.invalidated === true) {
  18533. if (data.cachedStats) {
  18534. _this2.throttledUpdateCachedStats(image, element, data);
  18535. } else {
  18536. _this2.updateCachedStats(image, element, data);
  18537. }
  18538. } // Default to textbox on right side of ROI
  18539. if (!data.handles.textBox.hasMoved) {
  18540. var defaultCoords = Object(_util_getROITextBoxCoords_js__WEBPACK_IMPORTED_MODULE_14__["default"])(eventData.viewport, data.handles);
  18541. Object.assign(data.handles.textBox, defaultCoords);
  18542. }
  18543. var textBoxAnchorPoints = function textBoxAnchorPoints(handles) {
  18544. return _findTextBoxAnchorPoints(handles.start, handles.end);
  18545. };
  18546. var textBoxContent = _createTextBoxContent(context, image.color, data.cachedStats, modality, hasPixelSpacing, _this2.configuration);
  18547. data.unit = _getUnit(modality, _this2.configuration.showHounsfieldUnits);
  18548. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_11__["drawLinkedTextBox"])(context, element, data.handles.textBox, textBoxContent, data.handles, textBoxAnchorPoints, color, lineWidth, 10, true);
  18549. }
  18550. });
  18551. }
  18552. }]);
  18553. return CircleRoiTool;
  18554. }(_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]);
  18555. /**
  18556. *
  18557. *
  18558. * @param {*} startHandle
  18559. * @param {*} endHandle
  18560. * @returns {Array.<{x: number, y: number}>}
  18561. */
  18562. function _findTextBoxAnchorPoints(startHandle, endHandle) {
  18563. var _getCircleCoords = Object(_util_getCircleCoords__WEBPACK_IMPORTED_MODULE_20__["default"])(startHandle, endHandle),
  18564. left = _getCircleCoords.left,
  18565. top = _getCircleCoords.top,
  18566. width = _getCircleCoords.width,
  18567. height = _getCircleCoords.height;
  18568. return [{
  18569. // Top middle point of ellipse
  18570. x: left + width / 2,
  18571. y: top
  18572. }, {
  18573. // Left middle point of ellipse
  18574. x: left,
  18575. y: top + height / 2
  18576. }, {
  18577. // Bottom middle point of ellipse
  18578. x: left + width / 2,
  18579. y: top + height
  18580. }, {
  18581. // Right middle point of ellipse
  18582. x: left + width,
  18583. y: top + height / 2
  18584. }];
  18585. }
  18586. function _getUnit(modality, showHounsfieldUnits) {
  18587. return modality === 'CT' && showHounsfieldUnits !== false ? 'HU' : '';
  18588. }
  18589. /**
  18590. *
  18591. *
  18592. * @param {*} context
  18593. * @param {*} isColorImage
  18594. * @param {*} { area, mean, stdDev, min, max, meanStdDevSUV }
  18595. * @param {*} modality
  18596. * @param {*} hasPixelSpacing
  18597. * @param {*} [options={}] - { showMinMax, showHounsfieldUnits }
  18598. * @returns {string[]}
  18599. */
  18600. function _createTextBoxContent(context, isColorImage) {
  18601. var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
  18602. _ref$area = _ref.area,
  18603. area = _ref$area === void 0 ? 0 : _ref$area,
  18604. _ref$radius = _ref.radius,
  18605. radius = _ref$radius === void 0 ? 0 : _ref$radius,
  18606. _ref$perimeter = _ref.perimeter,
  18607. perimeter = _ref$perimeter === void 0 ? 0 : _ref$perimeter,
  18608. _ref$mean = _ref.mean,
  18609. mean = _ref$mean === void 0 ? 0 : _ref$mean,
  18610. _ref$stdDev = _ref.stdDev,
  18611. stdDev = _ref$stdDev === void 0 ? 0 : _ref$stdDev,
  18612. _ref$min = _ref.min,
  18613. min = _ref$min === void 0 ? 0 : _ref$min,
  18614. _ref$max = _ref.max,
  18615. max = _ref$max === void 0 ? 0 : _ref$max,
  18616. _ref$meanStdDevSUV = _ref.meanStdDevSUV,
  18617. meanStdDevSUV = _ref$meanStdDevSUV === void 0 ? 0 : _ref$meanStdDevSUV;
  18618. var modality = arguments.length > 3 ? arguments[3] : undefined;
  18619. var hasPixelSpacing = arguments.length > 4 ? arguments[4] : undefined;
  18620. var options = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};
  18621. var showMinMax = options.showMinMax || false;
  18622. var textLines = []; // Don't display mean/standardDev for color images
  18623. var otherLines = [];
  18624. if (!isColorImage) {
  18625. var hasStandardUptakeValues = meanStdDevSUV && meanStdDevSUV.mean !== 0;
  18626. var unit = _getUnit(modality, options.showHounsfieldUnits);
  18627. var meanString = "Mean: ".concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_15__["default"])(mean.toFixed(2)), " ").concat(unit);
  18628. var stdDevString = "Std Dev: ".concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_15__["default"])(stdDev.toFixed(2)), " ").concat(unit); // If this image has SUV values to display, concatenate them to the text line
  18629. if (hasStandardUptakeValues) {
  18630. var SUVtext = ' SUV: ';
  18631. var meanSuvString = "".concat(SUVtext).concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_15__["default"])(meanStdDevSUV.mean.toFixed(2)));
  18632. var stdDevSuvString = "".concat(SUVtext).concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_15__["default"])(meanStdDevSUV.stdDev.toFixed(2)));
  18633. var targetStringLength = Math.floor(context.measureText("".concat(stdDevString, " ")).width);
  18634. while (context.measureText(meanString).width < targetStringLength) {
  18635. meanString += ' ';
  18636. }
  18637. otherLines.push("".concat(meanString).concat(meanSuvString));
  18638. otherLines.push("".concat(stdDevString, " ").concat(stdDevSuvString));
  18639. } else {
  18640. otherLines.push("".concat(meanString, " ").concat(stdDevString));
  18641. }
  18642. if (showMinMax) {
  18643. var minString = "Min: ".concat(min, " ").concat(unit);
  18644. var maxString = "Max: ".concat(max, " ").concat(unit);
  18645. var _targetStringLength = hasStandardUptakeValues ? Math.floor(context.measureText("".concat(stdDevString, " ")).width) : Math.floor(context.measureText("".concat(meanString, " ")).width);
  18646. while (context.measureText(minString).width < _targetStringLength) {
  18647. minString += ' ';
  18648. }
  18649. otherLines.push("".concat(minString).concat(maxString));
  18650. }
  18651. }
  18652. textLines.push(_formatArea(area, hasPixelSpacing));
  18653. if (radius) {
  18654. textLines.push(_formatLength(radius, 'Radius', hasPixelSpacing));
  18655. }
  18656. if (perimeter) {
  18657. textLines.push(_formatLength(perimeter, 'Perimeter', hasPixelSpacing));
  18658. }
  18659. otherLines.forEach(function (x) {
  18660. return textLines.push(x);
  18661. });
  18662. return textLines;
  18663. }
  18664. /**
  18665. *
  18666. *
  18667. * @param {*} area
  18668. * @param {*} hasPixelSpacing
  18669. * @returns {string} The formatted label for showing area
  18670. */
  18671. function _formatArea(area, hasPixelSpacing) {
  18672. // This uses Char code 178 for a superscript 2
  18673. var suffix = hasPixelSpacing ? " mm".concat(String.fromCharCode(178)) : " px".concat(String.fromCharCode(178));
  18674. return "Area: ".concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_15__["default"])(area.toFixed(2))).concat(suffix);
  18675. }
  18676. function _formatLength(value, name, hasPixelSpacing) {
  18677. if (!value) {
  18678. return '';
  18679. }
  18680. var suffix = hasPixelSpacing ? ' mm' : ' px';
  18681. return "".concat(name, ": ").concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_15__["default"])(value.toFixed(1))).concat(suffix);
  18682. }
  18683. /**
  18684. *
  18685. *
  18686. * @param {*} image
  18687. * @param {*} element
  18688. * @param {*} handles
  18689. * @param {*} modality
  18690. * @param {*} pixelSpacing
  18691. * @returns {Object} The Stats object
  18692. */
  18693. function _calculateStats(image, element, handles, modality, pixelSpacing) {
  18694. // Retrieve the bounds of the ellipse in image coordinates
  18695. var circleCoordinates = Object(_util_getCircleCoords__WEBPACK_IMPORTED_MODULE_20__["default"])(handles.start, handles.end); // Retrieve the array of pixels that the ellipse bounds cover
  18696. var pixels = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.getPixels(element, circleCoordinates.left, circleCoordinates.top, circleCoordinates.width, circleCoordinates.height); // Calculate the mean & standard deviation from the pixels and the ellipse details.
  18697. var ellipseMeanStdDev = Object(_util_ellipse_index_js__WEBPACK_IMPORTED_MODULE_13__["calculateEllipseStatistics"])(pixels, circleCoordinates);
  18698. var meanStdDevSUV;
  18699. if (modality === 'PT') {
  18700. meanStdDevSUV = {
  18701. mean: Object(_util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_12__["default"])(image, ellipseMeanStdDev.mean, true) || 0,
  18702. stdDev: Object(_util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_12__["default"])(image, ellipseMeanStdDev.stdDev, true) || 0
  18703. };
  18704. }
  18705. var radius = circleCoordinates.width * (pixelSpacing && pixelSpacing.colPixelSpacing || 1) / 2;
  18706. var perimeter = 2 * Math.PI * radius;
  18707. var area = Math.PI * (circleCoordinates.width * (pixelSpacing && pixelSpacing.colPixelSpacing || 1) / 2) * (circleCoordinates.height * (pixelSpacing && pixelSpacing.rowPixelSpacing || 1) / 2);
  18708. return {
  18709. area: area || 0,
  18710. radius: radius || 0,
  18711. perimeter: perimeter || 0,
  18712. count: ellipseMeanStdDev.count || 0,
  18713. mean: ellipseMeanStdDev.mean || 0,
  18714. variance: ellipseMeanStdDev.variance || 0,
  18715. stdDev: ellipseMeanStdDev.stdDev || 0,
  18716. min: ellipseMeanStdDev.min || 0,
  18717. max: ellipseMeanStdDev.max || 0,
  18718. meanStdDevSUV: meanStdDevSUV
  18719. };
  18720. }
  18721. /***/ }),
  18722. /***/ "./tools/annotation/CobbAngleTool.js":
  18723. /*!*******************************************!*\
  18724. !*** ./tools/annotation/CobbAngleTool.js ***!
  18725. \*******************************************/
  18726. /*! exports provided: default */
  18727. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  18728. "use strict";
  18729. __webpack_require__.r(__webpack_exports__);
  18730. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return CobbAngleTool; });
  18731. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
  18732. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
  18733. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
  18734. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
  18735. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
  18736. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
  18737. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
  18738. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
  18739. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
  18740. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
  18741. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../../externalModules.js */ "./externalModules.js");
  18742. /* harmony import */ var _base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../base/BaseAnnotationTool.js */ "./tools/base/BaseAnnotationTool.js");
  18743. /* harmony import */ var _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../../stateManagement/textStyle.js */ "./stateManagement/textStyle.js");
  18744. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  18745. /* harmony import */ var _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./../../stateManagement/toolStyle.js */ "./stateManagement/toolStyle.js");
  18746. /* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./../../stateManagement/toolColors.js */ "./stateManagement/toolColors.js");
  18747. /* harmony import */ var _manipulators_index_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./../../manipulators/index.js */ "./manipulators/index.js");
  18748. /* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./../../drawing/index.js */ "./drawing/index.js");
  18749. /* harmony import */ var _drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./../../drawing/drawHandles.js */ "./drawing/drawHandles.js");
  18750. /* harmony import */ var _drawing_drawLinkedTextBox_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./../../drawing/drawLinkedTextBox.js */ "./drawing/drawLinkedTextBox.js");
  18751. /* harmony import */ var _util_lineSegDistance_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./../../util/lineSegDistance.js */ "./util/lineSegDistance.js");
  18752. /* harmony import */ var _util_roundToDecimal_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./../../util/roundToDecimal.js */ "./util/roundToDecimal.js");
  18753. /* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./../../events.js */ "./events.js");
  18754. /* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../cursors/index.js */ "./tools/cursors/index.js");
  18755. /* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../../util/triggerEvent.js */ "./util/triggerEvent.js");
  18756. /* harmony import */ var _util_throttle__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../../util/throttle */ "./util/throttle.js");
  18757. /* harmony import */ var _util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../../util/getPixelSpacing */ "./util/getPixelSpacing.js");
  18758. /* harmony import */ var _store_index__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../../store/index */ "./store/index.js");
  18759. // State
  18760. // Manipulators
  18761. // Drawing
  18762. /**
  18763. * @public
  18764. * @class CobbAngleTool
  18765. * @memberof Tools.Annotation
  18766. * @classdesc Tool for measuring the angle between two straight lines.
  18767. * @extends Tools.Base.BaseAnnotationTool
  18768. */
  18769. var CobbAngleTool =
  18770. /*#__PURE__*/
  18771. function (_BaseAnnotationTool) {
  18772. _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(CobbAngleTool, _BaseAnnotationTool);
  18773. function CobbAngleTool() {
  18774. var _this;
  18775. var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  18776. _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, CobbAngleTool);
  18777. var defaultProps = {
  18778. name: 'CobbAngle',
  18779. supportedInteractionTypes: ['Mouse', 'Touch'],
  18780. svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_18__["cobbAngleCursor"],
  18781. configuration: {
  18782. drawHandles: true,
  18783. drawHandlesOnHover: false,
  18784. hideHandlesIfMoving: false,
  18785. renderDashed: false
  18786. }
  18787. };
  18788. _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(CobbAngleTool).call(this, props, defaultProps));
  18789. _this.hasIncomplete = false;
  18790. _this.throttledUpdateCachedStats = Object(_util_throttle__WEBPACK_IMPORTED_MODULE_20__["default"])(_this.updateCachedStats, 110);
  18791. return _this;
  18792. }
  18793. _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(CobbAngleTool, [{
  18794. key: "createNewMeasurement",
  18795. value: function createNewMeasurement(eventData) {
  18796. // Create the measurement data for this tool with the end handle activated
  18797. this.hasIncomplete = true;
  18798. return {
  18799. visible: true,
  18800. active: true,
  18801. color: undefined,
  18802. invalidated: true,
  18803. complete: false,
  18804. value: '',
  18805. handles: {
  18806. start: {
  18807. x: eventData.currentPoints.image.x,
  18808. y: eventData.currentPoints.image.y,
  18809. highlight: true,
  18810. active: false
  18811. },
  18812. end: {
  18813. x: eventData.currentPoints.image.x,
  18814. y: eventData.currentPoints.image.y,
  18815. highlight: true,
  18816. active: true
  18817. },
  18818. start2: {
  18819. x: eventData.currentPoints.image.x,
  18820. y: eventData.currentPoints.image.y,
  18821. highlight: true,
  18822. active: false,
  18823. drawnIndependently: true
  18824. },
  18825. end2: {
  18826. x: eventData.currentPoints.image.x + 1,
  18827. y: eventData.currentPoints.image.y,
  18828. highlight: true,
  18829. active: false,
  18830. drawnIndependently: true
  18831. },
  18832. textBox: {
  18833. active: false,
  18834. hasMoved: false,
  18835. movesIndependently: false,
  18836. drawnIndependently: true,
  18837. allowedOutsideImage: true,
  18838. hasBoundingBox: true
  18839. }
  18840. }
  18841. };
  18842. }
  18843. /**
  18844. *
  18845. *
  18846. * @param {*} element
  18847. * @param {*} data
  18848. * @param {*} coords
  18849. * @returns {Boolean}
  18850. */
  18851. }, {
  18852. key: "pointNearTool",
  18853. value: function pointNearTool(element, data, coords) {
  18854. if (data.visible === false) {
  18855. return false;
  18856. }
  18857. if (this.hasIncomplete) {
  18858. return false;
  18859. }
  18860. var seg1Near = Object(_util_lineSegDistance_js__WEBPACK_IMPORTED_MODULE_15__["default"])(element, data.handles.start, data.handles.end, coords) < 25;
  18861. var seg2Near = Object(_util_lineSegDistance_js__WEBPACK_IMPORTED_MODULE_15__["default"])(element, data.handles.start2, data.handles.end2, coords) < 25;
  18862. return seg1Near || seg2Near;
  18863. }
  18864. }, {
  18865. key: "updateCachedStats",
  18866. value: function updateCachedStats(image, element, data) {
  18867. var _getPixelSpacing = Object(_util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_21__["default"])(image),
  18868. rowPixelSpacing = _getPixelSpacing.rowPixelSpacing,
  18869. colPixelSpacing = _getPixelSpacing.colPixelSpacing;
  18870. var dx1 = (Math.ceil(data.handles.start.x) - Math.ceil(data.handles.end.x)) * (colPixelSpacing || 1);
  18871. var dy1 = (Math.ceil(data.handles.start.y) - Math.ceil(data.handles.end.y)) * (rowPixelSpacing || 1);
  18872. var dx2 = (Math.ceil(data.handles.start2.x) - Math.ceil(data.handles.end2.x)) * (colPixelSpacing || 1);
  18873. var dy2 = (Math.ceil(data.handles.start2.y) - Math.ceil(data.handles.end2.y)) * (rowPixelSpacing || 1);
  18874. var angle = Math.acos(Math.abs((dx1 * dx2 + dy1 * dy2) / (Math.sqrt(dx1 * dx1 + dy1 * dy1) * Math.sqrt(dx2 * dx2 + dy2 * dy2))));
  18875. angle *= 180 / Math.PI;
  18876. data.rAngle = Object(_util_roundToDecimal_js__WEBPACK_IMPORTED_MODULE_16__["default"])(angle, 2);
  18877. data.invalidated = false;
  18878. }
  18879. }, {
  18880. key: "renderToolData",
  18881. value: function renderToolData(evt) {
  18882. var _this2 = this;
  18883. var eventData = evt.detail;
  18884. var _this$configuration = this.configuration,
  18885. handleRadius = _this$configuration.handleRadius,
  18886. drawHandlesOnHover = _this$configuration.drawHandlesOnHover,
  18887. hideHandlesIfMoving = _this$configuration.hideHandlesIfMoving,
  18888. renderDashed = _this$configuration.renderDashed; // If we have no toolData for this element, return immediately as there is nothing to do
  18889. var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_8__["getToolState"])(evt.currentTarget, this.name);
  18890. if (!toolData) {
  18891. return;
  18892. } // We have tool data for this element - iterate over each one and draw it
  18893. var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_12__["getNewContext"])(eventData.canvasContext.canvas);
  18894. var lineWidth = _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_9__["default"].getToolWidth();
  18895. var lineDash = Object(_store_index__WEBPACK_IMPORTED_MODULE_22__["getModule"])('globalConfiguration').configuration.lineDash;
  18896. var font = _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_7__["default"].getFont();
  18897. var element = evt.detail.element;
  18898. var image = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.getEnabledElement(element).image;
  18899. var _getPixelSpacing2 = Object(_util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_21__["default"])(image),
  18900. rowPixelSpacing = _getPixelSpacing2.rowPixelSpacing,
  18901. colPixelSpacing = _getPixelSpacing2.colPixelSpacing;
  18902. var _loop = function _loop(i) {
  18903. var data = toolData.data[i];
  18904. if (data.visible === false) {
  18905. return "continue";
  18906. }
  18907. if (!data.value) {
  18908. data.value = _this2.textBoxText(data, rowPixelSpacing, colPixelSpacing);
  18909. }
  18910. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_12__["draw"])(context, function (context) {
  18911. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_12__["setShadow"])(context, _this2.configuration); // Differentiate the color of activation tool
  18912. var color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_10__["default"].getColorIfActive(data);
  18913. var lineOptions = {
  18914. color: color
  18915. };
  18916. if (renderDashed) {
  18917. lineOptions.lineDash = lineDash;
  18918. }
  18919. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_12__["drawLine"])(context, eventData.element, data.handles.start, data.handles.end, lineOptions);
  18920. if (data.complete) {
  18921. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_12__["drawLine"])(context, eventData.element, data.handles.start2, data.handles.end2, lineOptions);
  18922. } // Draw the handles
  18923. var handleOptions = {
  18924. color: color,
  18925. handleRadius: handleRadius,
  18926. drawHandlesIfActive: drawHandlesOnHover,
  18927. hideHandlesIfMoving: hideHandlesIfMoving
  18928. };
  18929. if (_this2.configuration.drawHandles) {
  18930. Object(_drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_13__["default"])(context, eventData, data.handles, handleOptions);
  18931. } // Draw the text
  18932. context.fillStyle = color;
  18933. var text = data.value;
  18934. if (!data.handles.textBox.hasMoved) {
  18935. var textCoords = {
  18936. x: (data.handles.start.x + data.handles.end.x) / 2,
  18937. y: (data.handles.start.y + data.handles.end.y) / 2 - 10
  18938. };
  18939. context.font = font;
  18940. data.handles.textBox.x = textCoords.x;
  18941. data.handles.textBox.y = textCoords.y;
  18942. }
  18943. Object(_drawing_drawLinkedTextBox_js__WEBPACK_IMPORTED_MODULE_14__["default"])(context, eventData.element, data.handles.textBox, text, data.handles, textBoxAnchorPoints, color, lineWidth, 0, true);
  18944. });
  18945. };
  18946. for (var i = 0; i < toolData.data.length; i++) {
  18947. var _ret = _loop(i);
  18948. if (_ret === "continue") continue;
  18949. }
  18950. function textBoxAnchorPoints(handles) {
  18951. return [handles.start, handles.start2, handles.end, handles.end2];
  18952. }
  18953. }
  18954. }, {
  18955. key: "getIncomplete",
  18956. value: function getIncomplete(element) {
  18957. var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_8__["getToolState"])(element, this.name);
  18958. if (toolState && Array.isArray(toolState.data)) {
  18959. return toolState.data.find(function (_ref) {
  18960. var complete = _ref.complete;
  18961. return complete === false;
  18962. });
  18963. }
  18964. }
  18965. }, {
  18966. key: "addNewMeasurement",
  18967. value: function addNewMeasurement(evt, interactionType) {
  18968. var _this3 = this;
  18969. evt.preventDefault();
  18970. evt.stopPropagation();
  18971. var eventData = evt.detail;
  18972. var measurementData;
  18973. var toMoveHandle;
  18974. var doneMovingCallback = function doneMovingCallback(success) {
  18975. // DoneMovingCallback for first measurement.
  18976. if (!success) {
  18977. Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_8__["removeToolState"])(element, _this3.name, measurementData);
  18978. return;
  18979. }
  18980. var eventType = _events_js__WEBPACK_IMPORTED_MODULE_17__["default"].MEASUREMENT_COMPLETED;
  18981. var eventData = {
  18982. toolName: _this3.name,
  18983. toolType: _this3.name,
  18984. // Deprecation notice: toolType will be replaced by toolName
  18985. element: element,
  18986. measurementData: measurementData
  18987. };
  18988. Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_19__["default"])(element, eventType, eventData);
  18989. }; // Search for incomplete measurements
  18990. var element = evt.detail.element;
  18991. var pendingMeasurement = this.getIncomplete(element);
  18992. if (pendingMeasurement) {
  18993. measurementData = pendingMeasurement;
  18994. measurementData.complete = true;
  18995. measurementData.handles.start2 = {
  18996. x: eventData.currentPoints.image.x,
  18997. y: eventData.currentPoints.image.y,
  18998. drawnIndependently: false,
  18999. highlight: true,
  19000. active: false
  19001. };
  19002. measurementData.handles.end2 = {
  19003. x: eventData.currentPoints.image.x,
  19004. y: eventData.currentPoints.image.y,
  19005. drawnIndependently: false,
  19006. highlight: true,
  19007. active: true
  19008. };
  19009. toMoveHandle = measurementData.handles.end2;
  19010. this.hasIncomplete = false;
  19011. doneMovingCallback = function doneMovingCallback(success) {
  19012. // DoneMovingCallback for second measurement
  19013. if (!success) {
  19014. Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_8__["removeToolState"])(element, _this3.name, measurementData);
  19015. return;
  19016. }
  19017. var eventType = _events_js__WEBPACK_IMPORTED_MODULE_17__["default"].MEASUREMENT_COMPLETED;
  19018. var eventData = {
  19019. toolName: _this3.name,
  19020. toolType: _this3.name,
  19021. // Deprecation notice: toolType will be replaced by toolName
  19022. element: element,
  19023. measurementData: measurementData
  19024. };
  19025. Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_19__["default"])(element, eventType, eventData);
  19026. };
  19027. } else {
  19028. measurementData = this.createNewMeasurement(eventData);
  19029. Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_8__["addToolState"])(element, this.name, measurementData);
  19030. toMoveHandle = measurementData.handles.end;
  19031. } // Associate this data with this imageId so we can render it and manipulate it
  19032. _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.updateImage(element);
  19033. Object(_manipulators_index_js__WEBPACK_IMPORTED_MODULE_11__["moveNewHandle"])(eventData, this.name, measurementData, toMoveHandle, this.options, interactionType, doneMovingCallback);
  19034. }
  19035. }, {
  19036. key: "onMeasureModified",
  19037. value: function onMeasureModified(ev) {
  19038. var element = ev.detail.element;
  19039. var image = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.getEnabledElement(element).image;
  19040. var _getPixelSpacing3 = Object(_util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_21__["default"])(image),
  19041. rowPixelSpacing = _getPixelSpacing3.rowPixelSpacing,
  19042. colPixelSpacing = _getPixelSpacing3.colPixelSpacing;
  19043. if (ev.detail.toolName !== this.name) {
  19044. return;
  19045. }
  19046. var data = ev.detail.measurementData; // Update textbox stats
  19047. if (data.invalidated === true) {
  19048. if (data.rAngle) {
  19049. this.throttledUpdateCachedStats(image, element, data);
  19050. } else {
  19051. this.updateCachedStats(image, element, data);
  19052. }
  19053. }
  19054. data.value = this.textBoxText(data, rowPixelSpacing, colPixelSpacing);
  19055. }
  19056. }, {
  19057. key: "textBoxText",
  19058. value: function textBoxText(_ref2, rowPixelSpacing, colPixelSpacing) {
  19059. var rAngle = _ref2.rAngle;
  19060. if (rAngle === undefined) {
  19061. return '';
  19062. }
  19063. if (Number.isNaN(rAngle)) {
  19064. return '';
  19065. }
  19066. var suffix = !rowPixelSpacing || !colPixelSpacing ? ' (isotropic)' : '';
  19067. return "".concat(rAngle, "\xB0").concat(suffix);
  19068. }
  19069. }, {
  19070. key: "activeCallback",
  19071. value: function activeCallback(element) {
  19072. this.onMeasureModified = this.onMeasureModified.bind(this);
  19073. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_17__["default"].MEASUREMENT_MODIFIED, this.onMeasureModified);
  19074. }
  19075. }, {
  19076. key: "passiveCallback",
  19077. value: function passiveCallback(element) {
  19078. this.onMeasureModified = this.onMeasureModified.bind(this);
  19079. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_17__["default"].MEASUREMENT_MODIFIED, this.onMeasureModified);
  19080. }
  19081. }, {
  19082. key: "enabledCallback",
  19083. value: function enabledCallback(element) {
  19084. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_17__["default"].MEASUREMENT_MODIFIED, this.onMeasureModified);
  19085. }
  19086. }, {
  19087. key: "disabledCallback",
  19088. value: function disabledCallback(element) {
  19089. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_17__["default"].MEASUREMENT_MODIFIED, this.onMeasureModified);
  19090. }
  19091. }]);
  19092. return CobbAngleTool;
  19093. }(_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]);
  19094. /***/ }),
  19095. /***/ "./tools/annotation/EllipticalRoiTool.js":
  19096. /*!***********************************************!*\
  19097. !*** ./tools/annotation/EllipticalRoiTool.js ***!
  19098. \***********************************************/
  19099. /*! exports provided: default */
  19100. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  19101. "use strict";
  19102. __webpack_require__.r(__webpack_exports__);
  19103. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return EllipticalRoiTool; });
  19104. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
  19105. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
  19106. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
  19107. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
  19108. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
  19109. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
  19110. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
  19111. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
  19112. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
  19113. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
  19114. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../../externalModules.js */ "./externalModules.js");
  19115. /* harmony import */ var _base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../base/BaseAnnotationTool.js */ "./tools/base/BaseAnnotationTool.js");
  19116. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  19117. /* harmony import */ var _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./../../stateManagement/toolStyle.js */ "./stateManagement/toolStyle.js");
  19118. /* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./../../stateManagement/toolColors.js */ "./stateManagement/toolColors.js");
  19119. /* harmony import */ var _manipulators_getHandleNearImagePoint__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../manipulators/getHandleNearImagePoint */ "./manipulators/getHandleNearImagePoint.js");
  19120. /* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./../../drawing/index.js */ "./drawing/index.js");
  19121. /* harmony import */ var _util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./../../util/calculateSUV.js */ "./util/calculateSUV.js");
  19122. /* harmony import */ var _util_ellipse_index_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./../../util/ellipse/index.js */ "./util/ellipse/index.js");
  19123. /* harmony import */ var _util_getROITextBoxCoords_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../util/getROITextBoxCoords.js */ "./util/getROITextBoxCoords.js");
  19124. /* harmony import */ var _util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./../../util/numbersWithCommas.js */ "./util/numbersWithCommas.js");
  19125. /* harmony import */ var _util_throttle_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./../../util/throttle.js */ "./util/throttle.js");
  19126. /* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../cursors/index.js */ "./tools/cursors/index.js");
  19127. /* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../util/logger.js */ "./util/logger.js");
  19128. /* harmony import */ var _util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../../util/getPixelSpacing */ "./util/getPixelSpacing.js");
  19129. /* harmony import */ var _store_index__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../../store/index */ "./store/index.js");
  19130. // State
  19131. // Drawing
  19132. // Util
  19133. var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_18__["getLogger"])('tools:annotation:EllipticalRoiTool');
  19134. /**
  19135. * @public
  19136. * @class EllipticalRoiTool
  19137. * @memberof Tools.Annotation
  19138. * @classdesc Tool for drawing elliptical regions of interest, and measuring
  19139. * the statistics of the enclosed pixels.
  19140. * @extends Tools.Base.BaseAnnotationTool
  19141. */
  19142. var EllipticalRoiTool =
  19143. /*#__PURE__*/
  19144. function (_BaseAnnotationTool) {
  19145. _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(EllipticalRoiTool, _BaseAnnotationTool);
  19146. function EllipticalRoiTool() {
  19147. var _this;
  19148. var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  19149. _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, EllipticalRoiTool);
  19150. var defaultProps = {
  19151. name: 'EllipticalRoi',
  19152. supportedInteractionTypes: ['Mouse', 'Touch'],
  19153. configuration: {
  19154. // showMinMax: false,
  19155. // showHounsfieldUnits: true,
  19156. drawHandlesOnHover: false,
  19157. hideHandlesIfMoving: false,
  19158. renderDashed: false
  19159. },
  19160. svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_17__["ellipticalRoiCursor"]
  19161. };
  19162. _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(EllipticalRoiTool).call(this, props, defaultProps));
  19163. _this.throttledUpdateCachedStats = Object(_util_throttle_js__WEBPACK_IMPORTED_MODULE_16__["default"])(_this.updateCachedStats, 110);
  19164. return _this;
  19165. }
  19166. _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(EllipticalRoiTool, [{
  19167. key: "createNewMeasurement",
  19168. value: function createNewMeasurement(eventData) {
  19169. var goodEventData = eventData && eventData.currentPoints && eventData.currentPoints.image;
  19170. if (!goodEventData) {
  19171. logger.error("required eventData not supplied to tool ".concat(this.name, "'s createNewMeasurement"));
  19172. return;
  19173. }
  19174. return {
  19175. visible: true,
  19176. active: true,
  19177. color: undefined,
  19178. invalidated: true,
  19179. handles: {
  19180. start: {
  19181. x: eventData.currentPoints.image.x,
  19182. y: eventData.currentPoints.image.y,
  19183. highlight: true,
  19184. active: false
  19185. },
  19186. end: {
  19187. x: eventData.currentPoints.image.x,
  19188. y: eventData.currentPoints.image.y,
  19189. highlight: true,
  19190. active: true
  19191. },
  19192. initialRotation: eventData.viewport.rotation,
  19193. textBox: {
  19194. active: false,
  19195. hasMoved: false,
  19196. movesIndependently: false,
  19197. drawnIndependently: true,
  19198. allowedOutsideImage: true,
  19199. hasBoundingBox: true
  19200. }
  19201. }
  19202. };
  19203. }
  19204. }, {
  19205. key: "pointNearTool",
  19206. value: function pointNearTool(element, data, coords, interactionType) {
  19207. var hasStartAndEndHandles = data && data.handles && data.handles.start && data.handles.end;
  19208. var validParameters = hasStartAndEndHandles;
  19209. if (!validParameters) {
  19210. logger.warn("invalid parameters supplied to tool ".concat(this.name, "'s pointNearTool"));
  19211. }
  19212. if (!validParameters || data.visible === false) {
  19213. return false;
  19214. }
  19215. var handleNearImagePoint = Object(_manipulators_getHandleNearImagePoint__WEBPACK_IMPORTED_MODULE_10__["default"])(element, data.handles, coords, 6);
  19216. if (handleNearImagePoint) {
  19217. return true;
  19218. }
  19219. var distance = interactionType === 'mouse' ? 15 : 25;
  19220. var startCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pixelToCanvas(element, data.handles.start);
  19221. var endCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pixelToCanvas(element, data.handles.end);
  19222. var minorEllipse = {
  19223. left: Math.min(startCanvas.x, endCanvas.x) + distance / 2,
  19224. top: Math.min(startCanvas.y, endCanvas.y) + distance / 2,
  19225. width: Math.abs(startCanvas.x - endCanvas.x) - distance,
  19226. height: Math.abs(startCanvas.y - endCanvas.y) - distance
  19227. };
  19228. var majorEllipse = {
  19229. left: Math.min(startCanvas.x, endCanvas.x) - distance / 2,
  19230. top: Math.min(startCanvas.y, endCanvas.y) - distance / 2,
  19231. width: Math.abs(startCanvas.x - endCanvas.x) + distance,
  19232. height: Math.abs(startCanvas.y - endCanvas.y) + distance
  19233. };
  19234. var pointInMinorEllipse = Object(_util_ellipse_index_js__WEBPACK_IMPORTED_MODULE_13__["pointInEllipse"])(minorEllipse, coords);
  19235. var pointInMajorEllipse = Object(_util_ellipse_index_js__WEBPACK_IMPORTED_MODULE_13__["pointInEllipse"])(majorEllipse, coords);
  19236. if (pointInMajorEllipse && !pointInMinorEllipse) {
  19237. return true;
  19238. }
  19239. return false;
  19240. }
  19241. }, {
  19242. key: "updateCachedStats",
  19243. value: function updateCachedStats(image, element, data) {
  19244. var seriesModule = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.metaData.get('generalSeriesModule', image.imageId) || {};
  19245. var modality = seriesModule.modality;
  19246. var pixelSpacing = Object(_util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_19__["default"])(image);
  19247. var stats = _calculateStats(image, element, data.handles, modality, pixelSpacing);
  19248. data.cachedStats = stats;
  19249. data.invalidated = false;
  19250. }
  19251. }, {
  19252. key: "renderToolData",
  19253. value: function renderToolData(evt) {
  19254. var _this2 = this;
  19255. var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_7__["getToolState"])(evt.currentTarget, this.name);
  19256. if (!toolData) {
  19257. return;
  19258. }
  19259. var eventData = evt.detail;
  19260. var image = eventData.image,
  19261. element = eventData.element;
  19262. var lineWidth = _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_8__["default"].getToolWidth();
  19263. var lineDash = Object(_store_index__WEBPACK_IMPORTED_MODULE_20__["getModule"])('globalConfiguration').configuration.lineDash;
  19264. var _this$configuration = this.configuration,
  19265. handleRadius = _this$configuration.handleRadius,
  19266. drawHandlesOnHover = _this$configuration.drawHandlesOnHover,
  19267. hideHandlesIfMoving = _this$configuration.hideHandlesIfMoving,
  19268. renderDashed = _this$configuration.renderDashed;
  19269. var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_11__["getNewContext"])(eventData.canvasContext.canvas);
  19270. var _getPixelSpacing = Object(_util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_19__["default"])(image),
  19271. rowPixelSpacing = _getPixelSpacing.rowPixelSpacing,
  19272. colPixelSpacing = _getPixelSpacing.colPixelSpacing; // Meta
  19273. var seriesModule = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.metaData.get('generalSeriesModule', image.imageId) || {}; // Pixel Spacing
  19274. var modality = seriesModule.modality;
  19275. var hasPixelSpacing = rowPixelSpacing && colPixelSpacing;
  19276. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_11__["draw"])(context, function (context) {
  19277. // If we have tool data for this element - iterate over each set and draw it
  19278. for (var i = 0; i < toolData.data.length; i++) {
  19279. var data = toolData.data[i];
  19280. if (data.visible === false) {
  19281. continue;
  19282. } // Configure
  19283. var color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__["default"].getColorIfActive(data);
  19284. var handleOptions = {
  19285. color: color,
  19286. handleRadius: handleRadius,
  19287. drawHandlesIfActive: drawHandlesOnHover,
  19288. hideHandlesIfMoving: hideHandlesIfMoving
  19289. };
  19290. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_11__["setShadow"])(context, _this2.configuration);
  19291. var ellipseOptions = {
  19292. color: color
  19293. };
  19294. if (renderDashed) {
  19295. ellipseOptions.lineDash = lineDash;
  19296. } // Draw
  19297. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_11__["drawEllipse"])(context, element, data.handles.start, data.handles.end, ellipseOptions, 'pixel', data.handles.initialRotation);
  19298. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_11__["drawHandles"])(context, eventData, data.handles, handleOptions); // Update textbox stats
  19299. if (data.invalidated === true) {
  19300. if (data.cachedStats) {
  19301. _this2.throttledUpdateCachedStats(image, element, data);
  19302. } else {
  19303. _this2.updateCachedStats(image, element, data);
  19304. }
  19305. } // Default to textbox on right side of ROI
  19306. if (!data.handles.textBox.hasMoved) {
  19307. var defaultCoords = Object(_util_getROITextBoxCoords_js__WEBPACK_IMPORTED_MODULE_14__["default"])(eventData.viewport, data.handles);
  19308. Object.assign(data.handles.textBox, defaultCoords);
  19309. }
  19310. var textBoxAnchorPoints = function textBoxAnchorPoints(handles) {
  19311. return _findTextBoxAnchorPoints(handles.start, handles.end);
  19312. };
  19313. var textBoxContent = _createTextBoxContent(context, image.color, data.cachedStats, modality, hasPixelSpacing, _this2.configuration);
  19314. data.unit = _getUnit(modality, _this2.configuration.showHounsfieldUnits);
  19315. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_11__["drawLinkedTextBox"])(context, element, data.handles.textBox, textBoxContent, data.handles, textBoxAnchorPoints, color, lineWidth, 10, true);
  19316. }
  19317. });
  19318. }
  19319. }]);
  19320. return EllipticalRoiTool;
  19321. }(_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]);
  19322. /**
  19323. *
  19324. *
  19325. * @param {*} startHandle
  19326. * @param {*} endHandle
  19327. * @returns {Array.<{x: number, y: number}>}
  19328. */
  19329. function _findTextBoxAnchorPoints(startHandle, endHandle) {
  19330. var _getEllipseImageCoord = _getEllipseImageCoordinates(startHandle, endHandle),
  19331. left = _getEllipseImageCoord.left,
  19332. top = _getEllipseImageCoord.top,
  19333. width = _getEllipseImageCoord.width,
  19334. height = _getEllipseImageCoord.height;
  19335. return [{
  19336. // Top middle point of ellipse
  19337. x: left + width / 2,
  19338. y: top
  19339. }, {
  19340. // Left middle point of ellipse
  19341. x: left,
  19342. y: top + height / 2
  19343. }, {
  19344. // Bottom middle point of ellipse
  19345. x: left + width / 2,
  19346. y: top + height
  19347. }, {
  19348. // Right middle point of ellipse
  19349. x: left + width,
  19350. y: top + height / 2
  19351. }];
  19352. }
  19353. function _getUnit(modality, showHounsfieldUnits) {
  19354. return modality === 'CT' && showHounsfieldUnits !== false ? 'HU' : '';
  19355. }
  19356. /**
  19357. *
  19358. *
  19359. * @param {*} context
  19360. * @param {*} isColorImage
  19361. * @param {*} { area, mean, stdDev, min, max, meanStdDevSUV }
  19362. * @param {*} modality
  19363. * @param {*} hasPixelSpacing
  19364. * @param {*} [options={}] - { showMinMax, showHounsfieldUnits }
  19365. * @returns {string[]}
  19366. */
  19367. function _createTextBoxContent(context, isColorImage) {
  19368. var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
  19369. _ref$area = _ref.area,
  19370. area = _ref$area === void 0 ? 0 : _ref$area,
  19371. _ref$mean = _ref.mean,
  19372. mean = _ref$mean === void 0 ? 0 : _ref$mean,
  19373. _ref$stdDev = _ref.stdDev,
  19374. stdDev = _ref$stdDev === void 0 ? 0 : _ref$stdDev,
  19375. _ref$min = _ref.min,
  19376. min = _ref$min === void 0 ? 0 : _ref$min,
  19377. _ref$max = _ref.max,
  19378. max = _ref$max === void 0 ? 0 : _ref$max,
  19379. _ref$meanStdDevSUV = _ref.meanStdDevSUV,
  19380. meanStdDevSUV = _ref$meanStdDevSUV === void 0 ? 0 : _ref$meanStdDevSUV;
  19381. var modality = arguments.length > 3 ? arguments[3] : undefined;
  19382. var hasPixelSpacing = arguments.length > 4 ? arguments[4] : undefined;
  19383. var options = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};
  19384. var showMinMax = options.showMinMax || false;
  19385. var textLines = []; // Don't display mean/standardDev for color images
  19386. var otherLines = [];
  19387. if (!isColorImage) {
  19388. var hasStandardUptakeValues = meanStdDevSUV && meanStdDevSUV.mean !== 0;
  19389. var unit = _getUnit(modality, options.showHounsfieldUnits);
  19390. var meanString = "Mean: ".concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_15__["default"])(mean.toFixed(2)), " ").concat(unit);
  19391. var stdDevString = "Std Dev: ".concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_15__["default"])(stdDev.toFixed(2)), " ").concat(unit); // If this image has SUV values to display, concatenate them to the text line
  19392. if (hasStandardUptakeValues) {
  19393. var SUVtext = ' SUV: ';
  19394. var meanSuvString = "".concat(SUVtext).concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_15__["default"])(meanStdDevSUV.mean.toFixed(2)));
  19395. var stdDevSuvString = "".concat(SUVtext).concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_15__["default"])(meanStdDevSUV.stdDev.toFixed(2)));
  19396. var targetStringLength = Math.floor(context.measureText("".concat(stdDevString, " ")).width);
  19397. while (context.measureText(meanString).width < targetStringLength) {
  19398. meanString += ' ';
  19399. }
  19400. otherLines.push("".concat(meanString).concat(meanSuvString));
  19401. otherLines.push("".concat(stdDevString, " ").concat(stdDevSuvString));
  19402. } else {
  19403. otherLines.push("".concat(meanString));
  19404. otherLines.push("".concat(stdDevString));
  19405. }
  19406. if (showMinMax) {
  19407. var minString = "Min: ".concat(min, " ").concat(unit);
  19408. var maxString = "Max: ".concat(max, " ").concat(unit);
  19409. var _targetStringLength = hasStandardUptakeValues ? Math.floor(context.measureText("".concat(stdDevString, " ")).width) : Math.floor(context.measureText("".concat(meanString, " ")).width);
  19410. while (context.measureText(minString).width < _targetStringLength) {
  19411. minString += ' ';
  19412. }
  19413. otherLines.push("".concat(minString).concat(maxString));
  19414. }
  19415. }
  19416. textLines.push(_formatArea(area, hasPixelSpacing));
  19417. otherLines.forEach(function (x) {
  19418. return textLines.push(x);
  19419. });
  19420. return textLines;
  19421. }
  19422. /**
  19423. *
  19424. *
  19425. * @param {*} area
  19426. * @param {*} hasPixelSpacing
  19427. * @returns {string} The formatted label for showing area
  19428. */
  19429. function _formatArea(area, hasPixelSpacing) {
  19430. // This uses Char code 178 for a superscript 2
  19431. var suffix = hasPixelSpacing ? " mm".concat(String.fromCharCode(178)) : " px".concat(String.fromCharCode(178));
  19432. return "Area: ".concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_15__["default"])(area.toFixed(2))).concat(suffix);
  19433. }
  19434. /**
  19435. *
  19436. *
  19437. * @param {*} image
  19438. * @param {*} element
  19439. * @param {*} handles
  19440. * @param {*} modality
  19441. * @param {*} pixelSpacing
  19442. * @returns {Object} The Stats object
  19443. */
  19444. function _calculateStats(image, element, handles, modality, pixelSpacing) {
  19445. // Retrieve the bounds of the ellipse in image coordinates
  19446. var ellipseCoordinates = _getEllipseImageCoordinates(handles.start, handles.end); // Retrieve the array of pixels that the ellipse bounds cover
  19447. var pixels = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.getPixels(element, ellipseCoordinates.left, ellipseCoordinates.top, ellipseCoordinates.width, ellipseCoordinates.height); // Calculate the mean & standard deviation from the pixels and the ellipse details.
  19448. var ellipseMeanStdDev = Object(_util_ellipse_index_js__WEBPACK_IMPORTED_MODULE_13__["calculateEllipseStatistics"])(pixels, ellipseCoordinates);
  19449. var meanStdDevSUV;
  19450. if (modality === 'PT') {
  19451. meanStdDevSUV = {
  19452. mean: Object(_util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_12__["default"])(image, ellipseMeanStdDev.mean, true) || 0,
  19453. stdDev: Object(_util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_12__["default"])(image, ellipseMeanStdDev.stdDev, true) || 0
  19454. };
  19455. } // Calculate the image area from the ellipse dimensions and pixel spacing
  19456. var area = Math.PI * (ellipseCoordinates.width * (pixelSpacing.colPixelSpacing || 1) / 2) * (ellipseCoordinates.height * (pixelSpacing.rowPixelSpacing || 1) / 2);
  19457. return {
  19458. area: area || 0,
  19459. count: ellipseMeanStdDev.count || 0,
  19460. mean: ellipseMeanStdDev.mean || 0,
  19461. variance: ellipseMeanStdDev.variance || 0,
  19462. stdDev: ellipseMeanStdDev.stdDev || 0,
  19463. min: ellipseMeanStdDev.min || 0,
  19464. max: ellipseMeanStdDev.max || 0,
  19465. meanStdDevSUV: meanStdDevSUV
  19466. };
  19467. }
  19468. /**
  19469. * Retrieve the bounds of the ellipse in image coordinates
  19470. *
  19471. * @param {*} startHandle
  19472. * @param {*} endHandle
  19473. * @returns {{ left: number, top: number, width: number, height: number }}
  19474. */
  19475. function _getEllipseImageCoordinates(startHandle, endHandle) {
  19476. return {
  19477. left: Math.round(Math.min(startHandle.x, endHandle.x)),
  19478. top: Math.round(Math.min(startHandle.y, endHandle.y)),
  19479. width: Math.round(Math.abs(startHandle.x - endHandle.x)),
  19480. height: Math.round(Math.abs(startHandle.y - endHandle.y))
  19481. };
  19482. }
  19483. /***/ }),
  19484. /***/ "./tools/annotation/FreehandRoiTool.js":
  19485. /*!*********************************************!*\
  19486. !*** ./tools/annotation/FreehandRoiTool.js ***!
  19487. \*********************************************/
  19488. /*! exports provided: default */
  19489. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  19490. "use strict";
  19491. __webpack_require__.r(__webpack_exports__);
  19492. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return FreehandRoiTool; });
  19493. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
  19494. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
  19495. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
  19496. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
  19497. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
  19498. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
  19499. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
  19500. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
  19501. /* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js");
  19502. /* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__);
  19503. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
  19504. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__);
  19505. /* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./../../events.js */ "./events.js");
  19506. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../../externalModules.js */ "./externalModules.js");
  19507. /* harmony import */ var _base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./../base/BaseAnnotationTool.js */ "./tools/base/BaseAnnotationTool.js");
  19508. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  19509. /* harmony import */ var _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./../../stateManagement/toolStyle.js */ "./stateManagement/toolStyle.js");
  19510. /* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./../../stateManagement/toolColors.js */ "./stateManagement/toolColors.js");
  19511. /* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../store/index.js */ "./store/index.js");
  19512. /* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../util/triggerEvent.js */ "./util/triggerEvent.js");
  19513. /* harmony import */ var _util_findAndMoveHelpers_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../util/findAndMoveHelpers.js */ "./util/findAndMoveHelpers.js");
  19514. /* harmony import */ var _util_pointInsideBoundingBox_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../util/pointInsideBoundingBox.js */ "./util/pointInsideBoundingBox.js");
  19515. /* harmony import */ var _util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../util/calculateSUV.js */ "./util/calculateSUV.js");
  19516. /* harmony import */ var _util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../util/numbersWithCommas.js */ "./util/numbersWithCommas.js");
  19517. /* harmony import */ var _util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../util/getPixelSpacing */ "./util/getPixelSpacing.js");
  19518. /* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../../drawing/index.js */ "./drawing/index.js");
  19519. /* harmony import */ var _drawing_drawLinkedTextBox_js__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../../drawing/drawLinkedTextBox.js */ "./drawing/drawLinkedTextBox.js");
  19520. /* harmony import */ var _drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../../drawing/drawHandles.js */ "./drawing/drawHandles.js");
  19521. /* harmony import */ var _util_clip_js__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../../util/clip.js */ "./util/clip.js");
  19522. /* harmony import */ var _store_setToolCursor_js__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../../store/setToolCursor.js */ "./store/setToolCursor.js");
  19523. /* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../cursors/index.js */ "./tools/cursors/index.js");
  19524. /* harmony import */ var _util_freehand_index_js__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../../util/freehand/index.js */ "./util/freehand/index.js");
  19525. /* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ../../util/logger.js */ "./util/logger.js");
  19526. /* harmony import */ var _util_throttle__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../../util/throttle */ "./util/throttle.js");
  19527. // State
  19528. // Manipulators
  19529. // Implementation Logic
  19530. // Drawing
  19531. var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_26__["getLogger"])('tools:annotation:FreehandRoiTool');
  19532. var insertOrDelete = _util_freehand_index_js__WEBPACK_IMPORTED_MODULE_25__["default"].insertOrDelete,
  19533. freehandArea = _util_freehand_index_js__WEBPACK_IMPORTED_MODULE_25__["default"].freehandArea,
  19534. calculateFreehandStatistics = _util_freehand_index_js__WEBPACK_IMPORTED_MODULE_25__["default"].calculateFreehandStatistics,
  19535. freehandIntersect = _util_freehand_index_js__WEBPACK_IMPORTED_MODULE_25__["default"].freehandIntersect,
  19536. FreehandHandleData = _util_freehand_index_js__WEBPACK_IMPORTED_MODULE_25__["default"].FreehandHandleData;
  19537. /**
  19538. * @public
  19539. * @class FreehandRoiTool
  19540. * @memberof Tools.Annotation
  19541. * @classdesc Tool for drawing arbitrary polygonal regions of interest, and
  19542. * measuring the statistics of the enclosed pixels.
  19543. * @extends Tools.Base.BaseAnnotationTool
  19544. */
  19545. var FreehandRoiTool =
  19546. /*#__PURE__*/
  19547. function (_BaseAnnotationTool) {
  19548. _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(FreehandRoiTool, _BaseAnnotationTool);
  19549. function FreehandRoiTool() {
  19550. var _this;
  19551. var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  19552. _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, FreehandRoiTool);
  19553. var defaultProps = {
  19554. name: 'FreehandRoi',
  19555. supportedInteractionTypes: ['Mouse', 'Touch'],
  19556. configuration: defaultFreehandConfiguration(),
  19557. svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_24__["freehandRoiCursor"]
  19558. };
  19559. _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(FreehandRoiTool).call(this, props, defaultProps));
  19560. _this.isMultiPartTool = true;
  19561. _this._drawing = false;
  19562. _this._dragging = false;
  19563. _this._modifying = false; // Create bound callback functions for private event loops
  19564. _this._drawingMouseDownCallback = _this._drawingMouseDownCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  19565. _this._drawingMouseMoveCallback = _this._drawingMouseMoveCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  19566. _this._drawingMouseDragCallback = _this._drawingMouseDragCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  19567. _this._drawingMouseUpCallback = _this._drawingMouseUpCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  19568. _this._drawingMouseDoubleClickCallback = _this._drawingMouseDoubleClickCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  19569. _this._editMouseUpCallback = _this._editMouseUpCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  19570. _this._editMouseDragCallback = _this._editMouseDragCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  19571. _this._drawingTouchStartCallback = _this._drawingTouchStartCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  19572. _this._drawingTouchDragCallback = _this._drawingTouchDragCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  19573. _this._drawingDoubleTapClickCallback = _this._drawingDoubleTapClickCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  19574. _this._editTouchDragCallback = _this._editTouchDragCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  19575. _this.throttledUpdateCachedStats = Object(_util_throttle__WEBPACK_IMPORTED_MODULE_27__["default"])(_this.updateCachedStats, 110);
  19576. return _this;
  19577. }
  19578. _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(FreehandRoiTool, [{
  19579. key: "createNewMeasurement",
  19580. value: function createNewMeasurement(eventData) {
  19581. var goodEventData = eventData && eventData.currentPoints && eventData.currentPoints.image;
  19582. if (!goodEventData) {
  19583. logger.error("required eventData not supplied to tool ".concat(this.name, "'s createNewMeasurement"));
  19584. return;
  19585. }
  19586. var measurementData = {
  19587. visible: true,
  19588. active: true,
  19589. invalidated: true,
  19590. color: undefined,
  19591. handles: {
  19592. points: []
  19593. }
  19594. };
  19595. measurementData.handles.textBox = {
  19596. active: false,
  19597. hasMoved: false,
  19598. movesIndependently: false,
  19599. drawnIndependently: true,
  19600. allowedOutsideImage: true,
  19601. hasBoundingBox: true
  19602. };
  19603. return measurementData;
  19604. }
  19605. /**
  19606. *
  19607. *
  19608. * @param {*} element element
  19609. * @param {*} data data
  19610. * @param {*} coords coords
  19611. * @returns {Boolean}
  19612. */
  19613. }, {
  19614. key: "pointNearTool",
  19615. value: function pointNearTool(element, data, coords) {
  19616. var validParameters = data && data.handles && data.handles.points;
  19617. if (!validParameters) {
  19618. throw new Error("invalid parameters supplied to tool ".concat(this.name, "'s pointNearTool"));
  19619. }
  19620. if (!validParameters || data.visible === false) {
  19621. return false;
  19622. }
  19623. var isPointNearTool = this._pointNearHandle(element, data, coords);
  19624. if (isPointNearTool !== undefined) {
  19625. return true;
  19626. }
  19627. return false;
  19628. }
  19629. /**
  19630. * @param {*} element
  19631. * @param {*} data
  19632. * @param {*} coords
  19633. * @returns {number} the distance in px from the provided coordinates to the
  19634. * closest rendered portion of the annotation. -1 if the distance cannot be
  19635. * calculated.
  19636. */
  19637. }, {
  19638. key: "distanceFromPoint",
  19639. value: function distanceFromPoint(element, data, coords) {
  19640. var distance = Infinity;
  19641. for (var i = 0; i < data.handles.points.length; i++) {
  19642. var distanceI = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstoneMath.point.distance(data.handles.points[i], coords);
  19643. distance = Math.min(distance, distanceI);
  19644. } // If an error caused distance not to be calculated, return -1.
  19645. if (distance === Infinity) {
  19646. return -1;
  19647. }
  19648. return distance;
  19649. }
  19650. /**
  19651. * @param {*} element
  19652. * @param {*} data
  19653. * @param {*} coords
  19654. * @returns {number} the distance in canvas units from the provided coordinates to the
  19655. * closest rendered portion of the annotation. -1 if the distance cannot be
  19656. * calculated.
  19657. */
  19658. }, {
  19659. key: "distanceFromPointCanvas",
  19660. value: function distanceFromPointCanvas(element, data, coords) {
  19661. var distance = Infinity;
  19662. if (!data) {
  19663. return -1;
  19664. }
  19665. var canvasCoords = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.pixelToCanvas(element, coords);
  19666. var points = data.handles.points;
  19667. for (var i = 0; i < points.length; i++) {
  19668. var handleCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.pixelToCanvas(element, points[i]);
  19669. var distanceI = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstoneMath.point.distance(handleCanvas, canvasCoords);
  19670. distance = Math.min(distance, distanceI);
  19671. } // If an error caused distance not to be calculated, return -1.
  19672. if (distance === Infinity) {
  19673. return -1;
  19674. }
  19675. return distance;
  19676. }
  19677. /**
  19678. *
  19679. *
  19680. *
  19681. * @param {Object} image image
  19682. * @param {Object} element element
  19683. * @param {Object} data data
  19684. *
  19685. * @returns {void} void
  19686. */
  19687. }, {
  19688. key: "updateCachedStats",
  19689. value: function updateCachedStats(image, element, data) {
  19690. // Define variables for the area and mean/standard deviation
  19691. var meanStdDev, meanStdDevSUV;
  19692. var seriesModule = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.metaData.get('generalSeriesModule', image.imageId);
  19693. var modality = seriesModule ? seriesModule.modality : null;
  19694. var points = data.handles.points; // If the data has been invalidated, and the tool is not currently active,
  19695. // We need to calculate it again.
  19696. // Retrieve the bounds of the ROI in image coordinates
  19697. var bounds = {
  19698. left: points[0].x,
  19699. right: points[0].x,
  19700. bottom: points[0].y,
  19701. top: points[0].x
  19702. };
  19703. for (var i = 0; i < points.length; i++) {
  19704. bounds.left = Math.min(bounds.left, points[i].x);
  19705. bounds.right = Math.max(bounds.right, points[i].x);
  19706. bounds.bottom = Math.min(bounds.bottom, points[i].y);
  19707. bounds.top = Math.max(bounds.top, points[i].y);
  19708. }
  19709. var polyBoundingBox = {
  19710. left: bounds.left,
  19711. top: bounds.bottom,
  19712. width: Math.abs(bounds.right - bounds.left),
  19713. height: Math.abs(bounds.top - bounds.bottom)
  19714. }; // Store the bounding box information for the text box
  19715. data.polyBoundingBox = polyBoundingBox; // First, make sure this is not a color image, since no mean / standard
  19716. // Deviation will be calculated for color images.
  19717. if (!image.color) {
  19718. // Retrieve the array of pixels that the ROI bounds cover
  19719. var pixels = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.getPixels(element, polyBoundingBox.left, polyBoundingBox.top, polyBoundingBox.width, polyBoundingBox.height); // Calculate the mean & standard deviation from the pixels and the object shape
  19720. meanStdDev = calculateFreehandStatistics.call(this, pixels, polyBoundingBox, data.handles.points);
  19721. if (modality === 'PT') {
  19722. // If the image is from a PET scan, use the DICOM tags to
  19723. // Calculate the SUV from the mean and standard deviation.
  19724. // Note that because we are using modality pixel values from getPixels, and
  19725. // The calculateSUV routine also rescales to modality pixel values, we are first
  19726. // Returning the values to storedPixel values before calcuating SUV with them.
  19727. // TODO: Clean this up? Should we add an option to not scale in calculateSUV?
  19728. meanStdDevSUV = {
  19729. mean: Object(_util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_16__["default"])(image, (meanStdDev.mean - image.intercept) / image.slope),
  19730. stdDev: Object(_util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_16__["default"])(image, (meanStdDev.stdDev - image.intercept) / image.slope)
  19731. };
  19732. } // If the mean and standard deviation values are sane, store them for later retrieval
  19733. if (meanStdDev && !isNaN(meanStdDev.mean)) {
  19734. data.meanStdDev = meanStdDev;
  19735. data.meanStdDevSUV = meanStdDevSUV;
  19736. }
  19737. } // Retrieve the pixel spacing values, and if they are not
  19738. // Real non-zero values, set them to 1
  19739. var _getPixelSpacing = Object(_util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_18__["default"])(image),
  19740. colPixelSpacing = _getPixelSpacing.colPixelSpacing,
  19741. rowPixelSpacing = _getPixelSpacing.rowPixelSpacing;
  19742. var scaling = (colPixelSpacing || 1) * (rowPixelSpacing || 1);
  19743. var area = freehandArea(data.handles.points, scaling); // If the area value is sane, store it for later retrieval
  19744. if (!isNaN(area)) {
  19745. data.area = area;
  19746. } // Set the invalidated flag to false so that this data won't automatically be recalculated
  19747. data.invalidated = false;
  19748. }
  19749. /**
  19750. *
  19751. *
  19752. * @param {*} evt
  19753. * @returns {undefined}
  19754. */
  19755. }, {
  19756. key: "renderToolData",
  19757. value: function renderToolData(evt) {
  19758. var _this2 = this;
  19759. var eventData = evt.detail; // If we have no toolState for this element, return immediately as there is nothing to do
  19760. var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_9__["getToolState"])(evt.currentTarget, this.name);
  19761. if (!toolState) {
  19762. return;
  19763. }
  19764. var image = eventData.image,
  19765. element = eventData.element;
  19766. var config = this.configuration;
  19767. var seriesModule = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.metaData.get('generalSeriesModule', image.imageId);
  19768. var modality = seriesModule ? seriesModule.modality : null; // We have tool data for this element - iterate over each one and draw it
  19769. var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_19__["getNewContext"])(eventData.canvasContext.canvas);
  19770. var lineWidth = _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_10__["default"].getToolWidth();
  19771. var renderDashed = config.renderDashed;
  19772. var lineDash = Object(_store_index_js__WEBPACK_IMPORTED_MODULE_12__["getModule"])('globalConfiguration').configuration.lineDash;
  19773. var _loop = function _loop(i) {
  19774. var data = toolState.data[i];
  19775. if (data.visible === false) {
  19776. return "continue";
  19777. }
  19778. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_19__["draw"])(context, function (context) {
  19779. var color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_11__["default"].getColorIfActive(data);
  19780. var fillColor;
  19781. if (data.active) {
  19782. if (data.handles.invalidHandlePlacement) {
  19783. color = config.invalidColor;
  19784. fillColor = config.invalidColor;
  19785. } else {
  19786. color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_11__["default"].getColorIfActive(data);
  19787. fillColor = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_11__["default"].getFillColor();
  19788. }
  19789. } else {
  19790. fillColor = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_11__["default"].getToolColor();
  19791. }
  19792. var options = {
  19793. color: color
  19794. };
  19795. if (renderDashed) {
  19796. options.lineDash = lineDash;
  19797. }
  19798. if (data.handles.points.length) {
  19799. var points = data.handles.points;
  19800. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_19__["drawJoinedLines"])(context, element, points[0], points, options);
  19801. if (data.polyBoundingBox) {
  19802. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_19__["drawJoinedLines"])(context, element, points[points.length - 1], [points[0]], options);
  19803. } else {
  19804. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_19__["drawJoinedLines"])(context, element, points[points.length - 1], [config.mouseLocation.handles.start], options);
  19805. }
  19806. } // Draw handles
  19807. options = {
  19808. color: color,
  19809. fill: fillColor
  19810. };
  19811. if (config.alwaysShowHandles || data.active && data.polyBoundingBox) {
  19812. // Render all handles
  19813. options.handleRadius = config.activeHandleRadius;
  19814. if (_this2.configuration.drawHandles) {
  19815. Object(_drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_21__["default"])(context, eventData, data.handles.points, options);
  19816. }
  19817. }
  19818. if (data.canComplete) {
  19819. // Draw large handle at the origin if can complete drawing
  19820. options.handleRadius = config.completeHandleRadius;
  19821. var handle = data.handles.points[0];
  19822. if (_this2.configuration.drawHandles) {
  19823. Object(_drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_21__["default"])(context, eventData, [handle], options);
  19824. }
  19825. }
  19826. if (data.active && !data.polyBoundingBox) {
  19827. // Draw handle at origin and at mouse if actively drawing
  19828. options.handleRadius = config.activeHandleRadius;
  19829. if (_this2.configuration.drawHandles) {
  19830. Object(_drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_21__["default"])(context, eventData, config.mouseLocation.handles, options);
  19831. }
  19832. var firstHandle = data.handles.points[0];
  19833. if (_this2.configuration.drawHandles) {
  19834. Object(_drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_21__["default"])(context, eventData, [firstHandle], options);
  19835. }
  19836. } // Update textbox stats
  19837. if (data.invalidated === true && !data.active) {
  19838. if (data.meanStdDev && data.meanStdDevSUV && data.area) {
  19839. _this2.throttledUpdateCachedStats(image, element, data);
  19840. } else {
  19841. _this2.updateCachedStats(image, element, data);
  19842. }
  19843. } // Only render text if polygon ROI has been completed and freehand 'shiftKey' mode was not used:
  19844. if (data.polyBoundingBox && !data.handles.textBox.freehand) {
  19845. // If the textbox has not been moved by the user, it should be displayed on the right-most
  19846. // Side of the tool.
  19847. if (!data.handles.textBox.hasMoved) {
  19848. // Find the rightmost side of the polyBoundingBox at its vertical center, and place the textbox here
  19849. // Note that this calculates it in image coordinates
  19850. data.handles.textBox.x = data.polyBoundingBox.left + data.polyBoundingBox.width;
  19851. data.handles.textBox.y = data.polyBoundingBox.top + data.polyBoundingBox.height / 2;
  19852. }
  19853. var text = textBoxText.call(_this2, data);
  19854. Object(_drawing_drawLinkedTextBox_js__WEBPACK_IMPORTED_MODULE_20__["default"])(context, element, data.handles.textBox, text, data.handles.points, textBoxAnchorPoints, color, lineWidth, 0, true);
  19855. }
  19856. });
  19857. };
  19858. for (var i = 0; i < toolState.data.length; i++) {
  19859. var _ret = _loop(i);
  19860. if (_ret === "continue") continue;
  19861. }
  19862. function textBoxText(data) {
  19863. var meanStdDev = data.meanStdDev,
  19864. meanStdDevSUV = data.meanStdDevSUV,
  19865. area = data.area; // Define an array to store the rows of text for the textbox
  19866. var textLines = []; // If the mean and standard deviation values are present, display them
  19867. if (meanStdDev && meanStdDev.mean !== undefined) {
  19868. // If the modality is CT, add HU to denote Hounsfield Units
  19869. var moSuffix = '';
  19870. if (modality === 'CT') {
  19871. moSuffix = 'HU';
  19872. }
  19873. data.unit = moSuffix; // Create a line of text to display the mean and any units that were specified (i.e. HU)
  19874. var meanText = "Mean: ".concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_17__["default"])(meanStdDev.mean.toFixed(2)), " ").concat(moSuffix); // Create a line of text to display the standard deviation and any units that were specified (i.e. HU)
  19875. var stdDevText = "StdDev: ".concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_17__["default"])(meanStdDev.stdDev.toFixed(2)), " ").concat(moSuffix); // If this image has SUV values to display, concatenate them to the text line
  19876. if (meanStdDevSUV && meanStdDevSUV.mean !== undefined) {
  19877. var SUVtext = ' SUV: ';
  19878. meanText += SUVtext + Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_17__["default"])(meanStdDevSUV.mean.toFixed(2));
  19879. stdDevText += SUVtext + Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_17__["default"])(meanStdDevSUV.stdDev.toFixed(2));
  19880. } // Add these text lines to the array to be displayed in the textbox
  19881. textLines.push(meanText);
  19882. textLines.push(stdDevText);
  19883. } // If the area is a sane value, display it
  19884. if (area) {
  19885. // Determine the area suffix based on the pixel spacing in the image.
  19886. // If pixel spacing is present, use millimeters. Otherwise, use pixels.
  19887. // This uses Char code 178 for a superscript 2
  19888. var suffix = " mm".concat(String.fromCharCode(178));
  19889. var _getPixelSpacing2 = Object(_util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_18__["default"])(image),
  19890. rowPixelSpacing = _getPixelSpacing2.rowPixelSpacing,
  19891. colPixelSpacing = _getPixelSpacing2.colPixelSpacing;
  19892. if (!rowPixelSpacing || !colPixelSpacing) {
  19893. suffix = " pixels".concat(String.fromCharCode(178));
  19894. } // Create a line of text to display the area and its units
  19895. var areaText = "Area: ".concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_17__["default"])(area.toFixed(2))).concat(suffix); // Add this text line to the array to be displayed in the textbox
  19896. textLines.push(areaText);
  19897. }
  19898. return textLines;
  19899. }
  19900. function textBoxAnchorPoints(handles) {
  19901. return handles;
  19902. }
  19903. }
  19904. }, {
  19905. key: "addNewMeasurement",
  19906. value: function addNewMeasurement(evt) {
  19907. var eventData = evt.detail;
  19908. this._startDrawing(evt);
  19909. this._addPoint(eventData);
  19910. preventPropagation(evt);
  19911. }
  19912. }, {
  19913. key: "preMouseDownCallback",
  19914. value: function preMouseDownCallback(evt) {
  19915. var eventData = evt.detail;
  19916. var nearby = this._pointNearHandleAllTools(eventData);
  19917. if (eventData.event.ctrlKey) {
  19918. if (nearby !== undefined && nearby.handleNearby.hasBoundingBox) {// Ctrl + clicked textBox, do nothing but still consume event.
  19919. } else {
  19920. insertOrDelete.call(this, evt, nearby);
  19921. }
  19922. preventPropagation(evt);
  19923. return true;
  19924. }
  19925. return false;
  19926. }
  19927. }, {
  19928. key: "handleSelectedCallback",
  19929. value: function handleSelectedCallback(evt, toolData, handle) {
  19930. var interactionType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'mouse';
  19931. var element = evt.detail.element;
  19932. var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_9__["getToolState"])(element, this.name);
  19933. if (handle.hasBoundingBox) {
  19934. // Use default move handler.
  19935. Object(_util_findAndMoveHelpers_js__WEBPACK_IMPORTED_MODULE_14__["moveHandleNearImagePoint"])(evt, this, toolData, handle, interactionType);
  19936. return;
  19937. }
  19938. var config = this.configuration;
  19939. config.dragOrigin = {
  19940. x: handle.x,
  19941. y: handle.y
  19942. }; // Iterating over handles of all toolData instances to find the indices of the selected handle
  19943. for (var toolIndex = 0; toolIndex < toolState.data.length; toolIndex++) {
  19944. var points = toolState.data[toolIndex].handles.points;
  19945. for (var p = 0; p < points.length; p++) {
  19946. if (points[p] === handle) {
  19947. config.currentHandle = p;
  19948. config.currentTool = toolIndex;
  19949. }
  19950. }
  19951. }
  19952. this._modifying = true;
  19953. this._activateModify(element); // Interupt eventDispatchers
  19954. preventPropagation(evt);
  19955. }
  19956. /**
  19957. * Event handler for MOUSE_MOVE during drawing event loop.
  19958. *
  19959. * @event
  19960. * @param {Object} evt - The event.
  19961. * @returns {undefined}
  19962. */
  19963. }, {
  19964. key: "_drawingMouseMoveCallback",
  19965. value: function _drawingMouseMoveCallback(evt) {
  19966. var eventData = evt.detail;
  19967. var currentPoints = eventData.currentPoints,
  19968. element = eventData.element;
  19969. var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_9__["getToolState"])(element, this.name);
  19970. var config = this.configuration;
  19971. var currentTool = config.currentTool;
  19972. var data = toolState.data[currentTool];
  19973. var coords = currentPoints.canvas; // Set the mouseLocation handle
  19974. this._getMouseLocation(eventData);
  19975. this._checkInvalidHandleLocation(data, eventData); // Mouse move -> Polygon Mode
  19976. var handleNearby = this._pointNearHandle(element, data, coords);
  19977. var points = data.handles.points; // If there is a handle nearby to snap to
  19978. // (and it's not the actual mouse handle)
  19979. if (handleNearby !== undefined && !handleNearby.hasBoundingBox && handleNearby < points.length - 1) {
  19980. config.mouseLocation.handles.start.x = points[handleNearby].x;
  19981. config.mouseLocation.handles.start.y = points[handleNearby].y;
  19982. } // Force onImageRendered
  19983. _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(element);
  19984. }
  19985. /**
  19986. * Event handler for MOUSE_DRAG during drawing event loop.
  19987. *
  19988. * @event
  19989. * @param {Object} evt - The event.
  19990. * @returns {undefined}
  19991. */
  19992. }, {
  19993. key: "_drawingMouseDragCallback",
  19994. value: function _drawingMouseDragCallback(evt) {
  19995. if (!this.options.mouseButtonMask.includes(evt.detail.buttons)) {
  19996. return;
  19997. }
  19998. this._drawingDrag(evt);
  19999. }
  20000. /**
  20001. * Event handler for TOUCH_DRAG during drawing event loop.
  20002. *
  20003. * @event
  20004. * @param {Object} evt - The event.
  20005. * @returns {undefined}
  20006. */
  20007. }, {
  20008. key: "_drawingTouchDragCallback",
  20009. value: function _drawingTouchDragCallback(evt) {
  20010. this._drawingDrag(evt);
  20011. }
  20012. }, {
  20013. key: "_drawingDrag",
  20014. value: function _drawingDrag(evt) {
  20015. var eventData = evt.detail;
  20016. var element = eventData.element;
  20017. var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_9__["getToolState"])(element, this.name);
  20018. var config = this.configuration;
  20019. var currentTool = config.currentTool;
  20020. var data = toolState.data[currentTool]; // Set the mouseLocation handle
  20021. this._getMouseLocation(eventData);
  20022. this._checkInvalidHandleLocation(data, eventData);
  20023. this._addPointPencilMode(eventData, data.handles.points);
  20024. this._dragging = true; // Force onImageRendered
  20025. _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(element);
  20026. }
  20027. /**
  20028. * Event handler for MOUSE_UP during drawing event loop.
  20029. *
  20030. * @event
  20031. * @param {Object} evt - The event.
  20032. * @returns {undefined}
  20033. */
  20034. }, {
  20035. key: "_drawingMouseUpCallback",
  20036. value: function _drawingMouseUpCallback(evt) {
  20037. var element = evt.detail.element;
  20038. if (!this._dragging) {
  20039. return;
  20040. }
  20041. this._dragging = false;
  20042. var config = this.configuration;
  20043. var currentTool = config.currentTool;
  20044. var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_9__["getToolState"])(element, this.name);
  20045. var data = toolState.data[currentTool];
  20046. if (!freehandIntersect.end(data.handles.points) && data.canComplete) {
  20047. var lastHandlePlaced = config.currentHandle;
  20048. this._endDrawing(element, lastHandlePlaced);
  20049. }
  20050. preventPropagation(evt);
  20051. return;
  20052. }
  20053. /**
  20054. * Event handler for MOUSE_DOWN during drawing event loop.
  20055. *
  20056. * @event
  20057. * @param {Object} evt - The event.
  20058. * @returns {undefined}
  20059. */
  20060. }, {
  20061. key: "_drawingMouseDownCallback",
  20062. value: function _drawingMouseDownCallback(evt) {
  20063. var eventData = evt.detail;
  20064. var buttons = eventData.buttons,
  20065. currentPoints = eventData.currentPoints,
  20066. element = eventData.element;
  20067. if (!this.options.mouseButtonMask.includes(buttons)) {
  20068. return;
  20069. }
  20070. var coords = currentPoints.canvas;
  20071. var config = this.configuration;
  20072. var currentTool = config.currentTool;
  20073. var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_9__["getToolState"])(element, this.name);
  20074. var data = toolState.data[currentTool];
  20075. var handleNearby = this._pointNearHandle(element, data, coords);
  20076. if (!freehandIntersect.end(data.handles.points) && data.canComplete) {
  20077. var lastHandlePlaced = config.currentHandle;
  20078. this._endDrawing(element, lastHandlePlaced);
  20079. } else if (handleNearby === undefined) {
  20080. this._addPoint(eventData);
  20081. }
  20082. preventPropagation(evt);
  20083. return;
  20084. }
  20085. /**
  20086. * Event handler for TOUCH_START during drawing event loop.
  20087. *
  20088. * @event
  20089. * @param {Object} evt - The event.
  20090. * @returns {undefined}
  20091. */
  20092. }, {
  20093. key: "_drawingTouchStartCallback",
  20094. value: function _drawingTouchStartCallback(evt) {
  20095. var eventData = evt.detail;
  20096. var currentPoints = eventData.currentPoints,
  20097. element = eventData.element;
  20098. var coords = currentPoints.canvas;
  20099. var config = this.configuration;
  20100. var currentTool = config.currentTool;
  20101. var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_9__["getToolState"])(element, this.name);
  20102. var data = toolState.data[currentTool];
  20103. var handleNearby = this._pointNearHandle(element, data, coords);
  20104. if (!freehandIntersect.end(data.handles.points) && data.canComplete) {
  20105. var lastHandlePlaced = config.currentHandle;
  20106. this._endDrawing(element, lastHandlePlaced);
  20107. } else if (handleNearby === undefined) {
  20108. this._addPoint(eventData);
  20109. }
  20110. preventPropagation(evt);
  20111. return;
  20112. }
  20113. /** Ends the active drawing loop and completes the polygon.
  20114. *
  20115. * @public
  20116. * @param {Object} element - The element on which the roi is being drawn.
  20117. * @returns {null}
  20118. */
  20119. }, {
  20120. key: "completeDrawing",
  20121. value: function completeDrawing(element) {
  20122. if (!this._drawing) {
  20123. return;
  20124. }
  20125. var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_9__["getToolState"])(element, this.name);
  20126. var config = this.configuration;
  20127. var data = toolState.data[config.currentTool];
  20128. if (!freehandIntersect.end(data.handles.points) && data.handles.points.length >= 2) {
  20129. var lastHandlePlaced = config.currentHandle;
  20130. data.polyBoundingBox = {};
  20131. this._endDrawing(element, lastHandlePlaced);
  20132. }
  20133. }
  20134. /**
  20135. * Event handler for MOUSE_DOUBLE_CLICK during drawing event loop.
  20136. *
  20137. * @event
  20138. * @param {Object} evt - The event.
  20139. * @returns {undefined}
  20140. */
  20141. }, {
  20142. key: "_drawingMouseDoubleClickCallback",
  20143. value: function _drawingMouseDoubleClickCallback(evt) {
  20144. var element = evt.detail.element;
  20145. this.completeDrawing(element);
  20146. preventPropagation(evt);
  20147. }
  20148. /**
  20149. * Event handler for DOUBLE_TAP during drawing event loop.
  20150. *
  20151. * @event
  20152. * @param {Object} evt - The event.
  20153. * @returns {undefined}
  20154. */
  20155. }, {
  20156. key: "_drawingDoubleTapClickCallback",
  20157. value: function _drawingDoubleTapClickCallback(evt) {
  20158. var element = evt.detail.element;
  20159. this.completeDrawing(element);
  20160. preventPropagation(evt);
  20161. }
  20162. /**
  20163. * Event handler for MOUSE_DRAG during handle drag event loop.
  20164. *
  20165. * @event
  20166. * @param {Object} evt - The event.
  20167. * @returns {undefined}
  20168. */
  20169. }, {
  20170. key: "_editMouseDragCallback",
  20171. value: function _editMouseDragCallback(evt) {
  20172. var eventData = evt.detail;
  20173. var element = eventData.element,
  20174. buttons = eventData.buttons;
  20175. if (!this.options.mouseButtonMask.includes(buttons)) {
  20176. return;
  20177. }
  20178. var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_9__["getToolState"])(element, this.name);
  20179. var config = this.configuration;
  20180. var data = toolState.data[config.currentTool];
  20181. var currentHandle = config.currentHandle;
  20182. var points = data.handles.points;
  20183. var handleIndex = -1; // Set the mouseLocation handle
  20184. this._getMouseLocation(eventData);
  20185. data.handles.invalidHandlePlacement = freehandIntersect.modify(points, currentHandle);
  20186. data.active = true;
  20187. data.highlight = true;
  20188. points[currentHandle].x = config.mouseLocation.handles.start.x;
  20189. points[currentHandle].y = config.mouseLocation.handles.start.y;
  20190. handleIndex = this._getPrevHandleIndex(currentHandle, points);
  20191. if (currentHandle >= 0) {
  20192. var lastLineIndex = points[handleIndex].lines.length - 1;
  20193. var lastLine = points[handleIndex].lines[lastLineIndex];
  20194. lastLine.x = config.mouseLocation.handles.start.x;
  20195. lastLine.y = config.mouseLocation.handles.start.y;
  20196. } // Update the image
  20197. _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(element);
  20198. }
  20199. /**
  20200. * Event handler for TOUCH_DRAG during handle drag event loop.
  20201. *
  20202. * @event
  20203. * @param {Object} evt - The event.
  20204. * @returns {void}
  20205. */
  20206. }, {
  20207. key: "_editTouchDragCallback",
  20208. value: function _editTouchDragCallback(evt) {
  20209. var eventData = evt.detail;
  20210. var element = eventData.element;
  20211. var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_9__["getToolState"])(element, this.name);
  20212. var config = this.configuration;
  20213. var data = toolState.data[config.currentTool];
  20214. var currentHandle = config.currentHandle;
  20215. var points = data.handles.points;
  20216. var handleIndex = -1; // Set the mouseLocation handle
  20217. this._getMouseLocation(eventData);
  20218. data.handles.invalidHandlePlacement = freehandIntersect.modify(points, currentHandle);
  20219. data.active = true;
  20220. data.highlight = true;
  20221. points[currentHandle].x = config.mouseLocation.handles.start.x;
  20222. points[currentHandle].y = config.mouseLocation.handles.start.y;
  20223. handleIndex = this._getPrevHandleIndex(currentHandle, points);
  20224. if (currentHandle >= 0) {
  20225. var lastLineIndex = points[handleIndex].lines.length - 1;
  20226. var lastLine = points[handleIndex].lines[lastLineIndex];
  20227. lastLine.x = config.mouseLocation.handles.start.x;
  20228. lastLine.y = config.mouseLocation.handles.start.y;
  20229. } // Update the image
  20230. _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(element);
  20231. }
  20232. /**
  20233. * Returns the previous handle to the current one.
  20234. * @param {Number} currentHandle - the current handle index
  20235. * @param {Array} points - the handles Array of the freehand data
  20236. * @returns {Number} - The index of the previos handle
  20237. */
  20238. }, {
  20239. key: "_getPrevHandleIndex",
  20240. value: function _getPrevHandleIndex(currentHandle, points) {
  20241. if (currentHandle === 0) {
  20242. return points.length - 1;
  20243. }
  20244. return currentHandle - 1;
  20245. }
  20246. /**
  20247. * Event handler for MOUSE_UP during handle drag event loop.
  20248. *
  20249. * @private
  20250. * @param {Object} evt - The event.
  20251. * @returns {undefined}
  20252. */
  20253. }, {
  20254. key: "_editMouseUpCallback",
  20255. value: function _editMouseUpCallback(evt) {
  20256. var eventData = evt.detail;
  20257. var element = eventData.element;
  20258. var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_9__["getToolState"])(element, this.name);
  20259. this._deactivateModify(element);
  20260. this._dropHandle(eventData, toolState);
  20261. this._endDrawing(element);
  20262. _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(element);
  20263. }
  20264. /**
  20265. * Places a handle of the freehand tool if the new location is valid.
  20266. * If the new location is invalid the handle snaps back to its previous position.
  20267. *
  20268. * @private
  20269. * @param {Object} eventData - Data object associated with the event.
  20270. * @param {Object} toolState - The data associated with the freehand tool.
  20271. * @modifies {toolState}
  20272. * @returns {undefined}
  20273. */
  20274. }, {
  20275. key: "_dropHandle",
  20276. value: function _dropHandle(eventData, toolState) {
  20277. var config = this.configuration;
  20278. var currentTool = config.currentTool;
  20279. var handles = toolState.data[currentTool].handles;
  20280. var points = handles.points; // Don't allow the line being modified to intersect other lines
  20281. if (handles.invalidHandlePlacement) {
  20282. var currentHandle = config.currentHandle;
  20283. var currentHandleData = points[currentHandle];
  20284. var previousHandleData;
  20285. if (currentHandle === 0) {
  20286. var lastHandleID = points.length - 1;
  20287. previousHandleData = points[lastHandleID];
  20288. } else {
  20289. previousHandleData = points[currentHandle - 1];
  20290. } // Snap back to previous position
  20291. currentHandleData.x = config.dragOrigin.x;
  20292. currentHandleData.y = config.dragOrigin.y;
  20293. previousHandleData.lines[0] = currentHandleData;
  20294. handles.invalidHandlePlacement = false;
  20295. }
  20296. }
  20297. /**
  20298. * Begining of drawing loop when tool is active and a click event happens far
  20299. * from existing handles.
  20300. *
  20301. * @private
  20302. * @param {Object} evt - The event.
  20303. * @returns {undefined}
  20304. */
  20305. }, {
  20306. key: "_startDrawing",
  20307. value: function _startDrawing(evt) {
  20308. var eventData = evt.detail;
  20309. var measurementData = this.createNewMeasurement(eventData);
  20310. var element = eventData.element;
  20311. var config = this.configuration;
  20312. var interactionType;
  20313. if (evt.type === _events_js__WEBPACK_IMPORTED_MODULE_6__["default"].MOUSE_DOWN_ACTIVATE) {
  20314. interactionType = 'Mouse';
  20315. } else if (evt.type === _events_js__WEBPACK_IMPORTED_MODULE_6__["default"].TOUCH_START_ACTIVE) {
  20316. interactionType = 'Touch';
  20317. }
  20318. this._activateDraw(element, interactionType);
  20319. this._getMouseLocation(eventData);
  20320. Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_9__["addToolState"])(element, this.name, measurementData);
  20321. var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_9__["getToolState"])(element, this.name);
  20322. config.currentTool = toolState.data.length - 1;
  20323. this._activeDrawingToolReference = toolState.data[config.currentTool];
  20324. }
  20325. /**
  20326. * Adds a point on mouse click in polygon mode.
  20327. *
  20328. * @private
  20329. * @param {Object} eventData - data object associated with an event.
  20330. * @returns {undefined}
  20331. */
  20332. }, {
  20333. key: "_addPoint",
  20334. value: function _addPoint(eventData) {
  20335. var currentPoints = eventData.currentPoints,
  20336. element = eventData.element;
  20337. var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_9__["getToolState"])(element, this.name); // Get the toolState from the last-drawn polygon
  20338. var config = this.configuration;
  20339. var data = toolState.data[config.currentTool];
  20340. if (data.handles.invalidHandlePlacement) {
  20341. return;
  20342. }
  20343. var newHandleData = new FreehandHandleData(currentPoints.image); // If this is not the first handle
  20344. if (data.handles.points.length) {
  20345. // Add the line from the current handle to the new handle
  20346. data.handles.points[config.currentHandle - 1].lines.push(currentPoints.image);
  20347. } // Add the new handle
  20348. data.handles.points.push(newHandleData); // Increment the current handle value
  20349. config.currentHandle += 1; // Force onImageRendered to fire
  20350. _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(element);
  20351. this.fireModifiedEvent(element, data);
  20352. }
  20353. /**
  20354. * If in pencilMode, check the mouse position is farther than the minimum
  20355. * distance between points, then add a point.
  20356. *
  20357. * @private
  20358. * @param {Object} eventData - Data object associated with an event.
  20359. * @param {Object} points - Data object associated with the tool.
  20360. * @returns {undefined}
  20361. */
  20362. }, {
  20363. key: "_addPointPencilMode",
  20364. value: function _addPointPencilMode(eventData, points) {
  20365. var _this3 = this;
  20366. var config = this.configuration;
  20367. var element = eventData.element;
  20368. var mousePoint = config.mouseLocation.handles.start;
  20369. var handleFurtherThanMinimumSpacing = function handleFurtherThanMinimumSpacing(handle) {
  20370. return _this3._isDistanceLargerThanSpacing(element, handle, mousePoint);
  20371. };
  20372. if (points.every(handleFurtherThanMinimumSpacing)) {
  20373. this._addPoint(eventData);
  20374. }
  20375. }
  20376. /**
  20377. * Ends the active drawing loop and completes the polygon.
  20378. *
  20379. * @private
  20380. * @param {Object} element - The element on which the roi is being drawn.
  20381. * @param {Object} handleNearby - the handle nearest to the mouse cursor.
  20382. * @returns {undefined}
  20383. */
  20384. }, {
  20385. key: "_endDrawing",
  20386. value: function _endDrawing(element, handleNearby) {
  20387. var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_9__["getToolState"])(element, this.name);
  20388. var config = this.configuration;
  20389. var data = toolState.data[config.currentTool];
  20390. data.active = false;
  20391. data.highlight = false;
  20392. data.handles.invalidHandlePlacement = false; // Connect the end handle to the origin handle
  20393. if (handleNearby !== undefined) {
  20394. var points = data.handles.points;
  20395. points[config.currentHandle - 1].lines.push(points[0]);
  20396. }
  20397. if (this._modifying) {
  20398. this._modifying = false;
  20399. data.invalidated = true;
  20400. } // Reset the current handle
  20401. config.currentHandle = 0;
  20402. config.currentTool = -1;
  20403. data.canComplete = false;
  20404. if (this._drawing) {
  20405. this._deactivateDraw(element);
  20406. }
  20407. _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(element);
  20408. this.fireModifiedEvent(element, data);
  20409. this.fireCompletedEvent(element, data);
  20410. }
  20411. /**
  20412. * Returns a handle of a particular tool if it is close to the mouse cursor
  20413. *
  20414. * @private
  20415. * @param {Object} element - The element on which the roi is being drawn.
  20416. * @param {Object} data Data object associated with the tool.
  20417. * @param {*} coords
  20418. * @returns {Number|Object|Boolean}
  20419. */
  20420. }, {
  20421. key: "_pointNearHandle",
  20422. value: function _pointNearHandle(element, data, coords) {
  20423. if (data.handles === undefined || data.handles.points === undefined) {
  20424. return;
  20425. }
  20426. if (data.visible === false) {
  20427. return;
  20428. }
  20429. for (var i = 0; i < data.handles.points.length; i++) {
  20430. var handleCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.pixelToCanvas(element, data.handles.points[i]);
  20431. if (_externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstoneMath.point.distance(handleCanvas, coords) < 6) {
  20432. return i;
  20433. }
  20434. } // Check to see if mouse in bounding box of textbox
  20435. if (data.handles.textBox) {
  20436. if (Object(_util_pointInsideBoundingBox_js__WEBPACK_IMPORTED_MODULE_15__["default"])(data.handles.textBox, coords)) {
  20437. return data.handles.textBox;
  20438. }
  20439. }
  20440. }
  20441. /**
  20442. * Returns a handle if it is close to the mouse cursor (all tools)
  20443. *
  20444. * @private
  20445. * @param {Object} eventData - data object associated with an event.
  20446. * @returns {Object}
  20447. */
  20448. }, {
  20449. key: "_pointNearHandleAllTools",
  20450. value: function _pointNearHandleAllTools(eventData) {
  20451. var currentPoints = eventData.currentPoints,
  20452. element = eventData.element;
  20453. var coords = currentPoints.canvas;
  20454. var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_9__["getToolState"])(element, this.name);
  20455. if (!toolState) {
  20456. return;
  20457. }
  20458. var handleNearby;
  20459. for (var toolIndex = 0; toolIndex < toolState.data.length; toolIndex++) {
  20460. handleNearby = this._pointNearHandle(element, toolState.data[toolIndex], coords);
  20461. if (handleNearby !== undefined) {
  20462. return {
  20463. handleNearby: handleNearby,
  20464. toolIndex: toolIndex
  20465. };
  20466. }
  20467. }
  20468. }
  20469. /**
  20470. * Gets the current mouse location and stores it in the configuration object.
  20471. *
  20472. * @private
  20473. * @param {Object} eventData The data assoicated with the event.
  20474. * @returns {undefined}
  20475. */
  20476. }, {
  20477. key: "_getMouseLocation",
  20478. value: function _getMouseLocation(eventData) {
  20479. var currentPoints = eventData.currentPoints,
  20480. image = eventData.image; // Set the mouseLocation handle
  20481. var config = this.configuration;
  20482. config.mouseLocation.handles.start.x = currentPoints.image.x;
  20483. config.mouseLocation.handles.start.y = currentPoints.image.y;
  20484. Object(_util_clip_js__WEBPACK_IMPORTED_MODULE_22__["clipToBox"])(config.mouseLocation.handles.start, image);
  20485. }
  20486. /**
  20487. * Returns true if the proposed location of a new handle is invalid.
  20488. *
  20489. * @private
  20490. * @param {Object} data Data object associated with the tool.
  20491. * @param {Object} eventData The data assoicated with the event.
  20492. * @returns {Boolean}
  20493. */
  20494. }, {
  20495. key: "_checkInvalidHandleLocation",
  20496. value: function _checkInvalidHandleLocation(data, eventData) {
  20497. if (data.handles.points.length < 2) {
  20498. return true;
  20499. }
  20500. var invalidHandlePlacement;
  20501. if (this._dragging) {
  20502. invalidHandlePlacement = this._checkHandlesPencilMode(data, eventData);
  20503. } else {
  20504. invalidHandlePlacement = this._checkHandlesPolygonMode(data, eventData);
  20505. }
  20506. data.handles.invalidHandlePlacement = invalidHandlePlacement;
  20507. }
  20508. /**
  20509. * Returns true if the proposed location of a new handle is invalid (in polygon mode).
  20510. *
  20511. * @private
  20512. *
  20513. * @param {Object} data - data object associated with the tool.
  20514. * @param {Object} eventData The data assoicated with the event.
  20515. * @returns {Boolean}
  20516. */
  20517. }, {
  20518. key: "_checkHandlesPolygonMode",
  20519. value: function _checkHandlesPolygonMode(data, eventData) {
  20520. var config = this.configuration;
  20521. var element = eventData.element;
  20522. var mousePoint = config.mouseLocation.handles.start;
  20523. var points = data.handles.points;
  20524. var invalidHandlePlacement = false;
  20525. data.canComplete = false;
  20526. var mouseAtOriginHandle = this._isDistanceSmallerThanCompleteSpacingCanvas(element, points[0], mousePoint);
  20527. if (mouseAtOriginHandle && !freehandIntersect.end(points) && points.length > 2) {
  20528. data.canComplete = true;
  20529. invalidHandlePlacement = false;
  20530. } else {
  20531. invalidHandlePlacement = freehandIntersect.newHandle(mousePoint, points);
  20532. }
  20533. return invalidHandlePlacement;
  20534. }
  20535. /**
  20536. * Returns true if the proposed location of a new handle is invalid (in pencilMode).
  20537. *
  20538. * @private
  20539. * @param {Object} data - data object associated with the tool.
  20540. * @param {Object} eventData The data associated with the event.
  20541. * @returns {Boolean}
  20542. */
  20543. }, {
  20544. key: "_checkHandlesPencilMode",
  20545. value: function _checkHandlesPencilMode(data, eventData) {
  20546. var config = this.configuration;
  20547. var mousePoint = config.mouseLocation.handles.start;
  20548. var points = data.handles.points;
  20549. var invalidHandlePlacement = freehandIntersect.newHandle(mousePoint, points);
  20550. if (invalidHandlePlacement === false) {
  20551. invalidHandlePlacement = this._invalidHandlePencilMode(data, eventData);
  20552. }
  20553. return invalidHandlePlacement;
  20554. }
  20555. /**
  20556. * Returns true if the mouse position is far enough from previous points (in pencilMode).
  20557. *
  20558. * @private
  20559. * @param {Object} data - data object associated with the tool.
  20560. * @param {Object} eventData The data associated with the event.
  20561. * @returns {Boolean}
  20562. */
  20563. }, {
  20564. key: "_invalidHandlePencilMode",
  20565. value: function _invalidHandlePencilMode(data, eventData) {
  20566. var config = this.configuration;
  20567. var element = eventData.element;
  20568. var mousePoint = config.mouseLocation.handles.start;
  20569. var points = data.handles.points;
  20570. var mouseAtOriginHandle = this._isDistanceSmallerThanCompleteSpacingCanvas(element, points[0], mousePoint);
  20571. if (mouseAtOriginHandle) {
  20572. data.canComplete = true;
  20573. return false;
  20574. }
  20575. data.canComplete = false; // Compare with all other handles appart from the last one
  20576. for (var i = 1; i < points.length - 1; i++) {
  20577. if (this._isDistanceSmallerThanSpacing(element, points[i], mousePoint)) {
  20578. return true;
  20579. }
  20580. }
  20581. return false;
  20582. }
  20583. /**
  20584. * Returns true if two points are closer than this.configuration.spacing.
  20585. *
  20586. * @private
  20587. * @param {Object} element The element on which the roi is being drawn.
  20588. * @param {Object} p1 The first point, in pixel space.
  20589. * @param {Object} p2 The second point, in pixel space.
  20590. * @returns {boolean} True if the distance is smaller than the
  20591. * allowed canvas spacing.
  20592. */
  20593. }, {
  20594. key: "_isDistanceSmallerThanCompleteSpacingCanvas",
  20595. value: function _isDistanceSmallerThanCompleteSpacingCanvas(element, p1, p2) {
  20596. var p1Canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.pixelToCanvas(element, p1);
  20597. var p2Canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.pixelToCanvas(element, p2);
  20598. var completeHandleRadius;
  20599. if (this._drawingInteractionType === 'Mouse') {
  20600. completeHandleRadius = this.configuration.completeHandleRadius;
  20601. } else if (this._drawingInteractionType === 'Touch') {
  20602. completeHandleRadius = this.configuration.completeHandleRadiusTouch;
  20603. }
  20604. return this._compareDistanceToSpacing(element, p1Canvas, p2Canvas, '<', completeHandleRadius);
  20605. }
  20606. /**
  20607. * Returns true if two points are closer than this.configuration.spacing.
  20608. *
  20609. * @private
  20610. * @param {Object} element The element on which the roi is being drawn.
  20611. * @param {Object} p1 The first point, in pixel space.
  20612. * @param {Object} p2 The second point, in pixel space.
  20613. * @returns {boolean} True if the distance is smaller than the
  20614. * allowed canvas spacing.
  20615. */
  20616. }, {
  20617. key: "_isDistanceSmallerThanSpacing",
  20618. value: function _isDistanceSmallerThanSpacing(element, p1, p2) {
  20619. return this._compareDistanceToSpacing(element, p1, p2, '<');
  20620. }
  20621. /**
  20622. * Returns true if two points are farther than this.configuration.spacing.
  20623. *
  20624. * @private
  20625. * @param {Object} element The element on which the roi is being drawn.
  20626. * @param {Object} p1 The first point, in pixel space.
  20627. * @param {Object} p2 The second point, in pixel space.
  20628. * @returns {boolean} True if the distance is smaller than the
  20629. * allowed canvas spacing.
  20630. */
  20631. }, {
  20632. key: "_isDistanceLargerThanSpacing",
  20633. value: function _isDistanceLargerThanSpacing(element, p1, p2) {
  20634. return this._compareDistanceToSpacing(element, p1, p2, '>');
  20635. }
  20636. /**
  20637. * Compares the distance between two points to this.configuration.spacing.
  20638. *
  20639. * @private
  20640. * @param {Object} element The element on which the roi is being drawn.
  20641. * @param {Object} p1 The first point, in pixel space.
  20642. * @param {Object} p2 The second point, in pixel space.
  20643. * @param {string} comparison The comparison to make.
  20644. * @param {number} spacing The allowed canvas spacing
  20645. * @returns {boolean} True if the distance is smaller than the
  20646. * allowed canvas spacing.
  20647. */
  20648. }, {
  20649. key: "_compareDistanceToSpacing",
  20650. value: function _compareDistanceToSpacing(element, p1, p2) {
  20651. var comparison = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '>';
  20652. var spacing = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : this.configuration.spacing;
  20653. if (comparison === '>') {
  20654. return _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstoneMath.point.distance(p1, p2) > spacing;
  20655. }
  20656. return _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstoneMath.point.distance(p1, p2) < spacing;
  20657. }
  20658. /**
  20659. * Adds drawing loop event listeners.
  20660. *
  20661. * @private
  20662. * @param {Object} element - The viewport element to add event listeners to.
  20663. * @param {string} interactionType - The interactionType used for the loop.
  20664. * @modifies {element}
  20665. * @returns {undefined}
  20666. */
  20667. }, {
  20668. key: "_activateDraw",
  20669. value: function _activateDraw(element) {
  20670. var interactionType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'Mouse';
  20671. this._drawing = true;
  20672. this._drawingInteractionType = interactionType;
  20673. _store_index_js__WEBPACK_IMPORTED_MODULE_12__["state"].isMultiPartToolActive = true;
  20674. Object(_store_setToolCursor_js__WEBPACK_IMPORTED_MODULE_23__["hideToolCursor"])(this.element); // Polygonal Mode
  20675. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].MOUSE_DOWN, this._drawingMouseDownCallback);
  20676. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].MOUSE_MOVE, this._drawingMouseMoveCallback);
  20677. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].MOUSE_DOUBLE_CLICK, this._drawingMouseDoubleClickCallback); // Drag/Pencil Mode
  20678. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].MOUSE_DRAG, this._drawingMouseDragCallback);
  20679. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].MOUSE_UP, this._drawingMouseUpCallback); // Touch
  20680. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].TOUCH_START, this._drawingMouseMoveCallback);
  20681. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].TOUCH_START, this._drawingTouchStartCallback);
  20682. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].TOUCH_DRAG, this._drawingTouchDragCallback);
  20683. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].TOUCH_END, this._drawingMouseUpCallback);
  20684. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].DOUBLE_TAP, this._drawingDoubleTapClickCallback);
  20685. _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(element);
  20686. }
  20687. /**
  20688. * Removes drawing loop event listeners.
  20689. *
  20690. * @private
  20691. * @param {Object} element - The viewport element to add event listeners to.
  20692. * @modifies {element}
  20693. * @returns {undefined}
  20694. */
  20695. }, {
  20696. key: "_deactivateDraw",
  20697. value: function _deactivateDraw(element) {
  20698. this._drawing = false;
  20699. _store_index_js__WEBPACK_IMPORTED_MODULE_12__["state"].isMultiPartToolActive = false;
  20700. this._activeDrawingToolReference = null;
  20701. this._drawingInteractionType = null;
  20702. Object(_store_setToolCursor_js__WEBPACK_IMPORTED_MODULE_23__["setToolCursor"])(this.element, this.svgCursor);
  20703. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].MOUSE_DOWN, this._drawingMouseDownCallback);
  20704. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].MOUSE_MOVE, this._drawingMouseMoveCallback);
  20705. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].MOUSE_DOUBLE_CLICK, this._drawingMouseDoubleClickCallback);
  20706. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].MOUSE_DRAG, this._drawingMouseDragCallback);
  20707. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].MOUSE_UP, this._drawingMouseUpCallback); // Touch
  20708. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].TOUCH_START, this._drawingTouchStartCallback);
  20709. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].TOUCH_DRAG, this._drawingTouchDragCallback);
  20710. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].TOUCH_START, this._drawingMouseMoveCallback);
  20711. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].TOUCH_END, this._drawingMouseUpCallback);
  20712. _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(element);
  20713. }
  20714. /**
  20715. * Adds modify loop event listeners.
  20716. *
  20717. * @private
  20718. * @param {Object} element - The viewport element to add event listeners to.
  20719. * @modifies {element}
  20720. * @returns {undefined}
  20721. */
  20722. }, {
  20723. key: "_activateModify",
  20724. value: function _activateModify(element) {
  20725. _store_index_js__WEBPACK_IMPORTED_MODULE_12__["state"].isToolLocked = true;
  20726. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].MOUSE_UP, this._editMouseUpCallback);
  20727. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].MOUSE_DRAG, this._editMouseDragCallback);
  20728. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].MOUSE_CLICK, this._editMouseUpCallback);
  20729. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].TOUCH_END, this._editMouseUpCallback);
  20730. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].TOUCH_DRAG, this._editTouchDragCallback);
  20731. _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(element);
  20732. }
  20733. /**
  20734. * Removes modify loop event listeners.
  20735. *
  20736. * @private
  20737. * @param {Object} element - The viewport element to add event listeners to.
  20738. * @modifies {element}
  20739. * @returns {undefined}
  20740. */
  20741. }, {
  20742. key: "_deactivateModify",
  20743. value: function _deactivateModify(element) {
  20744. _store_index_js__WEBPACK_IMPORTED_MODULE_12__["state"].isToolLocked = false;
  20745. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].MOUSE_UP, this._editMouseUpCallback);
  20746. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].MOUSE_DRAG, this._editMouseDragCallback);
  20747. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].MOUSE_CLICK, this._editMouseUpCallback);
  20748. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].TOUCH_END, this._editMouseUpCallback);
  20749. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].TOUCH_DRAG, this._editTouchDragCallback);
  20750. _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(element);
  20751. }
  20752. }, {
  20753. key: "passiveCallback",
  20754. value: function passiveCallback(element) {
  20755. this._closeToolIfDrawing(element);
  20756. }
  20757. }, {
  20758. key: "enabledCallback",
  20759. value: function enabledCallback(element) {
  20760. this._closeToolIfDrawing(element);
  20761. }
  20762. }, {
  20763. key: "disabledCallback",
  20764. value: function disabledCallback(element) {
  20765. this._closeToolIfDrawing(element);
  20766. }
  20767. }, {
  20768. key: "_closeToolIfDrawing",
  20769. value: function _closeToolIfDrawing(element) {
  20770. if (this._drawing) {
  20771. // Actively drawing but changed mode.
  20772. var config = this.configuration;
  20773. var lastHandlePlaced = config.currentHandle;
  20774. this._endDrawing(element, lastHandlePlaced);
  20775. _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(element);
  20776. }
  20777. }
  20778. /**
  20779. * Fire MEASUREMENT_MODIFIED event on provided element
  20780. * @param {any} element which freehand data has been modified
  20781. * @param {any} measurementData the measurment data
  20782. * @returns {void}
  20783. */
  20784. }, {
  20785. key: "fireModifiedEvent",
  20786. value: function fireModifiedEvent(element, measurementData) {
  20787. var eventType = _events_js__WEBPACK_IMPORTED_MODULE_6__["default"].MEASUREMENT_MODIFIED;
  20788. var eventData = {
  20789. toolName: this.name,
  20790. toolType: this.name,
  20791. // Deprecation notice: toolType will be replaced by toolName
  20792. element: element,
  20793. measurementData: measurementData
  20794. };
  20795. Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_13__["default"])(element, eventType, eventData);
  20796. }
  20797. }, {
  20798. key: "fireCompletedEvent",
  20799. value: function fireCompletedEvent(element, measurementData) {
  20800. var eventType = _events_js__WEBPACK_IMPORTED_MODULE_6__["default"].MEASUREMENT_COMPLETED;
  20801. var eventData = {
  20802. toolName: this.name,
  20803. toolType: this.name,
  20804. // Deprecation notice: toolType will be replaced by toolName
  20805. element: element,
  20806. measurementData: measurementData
  20807. };
  20808. Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_13__["default"])(element, eventType, eventData);
  20809. } // ===================================================================
  20810. // Public Configuration API. .
  20811. // ===================================================================
  20812. }, {
  20813. key: "cancelDrawing",
  20814. /**
  20815. * Ends the active drawing loop and removes the polygon.
  20816. *
  20817. * @public
  20818. * @param {Object} element - The element on which the roi is being drawn.
  20819. * @returns {null}
  20820. */
  20821. value: function cancelDrawing(element) {
  20822. if (!this._drawing) {
  20823. return;
  20824. }
  20825. var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_9__["getToolState"])(element, this.name);
  20826. var config = this.configuration;
  20827. var data = toolState.data[config.currentTool];
  20828. data.active = false;
  20829. data.highlight = false;
  20830. data.handles.invalidHandlePlacement = false; // Reset the current handle
  20831. config.currentHandle = 0;
  20832. config.currentTool = -1;
  20833. data.canComplete = false;
  20834. Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_9__["removeToolState"])(element, this.name, data);
  20835. this._deactivateDraw(element);
  20836. _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(element);
  20837. }
  20838. /**
  20839. * New image event handler.
  20840. *
  20841. * @public
  20842. * @param {Object} evt The event.
  20843. * @returns {null}
  20844. */
  20845. }, {
  20846. key: "newImageCallback",
  20847. value: function newImageCallback(evt) {
  20848. var config = this.configuration;
  20849. if (!(this._drawing && this._activeDrawingToolReference)) {
  20850. return;
  20851. } // Actively drawing but scrolled to different image.
  20852. var element = evt.detail.element;
  20853. var data = this._activeDrawingToolReference;
  20854. data.active = false;
  20855. data.highlight = false;
  20856. data.handles.invalidHandlePlacement = false; // Connect the end handle to the origin handle
  20857. var points = data.handles.points;
  20858. points[config.currentHandle - 1].lines.push(points[0]); // Reset the current handle
  20859. config.currentHandle = 0;
  20860. config.currentTool = -1;
  20861. data.canComplete = false;
  20862. this._deactivateDraw(element);
  20863. _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(element);
  20864. }
  20865. }, {
  20866. key: "spacing",
  20867. get: function get() {
  20868. return this.configuration.spacing;
  20869. },
  20870. set: function set(value) {
  20871. if (typeof value !== 'number') {
  20872. throw new Error('Attempting to set freehand spacing to a value other than a number.');
  20873. }
  20874. this.configuration.spacing = value;
  20875. _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(this.element);
  20876. }
  20877. }, {
  20878. key: "activeHandleRadius",
  20879. get: function get() {
  20880. return this.configuration.activeHandleRadius;
  20881. },
  20882. set: function set(value) {
  20883. if (typeof value !== 'number') {
  20884. throw new Error('Attempting to set freehand activeHandleRadius to a value other than a number.');
  20885. }
  20886. this.configuration.activeHandleRadius = value;
  20887. _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(this.element);
  20888. }
  20889. }, {
  20890. key: "completeHandleRadius",
  20891. get: function get() {
  20892. return this.configuration.completeHandleRadius;
  20893. },
  20894. set: function set(value) {
  20895. if (typeof value !== 'number') {
  20896. throw new Error('Attempting to set freehand completeHandleRadius to a value other than a number.');
  20897. }
  20898. this.configuration.completeHandleRadius = value;
  20899. _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(this.element);
  20900. }
  20901. }, {
  20902. key: "alwaysShowHandles",
  20903. get: function get() {
  20904. return this.configuration.alwaysShowHandles;
  20905. },
  20906. set: function set(value) {
  20907. if (typeof value !== 'boolean') {
  20908. throw new Error('Attempting to set freehand alwaysShowHandles to a value other than a boolean.');
  20909. }
  20910. this.configuration.alwaysShowHandles = value;
  20911. _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(this.element);
  20912. }
  20913. }, {
  20914. key: "invalidColor",
  20915. get: function get() {
  20916. return this.configuration.invalidColor;
  20917. },
  20918. set: function set(value) {
  20919. /*
  20920. It'd be easy to check if the color was e.g. a valid rgba color. However
  20921. it'd be difficult to check if the color was a named CSS color without
  20922. bloating the library, so we don't. If the canvas can't intepret the color
  20923. it'll show up grey.
  20924. */
  20925. this.configuration.invalidColor = value;
  20926. _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(this.element);
  20927. }
  20928. }]);
  20929. return FreehandRoiTool;
  20930. }(_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_8__["default"]);
  20931. function defaultFreehandConfiguration() {
  20932. return {
  20933. mouseLocation: {
  20934. handles: {
  20935. start: {
  20936. highlight: true,
  20937. active: true
  20938. }
  20939. }
  20940. },
  20941. spacing: 1,
  20942. activeHandleRadius: 3,
  20943. completeHandleRadius: 6,
  20944. completeHandleRadiusTouch: 28,
  20945. alwaysShowHandles: false,
  20946. invalidColor: 'crimson',
  20947. currentHandle: 0,
  20948. currentTool: -1,
  20949. drawHandles: true,
  20950. renderDashed: false
  20951. };
  20952. }
  20953. function preventPropagation(evt) {
  20954. evt.stopImmediatePropagation();
  20955. evt.stopPropagation();
  20956. evt.preventDefault();
  20957. }
  20958. /***/ }),
  20959. /***/ "./tools/annotation/LengthTool.js":
  20960. /*!****************************************!*\
  20961. !*** ./tools/annotation/LengthTool.js ***!
  20962. \****************************************/
  20963. /*! exports provided: default */
  20964. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  20965. "use strict";
  20966. __webpack_require__.r(__webpack_exports__);
  20967. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return LengthTool; });
  20968. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
  20969. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
  20970. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
  20971. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
  20972. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
  20973. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
  20974. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
  20975. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
  20976. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
  20977. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
  20978. /* harmony import */ var _base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../base/BaseAnnotationTool.js */ "./tools/base/BaseAnnotationTool.js");
  20979. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  20980. /* harmony import */ var _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../../stateManagement/toolStyle.js */ "./stateManagement/toolStyle.js");
  20981. /* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./../../stateManagement/toolColors.js */ "./stateManagement/toolColors.js");
  20982. /* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./../../drawing/index.js */ "./drawing/index.js");
  20983. /* harmony import */ var _drawing_drawLinkedTextBox_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./../../drawing/drawLinkedTextBox.js */ "./drawing/drawLinkedTextBox.js");
  20984. /* harmony import */ var _drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./../../drawing/drawHandles.js */ "./drawing/drawHandles.js");
  20985. /* harmony import */ var _util_lineSegDistance_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./../../util/lineSegDistance.js */ "./util/lineSegDistance.js");
  20986. /* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../cursors/index.js */ "./tools/cursors/index.js");
  20987. /* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../util/logger.js */ "./util/logger.js");
  20988. /* harmony import */ var _util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../util/getPixelSpacing */ "./util/getPixelSpacing.js");
  20989. /* harmony import */ var _util_throttle__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../util/throttle */ "./util/throttle.js");
  20990. /* harmony import */ var _store_index__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../store/index */ "./store/index.js");
  20991. // State
  20992. // Drawing
  20993. var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_14__["getLogger"])('tools:annotation:LengthTool');
  20994. /**
  20995. * @public
  20996. * @class LengthTool
  20997. * @memberof Tools.Annotation
  20998. * @classdesc Tool for measuring distances.
  20999. * @extends Tools.Base.BaseAnnotationTool
  21000. */
  21001. var LengthTool =
  21002. /*#__PURE__*/
  21003. function (_BaseAnnotationTool) {
  21004. _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(LengthTool, _BaseAnnotationTool);
  21005. function LengthTool() {
  21006. var _this;
  21007. var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  21008. _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, LengthTool);
  21009. var defaultProps = {
  21010. name: 'Length',
  21011. supportedInteractionTypes: ['Mouse', 'Touch'],
  21012. svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_13__["lengthCursor"],
  21013. configuration: {
  21014. drawHandles: true,
  21015. drawHandlesOnHover: false,
  21016. hideHandlesIfMoving: false,
  21017. renderDashed: false,
  21018. digits: 2
  21019. }
  21020. };
  21021. _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(LengthTool).call(this, props, defaultProps));
  21022. _this.throttledUpdateCachedStats = Object(_util_throttle__WEBPACK_IMPORTED_MODULE_16__["default"])(_this.updateCachedStats, 110);
  21023. return _this;
  21024. }
  21025. _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(LengthTool, [{
  21026. key: "createNewMeasurement",
  21027. value: function createNewMeasurement(eventData) {
  21028. var goodEventData = eventData && eventData.currentPoints && eventData.currentPoints.image;
  21029. if (!goodEventData) {
  21030. logger.error("required eventData not supplied to tool ".concat(this.name, "'s createNewMeasurement"));
  21031. return;
  21032. }
  21033. var _eventData$currentPoi = eventData.currentPoints.image,
  21034. x = _eventData$currentPoi.x,
  21035. y = _eventData$currentPoi.y;
  21036. return {
  21037. visible: true,
  21038. active: true,
  21039. color: undefined,
  21040. invalidated: true,
  21041. handles: {
  21042. start: {
  21043. x: x,
  21044. y: y,
  21045. highlight: true,
  21046. active: false
  21047. },
  21048. end: {
  21049. x: x,
  21050. y: y,
  21051. highlight: true,
  21052. active: true
  21053. },
  21054. textBox: {
  21055. active: false,
  21056. hasMoved: false,
  21057. movesIndependently: false,
  21058. drawnIndependently: true,
  21059. allowedOutsideImage: true,
  21060. hasBoundingBox: true
  21061. }
  21062. }
  21063. };
  21064. }
  21065. /**
  21066. *
  21067. *
  21068. * @param {*} element
  21069. * @param {*} data
  21070. * @param {*} coords
  21071. * @returns {Boolean}
  21072. */
  21073. }, {
  21074. key: "pointNearTool",
  21075. value: function pointNearTool(element, data, coords) {
  21076. var hasStartAndEndHandles = data && data.handles && data.handles.start && data.handles.end;
  21077. var validParameters = hasStartAndEndHandles;
  21078. if (!validParameters) {
  21079. logger.warn("invalid parameters supplied to tool ".concat(this.name, "'s pointNearTool"));
  21080. return false;
  21081. }
  21082. if (data.visible === false) {
  21083. return false;
  21084. }
  21085. return Object(_util_lineSegDistance_js__WEBPACK_IMPORTED_MODULE_12__["default"])(element, data.handles.start, data.handles.end, coords) < 25;
  21086. }
  21087. }, {
  21088. key: "updateCachedStats",
  21089. value: function updateCachedStats(image, element, data) {
  21090. var _getPixelSpacing = Object(_util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_15__["default"])(image),
  21091. rowPixelSpacing = _getPixelSpacing.rowPixelSpacing,
  21092. colPixelSpacing = _getPixelSpacing.colPixelSpacing; // Set rowPixelSpacing and columnPixelSpacing to 1 if they are undefined (or zero)
  21093. var dx = (data.handles.end.x - data.handles.start.x) * (colPixelSpacing || 1);
  21094. var dy = (data.handles.end.y - data.handles.start.y) * (rowPixelSpacing || 1); // Calculate the length, and create the text variable with the millimeters or pixels suffix
  21095. var length = Math.sqrt(dx * dx + dy * dy); // Store the length inside the tool for outside access
  21096. data.length = length;
  21097. data.invalidated = false;
  21098. }
  21099. }, {
  21100. key: "renderToolData",
  21101. value: function renderToolData(evt) {
  21102. var _this2 = this;
  21103. var eventData = evt.detail;
  21104. var _this$configuration = this.configuration,
  21105. handleRadius = _this$configuration.handleRadius,
  21106. drawHandlesOnHover = _this$configuration.drawHandlesOnHover,
  21107. hideHandlesIfMoving = _this$configuration.hideHandlesIfMoving,
  21108. renderDashed = _this$configuration.renderDashed,
  21109. digits = _this$configuration.digits;
  21110. var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_6__["getToolState"])(evt.currentTarget, this.name);
  21111. if (!toolData) {
  21112. return;
  21113. } // We have tool data for this element - iterate over each one and draw it
  21114. var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_9__["getNewContext"])(eventData.canvasContext.canvas);
  21115. var image = eventData.image,
  21116. element = eventData.element;
  21117. var _getPixelSpacing2 = Object(_util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_15__["default"])(image),
  21118. rowPixelSpacing = _getPixelSpacing2.rowPixelSpacing,
  21119. colPixelSpacing = _getPixelSpacing2.colPixelSpacing;
  21120. var lineWidth = _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_7__["default"].getToolWidth();
  21121. var lineDash = Object(_store_index__WEBPACK_IMPORTED_MODULE_17__["getModule"])('globalConfiguration').configuration.lineDash;
  21122. var _loop = function _loop(i) {
  21123. var data = toolData.data[i];
  21124. if (data.visible === false) {
  21125. return "continue";
  21126. }
  21127. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_9__["draw"])(context, function (context) {
  21128. // Configurable shadow
  21129. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_9__["setShadow"])(context, _this2.configuration);
  21130. var color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_8__["default"].getColorIfActive(data);
  21131. var lineOptions = {
  21132. color: color
  21133. };
  21134. if (renderDashed) {
  21135. lineOptions.lineDash = lineDash;
  21136. } // Draw the measurement line
  21137. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_9__["drawLine"])(context, element, data.handles.start, data.handles.end, lineOptions); // Draw the handles
  21138. var handleOptions = {
  21139. color: color,
  21140. handleRadius: handleRadius,
  21141. drawHandlesIfActive: drawHandlesOnHover,
  21142. hideHandlesIfMoving: hideHandlesIfMoving
  21143. };
  21144. if (_this2.configuration.drawHandles) {
  21145. Object(_drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_11__["default"])(context, eventData, data.handles, handleOptions);
  21146. }
  21147. if (!data.handles.textBox.hasMoved) {
  21148. var coords = {
  21149. x: Math.max(data.handles.start.x, data.handles.end.x)
  21150. }; // Depending on which handle has the largest x-value,
  21151. // Set the y-value for the text box
  21152. if (coords.x === data.handles.start.x) {
  21153. coords.y = data.handles.start.y;
  21154. } else {
  21155. coords.y = data.handles.end.y;
  21156. }
  21157. data.handles.textBox.x = coords.x;
  21158. data.handles.textBox.y = coords.y;
  21159. } // Move the textbox slightly to the right and upwards
  21160. // So that it sits beside the length tool handle
  21161. var xOffset = 10; // Update textbox stats
  21162. if (data.invalidated === true) {
  21163. if (data.length) {
  21164. _this2.throttledUpdateCachedStats(image, element, data);
  21165. } else {
  21166. _this2.updateCachedStats(image, element, data);
  21167. }
  21168. }
  21169. var text = textBoxText(data, rowPixelSpacing, colPixelSpacing);
  21170. Object(_drawing_drawLinkedTextBox_js__WEBPACK_IMPORTED_MODULE_10__["default"])(context, element, data.handles.textBox, text, data.handles, textBoxAnchorPoints, color, lineWidth, xOffset, true);
  21171. });
  21172. };
  21173. for (var i = 0; i < toolData.data.length; i++) {
  21174. var _ret = _loop(i);
  21175. if (_ret === "continue") continue;
  21176. } // - SideEffect: Updates annotation 'suffix'
  21177. function textBoxText(annotation, rowPixelSpacing, colPixelSpacing) {
  21178. var measuredValue = _sanitizeMeasuredValue(annotation.length); // Measured value is not defined, return empty string
  21179. if (!measuredValue) {
  21180. return '';
  21181. } // Set the length text suffix depending on whether or not pixelSpacing is available
  21182. var suffix = 'mm';
  21183. if (!rowPixelSpacing || !colPixelSpacing) {
  21184. suffix = 'pixels';
  21185. }
  21186. annotation.unit = suffix;
  21187. return "".concat(measuredValue.toFixed(digits), " ").concat(suffix);
  21188. }
  21189. function textBoxAnchorPoints(handles) {
  21190. var midpoint = {
  21191. x: (handles.start.x + handles.end.x) / 2,
  21192. y: (handles.start.y + handles.end.y) / 2
  21193. };
  21194. return [handles.start, midpoint, handles.end];
  21195. }
  21196. }
  21197. }]);
  21198. return LengthTool;
  21199. }(_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_5__["default"]);
  21200. /**
  21201. * Attempts to sanitize a value by casting as a number; if unable to cast,
  21202. * we return `undefined`
  21203. *
  21204. * @param {*} value
  21205. * @returns a number or undefined
  21206. */
  21207. function _sanitizeMeasuredValue(value) {
  21208. var parsedValue = Number(value);
  21209. var isNumber = !isNaN(parsedValue);
  21210. return isNumber ? parsedValue : undefined;
  21211. }
  21212. /***/ }),
  21213. /***/ "./tools/annotation/ProbeTool.js":
  21214. /*!***************************************!*\
  21215. !*** ./tools/annotation/ProbeTool.js ***!
  21216. \***************************************/
  21217. /*! exports provided: default */
  21218. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  21219. "use strict";
  21220. __webpack_require__.r(__webpack_exports__);
  21221. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ProbeTool; });
  21222. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
  21223. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
  21224. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
  21225. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
  21226. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
  21227. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
  21228. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
  21229. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
  21230. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
  21231. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
  21232. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../externalModules.js */ "./externalModules.js");
  21233. /* harmony import */ var _base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../base/BaseAnnotationTool.js */ "./tools/base/BaseAnnotationTool.js");
  21234. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  21235. /* harmony import */ var _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../stateManagement/textStyle.js */ "./stateManagement/textStyle.js");
  21236. /* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../stateManagement/toolColors.js */ "./stateManagement/toolColors.js");
  21237. /* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../drawing/index.js */ "./drawing/index.js");
  21238. /* harmony import */ var _drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../drawing/drawTextBox.js */ "./drawing/drawTextBox.js");
  21239. /* harmony import */ var _drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../drawing/drawHandles.js */ "./drawing/drawHandles.js");
  21240. /* harmony import */ var _util_getRGBPixels_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../util/getRGBPixels.js */ "./util/getRGBPixels.js");
  21241. /* harmony import */ var _util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../util/calculateSUV.js */ "./util/calculateSUV.js");
  21242. /* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../cursors/index.js */ "./tools/cursors/index.js");
  21243. /* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../util/logger.js */ "./util/logger.js");
  21244. /* harmony import */ var _util_throttle__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../util/throttle */ "./util/throttle.js");
  21245. /* harmony import */ var _store_index__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../store/index */ "./store/index.js");
  21246. // State
  21247. // Drawing
  21248. // Utilities
  21249. var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_16__["getLogger"])('tools:annotation:ProbeTool');
  21250. /**
  21251. * @public
  21252. * @class ProbeTool
  21253. * @memberof Tools.Annotation
  21254. * @classdesc Tool which provides a probe of the image data at the
  21255. * desired position.
  21256. * @extends Tools.Base.BaseAnnotationTool
  21257. */
  21258. var ProbeTool =
  21259. /*#__PURE__*/
  21260. function (_BaseAnnotationTool) {
  21261. _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(ProbeTool, _BaseAnnotationTool);
  21262. function ProbeTool() {
  21263. var _this;
  21264. var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  21265. _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, ProbeTool);
  21266. var defaultProps = {
  21267. name: 'Probe',
  21268. supportedInteractionTypes: ['Mouse', 'Touch'],
  21269. svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_15__["probeCursor"],
  21270. configuration: {
  21271. drawHandles: true,
  21272. renderDashed: false
  21273. }
  21274. };
  21275. _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(ProbeTool).call(this, props, defaultProps));
  21276. _this.throttledUpdateCachedStats = Object(_util_throttle__WEBPACK_IMPORTED_MODULE_17__["default"])(_this.updateCachedStats, 110);
  21277. return _this;
  21278. }
  21279. _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(ProbeTool, [{
  21280. key: "createNewMeasurement",
  21281. value: function createNewMeasurement(eventData) {
  21282. var goodEventData = eventData && eventData.currentPoints && eventData.currentPoints.image;
  21283. if (!goodEventData) {
  21284. logger.error("required eventData not supplied to tool ".concat(this.name, "'s createNewMeasurement"));
  21285. return;
  21286. }
  21287. return {
  21288. visible: true,
  21289. active: true,
  21290. color: undefined,
  21291. invalidated: true,
  21292. handles: {
  21293. end: {
  21294. x: eventData.currentPoints.image.x,
  21295. y: eventData.currentPoints.image.y,
  21296. highlight: true,
  21297. active: true
  21298. }
  21299. }
  21300. };
  21301. }
  21302. /**
  21303. *
  21304. *
  21305. * @param {*} element
  21306. * @param {*} data
  21307. * @param {*} coords
  21308. * @returns {Boolean}
  21309. */
  21310. }, {
  21311. key: "pointNearTool",
  21312. value: function pointNearTool(element, data, coords) {
  21313. var hasEndHandle = data && data.handles && data.handles.end;
  21314. var validParameters = hasEndHandle;
  21315. if (!validParameters) {
  21316. logger.warn("invalid parameters supplied to tool ".concat(this.name, "'s pointNearTool"));
  21317. }
  21318. if (!validParameters || data.visible === false) {
  21319. return false;
  21320. }
  21321. var probeCoords = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pixelToCanvas(element, data.handles.end);
  21322. return _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstoneMath.point.distance(probeCoords, coords) < 5;
  21323. }
  21324. }, {
  21325. key: "updateCachedStats",
  21326. value: function updateCachedStats(image, element, data) {
  21327. var x = Math.round(data.handles.end.x);
  21328. var y = Math.round(data.handles.end.y);
  21329. var stats = {};
  21330. if (x >= 0 && y >= 0 && x < image.columns && y < image.rows) {
  21331. stats.x = x;
  21332. stats.y = y;
  21333. if (image.color) {
  21334. stats.storedPixels = Object(_util_getRGBPixels_js__WEBPACK_IMPORTED_MODULE_13__["default"])(element, x, y, 1, 1);
  21335. } else {
  21336. stats.storedPixels = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.getStoredPixels(element, x, y, 1, 1);
  21337. stats.sp = stats.storedPixels[0];
  21338. stats.mo = stats.sp * image.slope + image.intercept;
  21339. stats.suv = Object(_util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_14__["default"])(image, stats.sp);
  21340. }
  21341. }
  21342. data.cachedStats = stats;
  21343. data.invalidated = false;
  21344. }
  21345. }, {
  21346. key: "renderToolData",
  21347. value: function renderToolData(evt) {
  21348. var _this2 = this;
  21349. var eventData = evt.detail;
  21350. var _this$configuration = this.configuration,
  21351. handleRadius = _this$configuration.handleRadius,
  21352. renderDashed = _this$configuration.renderDashed;
  21353. var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_7__["getToolState"])(evt.currentTarget, this.name);
  21354. if (!toolData) {
  21355. return;
  21356. } // We have tool data for this element - iterate over each one and draw it
  21357. var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["getNewContext"])(eventData.canvasContext.canvas);
  21358. var image = eventData.image,
  21359. element = eventData.element;
  21360. var fontHeight = _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_8__["default"].getFontSize();
  21361. var lineDash = Object(_store_index__WEBPACK_IMPORTED_MODULE_18__["getModule"])('globalConfiguration').configuration.lineDash;
  21362. var _loop = function _loop(i) {
  21363. var data = toolData.data[i];
  21364. if (data.visible === false) {
  21365. return "continue";
  21366. }
  21367. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["draw"])(context, function (context) {
  21368. var color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__["default"].getColorIfActive(data);
  21369. if (_this2.configuration.drawHandles) {
  21370. // Draw the handles
  21371. var handleOptions = {
  21372. handleRadius: handleRadius,
  21373. color: color
  21374. };
  21375. if (renderDashed) {
  21376. handleOptions.lineDash = lineDash;
  21377. }
  21378. Object(_drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_12__["default"])(context, eventData, data.handles, handleOptions);
  21379. } // Update textbox stats
  21380. if (data.invalidated === true) {
  21381. if (data.cachedStats) {
  21382. _this2.throttledUpdateCachedStats(image, element, data);
  21383. } else {
  21384. _this2.updateCachedStats(image, element, data);
  21385. }
  21386. }
  21387. var text, str;
  21388. var _data$cachedStats = data.cachedStats,
  21389. x = _data$cachedStats.x,
  21390. y = _data$cachedStats.y,
  21391. storedPixels = _data$cachedStats.storedPixels,
  21392. sp = _data$cachedStats.sp,
  21393. mo = _data$cachedStats.mo,
  21394. suv = _data$cachedStats.suv;
  21395. if (x >= 0 && y >= 0 && x < image.columns && y < image.rows) {
  21396. text = "".concat(x, ", ").concat(y);
  21397. if (image.color) {
  21398. str = "R: ".concat(storedPixels[0], " G: ").concat(storedPixels[1], " B: ").concat(storedPixels[2]);
  21399. } else {
  21400. // Draw text
  21401. str = "SP: ".concat(sp, " MO: ").concat(parseFloat(mo.toFixed(3)));
  21402. if (suv) {
  21403. str += " SUV: ".concat(parseFloat(suv.toFixed(3)));
  21404. }
  21405. } // Coords for text
  21406. var coords = {
  21407. // Translate the x/y away from the cursor
  21408. x: data.handles.end.x + 3,
  21409. y: data.handles.end.y - 3
  21410. };
  21411. var textCoords = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pixelToCanvas(eventData.element, coords);
  21412. Object(_drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_11__["default"])(context, str, textCoords.x, textCoords.y + fontHeight + 5, color);
  21413. Object(_drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_11__["default"])(context, text, textCoords.x, textCoords.y, color);
  21414. }
  21415. });
  21416. };
  21417. for (var i = 0; i < toolData.data.length; i++) {
  21418. var _ret = _loop(i);
  21419. if (_ret === "continue") continue;
  21420. }
  21421. }
  21422. }]);
  21423. return ProbeTool;
  21424. }(_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]);
  21425. /***/ }),
  21426. /***/ "./tools/annotation/RectangleRoiTool.js":
  21427. /*!**********************************************!*\
  21428. !*** ./tools/annotation/RectangleRoiTool.js ***!
  21429. \**********************************************/
  21430. /*! exports provided: default */
  21431. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  21432. "use strict";
  21433. __webpack_require__.r(__webpack_exports__);
  21434. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return RectangleRoiTool; });
  21435. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
  21436. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
  21437. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
  21438. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
  21439. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
  21440. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
  21441. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
  21442. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
  21443. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
  21444. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
  21445. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../../externalModules.js */ "./externalModules.js");
  21446. /* harmony import */ var _base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../base/BaseAnnotationTool.js */ "./tools/base/BaseAnnotationTool.js");
  21447. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  21448. /* harmony import */ var _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./../../stateManagement/toolStyle.js */ "./stateManagement/toolStyle.js");
  21449. /* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./../../stateManagement/toolColors.js */ "./stateManagement/toolColors.js");
  21450. /* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./../../drawing/index.js */ "./drawing/index.js");
  21451. /* harmony import */ var _util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./../../util/calculateSUV.js */ "./util/calculateSUV.js");
  21452. /* harmony import */ var _util_getROITextBoxCoords_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../util/getROITextBoxCoords.js */ "./util/getROITextBoxCoords.js");
  21453. /* harmony import */ var _util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./../../util/numbersWithCommas.js */ "./util/numbersWithCommas.js");
  21454. /* harmony import */ var _util_throttle_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./../../util/throttle.js */ "./util/throttle.js");
  21455. /* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../cursors/index.js */ "./tools/cursors/index.js");
  21456. /* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../util/logger.js */ "./util/logger.js");
  21457. /* harmony import */ var _util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../util/getPixelSpacing */ "./util/getPixelSpacing.js");
  21458. /* harmony import */ var _store_index__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../store/index */ "./store/index.js");
  21459. // State
  21460. // Drawing
  21461. // Util
  21462. var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_16__["getLogger"])('tools:annotation:RectangleRoiTool');
  21463. /**
  21464. * @public
  21465. * @class RectangleRoiTool
  21466. * @memberof Tools.Annotation
  21467. * @classdesc Tool for drawing rectangular regions of interest, and measuring
  21468. * the statistics of the enclosed pixels.
  21469. * @extends Tools.Base.BaseAnnotationTool
  21470. */
  21471. var RectangleRoiTool =
  21472. /*#__PURE__*/
  21473. function (_BaseAnnotationTool) {
  21474. _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(RectangleRoiTool, _BaseAnnotationTool);
  21475. function RectangleRoiTool() {
  21476. var _this;
  21477. var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  21478. _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, RectangleRoiTool);
  21479. var defaultProps = {
  21480. name: 'RectangleRoi',
  21481. supportedInteractionTypes: ['Mouse', 'Touch'],
  21482. configuration: {
  21483. drawHandles: true,
  21484. drawHandlesOnHover: false,
  21485. hideHandlesIfMoving: false,
  21486. renderDashed: false // showMinMax: false,
  21487. // showHounsfieldUnits: true
  21488. },
  21489. svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_15__["rectangleRoiCursor"]
  21490. };
  21491. _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(RectangleRoiTool).call(this, props, defaultProps));
  21492. _this.throttledUpdateCachedStats = Object(_util_throttle_js__WEBPACK_IMPORTED_MODULE_14__["default"])(_this.updateCachedStats, 110);
  21493. return _this;
  21494. }
  21495. _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(RectangleRoiTool, [{
  21496. key: "createNewMeasurement",
  21497. value: function createNewMeasurement(eventData) {
  21498. var goodEventData = eventData && eventData.currentPoints && eventData.currentPoints.image;
  21499. if (!goodEventData) {
  21500. logger.error("required eventData not supplied to tool ".concat(this.name, "'s createNewMeasurement"));
  21501. return;
  21502. }
  21503. return {
  21504. visible: true,
  21505. active: true,
  21506. color: undefined,
  21507. invalidated: true,
  21508. handles: {
  21509. start: {
  21510. x: eventData.currentPoints.image.x,
  21511. y: eventData.currentPoints.image.y,
  21512. highlight: true,
  21513. active: false
  21514. },
  21515. end: {
  21516. x: eventData.currentPoints.image.x,
  21517. y: eventData.currentPoints.image.y,
  21518. highlight: true,
  21519. active: true
  21520. },
  21521. initialRotation: eventData.viewport.rotation,
  21522. textBox: {
  21523. active: false,
  21524. hasMoved: false,
  21525. movesIndependently: false,
  21526. drawnIndependently: true,
  21527. allowedOutsideImage: true,
  21528. hasBoundingBox: true
  21529. }
  21530. }
  21531. };
  21532. }
  21533. }, {
  21534. key: "pointNearTool",
  21535. value: function pointNearTool(element, data, coords, interactionType) {
  21536. var hasStartAndEndHandles = data && data.handles && data.handles.start && data.handles.end;
  21537. var validParameters = hasStartAndEndHandles;
  21538. if (!validParameters) {
  21539. logger.warn("invalid parameters supplied to tool ".concat(this.name, "'s pointNearTool"));
  21540. }
  21541. if (!validParameters || data.visible === false) {
  21542. return false;
  21543. }
  21544. var distance = interactionType === 'mouse' ? 15 : 25;
  21545. var startCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pixelToCanvas(element, data.handles.start);
  21546. var endCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pixelToCanvas(element, data.handles.end);
  21547. var rect = {
  21548. left: Math.min(startCanvas.x, endCanvas.x),
  21549. top: Math.min(startCanvas.y, endCanvas.y),
  21550. width: Math.abs(startCanvas.x - endCanvas.x),
  21551. height: Math.abs(startCanvas.y - endCanvas.y)
  21552. };
  21553. var distanceToPoint = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstoneMath.rect.distanceToPoint(rect, coords);
  21554. return distanceToPoint < distance;
  21555. }
  21556. }, {
  21557. key: "updateCachedStats",
  21558. value: function updateCachedStats(image, element, data) {
  21559. var seriesModule = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.metaData.get('generalSeriesModule', image.imageId) || {};
  21560. var modality = seriesModule.modality;
  21561. var pixelSpacing = Object(_util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_17__["default"])(image);
  21562. var stats = _calculateStats(image, element, data.handles, modality, pixelSpacing);
  21563. data.cachedStats = stats;
  21564. data.invalidated = false;
  21565. }
  21566. }, {
  21567. key: "renderToolData",
  21568. value: function renderToolData(evt) {
  21569. var _this2 = this;
  21570. var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_7__["getToolState"])(evt.currentTarget, this.name);
  21571. if (!toolData) {
  21572. return;
  21573. }
  21574. var eventData = evt.detail;
  21575. var image = eventData.image,
  21576. element = eventData.element;
  21577. var lineWidth = _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_8__["default"].getToolWidth();
  21578. var lineDash = Object(_store_index__WEBPACK_IMPORTED_MODULE_18__["getModule"])('globalConfiguration').configuration.lineDash;
  21579. var _this$configuration = this.configuration,
  21580. handleRadius = _this$configuration.handleRadius,
  21581. drawHandlesOnHover = _this$configuration.drawHandlesOnHover,
  21582. hideHandlesIfMoving = _this$configuration.hideHandlesIfMoving,
  21583. renderDashed = _this$configuration.renderDashed;
  21584. var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["getNewContext"])(eventData.canvasContext.canvas);
  21585. var _getPixelSpacing = Object(_util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_17__["default"])(image),
  21586. rowPixelSpacing = _getPixelSpacing.rowPixelSpacing,
  21587. colPixelSpacing = _getPixelSpacing.colPixelSpacing; // Meta
  21588. var seriesModule = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.metaData.get('generalSeriesModule', image.imageId) || {}; // Pixel Spacing
  21589. var modality = seriesModule.modality;
  21590. var hasPixelSpacing = rowPixelSpacing && colPixelSpacing;
  21591. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["draw"])(context, function (context) {
  21592. // If we have tool data for this element - iterate over each set and draw it
  21593. for (var i = 0; i < toolData.data.length; i++) {
  21594. var data = toolData.data[i];
  21595. if (data.visible === false) {
  21596. continue;
  21597. } // Configure
  21598. var color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__["default"].getColorIfActive(data);
  21599. var handleOptions = {
  21600. color: color,
  21601. handleRadius: handleRadius,
  21602. drawHandlesIfActive: drawHandlesOnHover,
  21603. hideHandlesIfMoving: hideHandlesIfMoving
  21604. };
  21605. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["setShadow"])(context, _this2.configuration);
  21606. var rectOptions = {
  21607. color: color
  21608. };
  21609. if (renderDashed) {
  21610. rectOptions.lineDash = lineDash;
  21611. } // Draw
  21612. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["drawRect"])(context, element, data.handles.start, data.handles.end, rectOptions, 'pixel', data.handles.initialRotation);
  21613. if (_this2.configuration.drawHandles) {
  21614. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["drawHandles"])(context, eventData, data.handles, handleOptions);
  21615. } // Update textbox stats
  21616. if (data.invalidated === true) {
  21617. if (data.cachedStats) {
  21618. _this2.throttledUpdateCachedStats(image, element, data);
  21619. } else {
  21620. _this2.updateCachedStats(image, element, data);
  21621. }
  21622. } // Default to textbox on right side of ROI
  21623. if (!data.handles.textBox.hasMoved) {
  21624. var defaultCoords = Object(_util_getROITextBoxCoords_js__WEBPACK_IMPORTED_MODULE_12__["default"])(eventData.viewport, data.handles);
  21625. Object.assign(data.handles.textBox, defaultCoords);
  21626. }
  21627. var textBoxAnchorPoints = function textBoxAnchorPoints(handles) {
  21628. return _findTextBoxAnchorPoints(handles.start, handles.end);
  21629. };
  21630. var textBoxContent = _createTextBoxContent(context, image.color, data.cachedStats, modality, hasPixelSpacing, _this2.configuration);
  21631. data.unit = _getUnit(modality, _this2.configuration.showHounsfieldUnits);
  21632. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["drawLinkedTextBox"])(context, element, data.handles.textBox, textBoxContent, data.handles, textBoxAnchorPoints, color, lineWidth, 10, true);
  21633. }
  21634. });
  21635. }
  21636. }]);
  21637. return RectangleRoiTool;
  21638. }(_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]);
  21639. /**
  21640. * TODO: This is the same method (+ GetPixels) for the other ROIs
  21641. * TODO: The pixel filtering is the unique bit
  21642. *
  21643. * @param {*} startHandle
  21644. * @param {*} endHandle
  21645. * @returns {{ left: number, top: number, width: number, height: number}}
  21646. */
  21647. function _getRectangleImageCoordinates(startHandle, endHandle) {
  21648. return {
  21649. left: Math.min(startHandle.x, endHandle.x),
  21650. top: Math.min(startHandle.y, endHandle.y),
  21651. width: Math.abs(startHandle.x - endHandle.x),
  21652. height: Math.abs(startHandle.y - endHandle.y)
  21653. };
  21654. }
  21655. /**
  21656. *
  21657. *
  21658. * @param {*} image
  21659. * @param {*} element
  21660. * @param {*} handles
  21661. * @param {*} modality
  21662. * @param {*} pixelSpacing
  21663. * @returns {Object} The Stats object
  21664. */
  21665. function _calculateStats(image, element, handles, modality, pixelSpacing) {
  21666. // Retrieve the bounds of the rectangle in image coordinates
  21667. var roiCoordinates = _getRectangleImageCoordinates(handles.start, handles.end); // Retrieve the array of pixels that the rectangle bounds cover
  21668. var pixels = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.getPixels(element, roiCoordinates.left, roiCoordinates.top, roiCoordinates.width, roiCoordinates.height); // Calculate the mean & standard deviation from the pixels and the rectangle details
  21669. var roiMeanStdDev = _calculateRectangleStats(pixels, roiCoordinates);
  21670. var meanStdDevSUV;
  21671. if (modality === 'PT') {
  21672. meanStdDevSUV = {
  21673. mean: Object(_util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_11__["default"])(image, roiMeanStdDev.mean, true) || 0,
  21674. stdDev: Object(_util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_11__["default"])(image, roiMeanStdDev.stdDev, true) || 0
  21675. };
  21676. } // Calculate the image area from the rectangle dimensions and pixel spacing
  21677. var area = roiCoordinates.width * (pixelSpacing.colPixelSpacing || 1) * (roiCoordinates.height * (pixelSpacing.rowPixelSpacing || 1));
  21678. var perimeter = roiCoordinates.width * 2 * (pixelSpacing.colPixelSpacing || 1) + roiCoordinates.height * 2 * (pixelSpacing.rowPixelSpacing || 1);
  21679. return {
  21680. area: area || 0,
  21681. perimeter: perimeter,
  21682. count: roiMeanStdDev.count || 0,
  21683. mean: roiMeanStdDev.mean || 0,
  21684. variance: roiMeanStdDev.variance || 0,
  21685. stdDev: roiMeanStdDev.stdDev || 0,
  21686. min: roiMeanStdDev.min || 0,
  21687. max: roiMeanStdDev.max || 0,
  21688. meanStdDevSUV: meanStdDevSUV
  21689. };
  21690. }
  21691. /**
  21692. *
  21693. *
  21694. * @param {*} sp
  21695. * @param {*} rectangle
  21696. * @returns {{ count, number, mean: number, variance: number, stdDev: number, min: number, max: number }}
  21697. */
  21698. function _calculateRectangleStats(sp, rectangle) {
  21699. var sum = 0;
  21700. var sumSquared = 0;
  21701. var count = 0;
  21702. var index = 0;
  21703. var min = sp ? sp[0] : null;
  21704. var max = sp ? sp[0] : null;
  21705. for (var y = rectangle.top; y < rectangle.top + rectangle.height; y++) {
  21706. for (var x = rectangle.left; x < rectangle.left + rectangle.width; x++) {
  21707. sum += sp[index];
  21708. sumSquared += sp[index] * sp[index];
  21709. min = Math.min(min, sp[index]);
  21710. max = Math.max(max, sp[index]);
  21711. count++; // TODO: Wouldn't this just be sp.length?
  21712. index++;
  21713. }
  21714. }
  21715. if (count === 0) {
  21716. return {
  21717. count: count,
  21718. mean: 0.0,
  21719. variance: 0.0,
  21720. stdDev: 0.0,
  21721. min: 0.0,
  21722. max: 0.0
  21723. };
  21724. }
  21725. var mean = sum / count;
  21726. var variance = sumSquared / count - mean * mean;
  21727. return {
  21728. count: count,
  21729. mean: mean,
  21730. variance: variance,
  21731. stdDev: Math.sqrt(variance),
  21732. min: min,
  21733. max: max
  21734. };
  21735. }
  21736. /**
  21737. *
  21738. *
  21739. * @param {*} startHandle
  21740. * @param {*} endHandle
  21741. * @returns {Array.<{x: number, y: number}>}
  21742. */
  21743. function _findTextBoxAnchorPoints(startHandle, endHandle) {
  21744. var _getRectangleImageCoo = _getRectangleImageCoordinates(startHandle, endHandle),
  21745. left = _getRectangleImageCoo.left,
  21746. top = _getRectangleImageCoo.top,
  21747. width = _getRectangleImageCoo.width,
  21748. height = _getRectangleImageCoo.height;
  21749. return [{
  21750. // Top middle point of rectangle
  21751. x: left + width / 2,
  21752. y: top
  21753. }, {
  21754. // Left middle point of rectangle
  21755. x: left,
  21756. y: top + height / 2
  21757. }, {
  21758. // Bottom middle point of rectangle
  21759. x: left + width / 2,
  21760. y: top + height
  21761. }, {
  21762. // Right middle point of rectangle
  21763. x: left + width,
  21764. y: top + height / 2
  21765. }];
  21766. }
  21767. /**
  21768. *
  21769. *
  21770. * @param {*} area
  21771. * @param {*} hasPixelSpacing
  21772. * @returns {string} The formatted label for showing area
  21773. */
  21774. function _formatArea(area, hasPixelSpacing) {
  21775. // This uses Char code 178 for a superscript 2
  21776. var suffix = hasPixelSpacing ? " mm".concat(String.fromCharCode(178)) : " px".concat(String.fromCharCode(178));
  21777. return "Area: ".concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_13__["default"])(area.toFixed(2))).concat(suffix);
  21778. }
  21779. function _getUnit(modality, showHounsfieldUnits) {
  21780. return modality === 'CT' && showHounsfieldUnits !== false ? 'HU' : '';
  21781. }
  21782. /**
  21783. * TODO: This is identical to EllipticalROI's same fn
  21784. * TODO: We may want to make this a utility for ROIs with these values?
  21785. *
  21786. * @param {*} context
  21787. * @param {*} isColorImage
  21788. * @param {*} { area, mean, stdDev, min, max, meanStdDevSUV }
  21789. * @param {*} modality
  21790. * @param {*} hasPixelSpacing
  21791. * @param {*} [options={}]
  21792. * @returns {string[]}
  21793. */
  21794. function _createTextBoxContent(context, isColorImage) {
  21795. var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
  21796. _ref$area = _ref.area,
  21797. area = _ref$area === void 0 ? 0 : _ref$area,
  21798. _ref$mean = _ref.mean,
  21799. mean = _ref$mean === void 0 ? 0 : _ref$mean,
  21800. _ref$stdDev = _ref.stdDev,
  21801. stdDev = _ref$stdDev === void 0 ? 0 : _ref$stdDev,
  21802. _ref$min = _ref.min,
  21803. min = _ref$min === void 0 ? 0 : _ref$min,
  21804. _ref$max = _ref.max,
  21805. max = _ref$max === void 0 ? 0 : _ref$max,
  21806. _ref$meanStdDevSUV = _ref.meanStdDevSUV,
  21807. meanStdDevSUV = _ref$meanStdDevSUV === void 0 ? 0 : _ref$meanStdDevSUV;
  21808. var modality = arguments.length > 3 ? arguments[3] : undefined;
  21809. var hasPixelSpacing = arguments.length > 4 ? arguments[4] : undefined;
  21810. var options = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {};
  21811. var showMinMax = options.showMinMax || false;
  21812. var textLines = [];
  21813. var otherLines = [];
  21814. if (!isColorImage) {
  21815. var hasStandardUptakeValues = meanStdDevSUV && meanStdDevSUV.mean !== 0;
  21816. var unit = _getUnit(modality, options.showHounsfieldUnits);
  21817. var meanString = "Mean: ".concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_13__["default"])(mean.toFixed(2)), " ").concat(unit);
  21818. var stdDevString = "Std Dev: ".concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_13__["default"])(stdDev.toFixed(2)), " ").concat(unit); // If this image has SUV values to display, concatenate them to the text line
  21819. if (hasStandardUptakeValues) {
  21820. var SUVtext = ' SUV: ';
  21821. var meanSuvString = "".concat(SUVtext).concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_13__["default"])(meanStdDevSUV.mean.toFixed(2)));
  21822. var stdDevSuvString = "".concat(SUVtext).concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_13__["default"])(meanStdDevSUV.stdDev.toFixed(2)));
  21823. var targetStringLength = Math.floor(context.measureText("".concat(stdDevString, " ")).width);
  21824. while (context.measureText(meanString).width < targetStringLength) {
  21825. meanString += ' ';
  21826. }
  21827. otherLines.push("".concat(meanString).concat(meanSuvString));
  21828. otherLines.push("".concat(stdDevString, " ").concat(stdDevSuvString));
  21829. } else {
  21830. otherLines.push("".concat(meanString));
  21831. otherLines.push("".concat(stdDevString));
  21832. }
  21833. if (showMinMax) {
  21834. var minString = "Min: ".concat(min, " ").concat(unit);
  21835. var maxString = "Max: ".concat(max, " ").concat(unit);
  21836. var _targetStringLength = hasStandardUptakeValues ? Math.floor(context.measureText("".concat(stdDevString, " ")).width) : Math.floor(context.measureText("".concat(meanString, " ")).width);
  21837. while (context.measureText(minString).width < _targetStringLength) {
  21838. minString += ' ';
  21839. }
  21840. otherLines.push("".concat(minString).concat(maxString));
  21841. }
  21842. }
  21843. textLines.push(_formatArea(area, hasPixelSpacing));
  21844. otherLines.forEach(function (x) {
  21845. return textLines.push(x);
  21846. });
  21847. return textLines;
  21848. }
  21849. /***/ }),
  21850. /***/ "./tools/annotation/TextMarkerTool.js":
  21851. /*!********************************************!*\
  21852. !*** ./tools/annotation/TextMarkerTool.js ***!
  21853. \********************************************/
  21854. /*! exports provided: default */
  21855. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  21856. "use strict";
  21857. __webpack_require__.r(__webpack_exports__);
  21858. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return TextMarkerTool; });
  21859. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
  21860. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
  21861. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
  21862. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
  21863. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
  21864. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
  21865. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
  21866. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
  21867. /* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js");
  21868. /* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__);
  21869. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
  21870. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__);
  21871. /* harmony import */ var _base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../base/BaseAnnotationTool.js */ "./tools/base/BaseAnnotationTool.js");
  21872. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../../externalModules.js */ "./externalModules.js");
  21873. /* harmony import */ var _util_pointInsideBoundingBox_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./../../util/pointInsideBoundingBox.js */ "./util/pointInsideBoundingBox.js");
  21874. /* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./../../stateManagement/toolColors.js */ "./stateManagement/toolColors.js");
  21875. /* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./../../drawing/index.js */ "./drawing/index.js");
  21876. /* harmony import */ var _drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./../../drawing/drawTextBox.js */ "./drawing/drawTextBox.js");
  21877. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  21878. /* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../cursors/index.js */ "./tools/cursors/index.js");
  21879. /**
  21880. * @public
  21881. * @class TextMarkerTool
  21882. * @memberof Tools.Annotation
  21883. *
  21884. * @classdesc Tool for annotating an image with text markers.
  21885. * @extends Tools.Base.BaseAnnotationTool
  21886. */
  21887. var TextMarkerTool =
  21888. /*#__PURE__*/
  21889. function (_BaseAnnotationTool) {
  21890. _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(TextMarkerTool, _BaseAnnotationTool);
  21891. function TextMarkerTool() {
  21892. var _this;
  21893. var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  21894. _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, TextMarkerTool);
  21895. var defaultProps = {
  21896. name: 'TextMarker',
  21897. supportedInteractionTypes: ['Mouse', 'Touch'],
  21898. configuration: {
  21899. markers: [],
  21900. current: '',
  21901. ascending: true,
  21902. loop: false,
  21903. changeTextCallback: changeTextCallback
  21904. },
  21905. svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_13__["textMarkerCursor"]
  21906. };
  21907. _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(TextMarkerTool).call(this, props, defaultProps));
  21908. _this.touchPressCallback = _this._changeText.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  21909. _this.doubleClickCallback = _this._changeText.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  21910. return _this;
  21911. }
  21912. _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(TextMarkerTool, [{
  21913. key: "createNewMeasurement",
  21914. value: function createNewMeasurement(eventData) {
  21915. var config = this.configuration;
  21916. if (!config.current) {
  21917. return;
  21918. } // Create the measurement data for this tool with the end handle activated
  21919. var measurementData = {
  21920. visible: true,
  21921. active: true,
  21922. text: config.current,
  21923. color: undefined,
  21924. handles: {
  21925. end: {
  21926. x: eventData.currentPoints.image.x,
  21927. y: eventData.currentPoints.image.y,
  21928. highlight: true,
  21929. active: true,
  21930. hasBoundingBox: true
  21931. }
  21932. }
  21933. }; // Create a rectangle representing the image
  21934. var imageRect = {
  21935. left: 0,
  21936. top: 0,
  21937. width: eventData.image.width,
  21938. height: eventData.image.height
  21939. }; // Check if the current handle is outside the image,
  21940. // If it is, prevent the handle creation
  21941. if (!_externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstoneMath.point.insideRect(measurementData.handles.end, imageRect)) {
  21942. return;
  21943. } // Update the current marker for the next marker
  21944. var currentIndex = config.markers.indexOf(config.current);
  21945. var increment = config.ascending ? 1 : -1;
  21946. currentIndex += increment;
  21947. if (currentIndex >= config.markers.length) {
  21948. currentIndex = config.loop ? 0 : -1;
  21949. } else if (currentIndex < 0) {
  21950. currentIndex = config.loop ? config.markers.length : -1;
  21951. }
  21952. config.current = config.markers[currentIndex];
  21953. return measurementData;
  21954. }
  21955. }, {
  21956. key: "pointNearTool",
  21957. value: function pointNearTool(element, data, coords) {
  21958. if (data.visible === false) {
  21959. return false;
  21960. }
  21961. if (!data.handles.end.boundingBox) {
  21962. return;
  21963. }
  21964. var distanceToPoint = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstoneMath.rect.distanceToPoint(data.handles.end.boundingBox, coords);
  21965. var insideBoundingBox = Object(_util_pointInsideBoundingBox_js__WEBPACK_IMPORTED_MODULE_8__["default"])(data.handles.end, coords);
  21966. return distanceToPoint < 10 || insideBoundingBox;
  21967. }
  21968. }, {
  21969. key: "updateCachedStats",
  21970. value: function updateCachedStats() {// Implementing to satisfy BaseAnnotationTool
  21971. }
  21972. }, {
  21973. key: "renderToolData",
  21974. value: function renderToolData(evt) {
  21975. var eventData = evt.detail;
  21976. var config = this.configuration; // If we have no toolData for this element, return immediately as there is nothing to do
  21977. var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_12__["getToolState"])(eventData.element, this.name);
  21978. if (!toolData) {
  21979. return;
  21980. } // We have tool data for this element - iterate over each one and draw it
  21981. var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["getNewContext"])(eventData.canvasContext.canvas);
  21982. var _loop = function _loop(i) {
  21983. var data = toolData.data[i];
  21984. if (data.visible === false) {
  21985. return "continue";
  21986. }
  21987. var color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__["default"].getColorIfActive(data);
  21988. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["draw"])(context, function (context) {
  21989. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["setShadow"])(context, config);
  21990. var textCoords = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.pixelToCanvas(eventData.element, data.handles.end);
  21991. var options = {
  21992. centering: {
  21993. x: true,
  21994. y: true
  21995. }
  21996. };
  21997. data.handles.end.boundingBox = Object(_drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_11__["default"])(context, data.text, textCoords.x, textCoords.y - 10, color, options);
  21998. });
  21999. };
  22000. for (var i = 0; i < toolData.data.length; i++) {
  22001. var _ret = _loop(i);
  22002. if (_ret === "continue") continue;
  22003. }
  22004. }
  22005. }, {
  22006. key: "_changeText",
  22007. value: function _changeText(evt) {
  22008. var eventData = evt.detail;
  22009. var element = eventData.element,
  22010. currentPoints = eventData.currentPoints;
  22011. var data;
  22012. function doneChangingTextCallback(data, updatedText, deleteTool) {
  22013. if (deleteTool === true) {
  22014. Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_12__["removeToolState"])(element, this.name, data);
  22015. } else {
  22016. data.text = updatedText;
  22017. }
  22018. data.active = false;
  22019. _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(element);
  22020. }
  22021. var config = this.configuration;
  22022. var coords = currentPoints.canvas;
  22023. var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_12__["getToolState"])(element, this.name); // Now check to see if there is a handle we can move
  22024. if (!toolData) {
  22025. return;
  22026. }
  22027. for (var i = 0; i < toolData.data.length; i++) {
  22028. data = toolData.data[i];
  22029. if (this.pointNearTool(element, data, coords)) {
  22030. data.active = true;
  22031. _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(element); // Allow relabelling via a callback
  22032. config.changeTextCallback(data, eventData, doneChangingTextCallback);
  22033. evt.stopImmediatePropagation();
  22034. evt.preventDefault();
  22035. evt.stopPropagation();
  22036. return;
  22037. }
  22038. }
  22039. }
  22040. }]);
  22041. return TextMarkerTool;
  22042. }(_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]);
  22043. /**
  22044. * This function is a callback to be overwriten in order to provide the wanted feature
  22045. * modal, overlay, popup or any kind of interaction with the user to be able to update
  22046. * the text marker label.
  22047. *
  22048. * @param {Object} data
  22049. * @param {Object} eventData
  22050. * @param {doneChangingTextCallback} doneChangingTextCallback
  22051. * @returns {void}
  22052. */
  22053. var changeTextCallback = function changeTextCallback(data, eventData, doneChangingTextCallback) {
  22054. // eslint-disable-next-line no-alert
  22055. doneChangingTextCallback(data, prompt('Change your annotation:'));
  22056. };
  22057. /**
  22058. * @callback doneChangingTextCallback
  22059. * @param {Object} data
  22060. * @param {string} text - The new text
  22061. */
  22062. /***/ }),
  22063. /***/ "./tools/annotation/bidirectionalTool/addNewMeasurement.js":
  22064. /*!*****************************************************************!*\
  22065. !*** ./tools/annotation/bidirectionalTool/addNewMeasurement.js ***!
  22066. \*****************************************************************/
  22067. /*! exports provided: default */
  22068. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  22069. "use strict";
  22070. __webpack_require__.r(__webpack_exports__);
  22071. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../../externalModules.js */ "./externalModules.js");
  22072. /* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../../../events.js */ "./events.js");
  22073. /* harmony import */ var _manipulators_index_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./../../../manipulators/index.js */ "./manipulators/index.js");
  22074. /* harmony import */ var _manipulators_anyHandlesOutsideImage_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./../../../manipulators/anyHandlesOutsideImage.js */ "./manipulators/anyHandlesOutsideImage.js");
  22075. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./../../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  22076. /* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../util/triggerEvent.js */ "./util/triggerEvent.js");
  22077. /* harmony import */ var _util_getActiveTool__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../util/getActiveTool */ "./util/getActiveTool.js");
  22078. /* harmony import */ var _BidirectionalTool__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../BidirectionalTool */ "./tools/annotation/BidirectionalTool.js");
  22079. /* harmony import */ var _utils_updatePerpendicularLineHandles_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./utils/updatePerpendicularLineHandles.js */ "./tools/annotation/bidirectionalTool/utils/updatePerpendicularLineHandles.js");
  22080. /* harmony default export */ __webpack_exports__["default"] = (function (evt, interactionType) {
  22081. var _this = this;
  22082. var eventData = evt.detail;
  22083. var element = eventData.element,
  22084. image = eventData.image,
  22085. buttons = eventData.buttons;
  22086. var config = this.configuration;
  22087. if (checkPixelSpacing(image)) {
  22088. return;
  22089. }
  22090. var measurementData = this.createNewMeasurement(eventData);
  22091. var doneCallback = function doneCallback() {
  22092. measurementData.active = false;
  22093. _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.updateImage(element);
  22094. }; // Associate this data with this imageId so we can render it and manipulate it
  22095. Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_4__["addToolState"])(element, this.name, measurementData);
  22096. _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.updateImage(element);
  22097. var timestamp = new Date().getTime();
  22098. var _measurementData$hand = measurementData.handles,
  22099. end = _measurementData$hand.end,
  22100. perpendicularStart = _measurementData$hand.perpendicularStart;
  22101. Object(_manipulators_index_js__WEBPACK_IMPORTED_MODULE_2__["moveNewHandle"])(eventData, this.name, measurementData, end, {}, interactionType, function (success) {
  22102. if (!success) {
  22103. Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_4__["removeToolState"])(element, _this.name, measurementData);
  22104. return;
  22105. }
  22106. var handles = measurementData.handles,
  22107. longestDiameter = measurementData.longestDiameter,
  22108. shortestDiameter = measurementData.shortestDiameter;
  22109. var hasHandlesOutside = Object(_manipulators_anyHandlesOutsideImage_js__WEBPACK_IMPORTED_MODULE_3__["default"])(eventData, handles);
  22110. var longestDiameterSize = parseFloat(longestDiameter) || 0;
  22111. var shortestDiameterSize = parseFloat(shortestDiameter) || 0;
  22112. var isTooSmal = longestDiameterSize < 1 || shortestDiameterSize < 1;
  22113. var isTooFast = new Date().getTime() - timestamp < 150;
  22114. if (hasHandlesOutside || isTooSmal || isTooFast) {
  22115. // Delete the measurement
  22116. measurementData.cancelled = true;
  22117. Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_4__["removeToolState"])(element, _this.name, measurementData);
  22118. } else {
  22119. // Set lesionMeasurementData Session
  22120. config.getMeasurementLocationCallback(measurementData, eventData, doneCallback);
  22121. } // Update perpendicular line and disconnect it from the long-line
  22122. Object(_utils_updatePerpendicularLineHandles_js__WEBPACK_IMPORTED_MODULE_8__["default"])(eventData, measurementData);
  22123. perpendicularStart.locked = false;
  22124. measurementData.invalidated = true;
  22125. _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.updateImage(element);
  22126. var activeTool = Object(_util_getActiveTool__WEBPACK_IMPORTED_MODULE_6__["default"])(element, buttons, interactionType);
  22127. if (activeTool instanceof _BidirectionalTool__WEBPACK_IMPORTED_MODULE_7__["default"]) {
  22128. activeTool.updateCachedStats(image, element, measurementData);
  22129. }
  22130. var modifiedEventData = {
  22131. toolName: _this.name,
  22132. toolType: _this.name,
  22133. // Deprecation notice: toolType will be replaced by toolName
  22134. element: element,
  22135. measurementData: measurementData
  22136. };
  22137. Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_5__["default"])(element, _events_js__WEBPACK_IMPORTED_MODULE_1__["default"].MEASUREMENT_MODIFIED, modifiedEventData);
  22138. Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_5__["default"])(element, _events_js__WEBPACK_IMPORTED_MODULE_1__["default"].MEASUREMENT_COMPLETED, modifiedEventData);
  22139. });
  22140. });
  22141. var checkPixelSpacing = function checkPixelSpacing(image) {
  22142. var imagePlane = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.metaData.get('imagePlaneModule', image.imageId);
  22143. var rowPixelSpacing = image.rowPixelSpacing;
  22144. var colPixelSpacing = image.columnPixelSpacing;
  22145. if (imagePlane) {
  22146. rowPixelSpacing = imagePlane.rowPixelSpacing || imagePlane.rowImagePixelSpacing;
  22147. colPixelSpacing = imagePlane.columnPixelSpacing || imagePlane.colImagePixelSpacing;
  22148. } // LT-29 Disable Target Measurements when pixel spacing is not available
  22149. return !rowPixelSpacing || !colPixelSpacing;
  22150. };
  22151. /***/ }),
  22152. /***/ "./tools/annotation/bidirectionalTool/createNewMeasurement.js":
  22153. /*!********************************************************************!*\
  22154. !*** ./tools/annotation/bidirectionalTool/createNewMeasurement.js ***!
  22155. \********************************************************************/
  22156. /*! exports provided: default */
  22157. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  22158. "use strict";
  22159. __webpack_require__.r(__webpack_exports__);
  22160. var getHandle = function getHandle(x, y, index) {
  22161. var extraAttributes = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
  22162. return Object.assign({
  22163. x: x,
  22164. y: y,
  22165. index: index,
  22166. drawnIndependently: false,
  22167. allowedOutsideImage: false,
  22168. highlight: true,
  22169. active: false
  22170. }, extraAttributes);
  22171. };
  22172. /* harmony default export */ __webpack_exports__["default"] = (function (mouseEventData) {
  22173. var _mouseEventData$curre = mouseEventData.currentPoints.image,
  22174. x = _mouseEventData$curre.x,
  22175. y = _mouseEventData$curre.y; // Create the measurement data for this tool with the end handle activated
  22176. var measurementData = {
  22177. toolName: this.name,
  22178. toolType: this.name,
  22179. // Deprecation notice: toolType will be replaced by toolName
  22180. isCreating: true,
  22181. visible: true,
  22182. active: true,
  22183. invalidated: true,
  22184. handles: {
  22185. start: getHandle(x, y, 0),
  22186. end: getHandle(x, y, 1, {
  22187. active: true
  22188. }),
  22189. perpendicularStart: getHandle(x, y, 2, {
  22190. locked: true
  22191. }),
  22192. perpendicularEnd: getHandle(x, y, 3),
  22193. textBox: getHandle(x - 50, y - 70, null, {
  22194. highlight: false,
  22195. hasMoved: true,
  22196. active: false,
  22197. movesIndependently: false,
  22198. drawnIndependently: true,
  22199. allowedOutsideImage: true,
  22200. hasBoundingBox: true
  22201. })
  22202. },
  22203. longestDiameter: 0,
  22204. shortestDiameter: 0
  22205. };
  22206. return measurementData;
  22207. });
  22208. /***/ }),
  22209. /***/ "./tools/annotation/bidirectionalTool/handleSelectedCallback.js":
  22210. /*!**********************************************************************!*\
  22211. !*** ./tools/annotation/bidirectionalTool/handleSelectedCallback.js ***!
  22212. \**********************************************************************/
  22213. /*! exports provided: default */
  22214. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  22215. "use strict";
  22216. __webpack_require__.r(__webpack_exports__);
  22217. /* harmony default export */ __webpack_exports__["default"] = (function (evt, toolData, handle) {
  22218. var interactionType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'mouse';
  22219. if (interactionType === 'touch') {
  22220. this.handleSelectedTouchCallback(evt);
  22221. } else {
  22222. this.handleSelectedMouseCallback(evt);
  22223. }
  22224. });
  22225. /***/ }),
  22226. /***/ "./tools/annotation/bidirectionalTool/handleSelectedMouseCallback.js":
  22227. /*!***************************************************************************!*\
  22228. !*** ./tools/annotation/bidirectionalTool/handleSelectedMouseCallback.js ***!
  22229. \***************************************************************************/
  22230. /*! exports provided: default */
  22231. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  22232. "use strict";
  22233. __webpack_require__.r(__webpack_exports__);
  22234. /* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "../node_modules/@babel/runtime/helpers/typeof.js");
  22235. /* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__);
  22236. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../../../externalModules.js */ "./externalModules.js");
  22237. /* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./../../../events.js */ "./events.js");
  22238. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./../../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  22239. /* harmony import */ var _manipulators_anyHandlesOutsideImage_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./../../../manipulators/anyHandlesOutsideImage.js */ "./manipulators/anyHandlesOutsideImage.js");
  22240. /* harmony import */ var _manipulators_getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../../../manipulators/getHandleNearImagePoint.js */ "./manipulators/getHandleNearImagePoint.js");
  22241. /* harmony import */ var _manipulators_index_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./../../../manipulators/index.js */ "./manipulators/index.js");
  22242. /* harmony import */ var _moveHandle_moveHandle_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./moveHandle/moveHandle.js */ "./tools/annotation/bidirectionalTool/moveHandle/moveHandle.js");
  22243. /* harmony import */ var _invertHandles_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./invertHandles.js */ "./tools/annotation/bidirectionalTool/invertHandles.js");
  22244. /* harmony import */ var _store_setToolCursor_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../../store/setToolCursor.js */ "./store/setToolCursor.js");
  22245. /* harmony import */ var _util_getProximityThreshold_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../../util/getProximityThreshold.js */ "./util/getProximityThreshold.js");
  22246. /* jshint -W083 */
  22247. /* harmony default export */ __webpack_exports__["default"] = (function (evt) {
  22248. var _this = this;
  22249. var eventData = evt.detail;
  22250. var element = eventData.element;
  22251. var data;
  22252. var distanceThreshold = Object(_util_getProximityThreshold_js__WEBPACK_IMPORTED_MODULE_10__["default"])('mouse', this.name);
  22253. var handleDoneMove = function handleDoneMove(handle) {
  22254. data.invalidated = true;
  22255. if (Object(_manipulators_anyHandlesOutsideImage_js__WEBPACK_IMPORTED_MODULE_4__["default"])(eventData, data.handles)) {
  22256. // Delete the measurement
  22257. Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["removeToolState"])(element, _this.name, data);
  22258. } // Update the handles to keep selected state
  22259. if (handle) {
  22260. handle.moving = false;
  22261. handle.selected = true;
  22262. }
  22263. Object(_store_setToolCursor_js__WEBPACK_IMPORTED_MODULE_9__["setToolCursor"])(_this.element, _this.svgCursor);
  22264. _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.updateImage(element);
  22265. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].MOUSE_MOVE, _this._moveCallback);
  22266. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].TOUCH_START, _this._moveCallback);
  22267. };
  22268. var coords = eventData.startPoints.canvas;
  22269. var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["getToolState"])(evt.currentTarget, this.name);
  22270. if (!toolData) {
  22271. return;
  22272. } // Now check to see if there is a handle we can move
  22273. var _loop = function _loop(i) {
  22274. data = toolData.data[i];
  22275. var handleParams = [element, data.handles, coords, distanceThreshold];
  22276. var handle = _manipulators_getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_5__["default"].apply(void 0, handleParams);
  22277. if (handle) {
  22278. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].MOUSE_MOVE, _this._moveCallback);
  22279. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].TOUCH_START, _this._moveCallback);
  22280. data.active = true;
  22281. unselectAllHandles(data.handles);
  22282. handle.moving = true; // Invert handles if needed
  22283. handle = Object(_invertHandles_js__WEBPACK_IMPORTED_MODULE_8__["default"])(eventData, data, handle);
  22284. /* Hide the cursor to improve precision while resizing the line or set to move
  22285. if dragging text box
  22286. */
  22287. if (!handle.hasBoundingBox) {
  22288. Object(_store_setToolCursor_js__WEBPACK_IMPORTED_MODULE_9__["hideToolCursor"])(_this.element);
  22289. }
  22290. Object(_moveHandle_moveHandle_js__WEBPACK_IMPORTED_MODULE_7__["default"])(eventData, _this.name, data, handle, function () {
  22291. return handleDoneMove(handle);
  22292. });
  22293. preventPropagation(evt);
  22294. return {
  22295. v: true
  22296. };
  22297. }
  22298. };
  22299. for (var i = 0; i < toolData.data.length; i++) {
  22300. var _ret = _loop(i);
  22301. if (_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default()(_ret) === "object") return _ret.v;
  22302. }
  22303. var getDoneMovingCallback = function getDoneMovingCallback(handles) {
  22304. return function () {
  22305. setHandlesMovingState(handles, false);
  22306. handleDoneMove();
  22307. };
  22308. };
  22309. for (var i = 0; i < toolData.data.length; i++) {
  22310. data = toolData.data[i];
  22311. if (this.pointNearTool(element, data, coords, 'mouse')) {
  22312. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].MOUSE_MOVE, this._moveCallback);
  22313. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].TOUCH_START, this._moveCallback);
  22314. data.active = true;
  22315. unselectAllHandles(data.handles);
  22316. setHandlesMovingState(data.handles, true);
  22317. var doneMovingCallback = getDoneMovingCallback(data.handles);
  22318. Object(_manipulators_index_js__WEBPACK_IMPORTED_MODULE_6__["moveAllHandles"])(eventData, this.name, data, null, {
  22319. deleteIfHandleOutsideImage: true,
  22320. preventHandleOutsideImage: false
  22321. }, 'mouse', doneMovingCallback);
  22322. preventPropagation(evt);
  22323. return true;
  22324. }
  22325. }
  22326. }); // Clear the selected state for the given handles object
  22327. var unselectAllHandles = function unselectAllHandles(handles) {
  22328. var imageNeedsUpdate = false;
  22329. Object.keys(handles).forEach(function (handleKey) {
  22330. if (handleKey === 'textBox') {
  22331. return;
  22332. }
  22333. handles[handleKey].selected = false;
  22334. imageNeedsUpdate = handles[handleKey].active || imageNeedsUpdate;
  22335. handles[handleKey].active = false;
  22336. });
  22337. return imageNeedsUpdate;
  22338. };
  22339. var setHandlesMovingState = function setHandlesMovingState(handles, state) {
  22340. Object.keys(handles).forEach(function (handleKey) {
  22341. if (handleKey === 'textBox') {
  22342. return;
  22343. }
  22344. handles[handleKey].moving = state;
  22345. });
  22346. };
  22347. var preventPropagation = function preventPropagation(evt) {
  22348. evt.stopImmediatePropagation();
  22349. evt.stopPropagation();
  22350. evt.preventDefault();
  22351. };
  22352. /***/ }),
  22353. /***/ "./tools/annotation/bidirectionalTool/handleSelectedTouchCallback.js":
  22354. /*!***************************************************************************!*\
  22355. !*** ./tools/annotation/bidirectionalTool/handleSelectedTouchCallback.js ***!
  22356. \***************************************************************************/
  22357. /*! exports provided: default */
  22358. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  22359. "use strict";
  22360. __webpack_require__.r(__webpack_exports__);
  22361. /* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "../node_modules/@babel/runtime/helpers/typeof.js");
  22362. /* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__);
  22363. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../../../externalModules.js */ "./externalModules.js");
  22364. /* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../store/index.js */ "./store/index.js");
  22365. /* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./../../../events.js */ "./events.js");
  22366. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./../../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  22367. /* harmony import */ var _manipulators_anyHandlesOutsideImage_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../../../manipulators/anyHandlesOutsideImage.js */ "./manipulators/anyHandlesOutsideImage.js");
  22368. /* harmony import */ var _manipulators_getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./../../../manipulators/getHandleNearImagePoint.js */ "./manipulators/getHandleNearImagePoint.js");
  22369. /* harmony import */ var _manipulators_index_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../../../manipulators/index.js */ "./manipulators/index.js");
  22370. /* harmony import */ var _moveHandle_touchMoveHandle_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./moveHandle/touchMoveHandle.js */ "./tools/annotation/bidirectionalTool/moveHandle/touchMoveHandle.js");
  22371. /* jshint -W083 */
  22372. /* harmony default export */ __webpack_exports__["default"] = (function (evt) {
  22373. var _this = this;
  22374. var eventData = evt.detail;
  22375. var element = eventData.element;
  22376. var data;
  22377. var distanceThreshold = _store_index_js__WEBPACK_IMPORTED_MODULE_2__["state"].touchProximity;
  22378. var handleDoneMove = function handleDoneMove(handle) {
  22379. data.invalidated = true;
  22380. if (Object(_manipulators_anyHandlesOutsideImage_js__WEBPACK_IMPORTED_MODULE_5__["default"])(eventData, data.handles)) {
  22381. // Delete the measurement
  22382. Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_4__["removeToolState"])(element, _this.name, data);
  22383. } // Update the handles to keep selected state
  22384. if (handle) {
  22385. handle.moving = false;
  22386. handle.selected = true;
  22387. }
  22388. _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.updateImage(element);
  22389. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_3__["default"].TOUCH_DRAG, _this._moveCallback);
  22390. };
  22391. var coords = eventData.startPoints.canvas;
  22392. var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_4__["getToolState"])(evt.currentTarget, this.name);
  22393. if (!toolData) {
  22394. return;
  22395. } // Now check to see if there is a handle we can move
  22396. var _loop = function _loop(i) {
  22397. data = toolData.data[i];
  22398. var handleParams = [element, data.handles, coords, distanceThreshold];
  22399. var handle = _manipulators_getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_6__["default"].apply(void 0, handleParams);
  22400. if (handle) {
  22401. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_3__["default"].TOUCH_DRAG, _this._moveCallback);
  22402. data.active = true;
  22403. unselectAllHandles(data.handles);
  22404. handle.moving = true;
  22405. Object(_moveHandle_touchMoveHandle_js__WEBPACK_IMPORTED_MODULE_8__["default"])(eventData, _this.name, data, handle, function () {
  22406. return handleDoneMove(handle);
  22407. });
  22408. preventPropagation(evt);
  22409. return {
  22410. v: true
  22411. };
  22412. }
  22413. };
  22414. for (var i = 0; i < toolData.data.length; i++) {
  22415. var _ret = _loop(i);
  22416. if (_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default()(_ret) === "object") return _ret.v;
  22417. }
  22418. var getDoneMovingCallback = function getDoneMovingCallback(handles) {
  22419. return function () {
  22420. setHandlesMovingState(handles, false);
  22421. handleDoneMove();
  22422. };
  22423. };
  22424. for (var i = 0; i < toolData.data.length; i++) {
  22425. data = toolData.data[i];
  22426. if (this.pointNearTool(element, data, coords, 'touch')) {
  22427. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_3__["default"].TOUCH_DRAG, this._moveCallback);
  22428. data.active = true;
  22429. unselectAllHandles(data.handles);
  22430. setHandlesMovingState(data.handles, true);
  22431. var doneMovingCallback = getDoneMovingCallback(data.handles);
  22432. Object(_manipulators_index_js__WEBPACK_IMPORTED_MODULE_7__["moveAllHandles"])(eventData, this.name, data, null, {
  22433. deleteIfHandleOutsideImage: true,
  22434. preventHandleOutsideImage: false
  22435. }, 'touch', doneMovingCallback);
  22436. preventPropagation(evt);
  22437. return true;
  22438. }
  22439. }
  22440. }); // Clear the selected state for the given handles object
  22441. var unselectAllHandles = function unselectAllHandles(handles) {
  22442. var imageNeedsUpdate = false;
  22443. Object.keys(handles).forEach(function (handleKey) {
  22444. if (handleKey === 'textBox') {
  22445. return;
  22446. }
  22447. handles[handleKey].selected = false;
  22448. imageNeedsUpdate = handles[handleKey].active || imageNeedsUpdate;
  22449. handles[handleKey].active = false;
  22450. });
  22451. return imageNeedsUpdate;
  22452. };
  22453. var setHandlesMovingState = function setHandlesMovingState(handles, state) {
  22454. Object.keys(handles).forEach(function (handleKey) {
  22455. if (handleKey === 'textBox') {
  22456. return;
  22457. }
  22458. handles[handleKey].moving = state;
  22459. });
  22460. };
  22461. var preventPropagation = function preventPropagation(evt) {
  22462. evt.stopImmediatePropagation();
  22463. evt.stopPropagation();
  22464. evt.preventDefault();
  22465. };
  22466. /***/ }),
  22467. /***/ "./tools/annotation/bidirectionalTool/invertHandles.js":
  22468. /*!*************************************************************!*\
  22469. !*** ./tools/annotation/bidirectionalTool/invertHandles.js ***!
  22470. \*************************************************************/
  22471. /*! exports provided: default */
  22472. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  22473. "use strict";
  22474. __webpack_require__.r(__webpack_exports__);
  22475. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return invertHandles; });
  22476. var swapAttribute = function swapAttribute(a, b, attribute) {
  22477. var originalA = a[attribute];
  22478. var originalB = b[attribute];
  22479. a[attribute] = originalB;
  22480. b[attribute] = originalA;
  22481. };
  22482. var swapHandles = function swapHandles(a, b) {
  22483. swapAttribute(a, b, 'x');
  22484. swapAttribute(a, b, 'y');
  22485. swapAttribute(a, b, 'moving');
  22486. swapAttribute(a, b, 'hover');
  22487. swapAttribute(a, b, 'active');
  22488. swapAttribute(a, b, 'selected');
  22489. };
  22490. function invertHandles(eventData, measurementData, handle) {
  22491. var _eventData$image = eventData.image,
  22492. rowPixelSpacing = _eventData$image.rowPixelSpacing,
  22493. columnPixelSpacing = _eventData$image.columnPixelSpacing;
  22494. var handles = measurementData.handles;
  22495. var start = handles.start,
  22496. end = handles.end,
  22497. perpendicularStart = handles.perpendicularStart,
  22498. perpendicularEnd = handles.perpendicularEnd; // Calculate the long axis length
  22499. var dx = (start.x - end.x) * (columnPixelSpacing || 1);
  22500. var dy = (start.y - end.y) * (rowPixelSpacing || 1);
  22501. var length = Math.sqrt(dx * dx + dy * dy); // Calculate the short axis length
  22502. var wx = (perpendicularStart.x - perpendicularEnd.x) * (columnPixelSpacing || 1);
  22503. var wy = (perpendicularStart.y - perpendicularEnd.y) * (rowPixelSpacing || 1);
  22504. var width = Math.sqrt(wx * wx + wy * wy) || 0;
  22505. if (width > length) {
  22506. swapHandles(start, end);
  22507. swapHandles(start, perpendicularStart);
  22508. swapHandles(end, perpendicularEnd);
  22509. return Object.values(handles).find(function (h) {
  22510. return h.moving === true;
  22511. });
  22512. }
  22513. return handle;
  22514. }
  22515. /***/ }),
  22516. /***/ "./tools/annotation/bidirectionalTool/mouseMoveCallback.js":
  22517. /*!*****************************************************************!*\
  22518. !*** ./tools/annotation/bidirectionalTool/mouseMoveCallback.js ***!
  22519. \*****************************************************************/
  22520. /*! exports provided: default */
  22521. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  22522. "use strict";
  22523. __webpack_require__.r(__webpack_exports__);
  22524. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../../externalModules.js */ "./externalModules.js");
  22525. /* harmony import */ var _stateManagement_toolCoordinates_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../../../stateManagement/toolCoordinates.js */ "./stateManagement/toolCoordinates.js");
  22526. /* harmony import */ var _manipulators_getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./../../../manipulators/getHandleNearImagePoint.js */ "./manipulators/getHandleNearImagePoint.js");
  22527. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./../../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  22528. // Replaces the cornerstoneTools.handleActivator function by skiping the active handle comparison
  22529. var handleActivator = function handleActivator(element, handles, canvasPoint) {
  22530. var distanceThreshold = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 6;
  22531. var nearbyHandle = Object(_manipulators_getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_2__["default"])(element, handles, canvasPoint, distanceThreshold);
  22532. var handleActivatorChanged = false;
  22533. Object.keys(handles).forEach(function (handleKey) {
  22534. if (handleKey === 'textBox') {
  22535. return;
  22536. }
  22537. var handle = handles[handleKey];
  22538. var newActiveState = handle === nearbyHandle;
  22539. if (handle.active !== newActiveState) {
  22540. handleActivatorChanged = true;
  22541. }
  22542. handle.active = newActiveState;
  22543. });
  22544. return handleActivatorChanged;
  22545. }; // MouseMoveCallback is used to hide handles when mouse is away
  22546. /* harmony default export */ __webpack_exports__["default"] = (function (event) {
  22547. var _this = this;
  22548. var eventData = event.detail;
  22549. var element = eventData.element;
  22550. _stateManagement_toolCoordinates_js__WEBPACK_IMPORTED_MODULE_1__["default"].setCoords(eventData); // If we have no tool data for this element, do nothing
  22551. var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["getToolState"])(element, this.name);
  22552. if (!toolData) {
  22553. return;
  22554. } // We have tool data, search through all data and see if we can activate a handle
  22555. var imageNeedsUpdate = false;
  22556. var _loop = function _loop(i) {
  22557. // Get the cursor position in canvas coordinates
  22558. var coords = eventData.currentPoints.canvas;
  22559. var data = toolData.data[i];
  22560. var handleActivatorChanged = handleActivator(element, data.handles, coords);
  22561. Object.keys(data.handles).forEach(function (handleKey) {
  22562. if (handleKey === 'textBox') {
  22563. return;
  22564. }
  22565. var handle = data.handles[handleKey];
  22566. handle.hover = handle.active;
  22567. });
  22568. if (handleActivatorChanged) {
  22569. imageNeedsUpdate = true;
  22570. }
  22571. var nearTool = _this.pointNearTool(element, data, coords, 'mouse');
  22572. var nearToolAndInactive = nearTool && !data.active;
  22573. var notNearToolAndActive = !nearTool && data.active;
  22574. if (nearToolAndInactive || notNearToolAndActive) {
  22575. data.active = !data.active;
  22576. imageNeedsUpdate = true;
  22577. }
  22578. };
  22579. for (var i = 0; i < toolData.data.length; i++) {
  22580. _loop(i);
  22581. } // Handle activation status changed, redraw the image
  22582. if (imageNeedsUpdate === true) {
  22583. _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.updateImage(element);
  22584. }
  22585. });
  22586. /***/ }),
  22587. /***/ "./tools/annotation/bidirectionalTool/moveHandle/getBaseData.js":
  22588. /*!**********************************************************************!*\
  22589. !*** ./tools/annotation/bidirectionalTool/moveHandle/getBaseData.js ***!
  22590. \**********************************************************************/
  22591. /*! exports provided: default */
  22592. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  22593. "use strict";
  22594. __webpack_require__.r(__webpack_exports__);
  22595. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getBaseData; });
  22596. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../externalModules.js */ "./externalModules.js");
  22597. /* harmony import */ var _utils_getDistanceWithPixelSpacing_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/getDistanceWithPixelSpacing.js */ "./tools/annotation/bidirectionalTool/utils/getDistanceWithPixelSpacing.js");
  22598. function createLine(startPoint, endPoint) {
  22599. return {
  22600. start: startPoint,
  22601. end: endPoint
  22602. };
  22603. }
  22604. /**
  22605. * Extract and group the base data to be used on bidirectional tool lines
  22606. * moving.
  22607. *
  22608. * @param {*} measurementData Data from current bidirectional tool measurement
  22609. * @param {*} eventData Data object associated with the event
  22610. * @param {*} fixedPoint Point that is not being moved in line
  22611. *
  22612. * @returns {*} Grouped that needed for lines moving
  22613. */
  22614. function getBaseData(measurementData, eventData, fixedPoint) {
  22615. var lineSegment = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.lineSegment;
  22616. var _measurementData$hand = measurementData.handles,
  22617. start = _measurementData$hand.start,
  22618. end = _measurementData$hand.end,
  22619. perpendicularStart = _measurementData$hand.perpendicularStart,
  22620. perpendicularEnd = _measurementData$hand.perpendicularEnd;
  22621. var _eventData$image = eventData.image,
  22622. _eventData$image$colu = _eventData$image.columnPixelSpacing,
  22623. columnPixelSpacing = _eventData$image$colu === void 0 ? 1 : _eventData$image$colu,
  22624. _eventData$image$rowP = _eventData$image.rowPixelSpacing,
  22625. rowPixelSpacing = _eventData$image$rowP === void 0 ? 1 : _eventData$image$rowP;
  22626. var longLine = createLine(start, end);
  22627. var perpendicularLine = createLine(perpendicularStart, perpendicularEnd);
  22628. var intersection = lineSegment.intersectLine(longLine, perpendicularLine);
  22629. var distanceToFixed = Object(_utils_getDistanceWithPixelSpacing_js__WEBPACK_IMPORTED_MODULE_1__["default"])(columnPixelSpacing, rowPixelSpacing, fixedPoint, intersection);
  22630. return {
  22631. columnPixelSpacing: columnPixelSpacing,
  22632. // Width that a pixel represents in mm
  22633. rowPixelSpacing: rowPixelSpacing,
  22634. // Height that a pixel represents in mm
  22635. start: start,
  22636. // Start point of the long line
  22637. end: end,
  22638. // End point of the long line
  22639. perpendicularStart: perpendicularStart,
  22640. // Start point of the perpendicular line
  22641. perpendicularEnd: perpendicularEnd,
  22642. // End point of the perpendicular line
  22643. longLine: longLine,
  22644. // Long line object containing the start and end points
  22645. intersection: intersection,
  22646. // Intersection point between long and perpendicular lines
  22647. distanceToFixed: distanceToFixed,
  22648. // Distance from intersection to the fixed point
  22649. fixedPoint: fixedPoint // Opposite point from the handle that is being moved
  22650. };
  22651. }
  22652. /***/ }),
  22653. /***/ "./tools/annotation/bidirectionalTool/moveHandle/moveHandle.js":
  22654. /*!*********************************************************************!*\
  22655. !*** ./tools/annotation/bidirectionalTool/moveHandle/moveHandle.js ***!
  22656. \*********************************************************************/
  22657. /*! exports provided: default */
  22658. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  22659. "use strict";
  22660. __webpack_require__.r(__webpack_exports__);
  22661. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../../../externalModules.js */ "./externalModules.js");
  22662. /* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../store/index.js */ "./store/index.js");
  22663. /* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./../../../../events.js */ "./events.js");
  22664. /* harmony import */ var _setHandlesPosition_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./setHandlesPosition.js */ "./tools/annotation/bidirectionalTool/moveHandle/setHandlesPosition.js");
  22665. /* harmony import */ var _util_getActiveTool__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../../util/getActiveTool */ "./util/getActiveTool.js");
  22666. /* harmony import */ var _base_BaseAnnotationTool__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../base/BaseAnnotationTool */ "./tools/base/BaseAnnotationTool.js");
  22667. /* harmony default export */ __webpack_exports__["default"] = (function (mouseEventData, toolName, data, handle, doneMovingCallback, preventHandleOutsideImage) {
  22668. var element = mouseEventData.element,
  22669. image = mouseEventData.image,
  22670. buttons = mouseEventData.buttons;
  22671. var distanceFromTool = {
  22672. x: handle.x - mouseEventData.currentPoints.image.x,
  22673. y: handle.y - mouseEventData.currentPoints.image.y
  22674. };
  22675. var _dragCallback = function _dragCallback(event) {
  22676. var eventData = event.detail;
  22677. handle.hasMoved = true;
  22678. if (handle.index === undefined || handle.index === null) {
  22679. handle.x = eventData.currentPoints.image.x + distanceFromTool.x;
  22680. handle.y = eventData.currentPoints.image.y + distanceFromTool.y;
  22681. } else {
  22682. Object(_setHandlesPosition_js__WEBPACK_IMPORTED_MODULE_3__["default"])(handle, eventData, data, distanceFromTool);
  22683. }
  22684. if (preventHandleOutsideImage) {
  22685. handle.x = Math.max(handle.x, 0);
  22686. handle.x = Math.min(handle.x, eventData.image.width);
  22687. handle.y = Math.max(handle.y, 0);
  22688. handle.y = Math.min(handle.y, eventData.image.height);
  22689. }
  22690. data.invalidated = true;
  22691. _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.updateImage(element);
  22692. var activeTool = Object(_util_getActiveTool__WEBPACK_IMPORTED_MODULE_4__["default"])(element, buttons, 'mouse');
  22693. if (activeTool instanceof _base_BaseAnnotationTool__WEBPACK_IMPORTED_MODULE_5__["default"]) {
  22694. activeTool.updateCachedStats(image, element, data);
  22695. }
  22696. var modifiedEventData = {
  22697. toolName: toolName,
  22698. toolType: toolName,
  22699. // Deprecation notice: toolType will be replaced by toolName
  22700. element: element,
  22701. measurementData: data
  22702. };
  22703. _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.triggerEvent(element, _events_js__WEBPACK_IMPORTED_MODULE_2__["default"].MEASUREMENT_MODIFIED, modifiedEventData);
  22704. };
  22705. handle.active = true;
  22706. handle.moving = true;
  22707. _store_index_js__WEBPACK_IMPORTED_MODULE_1__["state"].isToolLocked = true;
  22708. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].MOUSE_DRAG, _dragCallback);
  22709. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].TOUCH_DRAG, _dragCallback);
  22710. var currentImage = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.getImage(element);
  22711. var imageRenderedHandler = function imageRenderedHandler() {
  22712. var newImage = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.getImage(element); // Check if the rendered image changed during measurement modifying and stop it if so
  22713. if (newImage.imageId !== currentImage.imageId) {
  22714. interactionEndCallback();
  22715. }
  22716. }; // Bind the event listener for image rendering
  22717. element.addEventListener(_externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.EVENTS.IMAGE_RENDERED, imageRenderedHandler);
  22718. var interactionEndCallback = function interactionEndCallback() {
  22719. handle.active = false;
  22720. _store_index_js__WEBPACK_IMPORTED_MODULE_1__["state"].isToolLocked = false;
  22721. element.removeEventListener(_externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.EVENTS.IMAGE_RENDERED, imageRenderedHandler);
  22722. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].MOUSE_DRAG, _dragCallback);
  22723. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].MOUSE_UP, interactionEndCallback);
  22724. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].MOUSE_CLICK, interactionEndCallback);
  22725. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].TOUCH_DRAG, _dragCallback);
  22726. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].TOUCH_DRAG_END, interactionEndCallback);
  22727. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].TAP, interactionEndCallback);
  22728. _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.updateImage(element);
  22729. if (typeof doneMovingCallback === 'function') {
  22730. doneMovingCallback();
  22731. }
  22732. };
  22733. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].MOUSE_UP, interactionEndCallback);
  22734. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].MOUSE_CLICK, interactionEndCallback);
  22735. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].TOUCH_DRAG_END, interactionEndCallback);
  22736. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].TAP, interactionEndCallback);
  22737. });
  22738. /***/ }),
  22739. /***/ "./tools/annotation/bidirectionalTool/moveHandle/moveLongLine/moveLongLine.js":
  22740. /*!************************************************************************************!*\
  22741. !*** ./tools/annotation/bidirectionalTool/moveHandle/moveLongLine/moveLongLine.js ***!
  22742. \************************************************************************************/
  22743. /*! exports provided: default */
  22744. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  22745. "use strict";
  22746. __webpack_require__.r(__webpack_exports__);
  22747. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return moveLongLine; });
  22748. /* harmony import */ var _utils_getDistanceWithPixelSpacing_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../utils/getDistanceWithPixelSpacing.js */ "./tools/annotation/bidirectionalTool/utils/getDistanceWithPixelSpacing.js");
  22749. /* harmony import */ var _getBaseData_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../getBaseData.js */ "./tools/annotation/bidirectionalTool/moveHandle/getBaseData.js");
  22750. /* harmony import */ var _updatePerpendicularLine_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./updatePerpendicularLine.js */ "./tools/annotation/bidirectionalTool/moveHandle/moveLongLine/updatePerpendicularLine.js");
  22751. /**
  22752. * Move the long line updating the perpendicular line handles position.
  22753. *
  22754. * @param {*} proposedPoint Point that was moved in bidirectional tool
  22755. * @param {*} measurementData Data from current bidirectional tool measurement
  22756. * @param {*} eventData Data object associated with the event
  22757. * @param {*} fixedPoint Point that is not being moved in long line
  22758. *
  22759. * @returns {boolean} True if perpendicular handles were updated, false if not
  22760. */
  22761. function moveLongLine(proposedPoint, measurementData, eventData, fixedPoint) {
  22762. var baseData = Object(_getBaseData_js__WEBPACK_IMPORTED_MODULE_1__["default"])(measurementData, eventData, fixedPoint);
  22763. var columnPixelSpacing = baseData.columnPixelSpacing,
  22764. rowPixelSpacing = baseData.rowPixelSpacing,
  22765. distanceToFixed = baseData.distanceToFixed; // Calculate the length of the new line, considering the proposed point
  22766. var newLineLength = Object(_utils_getDistanceWithPixelSpacing_js__WEBPACK_IMPORTED_MODULE_0__["default"])(columnPixelSpacing, rowPixelSpacing, fixedPoint, proposedPoint); // Stop here if the handle tries to move before the intersection point
  22767. if (newLineLength <= distanceToFixed) {
  22768. return false;
  22769. } // Calculate the new intersection point
  22770. var distanceRatio = distanceToFixed / newLineLength;
  22771. var newIntersection = {
  22772. x: fixedPoint.x + (proposedPoint.x - fixedPoint.x) * distanceRatio,
  22773. y: fixedPoint.y + (proposedPoint.y - fixedPoint.y) * distanceRatio
  22774. }; // Calculate and the new position of the perpendicular handles
  22775. var newLine = Object(_updatePerpendicularLine_js__WEBPACK_IMPORTED_MODULE_2__["default"])(baseData, newIntersection); // Update the perpendicular line handles
  22776. measurementData.handles.perpendicularStart.x = newLine.start.x;
  22777. measurementData.handles.perpendicularStart.y = newLine.start.y;
  22778. measurementData.handles.perpendicularEnd.x = newLine.end.x;
  22779. measurementData.handles.perpendicularEnd.y = newLine.end.y;
  22780. return true;
  22781. }
  22782. /***/ }),
  22783. /***/ "./tools/annotation/bidirectionalTool/moveHandle/moveLongLine/updatePerpendicularLine.js":
  22784. /*!***********************************************************************************************!*\
  22785. !*** ./tools/annotation/bidirectionalTool/moveHandle/moveLongLine/updatePerpendicularLine.js ***!
  22786. \***********************************************************************************************/
  22787. /*! exports provided: default */
  22788. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  22789. "use strict";
  22790. __webpack_require__.r(__webpack_exports__);
  22791. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return updatePerpendicularLine; });
  22792. /* harmony import */ var _utils_getLineVector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../utils/getLineVector */ "./tools/annotation/bidirectionalTool/utils/getLineVector.js");
  22793. /* harmony import */ var _utils_getDistanceWithPixelSpacing__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utils/getDistanceWithPixelSpacing */ "./tools/annotation/bidirectionalTool/utils/getDistanceWithPixelSpacing.js");
  22794. /**
  22795. * Returns the updated line object that will be used to change the position of
  22796. * the perpendicular line handles.
  22797. *
  22798. * @param {*} baseData Base data for bidirectional line moving
  22799. * @param {*} mid Middle point considering the proposed point
  22800. *
  22801. * @returns {*} Returns a line object with the updated handles position
  22802. */
  22803. function updatePerpendicularLine(baseData, mid) {
  22804. var columnPixelSpacing = baseData.columnPixelSpacing,
  22805. rowPixelSpacing = baseData.rowPixelSpacing,
  22806. start = baseData.start,
  22807. perpendicularStart = baseData.perpendicularStart,
  22808. perpendicularEnd = baseData.perpendicularEnd,
  22809. intersection = baseData.intersection,
  22810. fixedPoint = baseData.fixedPoint; // Get the original distance from perpendicular start handle to intersection
  22811. var distancePS = Object(_utils_getDistanceWithPixelSpacing__WEBPACK_IMPORTED_MODULE_1__["default"])(columnPixelSpacing, rowPixelSpacing, perpendicularStart, intersection); // Get the original distance from perpendicular end handle to intersection
  22812. var distancePE = Object(_utils_getDistanceWithPixelSpacing__WEBPACK_IMPORTED_MODULE_1__["default"])(columnPixelSpacing, rowPixelSpacing, perpendicularEnd, intersection); // Inclination of the perpendicular line
  22813. var vector = Object(_utils_getLineVector__WEBPACK_IMPORTED_MODULE_0__["default"])(columnPixelSpacing, rowPixelSpacing, fixedPoint, mid); // Define the multiplier
  22814. var multiplier = fixedPoint === start ? 1 : -1;
  22815. var rowMultiplier = multiplier * rowPixelSpacing;
  22816. var columnMultiplier = multiplier * columnPixelSpacing; // Calculate and return the new position of the perpendicular handles
  22817. return {
  22818. start: {
  22819. x: mid.x + vector.y * distancePS * rowMultiplier,
  22820. y: mid.y + vector.x * distancePS * columnMultiplier * -1
  22821. },
  22822. end: {
  22823. x: mid.x + vector.y * distancePE * rowMultiplier * -1,
  22824. y: mid.y + vector.x * distancePE * columnMultiplier
  22825. }
  22826. };
  22827. }
  22828. /***/ }),
  22829. /***/ "./tools/annotation/bidirectionalTool/moveHandle/movePerpendicularLine/getDirectionMultiplier.js":
  22830. /*!*******************************************************************************************************!*\
  22831. !*** ./tools/annotation/bidirectionalTool/moveHandle/movePerpendicularLine/getDirectionMultiplier.js ***!
  22832. \*******************************************************************************************************/
  22833. /*! exports provided: default */
  22834. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  22835. "use strict";
  22836. __webpack_require__.r(__webpack_exports__);
  22837. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getDirectionMultiplier; });
  22838. /* harmony import */ var _isPerpendicularEndFixed_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./isPerpendicularEndFixed.js */ "./tools/annotation/bidirectionalTool/moveHandle/movePerpendicularLine/isPerpendicularEndFixed.js");
  22839. /**
  22840. * Return the direction multiplier based on the perpendicular fixed point and
  22841. * the end point.
  22842. *
  22843. * @param {*} fixedPoint Point that is not being moved in perpendicular line
  22844. * @param {*} perpendicularEnd The end point of the perpencular line
  22845. *
  22846. * @returns {number} Returns -1 if end point is not being moved or 1 if it is
  22847. */
  22848. function getDirectionMultiplier(fixedPoint, perpendicularEnd) {
  22849. return Object(_isPerpendicularEndFixed_js__WEBPACK_IMPORTED_MODULE_0__["default"])(fixedPoint, perpendicularEnd) ? -1 : 1;
  22850. }
  22851. /***/ }),
  22852. /***/ "./tools/annotation/bidirectionalTool/moveHandle/movePerpendicularLine/getHelperLine.js":
  22853. /*!**********************************************************************************************!*\
  22854. !*** ./tools/annotation/bidirectionalTool/moveHandle/movePerpendicularLine/getHelperLine.js ***!
  22855. \**********************************************************************************************/
  22856. /*! exports provided: default */
  22857. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  22858. "use strict";
  22859. __webpack_require__.r(__webpack_exports__);
  22860. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getHelperLine; });
  22861. /* harmony import */ var _getDirectionMultiplier__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getDirectionMultiplier */ "./tools/annotation/bidirectionalTool/moveHandle/movePerpendicularLine/getDirectionMultiplier.js");
  22862. /**
  22863. * Creates a helper line with the same inclination as the perpendicular line
  22864. * but having the start point as the proposed point.
  22865. * This line will start in the proposed point and will grow in the long line
  22866. * direction trying to cross it to enable finding the intersection point
  22867. * between the long line and this new perpendicular line.
  22868. *
  22869. * @param {*} baseData Base data for bidirectional line moving
  22870. * @param {*} proposedPoint Point that was moved in bidirectional tool
  22871. * @param {*} vector Vector with the perpendicular line inclination
  22872. *
  22873. * @returns {*} Returns the helper line containing the start and end points
  22874. */
  22875. function getHelperLine(baseData, proposedPoint, vector) {
  22876. var columnPixelSpacing = baseData.columnPixelSpacing,
  22877. rowPixelSpacing = baseData.rowPixelSpacing,
  22878. perpendicularEnd = baseData.perpendicularEnd,
  22879. fixedPoint = baseData.fixedPoint; // Create a helper line to find the intesection point in the long line
  22880. var highNumber = Number.MAX_SAFE_INTEGER; // Get the multiplier
  22881. var multiplier = Object(_getDirectionMultiplier__WEBPACK_IMPORTED_MODULE_0__["default"])(fixedPoint, perpendicularEnd) * highNumber;
  22882. return {
  22883. start: proposedPoint,
  22884. end: {
  22885. x: proposedPoint.x + vector.y * rowPixelSpacing * multiplier,
  22886. y: proposedPoint.y + vector.x * columnPixelSpacing * multiplier * -1
  22887. }
  22888. };
  22889. }
  22890. /***/ }),
  22891. /***/ "./tools/annotation/bidirectionalTool/moveHandle/movePerpendicularLine/getMovingPoint.js":
  22892. /*!***********************************************************************************************!*\
  22893. !*** ./tools/annotation/bidirectionalTool/moveHandle/movePerpendicularLine/getMovingPoint.js ***!
  22894. \***********************************************************************************************/
  22895. /*! exports provided: default */
  22896. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  22897. "use strict";
  22898. __webpack_require__.r(__webpack_exports__);
  22899. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getMovingPoint; });
  22900. /* harmony import */ var _isPerpendicularEndFixed_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./isPerpendicularEndFixed.js */ "./tools/annotation/bidirectionalTool/moveHandle/movePerpendicularLine/isPerpendicularEndFixed.js");
  22901. /**
  22902. * Utility function to return the point that is the opposite of the fixed
  22903. * point (the point not being moved in the bidirectional tool's perpendicular
  22904. * line).
  22905. *
  22906. * @param {*} fixedPoint Point that is not being moved in perpendicular line
  22907. * @param {*} perpendicularStart The start point of the perpencular line
  22908. * @param {*} perpendicularEnd The end point of the perpencular line
  22909. *
  22910. * @returns {*} Point that is being moved in perpendicular line
  22911. */
  22912. function getMovingPoint(fixedPoint, perpendicularStart, perpendicularEnd) {
  22913. if (Object(_isPerpendicularEndFixed_js__WEBPACK_IMPORTED_MODULE_0__["default"])(fixedPoint, perpendicularEnd)) {
  22914. return perpendicularStart;
  22915. }
  22916. return perpendicularEnd;
  22917. }
  22918. /***/ }),
  22919. /***/ "./tools/annotation/bidirectionalTool/moveHandle/movePerpendicularLine/isPerpendicularEndFixed.js":
  22920. /*!********************************************************************************************************!*\
  22921. !*** ./tools/annotation/bidirectionalTool/moveHandle/movePerpendicularLine/isPerpendicularEndFixed.js ***!
  22922. \********************************************************************************************************/
  22923. /*! exports provided: default */
  22924. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  22925. "use strict";
  22926. __webpack_require__.r(__webpack_exports__);
  22927. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return isPerpendicularEndFixed; });
  22928. /**
  22929. * Returns true if the end point is the point that is not being moved in the
  22930. * perpendicular line.
  22931. *
  22932. * @param {*} fixedPoint Point that is not being moved in perpendicular line
  22933. * @param {*} perpendicularEnd The end point of the perpencular line
  22934. *
  22935. * @returns {boolean} Returns true if the fixed point is the end point
  22936. */
  22937. function isPerpendicularEndFixed(fixedPoint, perpendicularEnd) {
  22938. return fixedPoint === perpendicularEnd;
  22939. }
  22940. /***/ }),
  22941. /***/ "./tools/annotation/bidirectionalTool/moveHandle/movePerpendicularLine/lineHasLength.js":
  22942. /*!**********************************************************************************************!*\
  22943. !*** ./tools/annotation/bidirectionalTool/moveHandle/movePerpendicularLine/lineHasLength.js ***!
  22944. \**********************************************************************************************/
  22945. /*! exports provided: default */
  22946. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  22947. "use strict";
  22948. __webpack_require__.r(__webpack_exports__);
  22949. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return lineHasLength; });
  22950. /* harmony import */ var _utils_getDistanceWithPixelSpacing__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../utils/getDistanceWithPixelSpacing */ "./tools/annotation/bidirectionalTool/utils/getDistanceWithPixelSpacing.js");
  22951. /**
  22952. * Returns true if the given line object has its length different from zero,
  22953. * considering the column and row pixel spacings.
  22954. *
  22955. * @param {number} columnPixelSpacing Width that a pixel represents in mm
  22956. * @param {number} rowPixelSpacing Height that a pixel represents in mm
  22957. * @param {*} line Line object that will have its length calculated
  22958. *
  22959. * @returns {boolean} Returns true if line has any length
  22960. */
  22961. function lineHasLength(columnPixelSpacing, rowPixelSpacing, line) {
  22962. var lineLength = Object(_utils_getDistanceWithPixelSpacing__WEBPACK_IMPORTED_MODULE_0__["default"])(columnPixelSpacing, rowPixelSpacing, line.start, line.end);
  22963. return lineLength !== 0;
  22964. }
  22965. /***/ }),
  22966. /***/ "./tools/annotation/bidirectionalTool/moveHandle/movePerpendicularLine/movePerpendicularLine.js":
  22967. /*!******************************************************************************************************!*\
  22968. !*** ./tools/annotation/bidirectionalTool/moveHandle/movePerpendicularLine/movePerpendicularLine.js ***!
  22969. \******************************************************************************************************/
  22970. /*! exports provided: default */
  22971. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  22972. "use strict";
  22973. __webpack_require__.r(__webpack_exports__);
  22974. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return movePerpendicularLine; });
  22975. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../../../../externalModules.js */ "./externalModules.js");
  22976. /* harmony import */ var _utils_getLineVector_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../utils/getLineVector.js */ "./tools/annotation/bidirectionalTool/utils/getLineVector.js");
  22977. /* harmony import */ var _getBaseData_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../getBaseData.js */ "./tools/annotation/bidirectionalTool/moveHandle/getBaseData.js");
  22978. /* harmony import */ var _lineHasLength_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./lineHasLength.js */ "./tools/annotation/bidirectionalTool/moveHandle/movePerpendicularLine/lineHasLength.js");
  22979. /* harmony import */ var _getHelperLine_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./getHelperLine.js */ "./tools/annotation/bidirectionalTool/moveHandle/movePerpendicularLine/getHelperLine.js");
  22980. /* harmony import */ var _updatePerpendicularLine_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./updatePerpendicularLine.js */ "./tools/annotation/bidirectionalTool/moveHandle/movePerpendicularLine/updatePerpendicularLine.js");
  22981. /**
  22982. * Move the perpendicular line updating the opposite handle position.
  22983. *
  22984. * @param {*} proposedPoint Point that was moved in bidirectional tool
  22985. * @param {*} measurementData Data from current bidirectional tool measurement
  22986. * @param {*} eventData Data object associated with the event
  22987. * @param {*} fixedPoint Point that is not being moved in long line
  22988. *
  22989. * @returns {boolean} True if perpendicular handles were updated, false if not
  22990. */
  22991. function movePerpendicularLine(proposedPoint, measurementData, eventData, fixedPoint) {
  22992. var lineSegment = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.lineSegment;
  22993. var baseData = Object(_getBaseData_js__WEBPACK_IMPORTED_MODULE_2__["default"])(measurementData, eventData, fixedPoint);
  22994. var columnPixelSpacing = baseData.columnPixelSpacing,
  22995. rowPixelSpacing = baseData.rowPixelSpacing,
  22996. start = baseData.start,
  22997. longLine = baseData.longLine,
  22998. intersection = baseData.intersection; // Stop here if the long line has no length
  22999. if (!Object(_lineHasLength_js__WEBPACK_IMPORTED_MODULE_3__["default"])(columnPixelSpacing, rowPixelSpacing, longLine)) {
  23000. return false;
  23001. } // Inclination of the perpendicular line
  23002. var vector = Object(_utils_getLineVector_js__WEBPACK_IMPORTED_MODULE_1__["default"])(columnPixelSpacing, rowPixelSpacing, start, intersection); // Get a helper line to calculate the intersection
  23003. var helperLine = Object(_getHelperLine_js__WEBPACK_IMPORTED_MODULE_4__["default"])(baseData, proposedPoint, vector); // Find the new intersection in the long line
  23004. var newIntersection = lineSegment.intersectLine(longLine, helperLine); // Stop the flow here if there's no intersection point between lines
  23005. if (!newIntersection) {
  23006. return false;
  23007. } // Calculate and the new position of the perpendicular handles
  23008. var newLine = Object(_updatePerpendicularLine_js__WEBPACK_IMPORTED_MODULE_5__["default"])(baseData, newIntersection, helperLine, vector); // Change the position of the perpendicular line handles
  23009. measurementData.handles.perpendicularStart.x = newLine.start.x;
  23010. measurementData.handles.perpendicularStart.y = newLine.start.y;
  23011. measurementData.handles.perpendicularEnd.x = newLine.end.x;
  23012. measurementData.handles.perpendicularEnd.y = newLine.end.y;
  23013. return true;
  23014. }
  23015. /***/ }),
  23016. /***/ "./tools/annotation/bidirectionalTool/moveHandle/movePerpendicularLine/updatePerpendicularLine.js":
  23017. /*!********************************************************************************************************!*\
  23018. !*** ./tools/annotation/bidirectionalTool/moveHandle/movePerpendicularLine/updatePerpendicularLine.js ***!
  23019. \********************************************************************************************************/
  23020. /*! exports provided: default */
  23021. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  23022. "use strict";
  23023. __webpack_require__.r(__webpack_exports__);
  23024. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return updatePerpendicularLine; });
  23025. /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "../node_modules/@babel/runtime/helpers/defineProperty.js");
  23026. /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__);
  23027. /* harmony import */ var _getDirectionMultiplier__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getDirectionMultiplier */ "./tools/annotation/bidirectionalTool/moveHandle/movePerpendicularLine/getDirectionMultiplier.js");
  23028. /* harmony import */ var _getMovingPoint__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./getMovingPoint */ "./tools/annotation/bidirectionalTool/moveHandle/movePerpendicularLine/getMovingPoint.js");
  23029. /**
  23030. * Returns the updated line object that will be used to change the position of
  23031. * the perpendicular line handles.
  23032. *
  23033. * @param {*} baseData Base data for bidirectional line moving
  23034. * @param {*} mid Middle point considering the proposed point
  23035. * @param {*} helperLine Line based on proposed point that crosses long line
  23036. * @param {*} vector Vector with the perpendicular line inclination
  23037. *
  23038. * @returns {*} Returns a line object with the updated handles position
  23039. */
  23040. function updatePerpendicularLine(baseData, mid, helperLine, vector) {
  23041. var _ref;
  23042. var columnPixelSpacing = baseData.columnPixelSpacing,
  23043. rowPixelSpacing = baseData.rowPixelSpacing,
  23044. fixedPoint = baseData.fixedPoint,
  23045. perpendicularStart = baseData.perpendicularStart,
  23046. perpendicularEnd = baseData.perpendicularEnd,
  23047. distanceToFixed = baseData.distanceToFixed; // Get the multiplier
  23048. var multiplier = Object(_getDirectionMultiplier__WEBPACK_IMPORTED_MODULE_1__["default"])(fixedPoint, perpendicularEnd) * distanceToFixed; // Define the moving point
  23049. var movingPoint = Object(_getMovingPoint__WEBPACK_IMPORTED_MODULE_2__["default"])(fixedPoint, perpendicularStart, perpendicularEnd); // Get the object keys for moving and fixed points
  23050. var isMovingStart = movingPoint === perpendicularStart;
  23051. var movingKey = isMovingStart ? 'start' : 'end';
  23052. var fixedKey = isMovingStart ? 'end' : 'start'; // Calculate and return the new position of the perpendicular handles
  23053. return _ref = {}, _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(_ref, movingKey, {
  23054. x: helperLine.start.x,
  23055. y: helperLine.start.y
  23056. }), _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(_ref, fixedKey, {
  23057. x: mid.x + vector.y * rowPixelSpacing * multiplier,
  23058. y: mid.y + vector.x * columnPixelSpacing * multiplier * -1
  23059. }), _ref;
  23060. }
  23061. /***/ }),
  23062. /***/ "./tools/annotation/bidirectionalTool/moveHandle/setHandlesPosition.js":
  23063. /*!*****************************************************************************!*\
  23064. !*** ./tools/annotation/bidirectionalTool/moveHandle/setHandlesPosition.js ***!
  23065. \*****************************************************************************/
  23066. /*! exports provided: default */
  23067. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  23068. "use strict";
  23069. __webpack_require__.r(__webpack_exports__);
  23070. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../../../externalModules.js */ "./externalModules.js");
  23071. /* harmony import */ var _moveLongLine_moveLongLine_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./moveLongLine/moveLongLine.js */ "./tools/annotation/bidirectionalTool/moveHandle/moveLongLine/moveLongLine.js");
  23072. /* harmony import */ var _movePerpendicularLine_movePerpendicularLine_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./movePerpendicularLine/movePerpendicularLine.js */ "./tools/annotation/bidirectionalTool/moveHandle/movePerpendicularLine/movePerpendicularLine.js");
  23073. // Sets position of handles(start, end, perpendicularStart, perpendicularEnd)
  23074. /* harmony default export */ __webpack_exports__["default"] = (function (handle, eventData, data, distanceFromTool) {
  23075. var movedPoint;
  23076. var outOfBounds;
  23077. var result;
  23078. var intersection;
  23079. var d1;
  23080. var d2;
  23081. var longLine = {};
  23082. var perpendicularLine = {};
  23083. var proposedPoint = {
  23084. x: eventData.currentPoints.image.x + distanceFromTool.x,
  23085. y: eventData.currentPoints.image.y + distanceFromTool.y
  23086. };
  23087. if (handle.index === 0) {
  23088. // If long-axis start point is moved
  23089. result = Object(_moveLongLine_moveLongLine_js__WEBPACK_IMPORTED_MODULE_1__["default"])(proposedPoint, data, eventData, data.handles.end);
  23090. if (result) {
  23091. handle.x = proposedPoint.x;
  23092. handle.y = proposedPoint.y;
  23093. } else {
  23094. eventData.currentPoints.image.x = handle.x;
  23095. eventData.currentPoints.image.y = handle.y;
  23096. }
  23097. } else if (handle.index === 1) {
  23098. // If long-axis end point is moved
  23099. result = Object(_moveLongLine_moveLongLine_js__WEBPACK_IMPORTED_MODULE_1__["default"])(proposedPoint, data, eventData, data.handles.start);
  23100. if (result) {
  23101. handle.x = proposedPoint.x;
  23102. handle.y = proposedPoint.y;
  23103. } else {
  23104. eventData.currentPoints.image.x = handle.x;
  23105. eventData.currentPoints.image.y = handle.y;
  23106. }
  23107. } else if (handle.index === 2) {
  23108. outOfBounds = false; // If perpendicular start point is moved
  23109. longLine.start = {
  23110. x: data.handles.start.x,
  23111. y: data.handles.start.y
  23112. };
  23113. longLine.end = {
  23114. x: data.handles.end.x,
  23115. y: data.handles.end.y
  23116. };
  23117. perpendicularLine.start = {
  23118. x: data.handles.perpendicularEnd.x,
  23119. y: data.handles.perpendicularEnd.y
  23120. };
  23121. perpendicularLine.end = {
  23122. x: proposedPoint.x,
  23123. y: proposedPoint.y
  23124. };
  23125. intersection = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.lineSegment.intersectLine(longLine, perpendicularLine);
  23126. if (!intersection) {
  23127. perpendicularLine.end = {
  23128. x: data.handles.perpendicularStart.x,
  23129. y: data.handles.perpendicularStart.y
  23130. };
  23131. intersection = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.lineSegment.intersectLine(longLine, perpendicularLine);
  23132. d1 = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.point.distance(intersection, data.handles.start);
  23133. d2 = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.point.distance(intersection, data.handles.end);
  23134. if (!intersection || d1 < 3 || d2 < 3) {
  23135. outOfBounds = true;
  23136. }
  23137. }
  23138. movedPoint = false;
  23139. if (!outOfBounds) {
  23140. movedPoint = Object(_movePerpendicularLine_movePerpendicularLine_js__WEBPACK_IMPORTED_MODULE_2__["default"])(proposedPoint, data, eventData, data.handles.perpendicularEnd);
  23141. if (!movedPoint) {
  23142. eventData.currentPoints.image.x = data.handles.perpendicularStart.x;
  23143. eventData.currentPoints.image.y = data.handles.perpendicularStart.y;
  23144. }
  23145. }
  23146. } else if (handle.index === 3) {
  23147. outOfBounds = false; // If perpendicular end point is moved
  23148. longLine.start = {
  23149. x: data.handles.start.x,
  23150. y: data.handles.start.y
  23151. };
  23152. longLine.end = {
  23153. x: data.handles.end.x,
  23154. y: data.handles.end.y
  23155. };
  23156. perpendicularLine.start = {
  23157. x: data.handles.perpendicularStart.x,
  23158. y: data.handles.perpendicularStart.y
  23159. };
  23160. perpendicularLine.end = {
  23161. x: proposedPoint.x,
  23162. y: proposedPoint.y
  23163. };
  23164. intersection = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.lineSegment.intersectLine(longLine, perpendicularLine);
  23165. if (!intersection) {
  23166. perpendicularLine.end = {
  23167. x: data.handles.perpendicularEnd.x,
  23168. y: data.handles.perpendicularEnd.y
  23169. };
  23170. intersection = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.lineSegment.intersectLine(longLine, perpendicularLine);
  23171. d1 = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.point.distance(intersection, data.handles.start);
  23172. d2 = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.point.distance(intersection, data.handles.end);
  23173. if (!intersection || d1 < 3 || d2 < 3) {
  23174. outOfBounds = true;
  23175. }
  23176. }
  23177. movedPoint = false;
  23178. if (!outOfBounds) {
  23179. movedPoint = Object(_movePerpendicularLine_movePerpendicularLine_js__WEBPACK_IMPORTED_MODULE_2__["default"])(proposedPoint, data, eventData, data.handles.perpendicularStart);
  23180. if (!movedPoint) {
  23181. eventData.currentPoints.image.x = data.handles.perpendicularEnd.x;
  23182. eventData.currentPoints.image.y = data.handles.perpendicularEnd.y;
  23183. }
  23184. }
  23185. }
  23186. });
  23187. /***/ }),
  23188. /***/ "./tools/annotation/bidirectionalTool/moveHandle/touchMoveHandle.js":
  23189. /*!**************************************************************************!*\
  23190. !*** ./tools/annotation/bidirectionalTool/moveHandle/touchMoveHandle.js ***!
  23191. \**************************************************************************/
  23192. /*! exports provided: default */
  23193. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  23194. "use strict";
  23195. __webpack_require__.r(__webpack_exports__);
  23196. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../../../externalModules.js */ "./externalModules.js");
  23197. /* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../store/index.js */ "./store/index.js");
  23198. /* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./../../../../events.js */ "./events.js");
  23199. /* harmony import */ var _setHandlesPosition_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./setHandlesPosition.js */ "./tools/annotation/bidirectionalTool/moveHandle/setHandlesPosition.js");
  23200. /* harmony import */ var _util_getActiveTool__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../../util/getActiveTool */ "./util/getActiveTool.js");
  23201. /* harmony import */ var _base_BaseAnnotationTool__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../base/BaseAnnotationTool */ "./tools/base/BaseAnnotationTool.js");
  23202. var touchEndEvents = [_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].TOUCH_END, _events_js__WEBPACK_IMPORTED_MODULE_2__["default"].TOUCH_DRAG_END, _events_js__WEBPACK_IMPORTED_MODULE_2__["default"].TOUCH_PINCH, _events_js__WEBPACK_IMPORTED_MODULE_2__["default"].TOUCH_PRESS, _events_js__WEBPACK_IMPORTED_MODULE_2__["default"].TAP];
  23203. /* harmony default export */ __webpack_exports__["default"] = (function (mouseEventData, toolName, data, handle, doneMovingCallback, preventHandleOutsideImage) {
  23204. var element = mouseEventData.element,
  23205. image = mouseEventData.image,
  23206. buttons = mouseEventData.buttons;
  23207. var distanceFromTool = {
  23208. x: handle.x - mouseEventData.currentPoints.image.x,
  23209. y: handle.y - mouseEventData.currentPoints.image.y
  23210. };
  23211. var touchDragCallback = function touchDragCallback(event) {
  23212. var eventData = event.detail;
  23213. handle.hasMoved = true;
  23214. if (handle.index === undefined || handle.index === null) {
  23215. handle.x = eventData.currentPoints.image.x + distanceFromTool.x;
  23216. handle.y = eventData.currentPoints.image.y + distanceFromTool.y;
  23217. } else {
  23218. Object(_setHandlesPosition_js__WEBPACK_IMPORTED_MODULE_3__["default"])(handle, eventData, data, distanceFromTool);
  23219. }
  23220. if (preventHandleOutsideImage) {
  23221. handle.x = Math.max(handle.x, 0);
  23222. handle.x = Math.min(handle.x, eventData.image.width);
  23223. handle.y = Math.max(handle.y, 0);
  23224. handle.y = Math.min(handle.y, eventData.image.height);
  23225. }
  23226. data.invalidated = true;
  23227. _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.updateImage(element);
  23228. var activeTool = Object(_util_getActiveTool__WEBPACK_IMPORTED_MODULE_4__["default"])(element, buttons, 'touch');
  23229. if (activeTool instanceof _base_BaseAnnotationTool__WEBPACK_IMPORTED_MODULE_5__["default"]) {
  23230. activeTool.updateCachedStats(image, element, data);
  23231. }
  23232. var modifiedEventData = {
  23233. toolName: toolName,
  23234. toolType: toolName,
  23235. // Deprecation notice: toolType will be replaced by toolName
  23236. element: element,
  23237. measurementData: data
  23238. };
  23239. _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.triggerEvent(element, _events_js__WEBPACK_IMPORTED_MODULE_2__["default"].MEASUREMENT_MODIFIED, modifiedEventData);
  23240. };
  23241. handle.active = true;
  23242. _store_index_js__WEBPACK_IMPORTED_MODULE_1__["state"].isToolLocked = true;
  23243. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].TOUCH_DRAG, touchDragCallback);
  23244. var touchEndCallback = function touchEndCallback() {
  23245. handle.active = false;
  23246. _store_index_js__WEBPACK_IMPORTED_MODULE_1__["state"].isToolLocked = false;
  23247. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].TOUCH_DRAG, touchDragCallback);
  23248. touchEndEvents.forEach(function (eventType) {
  23249. element.removeEventListener(eventType, touchEndCallback);
  23250. });
  23251. _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.updateImage(element);
  23252. if (typeof doneMovingCallback === 'function') {
  23253. doneMovingCallback();
  23254. }
  23255. };
  23256. touchEndEvents.forEach(function (eventType) {
  23257. element.addEventListener(eventType, touchEndCallback);
  23258. });
  23259. });
  23260. /***/ }),
  23261. /***/ "./tools/annotation/bidirectionalTool/pointNearTool.js":
  23262. /*!*************************************************************!*\
  23263. !*** ./tools/annotation/bidirectionalTool/pointNearTool.js ***!
  23264. \*************************************************************/
  23265. /*! exports provided: default */
  23266. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  23267. "use strict";
  23268. __webpack_require__.r(__webpack_exports__);
  23269. /* harmony import */ var _util_getProximityThreshold_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../util/getProximityThreshold.js */ "./util/getProximityThreshold.js");
  23270. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../../../externalModules.js */ "./externalModules.js");
  23271. /* harmony import */ var _util_pointInsideBoundingBox_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./../../../util/pointInsideBoundingBox.js */ "./util/pointInsideBoundingBox.js");
  23272. var pointNearPerpendicular = function pointNearPerpendicular(element, handles, coords, distanceThreshold) {
  23273. var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone;
  23274. var cornerstoneMath = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath;
  23275. var lineSegment = {
  23276. start: cornerstone.pixelToCanvas(element, handles.perpendicularStart),
  23277. end: cornerstone.pixelToCanvas(element, handles.perpendicularEnd)
  23278. };
  23279. var distanceToPoint = cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);
  23280. return distanceToPoint < distanceThreshold;
  23281. };
  23282. /* harmony default export */ __webpack_exports__["default"] = (function (element, data, coords) {
  23283. var interactionType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'mouse';
  23284. var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone;
  23285. var cornerstoneMath = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath;
  23286. var handles = data.handles;
  23287. var lineSegment = {
  23288. start: cornerstone.pixelToCanvas(element, handles.start),
  23289. end: cornerstone.pixelToCanvas(element, handles.end)
  23290. };
  23291. var distanceToPoint = cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);
  23292. if (Object(_util_pointInsideBoundingBox_js__WEBPACK_IMPORTED_MODULE_2__["default"])(handles.textBox, coords)) {
  23293. return true;
  23294. }
  23295. var distanceThreshold = Object(_util_getProximityThreshold_js__WEBPACK_IMPORTED_MODULE_0__["default"])(interactionType, 'Bidirectional');
  23296. if (pointNearPerpendicular(element, handles, coords, distanceThreshold)) {
  23297. return true;
  23298. }
  23299. return distanceToPoint < distanceThreshold;
  23300. });
  23301. /***/ }),
  23302. /***/ "./tools/annotation/bidirectionalTool/renderToolData.js":
  23303. /*!**************************************************************!*\
  23304. !*** ./tools/annotation/bidirectionalTool/renderToolData.js ***!
  23305. \**************************************************************/
  23306. /*! exports provided: default */
  23307. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  23308. "use strict";
  23309. __webpack_require__.r(__webpack_exports__);
  23310. /* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "../node_modules/@babel/runtime/helpers/toConsumableArray.js");
  23311. /* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__);
  23312. /* harmony import */ var _drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../../../drawing/drawHandles.js */ "./drawing/drawHandles.js");
  23313. /* harmony import */ var _utils_updatePerpendicularLineHandles_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils/updatePerpendicularLineHandles.js */ "./tools/annotation/bidirectionalTool/utils/updatePerpendicularLineHandles.js");
  23314. /* harmony import */ var _store_index__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../store/index */ "./store/index.js");
  23315. /* harmony import */ var _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./../../../stateManagement/toolStyle.js */ "./stateManagement/toolStyle.js");
  23316. /* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../../../stateManagement/toolColors.js */ "./stateManagement/toolColors.js");
  23317. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./../../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  23318. /* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../../../drawing/index.js */ "./drawing/index.js");
  23319. /* harmony import */ var _drawing_drawLinkedTextBox_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./../../../drawing/drawLinkedTextBox.js */ "./drawing/drawLinkedTextBox.js");
  23320. /* harmony import */ var _util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../../util/getPixelSpacing */ "./util/getPixelSpacing.js");
  23321. /* eslint no-loop-func: 0 */
  23322. // --> OFF
  23323. /* harmony default export */ __webpack_exports__["default"] = (function (evt) {
  23324. var _this = this;
  23325. var eventData = evt.detail;
  23326. var element = eventData.element,
  23327. canvasContext = eventData.canvasContext,
  23328. image = eventData.image;
  23329. var _this$configuration = this.configuration,
  23330. handleRadius = _this$configuration.handleRadius,
  23331. drawHandlesOnHover = _this$configuration.drawHandlesOnHover,
  23332. hideHandlesIfMoving = _this$configuration.hideHandlesIfMoving,
  23333. renderDashed = _this$configuration.renderDashed;
  23334. var lineDash = Object(_store_index__WEBPACK_IMPORTED_MODULE_3__["getModule"])('globalConfiguration').configuration.lineDash; // If we have no toolData for this element, return immediately as there is nothing to do
  23335. var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_6__["getToolState"])(element, this.name);
  23336. if (!toolData) {
  23337. return;
  23338. }
  23339. var _getPixelSpacing = Object(_util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_9__["default"])(image),
  23340. rowPixelSpacing = _getPixelSpacing.rowPixelSpacing,
  23341. colPixelSpacing = _getPixelSpacing.colPixelSpacing; // LT-29 Disable Target Measurements when pixel spacing is not available
  23342. if (!rowPixelSpacing || !colPixelSpacing) {
  23343. return;
  23344. } // We have tool data for this element - iterate over each one and draw it
  23345. var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["getNewContext"])(canvasContext.canvas);
  23346. var color;
  23347. var lineWidth = _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_4__["default"].getToolWidth();
  23348. var _loop = function _loop(i) {
  23349. var data = toolData.data[i];
  23350. if (data.visible === false) {
  23351. return "continue";
  23352. }
  23353. color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_5__["default"].getColorIfActive(data); // Calculate the data measurements
  23354. if (data.invalidated === true) {
  23355. if (data.longestDiameter && data.shortestDiameter) {
  23356. _this.throttledUpdateCachedStats(image, element, data);
  23357. } else {
  23358. _this.updateCachedStats(image, element, data);
  23359. }
  23360. }
  23361. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["draw"])(context, function (context) {
  23362. // Configurable shadow
  23363. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["setShadow"])(context, _this.configuration);
  23364. var _data$handles = data.handles,
  23365. start = _data$handles.start,
  23366. end = _data$handles.end,
  23367. perpendicularStart = _data$handles.perpendicularStart,
  23368. perpendicularEnd = _data$handles.perpendicularEnd,
  23369. textBox = _data$handles.textBox;
  23370. var lineOptions = {
  23371. color: color
  23372. };
  23373. var perpendicularLineOptions = {
  23374. color: color,
  23375. strokeWidth: strokeWidth
  23376. };
  23377. if (renderDashed) {
  23378. lineOptions.lineDash = lineDash;
  23379. perpendicularLineOptions.lineDash = lineDash;
  23380. } // Draw the measurement line
  23381. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["drawLine"])(context, element, start, end, lineOptions); // Draw perpendicular line
  23382. var strokeWidth = lineWidth;
  23383. Object(_utils_updatePerpendicularLineHandles_js__WEBPACK_IMPORTED_MODULE_2__["default"])(eventData, data);
  23384. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["drawLine"])(context, element, perpendicularStart, perpendicularEnd, perpendicularLineOptions); // Draw the handles
  23385. var handleOptions = {
  23386. color: color,
  23387. handleRadius: handleRadius,
  23388. drawHandlesIfActive: drawHandlesOnHover,
  23389. hideHandlesIfMoving: hideHandlesIfMoving
  23390. }; // Draw the handles
  23391. if (_this.configuration.drawHandles) {
  23392. Object(_drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_1__["default"])(context, eventData, data.handles, handleOptions);
  23393. } // Draw the textbox
  23394. // Move the textbox slightly to the right and upwards
  23395. // So that it sits beside the length tool handle
  23396. var xOffset = 10;
  23397. var textBoxAnchorPoints = function textBoxAnchorPoints(handles) {
  23398. return [handles.start, handles.end, handles.perpendicularStart, handles.perpendicularEnd];
  23399. };
  23400. var textLines = getTextBoxText(data, rowPixelSpacing, colPixelSpacing);
  23401. Object(_drawing_drawLinkedTextBox_js__WEBPACK_IMPORTED_MODULE_8__["default"])(context, element, textBox, textLines, data.handles, textBoxAnchorPoints, color, lineWidth, xOffset, true);
  23402. });
  23403. };
  23404. for (var i = 0; i < toolData.data.length; i++) {
  23405. var _ret = _loop(i);
  23406. if (_ret === "continue") continue;
  23407. }
  23408. });
  23409. var getTextBoxText = function getTextBoxText(data, rowPixelSpacing, colPixelSpacing) {
  23410. var suffix = ' mm';
  23411. if (!rowPixelSpacing || !colPixelSpacing) {
  23412. suffix = ' pixels';
  23413. }
  23414. var lengthText = " L ".concat(data.longestDiameter).concat(suffix);
  23415. var widthText = " W ".concat(data.shortestDiameter).concat(suffix);
  23416. var labels = data.labels;
  23417. if (labels && Array.isArray(labels)) {
  23418. return [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(labels), [lengthText, widthText]);
  23419. }
  23420. return [lengthText, widthText];
  23421. };
  23422. /***/ }),
  23423. /***/ "./tools/annotation/bidirectionalTool/utils/calculateLongestAndShortestDiameters.js":
  23424. /*!******************************************************************************************!*\
  23425. !*** ./tools/annotation/bidirectionalTool/utils/calculateLongestAndShortestDiameters.js ***!
  23426. \******************************************************************************************/
  23427. /*! exports provided: default */
  23428. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  23429. "use strict";
  23430. __webpack_require__.r(__webpack_exports__);
  23431. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return calculateLongestAndShortestDiameters; });
  23432. /**
  23433. * Calculates longest and shortest diameters using measurement handles and pixelSpacing
  23434. * @param {Object} measurementData
  23435. * @param {Object} pixelSpacing pixelSpacing
  23436. *
  23437. *@returns {Object} longestDiameter and shortestDiameter
  23438. */
  23439. function calculateLongestAndShortestDiameters(measurementData, pixelSpacing) {
  23440. var rowPixelSpacing = pixelSpacing.rowPixelSpacing,
  23441. colPixelSpacing = pixelSpacing.colPixelSpacing;
  23442. var _measurementData$hand = measurementData.handles,
  23443. start = _measurementData$hand.start,
  23444. end = _measurementData$hand.end,
  23445. perpendicularStart = _measurementData$hand.perpendicularStart,
  23446. perpendicularEnd = _measurementData$hand.perpendicularEnd; // Calculate the long axis length
  23447. var dx = (start.x - end.x) * (colPixelSpacing || 1);
  23448. var dy = (start.y - end.y) * (rowPixelSpacing || 1);
  23449. var length = Math.sqrt(dx * dx + dy * dy); // Calculate the short axis length
  23450. var wx = (perpendicularStart.x - perpendicularEnd.x) * (colPixelSpacing || 1);
  23451. var wy = (perpendicularStart.y - perpendicularEnd.y) * (rowPixelSpacing || 1);
  23452. var width = Math.sqrt(wx * wx + wy * wy);
  23453. if (!width) {
  23454. width = 0;
  23455. } // Length is always longer than width
  23456. if (width > length) {
  23457. var tempW = width;
  23458. var tempL = length;
  23459. length = tempW;
  23460. width = tempL;
  23461. }
  23462. return {
  23463. longestDiameter: length.toFixed(1),
  23464. shortestDiameter: width.toFixed(1)
  23465. };
  23466. }
  23467. /***/ }),
  23468. /***/ "./tools/annotation/bidirectionalTool/utils/getDistanceWithPixelSpacing.js":
  23469. /*!*********************************************************************************!*\
  23470. !*** ./tools/annotation/bidirectionalTool/utils/getDistanceWithPixelSpacing.js ***!
  23471. \*********************************************************************************/
  23472. /*! exports provided: default */
  23473. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  23474. "use strict";
  23475. __webpack_require__.r(__webpack_exports__);
  23476. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getDistanceWithPixelSpacing; });
  23477. /**
  23478. * Return the distance between 2 points considering the pixel spacing
  23479. *
  23480. * @param {number} columnPixelSpacing Width that a pixel represents in mm
  23481. * @param {number} rowPixelSpacing Height that a pixel represents in mm
  23482. * @param {*} startPoint Start point of the line
  23483. * @param {*} endPoint End point of the line
  23484. *
  23485. * @returns {number} Distance between the 2 given points considering the pixel spacing
  23486. */
  23487. function getDistanceWithPixelSpacing(columnPixelSpacing, rowPixelSpacing, startPoint, endPoint) {
  23488. var calcX = (startPoint.x - endPoint.x) / rowPixelSpacing;
  23489. var calcY = (startPoint.y - endPoint.y) / columnPixelSpacing;
  23490. return Math.sqrt(calcX * calcX + calcY * calcY);
  23491. }
  23492. /***/ }),
  23493. /***/ "./tools/annotation/bidirectionalTool/utils/getLineVector.js":
  23494. /*!*******************************************************************!*\
  23495. !*** ./tools/annotation/bidirectionalTool/utils/getLineVector.js ***!
  23496. \*******************************************************************/
  23497. /*! exports provided: default */
  23498. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  23499. "use strict";
  23500. __webpack_require__.r(__webpack_exports__);
  23501. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getLineVector; });
  23502. /**
  23503. * Return the Vector of a line which determines its inclination and length
  23504. *
  23505. * @param {number} columnPixelSpacing Width that a pixel represents in mm
  23506. * @param {number} rowPixelSpacing Height that a pixel represents in mm
  23507. * @param {*} startPoint Start point of the line
  23508. * @param {*} endPoint End point of the line
  23509. *
  23510. * @returns {*} Resulting line inclination vector
  23511. */
  23512. function getLineVector(columnPixelSpacing, rowPixelSpacing, startPoint, endPoint) {
  23513. var dx = (startPoint.x - endPoint.x) * columnPixelSpacing;
  23514. var dy = (startPoint.y - endPoint.y) * rowPixelSpacing;
  23515. var length = Math.sqrt(dx * dx + dy * dy);
  23516. var vectorX = dx / length;
  23517. var vectorY = dy / length;
  23518. return {
  23519. x: vectorX,
  23520. y: vectorY,
  23521. length: length
  23522. };
  23523. }
  23524. /***/ }),
  23525. /***/ "./tools/annotation/bidirectionalTool/utils/updatePerpendicularLineHandles.js":
  23526. /*!************************************************************************************!*\
  23527. !*** ./tools/annotation/bidirectionalTool/utils/updatePerpendicularLineHandles.js ***!
  23528. \************************************************************************************/
  23529. /*! exports provided: default */
  23530. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  23531. "use strict";
  23532. __webpack_require__.r(__webpack_exports__);
  23533. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return updatePerpendicularLineHandles; });
  23534. /* harmony import */ var _getLineVector__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getLineVector */ "./tools/annotation/bidirectionalTool/utils/getLineVector.js");
  23535. /**
  23536. * Update the perpendicular line handles when the measurement is being created.
  23537. * This method will make the perpendicular line intersect in the middle of the
  23538. * long line and assume half the size of the long line.
  23539. *
  23540. * @param {*} eventData Data object associated with the event
  23541. * @param {*} measurementData Data from current bidirectional tool measurement
  23542. *
  23543. * @returns {boolean} False in case the handle is not locked or true when moved
  23544. */
  23545. function updatePerpendicularLineHandles(eventData, measurementData) {
  23546. if (!measurementData.handles.perpendicularStart.locked) {
  23547. return false;
  23548. }
  23549. var startX, startY, endX, endY;
  23550. var _measurementData$hand = measurementData.handles,
  23551. start = _measurementData$hand.start,
  23552. end = _measurementData$hand.end;
  23553. var _eventData$image = eventData.image,
  23554. _eventData$image$colu = _eventData$image.columnPixelSpacing,
  23555. columnPixelSpacing = _eventData$image$colu === void 0 ? 1 : _eventData$image$colu,
  23556. _eventData$image$rowP = _eventData$image.rowPixelSpacing,
  23557. rowPixelSpacing = _eventData$image$rowP === void 0 ? 1 : _eventData$image$rowP;
  23558. if (start.x === end.x && start.y === end.y) {
  23559. startX = start.x;
  23560. startY = start.y;
  23561. endX = end.x;
  23562. endY = end.y;
  23563. } else {
  23564. // Mid point of long-axis line
  23565. var mid = {
  23566. x: (start.x + end.x) / 2,
  23567. y: (start.y + end.y) / 2
  23568. }; // Inclination of the perpendicular line
  23569. var vector = Object(_getLineVector__WEBPACK_IMPORTED_MODULE_0__["default"])(columnPixelSpacing, rowPixelSpacing, start, end);
  23570. var perpendicularLineLength = vector.length / 2;
  23571. var rowMultiplier = perpendicularLineLength / (2 * rowPixelSpacing);
  23572. var columnMultiplier = perpendicularLineLength / (2 * columnPixelSpacing);
  23573. startX = mid.x + columnMultiplier * vector.y;
  23574. startY = mid.y - rowMultiplier * vector.x;
  23575. endX = mid.x - columnMultiplier * vector.y;
  23576. endY = mid.y + rowMultiplier * vector.x;
  23577. }
  23578. measurementData.handles.perpendicularStart.x = startX;
  23579. measurementData.handles.perpendicularStart.y = startY;
  23580. measurementData.handles.perpendicularEnd.x = endX;
  23581. measurementData.handles.perpendicularEnd.y = endY;
  23582. return true;
  23583. }
  23584. /***/ }),
  23585. /***/ "./tools/annotation/index.js":
  23586. /*!***********************************!*\
  23587. !*** ./tools/annotation/index.js ***!
  23588. \***********************************/
  23589. /*! exports provided: AngleTool, ArrowAnnotateTool, BidirectionalTool, CircleRoiTool, CobbAngleTool, EllipticalRoiTool, FreehandRoiTool, LengthTool, ProbeTool, RectangleRoiTool, TextMarkerTool, default */
  23590. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  23591. "use strict";
  23592. __webpack_require__.r(__webpack_exports__);
  23593. /* harmony import */ var _AngleTool_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AngleTool.js */ "./tools/annotation/AngleTool.js");
  23594. /* harmony import */ var _ArrowAnnotateTool_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ArrowAnnotateTool.js */ "./tools/annotation/ArrowAnnotateTool.js");
  23595. /* harmony import */ var _BidirectionalTool_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./BidirectionalTool.js */ "./tools/annotation/BidirectionalTool.js");
  23596. /* harmony import */ var _CircleRoiTool_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./CircleRoiTool.js */ "./tools/annotation/CircleRoiTool.js");
  23597. /* harmony import */ var _CobbAngleTool_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./CobbAngleTool.js */ "./tools/annotation/CobbAngleTool.js");
  23598. /* harmony import */ var _EllipticalRoiTool_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./EllipticalRoiTool.js */ "./tools/annotation/EllipticalRoiTool.js");
  23599. /* harmony import */ var _FreehandRoiTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./FreehandRoiTool.js */ "./tools/annotation/FreehandRoiTool.js");
  23600. /* harmony import */ var _LengthTool_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./LengthTool.js */ "./tools/annotation/LengthTool.js");
  23601. /* harmony import */ var _ProbeTool_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./ProbeTool.js */ "./tools/annotation/ProbeTool.js");
  23602. /* harmony import */ var _RectangleRoiTool_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./RectangleRoiTool.js */ "./tools/annotation/RectangleRoiTool.js");
  23603. /* harmony import */ var _TextMarkerTool_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./TextMarkerTool.js */ "./tools/annotation/TextMarkerTool.js");
  23604. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "AngleTool", function() { return _AngleTool_js__WEBPACK_IMPORTED_MODULE_0__["default"]; });
  23605. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ArrowAnnotateTool", function() { return _ArrowAnnotateTool_js__WEBPACK_IMPORTED_MODULE_1__["default"]; });
  23606. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BidirectionalTool", function() { return _BidirectionalTool_js__WEBPACK_IMPORTED_MODULE_2__["default"]; });
  23607. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "CircleRoiTool", function() { return _CircleRoiTool_js__WEBPACK_IMPORTED_MODULE_3__["default"]; });
  23608. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "CobbAngleTool", function() { return _CobbAngleTool_js__WEBPACK_IMPORTED_MODULE_4__["default"]; });
  23609. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "EllipticalRoiTool", function() { return _EllipticalRoiTool_js__WEBPACK_IMPORTED_MODULE_5__["default"]; });
  23610. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FreehandRoiTool", function() { return _FreehandRoiTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]; });
  23611. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "LengthTool", function() { return _LengthTool_js__WEBPACK_IMPORTED_MODULE_7__["default"]; });
  23612. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ProbeTool", function() { return _ProbeTool_js__WEBPACK_IMPORTED_MODULE_8__["default"]; });
  23613. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "RectangleRoiTool", function() { return _RectangleRoiTool_js__WEBPACK_IMPORTED_MODULE_9__["default"]; });
  23614. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TextMarkerTool", function() { return _TextMarkerTool_js__WEBPACK_IMPORTED_MODULE_10__["default"]; });
  23615. // Named Exports
  23616. // Namespace, default export
  23617. /* harmony default export */ __webpack_exports__["default"] = ({
  23618. AngleTool: _AngleTool_js__WEBPACK_IMPORTED_MODULE_0__["default"],
  23619. ArrowAnnotateTool: _ArrowAnnotateTool_js__WEBPACK_IMPORTED_MODULE_1__["default"],
  23620. BidirectionalTool: _BidirectionalTool_js__WEBPACK_IMPORTED_MODULE_2__["default"],
  23621. CircleRoiTool: _CircleRoiTool_js__WEBPACK_IMPORTED_MODULE_3__["default"],
  23622. CobbAngleTool: _CobbAngleTool_js__WEBPACK_IMPORTED_MODULE_4__["default"],
  23623. EllipticalRoiTool: _EllipticalRoiTool_js__WEBPACK_IMPORTED_MODULE_5__["default"],
  23624. FreehandRoiTool: _FreehandRoiTool_js__WEBPACK_IMPORTED_MODULE_6__["default"],
  23625. LengthTool: _LengthTool_js__WEBPACK_IMPORTED_MODULE_7__["default"],
  23626. ProbeTool: _ProbeTool_js__WEBPACK_IMPORTED_MODULE_8__["default"],
  23627. RectangleRoiTool: _RectangleRoiTool_js__WEBPACK_IMPORTED_MODULE_9__["default"],
  23628. TextMarkerTool: _TextMarkerTool_js__WEBPACK_IMPORTED_MODULE_10__["default"]
  23629. });
  23630. /***/ }),
  23631. /***/ "./tools/base/BaseAnnotationTool.js":
  23632. /*!******************************************!*\
  23633. !*** ./tools/base/BaseAnnotationTool.js ***!
  23634. \******************************************/
  23635. /*! exports provided: default */
  23636. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  23637. "use strict";
  23638. __webpack_require__.r(__webpack_exports__);
  23639. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
  23640. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
  23641. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
  23642. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
  23643. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
  23644. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
  23645. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
  23646. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
  23647. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
  23648. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__);
  23649. /* harmony import */ var _BaseTool_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./BaseTool.js */ "./tools/base/BaseTool.js");
  23650. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  23651. /* harmony import */ var _manipulators_handleActivator_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../../manipulators/handleActivator.js */ "./manipulators/handleActivator.js");
  23652. /* harmony import */ var _util_findAndMoveHelpers_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./../../util/findAndMoveHelpers.js */ "./util/findAndMoveHelpers.js");
  23653. /* harmony import */ var _util_logger__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../util/logger */ "./util/logger.js");
  23654. var logger = Object(_util_logger__WEBPACK_IMPORTED_MODULE_9__["getLogger"])('baseAnnotationTool');
  23655. /**
  23656. * @memberof Tools.Base
  23657. * @classdesc Abstract class for tools which create and display annotations on the
  23658. * cornerstone canvas.
  23659. * @extends Tools.Base.BaseTool
  23660. */
  23661. var BaseAnnotationTool =
  23662. /*#__PURE__*/
  23663. function (_BaseTool) {
  23664. _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(BaseAnnotationTool, _BaseTool);
  23665. function BaseAnnotationTool() {
  23666. _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, BaseAnnotationTool);
  23667. return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(BaseAnnotationTool).apply(this, arguments));
  23668. }
  23669. _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(BaseAnnotationTool, [{
  23670. key: "createNewMeasurement",
  23671. // ===================================================================
  23672. // Abstract Methods - Must be implemented.
  23673. // ===================================================================
  23674. /**
  23675. * Creates a new annotation.
  23676. *
  23677. * @method createNewMeasurement
  23678. * @memberof Tools.Base.BaseAnnotationTool
  23679. *
  23680. * @param {type} evt description
  23681. * @returns {type} description
  23682. */
  23683. // eslint-disable-next-line no-unused-vars
  23684. value: function createNewMeasurement(evt) {
  23685. throw new Error("Method createNewMeasurement not implemented for ".concat(this.name, "."));
  23686. }
  23687. /**
  23688. *
  23689. * Returns true if the given coords are need the tool.
  23690. *
  23691. * @method pointNearTool
  23692. * @memberof Tools.Base.BaseAnnotationTool
  23693. *
  23694. * @param {*} element
  23695. * @param {*} data
  23696. * @param {*} coords
  23697. * @param {string} [interactionType=mouse]
  23698. * @returns {boolean} If the point is near the tool
  23699. */
  23700. // eslint-disable-next-line no-unused-vars
  23701. }, {
  23702. key: "pointNearTool",
  23703. value: function pointNearTool(element, data, coords) {
  23704. var interactionType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'mouse';
  23705. throw new Error("Method pointNearTool not implemented for ".concat(this.name, "."));
  23706. }
  23707. /**
  23708. * Returns the distance in px from the given coords to the closest handle of the annotation.
  23709. *
  23710. * @method distanceFromPoint
  23711. * @memberof Tools.Base.BaseAnnotationTool
  23712. *
  23713. * @param {*} element
  23714. * @param {*} data
  23715. * @param {*} coords
  23716. * @returns {number} - the distance in px from the provided coordinates to the
  23717. * closest rendered portion of the annotation. -1 if the distance cannot be
  23718. * calculated.
  23719. */
  23720. // eslint-disable-next-line no-unused-vars
  23721. }, {
  23722. key: "distanceFromPoint",
  23723. value: function distanceFromPoint(element, data, coords) {
  23724. throw new Error("Method distanceFromPoint not implemented for ".concat(this.name, "."));
  23725. }
  23726. /**
  23727. * Used to redraw the tool's annotation data per render
  23728. *
  23729. * @abstract
  23730. * @param {*} evt
  23731. * @returns {void}
  23732. */
  23733. // eslint-disable-next-line no-unused-vars
  23734. }, {
  23735. key: "renderToolData",
  23736. value: function renderToolData(evt) {
  23737. throw new Error("renderToolData not implemented for ".concat(this.name, "."));
  23738. } // ===================================================================
  23739. // Virtual Methods - Have default behavior but may be overriden.
  23740. // ===================================================================
  23741. /**
  23742. * Event handler for MOUSE_MOVE event.
  23743. *
  23744. * @abstract
  23745. * @event
  23746. * @param {Object} evt - The event.
  23747. * @returns {boolean} - True if the image needs to be updated
  23748. */
  23749. }, {
  23750. key: "mouseMoveCallback",
  23751. value: function mouseMoveCallback(evt) {
  23752. var _evt$detail = evt.detail,
  23753. element = _evt$detail.element,
  23754. currentPoints = _evt$detail.currentPoints;
  23755. var coords = currentPoints.canvas;
  23756. var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_6__["getToolState"])(element, this.name);
  23757. var imageNeedsUpdate = false;
  23758. for (var d = 0; d < toolState.data.length; d++) {
  23759. var data = toolState.data[d]; // Hovering a handle?
  23760. if (Object(_manipulators_handleActivator_js__WEBPACK_IMPORTED_MODULE_7__["default"])(element, data.handles, coords) === true) {
  23761. imageNeedsUpdate = true;
  23762. } // Tool data's 'active' does not match coordinates
  23763. // TODO: can't we just do an if/else and save on a pointNearTool check?
  23764. var nearToolAndNotMarkedActive = this.pointNearTool(element, data, coords, 'mouse') && !data.active;
  23765. var notNearToolAndMarkedActive = !this.pointNearTool(element, data, coords, 'mouse') && data.active;
  23766. if (nearToolAndNotMarkedActive || notNearToolAndMarkedActive) {
  23767. data.active = !data.active;
  23768. imageNeedsUpdate = true;
  23769. }
  23770. }
  23771. return imageNeedsUpdate;
  23772. }
  23773. /**
  23774. * Custom callback for when a handle is selected.
  23775. * @method handleSelectedCallback
  23776. * @memberof Tools.Base.BaseAnnotationTool
  23777. *
  23778. * @param {*} evt -
  23779. * @param {*} toolData -
  23780. * @param {*} handle - The selected handle.
  23781. * @param {String} interactionType -
  23782. * @returns {void}
  23783. */
  23784. }, {
  23785. key: "handleSelectedCallback",
  23786. value: function handleSelectedCallback(evt, toolData, handle) {
  23787. var interactionType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'mouse';
  23788. Object(_util_findAndMoveHelpers_js__WEBPACK_IMPORTED_MODULE_8__["moveHandleNearImagePoint"])(evt, this, toolData, handle, interactionType);
  23789. }
  23790. /**
  23791. * Custom callback for when a tool is selected.
  23792. *
  23793. * @method toolSelectedCallback
  23794. * @memberof Tools.Base.BaseAnnotationTool
  23795. *
  23796. * @param {*} evt
  23797. * @param {*} annotation
  23798. * @param {string} [interactionType=mouse]
  23799. * @returns {void}
  23800. */
  23801. }, {
  23802. key: "toolSelectedCallback",
  23803. value: function toolSelectedCallback(evt, annotation) {
  23804. var interactionType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'mouse';
  23805. Object(_util_findAndMoveHelpers_js__WEBPACK_IMPORTED_MODULE_8__["moveAnnotation"])(evt, this, annotation, interactionType);
  23806. }
  23807. /**
  23808. * Updates cached statistics for the tool's annotation data on the element
  23809. *
  23810. * @param {*} image
  23811. * @param {*} element
  23812. * @param {*} data
  23813. * @returns {void}
  23814. */
  23815. }, {
  23816. key: "updateCachedStats",
  23817. value: function updateCachedStats(image, element, data) {
  23818. // eslint-disable-line
  23819. logger.warn("updateCachedStats not implemented for ".concat(this.name, "."));
  23820. }
  23821. }]);
  23822. return BaseAnnotationTool;
  23823. }(_BaseTool_js__WEBPACK_IMPORTED_MODULE_5__["default"]);
  23824. /* harmony default export */ __webpack_exports__["default"] = (BaseAnnotationTool);
  23825. /***/ }),
  23826. /***/ "./tools/base/BaseBrushTool.js":
  23827. /*!*************************************!*\
  23828. !*** ./tools/base/BaseBrushTool.js ***!
  23829. \*************************************/
  23830. /*! exports provided: default */
  23831. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  23832. "use strict";
  23833. __webpack_require__.r(__webpack_exports__);
  23834. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
  23835. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
  23836. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
  23837. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
  23838. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
  23839. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
  23840. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
  23841. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
  23842. /* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js");
  23843. /* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__);
  23844. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
  23845. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__);
  23846. /* harmony import */ var _BaseTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./BaseTool.js */ "./tools/base/BaseTool.js");
  23847. /* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../../events.js */ "./events.js");
  23848. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./../../externalModules.js */ "./externalModules.js");
  23849. /* harmony import */ var _store_isToolActiveForElement_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./../../store/isToolActiveForElement.js */ "./store/isToolActiveForElement.js");
  23850. /* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./../../store/index.js */ "./store/index.js");
  23851. /* harmony import */ var _util_segmentation__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../util/segmentation */ "./util/segmentation/index.js");
  23852. var segmentationModule = Object(_store_index_js__WEBPACK_IMPORTED_MODULE_10__["getModule"])('segmentation');
  23853. /**
  23854. * @abstract
  23855. * @memberof Tools.Base
  23856. * @classdesc Abstract class for tools which manipulate the mask data to be displayed on
  23857. * the cornerstone canvas.
  23858. * @extends Tools.Base.BaseTool
  23859. */
  23860. var BaseBrushTool =
  23861. /*#__PURE__*/
  23862. function (_BaseTool) {
  23863. _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(BaseBrushTool, _BaseTool);
  23864. function BaseBrushTool(props) {
  23865. var _this;
  23866. var defaultProps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  23867. _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, BaseBrushTool);
  23868. if (!defaultProps.configuration) {
  23869. defaultProps.configuration = {
  23870. alwaysEraseOnClick: false
  23871. };
  23872. }
  23873. _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(BaseBrushTool).call(this, props, defaultProps));
  23874. _this.updateOnMouseMove = true;
  23875. _this.hideDefaultCursor = true;
  23876. _this._drawing = false;
  23877. _this._drawingMouseUpCallback = _this._drawingMouseUpCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  23878. return _this;
  23879. } // ===================================================================
  23880. // Abstract Methods - Must be implemented.
  23881. // ===================================================================
  23882. /**
  23883. * Helper function for rendering the brush.
  23884. *
  23885. * @abstract
  23886. * @param {Object} evt - The event.
  23887. * @returns {void}
  23888. */
  23889. // eslint-disable-next-line no-unused-vars
  23890. _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(BaseBrushTool, [{
  23891. key: "renderBrush",
  23892. value: function renderBrush(evt) {
  23893. throw new Error("Method renderBrush not implemented for ".concat(this.name, "."));
  23894. }
  23895. /**
  23896. * Paints the data to the labelmap.
  23897. *
  23898. * @protected
  23899. * @abstract
  23900. * @param {Object} evt The event.
  23901. * @returns {void}
  23902. */
  23903. // eslint-disable-next-line no-unused-vars
  23904. }, {
  23905. key: "_paint",
  23906. value: function _paint(evt) {
  23907. throw new Error("Method _paint not implemented for ".concat(this.name, "."));
  23908. } // ===================================================================
  23909. // Virtual Methods - Have default behavior but may be overriden.
  23910. // ===================================================================
  23911. /**
  23912. * Event handler for MOUSE_DRAG event.
  23913. *
  23914. * @override
  23915. * @abstract
  23916. * @event
  23917. * @param {Object} evt - The event.
  23918. */
  23919. }, {
  23920. key: "mouseDragCallback",
  23921. value: function mouseDragCallback(evt) {
  23922. var currentPoints = evt.detail.currentPoints;
  23923. this._lastImageCoords = currentPoints.image; // Safety measure incase _startPainting is overridden and doesn't always
  23924. // start a paint.
  23925. if (this._drawing) {
  23926. this._paint(evt);
  23927. }
  23928. }
  23929. /**
  23930. * Event handler for MOUSE_DOWN event.
  23931. *
  23932. * @override
  23933. * @abstract
  23934. * @event
  23935. * @param {Object} evt - The event.
  23936. */
  23937. }, {
  23938. key: "preMouseDownCallback",
  23939. value: function preMouseDownCallback(evt) {
  23940. var eventData = evt.detail;
  23941. var element = eventData.element,
  23942. currentPoints = eventData.currentPoints;
  23943. this._startPainting(evt);
  23944. this._lastImageCoords = currentPoints.image;
  23945. this._drawing = true;
  23946. this._startListeningForMouseUp(element);
  23947. this._paint(evt);
  23948. return true;
  23949. }
  23950. /**
  23951. * Initialise painting with BaseBrushTool.
  23952. *
  23953. * @abstract
  23954. * @event
  23955. * @param {Object} evt - The event.
  23956. * @returns {void}
  23957. */
  23958. }, {
  23959. key: "_startPainting",
  23960. value: function _startPainting(evt) {
  23961. var eventData = evt.detail;
  23962. var element = eventData.element;
  23963. var configuration = segmentationModule.configuration,
  23964. getters = segmentationModule.getters;
  23965. var _getters$labelmap2D = getters.labelmap2D(element),
  23966. labelmap2D = _getters$labelmap2D.labelmap2D,
  23967. labelmap3D = _getters$labelmap2D.labelmap3D,
  23968. currentImageIdIndex = _getters$labelmap2D.currentImageIdIndex,
  23969. activeLabelmapIndex = _getters$labelmap2D.activeLabelmapIndex;
  23970. var shouldErase = this._isCtrlDown(eventData) || this.configuration.alwaysEraseOnClick;
  23971. this.paintEventData = {
  23972. labelmap2D: labelmap2D,
  23973. labelmap3D: labelmap3D,
  23974. currentImageIdIndex: currentImageIdIndex,
  23975. activeLabelmapIndex: activeLabelmapIndex,
  23976. shouldErase: shouldErase
  23977. };
  23978. if (configuration.storeHistory) {
  23979. var previousPixelData = labelmap2D.pixelData.slice();
  23980. this.paintEventData.previousPixelData = previousPixelData;
  23981. }
  23982. }
  23983. /**
  23984. * End painting with BaseBrushTool.
  23985. *
  23986. * @abstract
  23987. * @event
  23988. * @param {Object} evt - The event.
  23989. * @returns {void}
  23990. */
  23991. }, {
  23992. key: "_endPainting",
  23993. value: function _endPainting(evt) {
  23994. var configuration = segmentationModule.configuration,
  23995. setters = segmentationModule.setters;
  23996. var _this$paintEventData = this.paintEventData,
  23997. labelmap2D = _this$paintEventData.labelmap2D,
  23998. currentImageIdIndex = _this$paintEventData.currentImageIdIndex; // Grab the labels on the slice.
  23999. var segmentSet = new Set(labelmap2D.pixelData);
  24000. var iterator = segmentSet.values();
  24001. var segmentsOnLabelmap = [];
  24002. var done = false;
  24003. while (!done) {
  24004. var next = iterator.next();
  24005. done = next.done;
  24006. if (!done) {
  24007. segmentsOnLabelmap.push(next.value);
  24008. }
  24009. }
  24010. labelmap2D.segmentsOnLabelmap = segmentsOnLabelmap;
  24011. if (configuration.storeHistory) {
  24012. var previousPixelData = this.paintEventData.previousPixelData;
  24013. var newPixelData = labelmap2D.pixelData;
  24014. var operation = {
  24015. imageIdIndex: currentImageIdIndex,
  24016. diff: Object(_util_segmentation__WEBPACK_IMPORTED_MODULE_11__["getDiffBetweenPixelData"])(previousPixelData, newPixelData)
  24017. };
  24018. setters.pushState(this.element, [operation]);
  24019. }
  24020. Object(_util_segmentation__WEBPACK_IMPORTED_MODULE_11__["triggerLabelmapModifiedEvent"])(this.element);
  24021. } // ===================================================================
  24022. // Implementation interface
  24023. // ===================================================================
  24024. /**
  24025. * Event handler for MOUSE_MOVE event.
  24026. *
  24027. * @override
  24028. * @abstract
  24029. * @event
  24030. * @param {Object} evt - The event.
  24031. */
  24032. }, {
  24033. key: "mouseMoveCallback",
  24034. value: function mouseMoveCallback(evt) {
  24035. var currentPoints = evt.detail.currentPoints;
  24036. this._lastImageCoords = currentPoints.image;
  24037. }
  24038. /**
  24039. * Used to redraw the tool's cursor per render.
  24040. *
  24041. * @override
  24042. * @param {Object} evt - The event.
  24043. */
  24044. }, {
  24045. key: "renderToolData",
  24046. value: function renderToolData(evt) {
  24047. var eventData = evt.detail;
  24048. var element = eventData.element; // Only brush needs to render.
  24049. if (Object(_store_isToolActiveForElement_js__WEBPACK_IMPORTED_MODULE_9__["default"])(element, this.name)) {
  24050. // Call the hover event for the brush
  24051. this.renderBrush(evt);
  24052. }
  24053. }
  24054. /**
  24055. * Event handler for switching mode to passive.
  24056. *
  24057. * @override
  24058. * @event
  24059. * @param {Object} evt - The event.
  24060. */
  24061. // eslint-disable-next-line no-unused-vars
  24062. }, {
  24063. key: "passiveCallback",
  24064. value: function passiveCallback(evt) {
  24065. try {
  24066. _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(this.element);
  24067. } catch (error) {
  24068. // It is possible that the image has not been loaded
  24069. // when this is called.
  24070. return;
  24071. }
  24072. }
  24073. /**
  24074. * Event handler for MOUSE_UP during the drawing event loop.
  24075. *
  24076. * @protected
  24077. * @event
  24078. * @param {Object} evt - The event.
  24079. * @returns {void}
  24080. */
  24081. }, {
  24082. key: "_drawingMouseUpCallback",
  24083. value: function _drawingMouseUpCallback(evt) {
  24084. var eventData = evt.detail;
  24085. var element = eventData.element;
  24086. this._endPainting(evt);
  24087. this._drawing = false;
  24088. this._mouseUpRender = true;
  24089. this._stopListeningForMouseUp(element);
  24090. }
  24091. }, {
  24092. key: "newImageCallback",
  24093. value: function newImageCallback(evt) {
  24094. if (this._drawing) {
  24095. // End painting on one slice and start on another.
  24096. this._endPainting(evt);
  24097. this._startPainting(evt);
  24098. }
  24099. }
  24100. /**
  24101. * Adds modify loop event listeners.
  24102. *
  24103. * @protected
  24104. * @param {Object} element - The viewport element to add event listeners to.
  24105. * @modifies {element}
  24106. * @returns {void}
  24107. */
  24108. }, {
  24109. key: "_startListeningForMouseUp",
  24110. value: function _startListeningForMouseUp(element) {
  24111. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_UP, this._drawingMouseUpCallback);
  24112. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_CLICK, this._drawingMouseUpCallback);
  24113. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_UP, this._drawingMouseUpCallback);
  24114. element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_CLICK, this._drawingMouseUpCallback);
  24115. _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(element);
  24116. }
  24117. /**
  24118. * Adds modify loop event listeners.
  24119. *
  24120. * @protected
  24121. * @param {Object} element - The viewport element to add event listeners to.
  24122. * @modifies {element}
  24123. * @returns {void}
  24124. */
  24125. }, {
  24126. key: "_stopListeningForMouseUp",
  24127. value: function _stopListeningForMouseUp(element) {
  24128. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_UP, this._drawingMouseUpCallback);
  24129. element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_CLICK, this._drawingMouseUpCallback);
  24130. _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(element);
  24131. } // ===================================================================
  24132. // Brush API. This is effectively a wrapper around the store.
  24133. // ===================================================================
  24134. /**
  24135. * Increases the brush size
  24136. *
  24137. * @public
  24138. * @api
  24139. * @returns {void}
  24140. */
  24141. }, {
  24142. key: "increaseBrushSize",
  24143. value: function increaseBrushSize() {
  24144. var configuration = segmentationModule.configuration,
  24145. setters = segmentationModule.setters;
  24146. var oldRadius = configuration.radius;
  24147. var newRadius = Math.floor(oldRadius * 1.2); // If e.g. only 2 pixels big. Math.floor(2*1.2) = 2.
  24148. // Hence, have minimum increment of 1 pixel.
  24149. if (newRadius === oldRadius) {
  24150. newRadius += 1;
  24151. }
  24152. setters.radius(newRadius);
  24153. }
  24154. /**
  24155. * Decreases the brush size
  24156. *
  24157. * @public
  24158. * @api
  24159. * @returns {void}
  24160. */
  24161. }, {
  24162. key: "decreaseBrushSize",
  24163. value: function decreaseBrushSize() {
  24164. var configuration = segmentationModule.configuration,
  24165. setters = segmentationModule.setters;
  24166. var oldRadius = configuration.radius;
  24167. var newRadius = Math.floor(oldRadius * 0.8);
  24168. setters.radius(newRadius);
  24169. }
  24170. }, {
  24171. key: "_isCtrlDown",
  24172. value: function _isCtrlDown(eventData) {
  24173. return eventData.event && eventData.event.ctrlKey || eventData.ctrlKey;
  24174. }
  24175. }]);
  24176. return BaseBrushTool;
  24177. }(_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]);
  24178. /* harmony default export */ __webpack_exports__["default"] = (BaseBrushTool);
  24179. /***/ }),
  24180. /***/ "./tools/base/BaseTool.js":
  24181. /*!********************************!*\
  24182. !*** ./tools/base/BaseTool.js ***!
  24183. \********************************/
  24184. /*! exports provided: default */
  24185. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  24186. "use strict";
  24187. __webpack_require__.r(__webpack_exports__);
  24188. /* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "../node_modules/@babel/runtime/helpers/typeof.js");
  24189. /* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__);
  24190. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
  24191. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__);
  24192. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
  24193. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__);
  24194. /* harmony import */ var _mixins_index_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./../../mixins/index.js */ "./mixins/index.js");
  24195. /* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../util/logger.js */ "./util/logger.js");
  24196. /* harmony import */ var _util_deepmerge_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../../util/deepmerge.js */ "./util/deepmerge.js");
  24197. /* harmony import */ var _store_setToolCursor_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../store/setToolCursor.js */ "./store/setToolCursor.js");
  24198. /* harmony import */ var _store__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../store */ "./store/index.js");
  24199. var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_4__["getLogger"])('tools:base:BaseTool');
  24200. var globalConfigurationModule = Object(_store__WEBPACK_IMPORTED_MODULE_7__["getModule"])('globalConfiguration');
  24201. /**
  24202. * @typedef ToolConfiguration
  24203. * @param {String} name
  24204. * @param {object} strategies - Named strategy functions
  24205. * @param {String} defaultStrategy - The name of the strategy to use by default
  24206. * @param {Object} configuration
  24207. * @param {String[]} mixins - A list of mixin names to apply to the tool
  24208. */
  24209. /**
  24210. * @memberof Tools.Base
  24211. * @classdesc BaseTool Class description
  24212. * @property {String[]} supportedInteractionTypes - A string list of ways the tool can interact with the user
  24213. */
  24214. var BaseTool =
  24215. /*#__PURE__*/
  24216. function () {
  24217. /**
  24218. * Constructor description
  24219. * @param {props} [props={}] Tool properties set on instantiation of a tool
  24220. * @param {defaultProps} [defaultProps={}] Tools Default properties
  24221. */
  24222. function BaseTool(props, defaultProps) {
  24223. _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1___default()(this, BaseTool);
  24224. /**
  24225. * Merge default props with custom props
  24226. */
  24227. this.initialConfiguration = Object(_util_deepmerge_js__WEBPACK_IMPORTED_MODULE_5__["default"])(defaultProps, props);
  24228. var _this$initialConfigur = this.initialConfiguration,
  24229. name = _this$initialConfigur.name,
  24230. strategies = _this$initialConfigur.strategies,
  24231. defaultStrategy = _this$initialConfigur.defaultStrategy,
  24232. configuration = _this$initialConfigur.configuration,
  24233. supportedInteractionTypes = _this$initialConfigur.supportedInteractionTypes,
  24234. mixins = _this$initialConfigur.mixins,
  24235. svgCursor = _this$initialConfigur.svgCursor;
  24236. /**
  24237. * A unique, identifying tool name
  24238. * @type {String}
  24239. */
  24240. this.name = name;
  24241. /** @type {String} */
  24242. this.mode = 'disabled';
  24243. this.element = undefined;
  24244. this.supportedInteractionTypes = supportedInteractionTypes || [];
  24245. this.strategies = strategies || {};
  24246. this.defaultStrategy = defaultStrategy || Object.keys(this.strategies)[0] || undefined;
  24247. this.activeStrategy = this.defaultStrategy;
  24248. if (svgCursor) {
  24249. this.svgCursor = svgCursor;
  24250. } // Options are set when a tool is added, during a "mode" change,
  24251. // or via a tool's option's setter
  24252. this._options = {}; // Configuration is set at tool initalization
  24253. this._configuration = Object.assign({}, configuration); // `updateOnMouseMove` causes the frame to render on every mouse move when
  24254. // the tool is active. This is useful for tools that render large/dynamic
  24255. // items to the canvas which can't easily be respresented with an SVG Cursor.
  24256. this.updateOnMouseMove = false;
  24257. this.hideDefaultCursor = false; // Apply mixins if mixinsArray is not empty.
  24258. if (mixins && mixins.length) {
  24259. this._applyMixins(mixins);
  24260. }
  24261. this._cursors = Object.assign({}, this.initialConfiguration.cursors);
  24262. var defaultCursor = this.defaultStrategy && this._cursors[this.activeStrategy];
  24263. if (defaultCursor) {
  24264. this.svgCursor = defaultCursor;
  24265. }
  24266. } //
  24267. // CONFIGURATION
  24268. //
  24269. /**
  24270. * Config...
  24271. * @public
  24272. * @type {Object}
  24273. * @instance
  24274. */
  24275. _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2___default()(BaseTool, [{
  24276. key: "mergeOptions",
  24277. /**
  24278. * Merges provided options with existing options.
  24279. *
  24280. * @public
  24281. * @instance
  24282. * @param {Object} options - options object to merge with existing options.
  24283. * @returns {undefined}
  24284. */
  24285. value: function mergeOptions(options) {
  24286. this._options = Object.assign({}, this._options, options);
  24287. }
  24288. /**
  24289. * Clears the tools options.
  24290. *
  24291. * @public
  24292. * @instance
  24293. * @memberof Tools.Base.BaseTool
  24294. * @returns {undefined}
  24295. */
  24296. }, {
  24297. key: "clearOptions",
  24298. value: function clearOptions() {
  24299. this._options = {};
  24300. }
  24301. /**
  24302. * Apply the currently set/active strategy.
  24303. *
  24304. * @public
  24305. * @instance
  24306. * @method applyActiveStrategy
  24307. * @memberof Tools.Base.BaseTool
  24308. *
  24309. * @param {Object} evt The event that triggered the strategies application
  24310. * @param {Object} operationData - An object containing extra data not present in the `evt`,
  24311. * required to apply the strategy.
  24312. * @returns {*} strategies vary widely; check each specific strategy to find expected return value
  24313. */
  24314. }, {
  24315. key: "applyActiveStrategy",
  24316. value: function applyActiveStrategy(evt, operationData) {
  24317. return this.strategies[this.activeStrategy].call(this, evt, operationData);
  24318. }
  24319. /**
  24320. * Iterates over registered mixins; any matching names in the provided `mixinsArray` will
  24321. * be merged with this instance.
  24322. *
  24323. * @private
  24324. * @method _applyMixins
  24325. * @param {string[]} mixinsArray An array of mixin identifiers (strings).
  24326. * @returns {undefined}
  24327. */
  24328. }, {
  24329. key: "_applyMixins",
  24330. value: function _applyMixins(mixinsArray) {
  24331. for (var i = 0; i < mixinsArray.length; i++) {
  24332. var mixin = _mixins_index_js__WEBPACK_IMPORTED_MODULE_3__["default"]["".concat(mixinsArray[i])];
  24333. if (_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default()(mixin) === 'object') {
  24334. Object.assign(this, mixin);
  24335. if (typeof this.initializeMixin === 'function') {
  24336. // Run the mixin's initialisation process.
  24337. this.initializeMixin();
  24338. }
  24339. } else {
  24340. logger.warn("".concat(this.name, ": mixin ").concat(_mixins_index_js__WEBPACK_IMPORTED_MODULE_3__["default"][i], " does not exist."));
  24341. }
  24342. } // Don't keep initialiseMixin from last mixin.
  24343. if (this.initializeMixin === 'function') {
  24344. delete this.initializeMixin;
  24345. }
  24346. }
  24347. /**
  24348. * Change the active strategy.
  24349. *
  24350. * @public
  24351. * @method setActiveStrategy
  24352. * @param {string} strategy
  24353. * @returns {null}
  24354. */
  24355. }, {
  24356. key: "setActiveStrategy",
  24357. value: function setActiveStrategy(strategy) {
  24358. this.activeStrategy = strategy;
  24359. if (globalConfigurationModule.configuration.showSVGCursors) {
  24360. this.changeCursor(this.element, strategy);
  24361. }
  24362. }
  24363. /**
  24364. * Function responsible for changing the Cursor, according to the strategy.
  24365. * @param {HTMLElement} element
  24366. * @param {string} strategy The strategy to be used on Tool
  24367. * @public
  24368. * @returns {void}
  24369. */
  24370. }, {
  24371. key: "changeCursor",
  24372. value: function changeCursor(element, strategy) {
  24373. // Necessary to avoid setToolCursor call without elements, which throws an error.
  24374. if (!element) {
  24375. return;
  24376. } // If there are cursors set per strategy, change the cursor.
  24377. var cursor = this._cursors[strategy];
  24378. if (cursor) {
  24379. this.svgCursor = cursor;
  24380. if (this.mode === 'active') {
  24381. Object(_store_setToolCursor_js__WEBPACK_IMPORTED_MODULE_6__["setToolCursor"])(element, cursor); // External.cornerstone.updateImage(element);
  24382. }
  24383. }
  24384. } // ===================================================================
  24385. // Virtual Methods - Have default behavior but may be overridden.
  24386. // ===================================================================
  24387. //
  24388. // MOUSE
  24389. //
  24390. /**
  24391. * Callback that takes priority if the tool is active, before `MOUSE_DOWN`
  24392. * events are processed. Does nothing by default.
  24393. *
  24394. * @callback BaseTool~preMouseDownCallback
  24395. * @param {CornerstoneTools.event:cornerstonetoolsmousedown} evt
  24396. * @returns {boolean} consumedEvent - True if function consumed the event.
  24397. */
  24398. /**
  24399. * Callback that takes priority if the tool is active, after `MOUSE_DOWN`
  24400. * events are processed. Does nothing by default.
  24401. *
  24402. * @callback BaseTool~postMouseDownCallback
  24403. * @param {CornerstoneTools.event:cornerstonetoolsmousedown} evt
  24404. * @returns {boolean} consumedEvent - True if function consumed the event.
  24405. */
  24406. /**
  24407. * Callback that is called if the tool is active, after `MOUSE_DOWN`
  24408. * events are processed. Does nothing by default.
  24409. *
  24410. * @virtual
  24411. * @param {type} evt
  24412. * @returns {boolean} consumedEvent - True if function consumed the event.
  24413. */
  24414. /**
  24415. * Example implementation:
  24416. *
  24417. * postMouseDownCallback(evt) {
  24418. * return false;
  24419. * }
  24420. */
  24421. /**
  24422. * Callback that takes priority if the tool is active, before `TOUCH_START`
  24423. * events are processed. Does nothing by default.
  24424. *
  24425. * @virtual
  24426. * @param {type} evt
  24427. * @returns {boolean} consumedEvent - True if function consumed the event.
  24428. */
  24429. /**
  24430. * Example implementation:
  24431. *
  24432. * preTouchStartCallback(evt) {
  24433. * return false;
  24434. * }
  24435. */
  24436. /**
  24437. * Callback that is called if the tool is active, after `TOUCH_START`
  24438. * events are processed. Does nothing by default.
  24439. *
  24440. * @virtual
  24441. * @param {type} evt
  24442. * @returns {boolean} consumedEvent - True if function consumed the event.
  24443. */
  24444. /**
  24445. * Example implementation:
  24446. *
  24447. * postTouchStartCallback(evt) {
  24448. * return false;
  24449. * }
  24450. */
  24451. }, {
  24452. key: "configuration",
  24453. get: function get() {
  24454. return this._configuration;
  24455. },
  24456. set: function set(configuration) {
  24457. this._configuration = configuration;
  24458. } //
  24459. // OPTIONS
  24460. //
  24461. /**
  24462. * Options...
  24463. * @readonly
  24464. * @instance
  24465. */
  24466. }, {
  24467. key: "options",
  24468. get: function get() {
  24469. return this._options;
  24470. }
  24471. }], [{
  24472. key: "configuration",
  24473. get: function get() {}
  24474. }]);
  24475. return BaseTool;
  24476. }();
  24477. /* harmony default export */ __webpack_exports__["default"] = (BaseTool);
  24478. /***/ }),
  24479. /***/ "./tools/base/index.js":
  24480. /*!*****************************!*\
  24481. !*** ./tools/base/index.js ***!
  24482. \*****************************/
  24483. /*! exports provided: BaseAnnotationTool, BaseBrushTool, BaseTool, default */
  24484. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  24485. "use strict";
  24486. __webpack_require__.r(__webpack_exports__);
  24487. /* harmony import */ var _BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BaseAnnotationTool.js */ "./tools/base/BaseAnnotationTool.js");
  24488. /* harmony import */ var _BaseTool_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./BaseTool.js */ "./tools/base/BaseTool.js");
  24489. /* harmony import */ var _BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./BaseBrushTool.js */ "./tools/base/BaseBrushTool.js");
  24490. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BaseAnnotationTool", function() { return _BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_0__["default"]; });
  24491. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BaseBrushTool", function() { return _BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_2__["default"]; });
  24492. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BaseTool", function() { return _BaseTool_js__WEBPACK_IMPORTED_MODULE_1__["default"]; });
  24493. // Named Exports
  24494. // Namespace, default export
  24495. /* harmony default export */ __webpack_exports__["default"] = ({
  24496. BaseAnnotationTool: _BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_0__["default"],
  24497. BaseBrushTool: _BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_2__["default"],
  24498. BaseTool: _BaseTool_js__WEBPACK_IMPORTED_MODULE_1__["default"]
  24499. });
  24500. /***/ }),
  24501. /***/ "./tools/cursors/MouseCursor.js":
  24502. /*!**************************************!*\
  24503. !*** ./tools/cursors/MouseCursor.js ***!
  24504. \**************************************/
  24505. /*! exports provided: default */
  24506. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  24507. "use strict";
  24508. __webpack_require__.r(__webpack_exports__);
  24509. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return MouseCursor; });
  24510. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
  24511. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
  24512. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
  24513. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
  24514. /* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../stateManagement/toolColors.js */ "./stateManagement/toolColors.js");
  24515. /* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../store/index.js */ "./store/index.js");
  24516. var cursorModule = _store_index_js__WEBPACK_IMPORTED_MODULE_3__["modules"].cursor;
  24517. /* eslint-disable valid-jsdoc */
  24518. /*
  24519. MACROS - The following keys will have the appropriate value injected when
  24520. an SVG is requested:
  24521. - ACTIVE_COLOR => options.activeColor || toolColors.getActiveColor();
  24522. - TOOL_COLOR => options.toolColor || toolColors.getToolColor();
  24523. - FILL_COLOR => options.fillColor || toolColors.getFillColor();
  24524. */
  24525. var MouseCursor =
  24526. /*#__PURE__*/
  24527. function () {
  24528. function MouseCursor(iconGroupString, options) {
  24529. _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, MouseCursor);
  24530. this.iconGroupString = iconGroupString;
  24531. this.options = Object.assign({}, cursorModule.getters.defaultOptions(), options);
  24532. }
  24533. /**
  24534. * Returns an SVG of the icon only.
  24535. *
  24536. * @param {Object} options - An object which overrides default properties of the returned SVG.
  24537. * @returns {Blob} The SVG of the icon.
  24538. */
  24539. _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(MouseCursor, [{
  24540. key: "getIconSVG",
  24541. value: function getIconSVG() {
  24542. var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  24543. var svgString = this._generateIconSVGString(options);
  24544. return new Blob([svgString], {
  24545. type: 'image/svg+xml'
  24546. });
  24547. }
  24548. /**
  24549. * Returns a string representation of the SVG of the icon only.
  24550. *
  24551. * @param {Object} options - An object which overrides default properties of the returned SVG.
  24552. * @returns {string} The stringified SVG of the icon.
  24553. */
  24554. }, {
  24555. key: "getIconSVGString",
  24556. value: function getIconSVGString() {
  24557. var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  24558. return this._generateIconSVGString(options);
  24559. }
  24560. /**
  24561. * Returns an SVG of the icon + pointer.
  24562. *
  24563. * @param {Object} options - An object which overrides default properties of the returned SVG.
  24564. * @returns {Blob} The SVG of the icon + pointer..
  24565. */
  24566. }, {
  24567. key: "getIconWithPointerSVG",
  24568. value: function getIconWithPointerSVG() {
  24569. var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  24570. var svgString = this._generateIconWithPointerSVGString(options);
  24571. return new Blob([svgString], {
  24572. type: 'image/svg+xml'
  24573. });
  24574. }
  24575. /**
  24576. * Returns a string representation of the SVG of the icon + pointer.
  24577. *
  24578. * @param {Object} options - An object which overrides default properties of the returned SVG.
  24579. * @returns {string} The stringified SVG of the icon + pointer.
  24580. */
  24581. }, {
  24582. key: "getIconWithPointerString",
  24583. value: function getIconWithPointerString() {
  24584. var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  24585. return this._generateIconWithPointerSVGString(options);
  24586. }
  24587. /**
  24588. * Returns the mousePoint as a space separated string.
  24589. *
  24590. * @returns {string} The mousePoint.
  24591. */
  24592. }, {
  24593. key: "_generateIconWithPointerSVGString",
  24594. /**
  24595. * Generates a string representation of the icon + pointer.
  24596. *
  24597. * @param {Object} options - An object which overrides default properties of the returned string.
  24598. * @returns {string} The SVG as a string.
  24599. */
  24600. value: function _generateIconWithPointerSVGString() {
  24601. var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  24602. var svgOptions = Object.assign({}, this.options, options);
  24603. var mousePointerGroupString = svgOptions.mousePointerGroupString,
  24604. iconSize = svgOptions.iconSize,
  24605. viewBox = svgOptions.viewBox;
  24606. var scale = iconSize / Math.max(viewBox.x, viewBox.y);
  24607. var svgSize = 16 + iconSize;
  24608. var svgString = "\n <svg\n data-icon=\"cursor\" role=\"img\" xmlns=\"http://www.w3.org/2000/svg\"\n width=\"".concat(svgSize, "\" height=\"").concat(svgSize, "\" viewBox=\"0 0 ").concat(svgSize, " ").concat(svgSize, "\"\n >\n <g>\n ").concat(mousePointerGroupString, "\n </g>\n <g transform=\"translate(16, 16) scale(").concat(scale, ")\">\n ").concat(this.iconGroupString, "\n </g>\n </svg>");
  24609. return this._injectColors(svgString, svgOptions);
  24610. }
  24611. /**
  24612. * Generates a string representation of the icon.
  24613. *
  24614. * @param {Object} options - An object which overrides default properties of the returned string.
  24615. * @returns {string} The SVG as a string.
  24616. */
  24617. }, {
  24618. key: "_generateIconSVGString",
  24619. value: function _generateIconSVGString() {
  24620. var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  24621. var svgOptions = Object.assign({}, this.options, options);
  24622. var iconSize = svgOptions.iconSize,
  24623. viewBox = svgOptions.viewBox;
  24624. var svgString = "\n <svg\n data-icon=\"cursor\" role=\"img\" xmlns=\"http://www.w3.org/2000/svg\"\n width=\"".concat(iconSize, "\" height=\"").concat(iconSize, "\" viewBox=\"0 0\n ").concat(viewBox.x, " ").concat(viewBox.y, "\"\n >\n ").concat(this.iconGroupString, "\n </svg>");
  24625. return this._injectColors(svgString, svgOptions);
  24626. }
  24627. /**
  24628. * Replaces ACTIVE_COLOR, TOOL_COLOR and FILL_COLOR in svgString with their appropriate values.
  24629. *
  24630. * @param {string} svgString - The string to modify.
  24631. * @param {Object} options - Optional overrides for the colors.
  24632. * @returns {string} The string with color values injected.
  24633. */
  24634. }, {
  24635. key: "_injectColors",
  24636. value: function _injectColors(svgString) {
  24637. var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  24638. var activeColor = options.activeColor || _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_2__["default"].getActiveColor();
  24639. var toolColor = options.toolColor || _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_2__["default"].getToolColor();
  24640. var fillColor = options.fillColor || _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_2__["default"].getFillColor();
  24641. return svgString.replace(/ACTIVE_COLOR/g, "".concat(activeColor)).replace(/TOOL_COLOR/g, "".concat(toolColor)).replace(/FILL_COLOR/g, "".concat(fillColor));
  24642. }
  24643. }, {
  24644. key: "mousePoint",
  24645. get: function get() {
  24646. var mousePoint = this.options.mousePoint;
  24647. return "".concat(mousePoint.x, " ").concat(mousePoint.y);
  24648. }
  24649. }]);
  24650. return MouseCursor;
  24651. }();
  24652. /***/ }),
  24653. /***/ "./tools/cursors/index.js":
  24654. /*!********************************!*\
  24655. !*** ./tools/cursors/index.js ***!
  24656. \********************************/
  24657. /*! exports provided: angleCursor, arrowAnnotateCursor, bidirectionalCursor, cobbAngleCursor, circleRoiCursor, ellipticalRoiCursor, freehandRoiCursor, freehandRoiSculptorCursor, lengthCursor, probeCursor, rectangleRoiCursor, textMarkerCursor, crosshairsCursor, eraserCursor, magnifyCursor, panCursor, rotateCursor, stackScrollCursor, wwwcRegionCursor, wwwcCursor, zoomCursor, freehandEraseInsideCursor, freehandFillInsideCursor, freehandEraseOutsideCursor, freehandFillOutsideCursor, segRectangleEraseInsideCursor, segRectangleFillInsideCursor, segRectangleEraseOutsideCursor, segRectangleFillOutsideCursor, segCircleEraseInsideCursor, segCircleFillInsideCursor, segCircleEraseOutsideCursor, segCircleFillOutsideCursor */
  24658. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  24659. "use strict";
  24660. __webpack_require__.r(__webpack_exports__);
  24661. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "angleCursor", function() { return angleCursor; });
  24662. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "arrowAnnotateCursor", function() { return arrowAnnotateCursor; });
  24663. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bidirectionalCursor", function() { return bidirectionalCursor; });
  24664. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cobbAngleCursor", function() { return cobbAngleCursor; });
  24665. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "circleRoiCursor", function() { return circleRoiCursor; });
  24666. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ellipticalRoiCursor", function() { return ellipticalRoiCursor; });
  24667. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "freehandRoiCursor", function() { return freehandRoiCursor; });
  24668. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "freehandRoiSculptorCursor", function() { return freehandRoiSculptorCursor; });
  24669. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "lengthCursor", function() { return lengthCursor; });
  24670. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "probeCursor", function() { return probeCursor; });
  24671. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rectangleRoiCursor", function() { return rectangleRoiCursor; });
  24672. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "textMarkerCursor", function() { return textMarkerCursor; });
  24673. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "crosshairsCursor", function() { return crosshairsCursor; });
  24674. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "eraserCursor", function() { return eraserCursor; });
  24675. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "magnifyCursor", function() { return magnifyCursor; });
  24676. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "panCursor", function() { return panCursor; });
  24677. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rotateCursor", function() { return rotateCursor; });
  24678. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "stackScrollCursor", function() { return stackScrollCursor; });
  24679. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "wwwcRegionCursor", function() { return wwwcRegionCursor; });
  24680. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "wwwcCursor", function() { return wwwcCursor; });
  24681. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "zoomCursor", function() { return zoomCursor; });
  24682. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "freehandEraseInsideCursor", function() { return freehandEraseInsideCursor; });
  24683. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "freehandFillInsideCursor", function() { return freehandFillInsideCursor; });
  24684. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "freehandEraseOutsideCursor", function() { return freehandEraseOutsideCursor; });
  24685. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "freehandFillOutsideCursor", function() { return freehandFillOutsideCursor; });
  24686. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "segRectangleEraseInsideCursor", function() { return segRectangleEraseInsideCursor; });
  24687. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "segRectangleFillInsideCursor", function() { return segRectangleFillInsideCursor; });
  24688. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "segRectangleEraseOutsideCursor", function() { return segRectangleEraseOutsideCursor; });
  24689. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "segRectangleFillOutsideCursor", function() { return segRectangleFillOutsideCursor; });
  24690. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "segCircleEraseInsideCursor", function() { return segCircleEraseInsideCursor; });
  24691. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "segCircleFillInsideCursor", function() { return segCircleFillInsideCursor; });
  24692. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "segCircleEraseOutsideCursor", function() { return segCircleEraseOutsideCursor; });
  24693. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "segCircleFillOutsideCursor", function() { return segCircleFillOutsideCursor; });
  24694. /* harmony import */ var _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./MouseCursor.js */ "./tools/cursors/MouseCursor.js");
  24695. /*
  24696. MACROS:
  24697. The following keys will have the appropriate value injected by the MouseCursor
  24698. class when an SVG is requested:
  24699. - ACTIVE_COLOR => options.activeColor || toolColors.getActiveColor();
  24700. - TOOL_COLOR => options.toolColor || toolColors.getToolColor();
  24701. - FILL_COLOR => options.fillColor || toolColors.getFillColor();
  24702. */
  24703. var angleCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<path fill=\"ACTIVE_COLOR\" d=\"M1203 544q0 13-10 23l-393 393 393 393q10 10 10 23t-10 23l-50\n 50q-10 10-23 10t-23-10l-466-466q-10-10-10-23t10-23l466-466q10-10 23-10t23\n 10l50 50q10 10 10 23z\"\n />", {
  24704. viewBox: {
  24705. x: 1792,
  24706. y: 1792
  24707. }
  24708. });
  24709. var arrowAnnotateCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<g id=\"arrowAnnotate-group\" fill=\"none\" stroke-width=\"1\" stroke=\"ACTIVE_COLOR\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path id=\"arrowAnnotate-arrow\" d=\"M23,7 l-15,15 M7,17 l0,6 6,0\" stroke-width=\"2\" />\n </g>", {
  24710. viewBox: {
  24711. x: 24,
  24712. y: 24
  24713. }
  24714. });
  24715. var bidirectionalCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<g fill=\"ACTIVE_COLOR\" stroke-width=\"3\" stroke=\"ACTIVE_COLOR\">\n <path d=\"M27.63 3.21L3.12 28.81\"></path>\n <path d=\"M27.63 15.75L15.27 4.43\"></path>\n <path d=\"M16.5 4.28C16.5 4.96 15.95 5.51 15.27 5.51C14.59 5.51 14.03 4.96 14.03 4.28C14.03 3.59 14.59 3.04 15.27 3.04C15.95 3.04 16.5 3.59 16.5 4.28Z\" ></path>\n <path d=\"M28.87 3.19C28.87 3.87 28.31 4.43 27.63 4.43C26.95 4.43 26.4 3.87 26.4 3.19C26.4 2.51 26.95 1.95 27.63 1.95C28.31 1.95 28.87 2.51 28.87 3.19Z\"></path>\n <path d=\"M28.87 15.75C28.87 16.43 28.31 16.99 27.63 16.99C26.95 16.99 26.4 16.43 26.4 15.75C26.4 15.07 26.95 14.51 27.63 14.51C28.31 14.51 28.87 15.07 28.87 15.75Z\"></path>\n <path d=\"M4.73 28.44C4.73 29.12 4.17 29.68 3.49 29.68C2.81 29.68 2.25 29.12 2.25 28.44C2.25 27.76 2.81 27.2 3.49 27.2C4.17 27.2 4.73 27.76 4.73 28.44Z\"></path>\n </g>", {
  24716. viewBox: {
  24717. x: 48,
  24718. y: 48
  24719. }
  24720. });
  24721. var cobbAngleCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<g stroke=\"ACTIVE_COLOR\" stroke-width=\"3\">\n <path d=\"M28.59 2.34L3.82 12.32\"></path>\n <path d=\"M28.59 29.66L3.82 19.68\"></path>\n <path stroke-dasharray=\"2\" fill-opacity=\"0\" d=\"M12.37\n 23.06C12.67 22.36 12.85 21.93 12.92 21.76C14.6 17.8 14.68 13.35 13.15\n 9.33C13.11 9.24 13.02 9 12.88 8.63\">\n </path>\n </g>", {
  24722. viewBox: {
  24723. x: 32,
  24724. y: 32
  24725. }
  24726. });
  24727. var circleRoiCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<circle stroke=\"ACTIVE_COLOR\" fill=\"none\" stroke-width=\"3\" cx=\"16\" cy=\"16\" r=\"14\" />", {
  24728. viewBox: {
  24729. x: 32,
  24730. y: 32
  24731. }
  24732. });
  24733. var ellipticalRoiCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<path stroke=\"ACTIVE_COLOR\" fill=\"none\" stroke-width=\"3\" d=\"M30.74 15.76C30.74 20.99 24.14 25.23 16\n 25.23C7.86 25.23 1.26 20.99 1.26 15.76C1.26 10.54 7.86 6.3 16 6.3C24.14\n 6.3 30.74 10.54 30.74 15.76Z\"\n />", {
  24734. viewBox: {
  24735. x: 32,
  24736. y: 32
  24737. }
  24738. });
  24739. var freehandRoiCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("\n <g fill=\"ACTIVE_COLOR\" stroke=\"ACTIVE_COLOR\" stroke-width=\"2\">\n <ellipse ry=\"1\" rx=\"1\" id=\"svg_3\" cy=\"4.240343\" cx=\"14.306499\"/>\n <line id=\"svg_4\" y2=\"3.58462\" x2=\"12.242186\" y1=\"3.997482\" x1=\"13.432202\"/>\n <line id=\"svg_5\" y2=\"3.268901\" x2=\"10.857882\" y1=\"3.608906\" x1=\"12.387902\"/>\n <line id=\"svg_6\" y2=\"3.147471\" x2=\"9.740724\" y1=\"3.293187\" x1=\"10.955026\"/>\n <line id=\"svg_7\" y2=\"3.147471\" x2=\"8.089274\" y1=\"3.196043\" x1=\"9.983585\"/>\n <line id=\"svg_8\" y2=\"3.268901\" x2=\"6.874972\" y1=\"3.123185\" x1=\"8.307848\"/>\n <line id=\"svg_9\" y2=\"3.657478\" x2=\"5.587812\" y1=\"3.220329\" x1=\"7.020688\"/>\n <line id=\"svg_10\" y2=\"4.046054\" x2=\"4.737801\" y1=\"3.560334\" x1=\"5.854959\"/>\n <line id=\"svg_11\" y2=\"4.337487\" x2=\"4.300652\" y1=\"3.997482\" x1=\"4.834945\"/>\n <line id=\"svg_12\" y2=\"4.726063\" x2=\"3.88779\" y1=\"4.191771\" x1=\"4.470655\"/>\n <line id=\"svg_15\" y2=\"5.3575\" x2=\"3.377783\" y1=\"4.604633\" x1=\"3.960648\"/>\n <line id=\"svg_16\" y2=\"6.183226\" x2=\"2.916348\" y1=\"5.138926\" x1=\"3.547785\"/>\n <line id=\"svg_17\" y2=\"6.960379\" x2=\"2.770632\" y1=\"5.867507\" x1=\"3.037779\"/>\n <line id=\"svg_18\" y2=\"7.713246\" x2=\"2.673488\" y1=\"6.741804\" x1=\"2.819204\"/>\n <line id=\"svg_19\" y2=\"8.684687\" x2=\"2.697774\" y1=\"7.616102\" x1=\"2.673488\"/>\n <line id=\"svg_20\" y2=\"9.753273\" x2=\"2.892062\" y1=\"8.611829\" x1=\"2.697774\"/>\n <line id=\"svg_21\" y2=\"10.724714\" x2=\"3.134923\" y1=\"9.534698\" x1=\"2.84349\"/>\n <line id=\"svg_23\" y2=\"11.647583\" x2=\"3.596357\" y1=\"10.578998\" x1=\"3.086351\"/>\n <line id=\"svg_25\" y2=\"12.521881\" x2=\"4.276366\" y1=\"11.501867\" x1=\"3.499213\"/>\n <line id=\"svg_26\" y2=\"13.930471\" x2=\"5.830673\" y1=\"12.376165\" x1=\"4.13065\"/>\n <line id=\"svg_28\" y2=\"14.707624\" x2=\"7.263549\" y1=\"13.881899\" x1=\"5.733528\"/>\n <line id=\"svg_29\" y2=\"15.339061\" x2=\"8.963571\" y1=\"14.61048\" x1=\"7.06926\"/>\n <line id=\"svg_30\" y2=\"15.581921\" x2=\"10.882168\" y1=\"15.314775\" x1=\"8.817855\"/>\n <line id=\"svg_31\" y2=\"15.460491\" x2=\"12.023612\" y1=\"15.581921\" x1=\"10.785024\"/>\n <line id=\"svg_33\" y2=\"15.120487\" x2=\"13.092197\" y1=\"15.484777\" x1=\"11.877895\"/>\n <line id=\"svg_34\" y2=\"14.586194\" x2=\"13.86935\" y1=\"15.217631\" x1=\"12.897909\"/>\n <line id=\"svg_35\" y2=\"13.833327\" x2=\"14.597931\" y1=\"14.756196\" x1=\"13.699348\"/>\n <line id=\"svg_37\" y2=\"12.716169\" x2=\"15.180796\" y1=\"13.881899\" x1=\"14.549359\"/>\n <line id=\"svg_39\" y2=\"11.429009\" x2=\"15.520801\" y1=\"12.813313\" x1=\"15.15651\"/>\n <ellipse ry=\"1\" rx=\"1\" id=\"svg_40\" cy=\"10.967574\" cx=\"15.520801\"/>\n </g>", {
  24740. viewBox: {
  24741. x: 18,
  24742. y: 18
  24743. }
  24744. });
  24745. var freehandRoiSculptorCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<g id=\"icon-freehand-sculpt\" fill=\"none\" stroke-width=\"1.5\" stroke=\"ACTIVE_COLOR\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <line id=\"svg_1\" y2=\"2.559367\" x2=\"10.184807\" y1=\"4.467781\" x1=\"8.81711\"/>\n <line id=\"svg_4\" y2=\"1.493836\" x2=\"11.727442\" y1=\"2.766112\" x1=\"10.089386\"/>\n <line id=\"svg_7\" y2=\"1.080346\" x2=\"13.047428\" y1=\"1.748291\" x1=\"11.345759\"/>\n <line id=\"svg_8\" y2=\"1.000829\" x2=\"14.351511\" y1=\"1.112153\" x1=\"12.77707\"/>\n <line id=\"svg_9\" y2=\"1.350705\" x2=\"15.242104\" y1=\"0.905408\" x1=\"13.969828\"/>\n <line id=\"svg_10\" y2=\"2.098167\" x2=\"15.862339\" y1=\"1.14396\" x1=\"14.955842\"/>\n <line id=\"svg_11\" y2=\"3.195505\" x2=\"16.41896\" y1=\"1.939133\" x1=\"15.766918\"/>\n <line id=\"svg_12\" y2=\"4.292843\" x2=\"16.530284\" y1=\"2.925147\" x1=\"16.387153\"/>\n <line id=\"svg_16\" y2=\"5.644637\" x2=\"16.196311\" y1=\"3.831643\" x1=\"16.593898\"/>\n <line id=\"svg_18\" y2=\"7.266789\" x2=\"15.623787\" y1=\"5.19934\" x1=\"16.275829\"/>\n <line id=\"svg_19\" y2=\"10.813258\" x2=\"14.526449\" y1=\"6.726071\" x1=\"15.766918\"/>\n <line id=\"svg_20\" y2=\"5.056209\" x2=\"8.085552\" y1=\"4.181519\" x1=\"8.976145\"/>\n <line id=\"svg_23\" y2=\"5.326568\" x2=\"7.481221\" y1=\"4.78585\" x1=\"8.403621\"/>\n <line id=\"svg_24\" y2=\"5.565119\" x2=\"6.749662\" y1=\"5.294761\" x1=\"7.624352\"/>\n <line id=\"svg_25\" y2=\"5.994512\" x2=\"5.429675\" y1=\"5.533312\" x1=\"6.956407\"/>\n <line id=\"svg_27\" y2=\"6.551133\" x2=\"4.284627\" y1=\"5.962706\" x1=\"5.572807\"/>\n <line id=\"svg_28\" y2=\"7.584858\" x2=\"3.044158\" y1=\"6.392099\" x1=\"4.427758\"/>\n <line id=\"svg_29\" y2=\"8.84123\" x2=\"2.185372\" y1=\"7.489437\" x1=\"3.219096\"/>\n <line id=\"svg_31\" y2=\"10.606513\" x2=\"1.644654\" y1=\"8.602678\" x1=\"2.280792\"/>\n <line id=\"svg_32\" y2=\"13.214679\" x2=\"1.48562\" y1=\"10.352058\" x1=\"1.724171\"/>\n <line id=\"svg_33\" y2=\"14.375631\" x2=\"1.676461\" y1=\"12.992031\" x1=\"1.453813\"/>\n <line id=\"svg_34\" y2=\"15.298031\" x2=\"2.264889\" y1=\"14.152983\" x1=\"1.517427\"/>\n <line id=\"svg_35\" y2=\"16.172721\" x2=\"3.521261\" y1=\"14.948155\" x1=\"1.915013\"/>\n <line id=\"svg_36\" y2=\"16.824762\" x2=\"5.207027\" y1=\"15.997783\" x1=\"3.28271\"/>\n <line id=\"svg_38\" y2=\"17.063314\" x2=\"7.035924\" y1=\"16.745245\" x1=\"4.968475\"/>\n <line id=\"svg_39\" y2=\"16.888376\" x2=\"9.278311\" y1=\"17.047411\" x1=\"6.733758\"/>\n <line id=\"svg_40\" y2=\"16.284045\" x2=\"10.661911\" y1=\"16.983797\" x1=\"8.992048\"/>\n <line id=\"svg_41\" y2=\"15.313934\" x2=\"11.647925\" y1=\"16.395369\" x1=\"10.455166\"/>\n <line id=\"svg_44\" y2=\"13.898527\" x2=\"12.82478\" y1=\"15.425259\" x1=\"11.504794\"/>\n <line id=\"svg_45\" y2=\"12.037824\" x2=\"14.144766\" y1=\"14.312017\" x1=\"12.522614\"/>\n <line id=\"svg_47\" y2=\"10.59061\" x2=\"14.605966\" y1=\"12.228665\" x1=\"13.953925\"/>\n <ellipse ry=\"1\" rx=\"1\" id=\"svg_48\" cy=\"3.982726\" cx=\"13.460918\"/>\n </g>", {
  24746. viewBox: {
  24747. x: 18,
  24748. y: 18
  24749. }
  24750. });
  24751. var lengthCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<g id=\"length-group\" fill=\"none\" stroke-width=\"1\" stroke=\"ACTIVE_COLOR\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path id=\"length-dashes\" d=\"m22.5,6 -16.5,16.5\" stroke-width=\"3\" stroke-dasharray=\"0.6666,5\" />\n </g>", {
  24752. viewBox: {
  24753. x: 24,
  24754. y: 24
  24755. }
  24756. });
  24757. var probeCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<path fill=\"ACTIVE_COLOR\" d=\"M1152 896q0 106-75 181t-181 75-181-75-75-181 75-181 181-75 181 75\n 75 181zm-256-544q-148 0-273 73t-198 198-73 273 73 273 198 198 273 73 273-73\n 198-198 73-273-73-273-198-198-273-73zm768 544q0 209-103 385.5t-279.5\n 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5\n 385.5-103 385.5 103 279.5 279.5 103 385.5z\"\n />", {
  24758. viewBox: {
  24759. x: 1792,
  24760. y: 1792
  24761. }
  24762. });
  24763. var rectangleRoiCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<path fill=\"ACTIVE_COLOR\" d=\"M1312 256h-832q-66 0-113 47t-47 113v832q0 66 47\n 113t113 47h832q66 0 113-47t47-113v-832q0-66-47-113t-113-47zm288 160v832q0\n 119-84.5 203.5t-203.5 84.5h-832q-119 0-203.5-84.5t-84.5-203.5v-832q0-119\n 84.5-203.5t203.5-84.5h832q119 0 203.5 84.5t84.5 203.5z\"\n />", {
  24764. viewBox: {
  24765. x: 1792,
  24766. y: 1792
  24767. }
  24768. });
  24769. var textMarkerCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<path fill=\"ACTIVE_COLOR\" d=\"M789 559l-170 450q33 0 136.5 2t160.5 2q19 0\n 57-2-87-253-184-452zm-725 1105l2-79q23-7 56-12.5t57-10.5 49.5-14.5 44.5-29\n 31-50.5l237-616 280-724h128q8 14 11 21l205 480q33 78 106 257.5t114 274.5q15\n 34 58 144.5t72 168.5q20 45 35 57 19 15 88 29.5t84 20.5q6 38 6 57 0 5-.5\n 13.5t-.5 12.5q-63 0-190-8t-191-8q-76 0-215 7t-178 8q0-43 4-78l131-28q1 0\n 12.5-2.5t15.5-3.5 14.5-4.5 15-6.5 11-8 9-11\n 2.5-14q0-16-31-96.5t-72-177.5-42-100l-450-2q-26 58-76.5 195.5t-50.5 162.5q0\n 22 14 37.5t43.5 24.5 48.5 13.5 57 8.5 41 4q1 19 1 58 0 9-2 27-58\n 0-174.5-10t-174.5-10q-8 0-26.5 4t-21.5 4q-80 14-188 14z\"\n />", {
  24770. viewBox: {
  24771. x: 1792,
  24772. y: 1792
  24773. }
  24774. });
  24775. var crosshairsCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<path fill=\"ACTIVE_COLOR\" d=\"M1325 1024h-109q-26 0-45-19t-19-45v-128q0-26\n 19-45t45-19h109q-32-108-112.5-188.5t-188.5-112.5v109q0 26-19 45t-45\n 19h-128q-26 0-45-19t-19-45v-109q-108 32-188.5 112.5t-112.5 188.5h109q26\n 0 45 19t19 45v128q0 26-19 45t-45 19h-109q32 108 112.5 188.5t188.5\n 112.5v-109q0-26 19-45t45-19h128q26 0 45 19t19 45v109q108-32\n 188.5-112.5t112.5-188.5zm339-192v128q0 26-19 45t-45 19h-143q-37 161-154.5\n 278.5t-278.5 154.5v143q0 26-19 45t-45 19h-128q-26\n 0-45-19t-19-45v-143q-161-37-278.5-154.5t-154.5-278.5h-143q-26\n 0-45-19t-19-45v-128q0-26 19-45t45-19h143q37-161\n 154.5-278.5t278.5-154.5v-143q0-26 19-45t45-19h128q26 0 45 19t19 45v143q161\n 37 278.5 154.5t154.5 278.5h143q26 0 45 19t19 45z\"\n />", {
  24776. viewBox: {
  24777. x: 1792,
  24778. y: 1792
  24779. }
  24780. });
  24781. var eraserCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<path transform=\"translate(0,1792) scale(1,-1)\" fill=\"ACTIVE_COLOR\" d=\"M960 1408l336-384h-768l-336 384h768zm1013-1077q15\n 34 9.5 71.5t-30.5 65.5l-896 1024q-38 44-96 44h-768q-38\n 0-69.5-20.5t-47.5-54.5q-15-34-9.5-71.5t30.5-65.5l896-1024q38-44 96-44h768q38\n 0 69.5 20.5t47.5 54.5z\"\n />", {
  24782. viewBox: {
  24783. x: 2048,
  24784. y: 1792
  24785. }
  24786. });
  24787. var magnifyCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<path fill=\"ACTIVE_COLOR\" d=\"M508.5 481.6l-129-129c-2.3-2.3-5.3-3.5-8.5-3.5h-10.3C395\n 312 416 262.5 416 208 416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c54.5\n 0 104-21 141.1-55.2V371c0 3.2 1.3 6.2 3.5 8.5l129 129c4.7 4.7 12.3 4.7 17\n 0l9.9-9.9c4.7-4.7 4.7-12.3 0-17zM208 384c-97.3 0-176-78.7-176-176S110.7 32 208\n 32s176 78.7 176 176-78.7 176-176 176z\"\n />", {
  24788. viewBox: {
  24789. x: 512,
  24790. y: 512
  24791. }
  24792. });
  24793. var panCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<path fill=\"ACTIVE_COLOR\" d=\"M1411 541l-355 355 355 355 144-144q29-31 70-14 39 17\n 39 59v448q0 26-19 45t-45 19h-448q-42 0-59-40-17-39 14-69l144-144-355-355-355\n 355 144 144q31 30 14 69-17 40-59 40h-448q-26 0-45-19t-19-45v-448q0-42 40-59\n 39-17 69 14l144 144 355-355-355-355-144 144q-19 19-45 19-12\n 0-24-5-40-17-40-59v-448q0-26 19-45t45-19h448q42 0 59 40 17 39-14 69l-144\n 144 355 355 355-355-144-144q-31-30-14-69 17-40 59-40h448q26 0 45 19t19\n 45v448q0 42-39 59-13 5-25 5-26 0-45-19z\"\n />", {
  24794. viewBox: {
  24795. x: 1792,
  24796. y: 1792
  24797. }
  24798. });
  24799. var rotateCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<path fill=\"ACTIVE_COLOR\" d=\"M1664 256v448q0 26-19 45t-45 19h-448q-42 0-59-40-17-39\n 14-69l138-138q-148-137-349-137-104 0-198.5 40.5t-163.5 109.5-109.5\n 163.5-40.5 198.5 40.5 198.5 109.5 163.5 163.5 109.5 198.5 40.5q119 0\n 225-52t179-147q7-10 23-12 15 0 25 9l137 138q9 8 9.5 20.5t-7.5 22.5q-109\n 132-264 204.5t-327 72.5q-156 0-298-61t-245-164-164-245-61-298 61-298\n 164-245 245-164 298-61q147 0 284.5 55.5t244.5 156.5l130-129q29-31 70-14\n 39 17 39 59z\"\n />", {
  24800. viewBox: {
  24801. x: 1792,
  24802. y: 1792
  24803. }
  24804. });
  24805. var stackScrollCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<path fill=\"ACTIVE_COLOR\" d=\"M24 21v2c0 0.547-0.453 1-1 1h-22c-0.547\n 0-1-0.453-1-1v-2c0-0.547 0.453-1 1-1h22c0.547 0 1 0.453 1 1zM24 13v2c0\n 0.547-0.453 1-1 1h-22c-0.547 0-1-0.453-1-1v-2c0-0.547 0.453-1 1-1h22c0.547\n 0 1 0.453 1 1zM24 5v2c0 0.547-0.453 1-1 1h-22c-0.547\n 0-1-0.453-1-1v-2c0-0.547 0.453-1 1-1h22c0.547 0 1 0.453 1 1z\"\n />", {
  24806. viewBox: {
  24807. x: 24,
  24808. y: 28
  24809. }
  24810. });
  24811. var wwwcRegionCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<path fill=\"ACTIVE_COLOR\" d=\"M1664 416v960q0 119-84.5 203.5t-203.5 84.5h-960q-119\n 0-203.5-84.5t-84.5-203.5v-960q0-119 84.5-203.5t203.5-84.5h960q119 0 203.5\n 84.5t84.5 203.5z\"\n />", {
  24812. viewBox: {
  24813. x: 1792,
  24814. y: 1792
  24815. }
  24816. });
  24817. var wwwcCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<path fill=\"ACTIVE_COLOR\" d=\"M14.5,3.5 a1 1 0 0 1 -11,11 Z\" stroke=\"none\" opacity=\"0.8\" />\n <circle cx=\"9\" cy=\"9\" r=\"8\" fill=\"none\" stroke-width=\"2\" stroke=\"ACTIVE_COLOR\" />", {
  24818. viewBox: {
  24819. x: 18,
  24820. y: 18
  24821. }
  24822. });
  24823. var zoomCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<path fill=\"ACTIVE_COLOR\" d=\"M508.5 481.6l-129-129c-2.3-2.3-5.3-3.5-8.5-3.5h-10.3C395\n 312 416 262.5 416 208 416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c54.5\n 0 104-21 141.1-55.2V371c0 3.2 1.3 6.2 3.5 8.5l129 129c4.7 4.7 12.3 4.7 17\n 0l9.9-9.9c4.7-4.7 4.7-12.3 0-17zM208 384c-97.3 0-176-78.7-176-176S110.7 32 208\n 32s176 78.7 176 176-78.7 176-176 176z\"\n />\n <path fill=\"ACTIVE_COLOR\" transform=\"scale(0.22,0.22) translate(1400,0)\" d=\"M1216\n 320q0 26-19 45t-45 19h-128v1024h128q26 0 45 19t19 45-19 45l-256 256q-19\n 19-45 19t-45-19l-256-256q-19-19-19-45t19-45 45-19h128v-1024h-128q-26\n 0-45-19t-19-45 19-45l256-256q19-19 45-19t45 19l256 256q19 19 19 45z\"\n />", {
  24824. viewBox: {
  24825. x: 640,
  24826. y: 512
  24827. }
  24828. });
  24829. var segToolCursorBoundaries = {
  24830. x: 127,
  24831. y: 60
  24832. };
  24833. var minusRect = function minusRect() {
  24834. var color = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'ACTIVE_COLOR';
  24835. return "<rect fill=\"".concat(color, "\" x=\"80.19\" y=\"25.03\" width=\"47.14\" height=\"15.85\"/>");
  24836. };
  24837. var plusRect = function plusRect() {
  24838. var color = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'ACTIVE_COLOR';
  24839. return "<rect fill=\"".concat(color, "\" x=\"80.19\" y=\"25.03\" width=\"47.14\" height=\"15.85\"/>\n <rect fill=\"").concat(color, "\" x=\"95.84\" y=\"9.38\" width=\"15.85\" height=\"47.14\"/>");
  24840. };
  24841. var scissorIcon = "<path fill=\"ACTIVE_COLOR\" d=\"M82.89,10a12.09,12.09,0,0,0-16.8-2.5l-27.5,20.4-8.5-6.3a2.93,2.93,0,0,1-1.1-3,14.66,14.66,0,0,0,.1-6.6,14.08,14.08,0,1,0-6.5,15.2,2.87,2.87,0,0,1,3.2.2l8.2,6.1-8.2,6.1a2.87,2.87,0,0,1-3.2.2,14.16,14.16,0,1,0,6.7,14.4,14,14,0,0,0-.3-5.8,2.93,2.93,0,0,1,1.1-3l8.5-6.3,27.5,20.4A11.91,11.91,0,0,0,82.89,57l-31.7-23.5ZM15.29,21a5.9,5.9,0,1,1,5.9-5.9A5.91,5.91,0,0,1,15.29,21Zm0,36.8a5.9,5.9,0,1,1,5.9-5.9A5.91,5.91,0,0,1,15.29,57.77Zm28.3-21.5a2.8,2.8,0,1,1,2.8-2.8A2.8,2.8,0,0,1,43.59,36.27Z\" transform=\"translate(-1.17 -0.96)\"/>";
  24842. var rectangleIcon = "<path fill=\"ACTIVE_COLOR\" d=\"M8.86,2.25V66.08H72.69V2.25H8.86ZM65.28,58.67h-49v-49h49v49Z\" transform=\"translate(-8.86 -2.25)\"/>";
  24843. var circleIcon = "<path fill=\"ACTIVE_COLOR\" d=\"M40.77,2.25A31.92,31.92,0,1,0,72.69,34.16,31.92,31.92,0,0,0,40.77,2.25Zm0,57.63A25.71,25.71,0,1,1,66.48,34.16,25.71,25.71,0,0,1,40.77,59.87Z\" transform=\"translate(-8.86 -2.25)\"/>";
  24844. var freehandEraseInsideCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("".concat(scissorIcon, " ").concat(minusRect()), {
  24845. viewBox: segToolCursorBoundaries
  24846. });
  24847. var freehandFillInsideCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("".concat(scissorIcon, " ").concat(plusRect()), {
  24848. viewBox: segToolCursorBoundaries
  24849. });
  24850. var freehandEraseOutsideCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("".concat(scissorIcon, " ").concat(minusRect()), {
  24851. viewBox: segToolCursorBoundaries
  24852. });
  24853. var freehandFillOutsideCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("".concat(scissorIcon, " ").concat(plusRect()), {
  24854. viewBox: segToolCursorBoundaries
  24855. });
  24856. var segRectangleEraseInsideCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("".concat(rectangleIcon, " ").concat(minusRect()), {
  24857. viewBox: segToolCursorBoundaries
  24858. });
  24859. var segRectangleFillInsideCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("".concat(rectangleIcon, " ").concat(plusRect()), {
  24860. viewBox: segToolCursorBoundaries
  24861. });
  24862. var segRectangleEraseOutsideCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("".concat(rectangleIcon, " ").concat(minusRect()), {
  24863. viewBox: segToolCursorBoundaries
  24864. });
  24865. var segRectangleFillOutsideCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("".concat(rectangleIcon, " ").concat(plusRect()), {
  24866. viewBox: segToolCursorBoundaries
  24867. });
  24868. var segCircleEraseInsideCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("".concat(circleIcon, " ").concat(minusRect()), {
  24869. viewBox: segToolCursorBoundaries
  24870. });
  24871. var segCircleFillInsideCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("".concat(circleIcon, " ").concat(plusRect()), {
  24872. viewBox: segToolCursorBoundaries
  24873. });
  24874. var segCircleEraseOutsideCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("".concat(circleIcon, " ").concat(minusRect()), {
  24875. viewBox: segToolCursorBoundaries
  24876. });
  24877. var segCircleFillOutsideCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("".concat(circleIcon, " ").concat(plusRect()), {
  24878. viewBox: segToolCursorBoundaries
  24879. });
  24880. /***/ }),
  24881. /***/ "./tools/index.js":
  24882. /*!************************!*\
  24883. !*** ./tools/index.js ***!
  24884. \************************/
  24885. /*! exports provided: CrosshairsTool, DoubleTapFitToWindowTool, DragProbeTool, EraserTool, FreehandRoiSculptorTool, MagnifyTool, OverlayTool, OrientationMarkersTool, PanMultiTouchTool, PanTool, ReferenceLinesTool, RotateTool, RotateTouchTool, ScaleOverlayTool, StackScrollMouseWheelTool, StackScrollMultiTouchTool, StackScrollTool, WwwcRegionTool, WwwcTool, ZoomMouseWheelTool, ZoomTool, ZoomTouchPinchTool, default */
  24886. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  24887. "use strict";
  24888. __webpack_require__.r(__webpack_exports__);
  24889. /* harmony import */ var _CrosshairsTool_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./CrosshairsTool.js */ "./tools/CrosshairsTool.js");
  24890. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "CrosshairsTool", function() { return _CrosshairsTool_js__WEBPACK_IMPORTED_MODULE_0__["default"]; });
  24891. /* harmony import */ var _DoubleTapFitToWindowTool_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./DoubleTapFitToWindowTool.js */ "./tools/DoubleTapFitToWindowTool.js");
  24892. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "DoubleTapFitToWindowTool", function() { return _DoubleTapFitToWindowTool_js__WEBPACK_IMPORTED_MODULE_1__["default"]; });
  24893. /* harmony import */ var _DragProbeTool_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./DragProbeTool.js */ "./tools/DragProbeTool.js");
  24894. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "DragProbeTool", function() { return _DragProbeTool_js__WEBPACK_IMPORTED_MODULE_2__["default"]; });
  24895. /* harmony import */ var _EraserTool_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./EraserTool.js */ "./tools/EraserTool.js");
  24896. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "EraserTool", function() { return _EraserTool_js__WEBPACK_IMPORTED_MODULE_3__["default"]; });
  24897. /* harmony import */ var _FreehandRoiSculptorTool_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./FreehandRoiSculptorTool.js */ "./tools/FreehandRoiSculptorTool.js");
  24898. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FreehandRoiSculptorTool", function() { return _FreehandRoiSculptorTool_js__WEBPACK_IMPORTED_MODULE_4__["default"]; });
  24899. /* harmony import */ var _MagnifyTool_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./MagnifyTool.js */ "./tools/MagnifyTool.js");
  24900. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "MagnifyTool", function() { return _MagnifyTool_js__WEBPACK_IMPORTED_MODULE_5__["default"]; });
  24901. /* harmony import */ var _OverlayTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./OverlayTool.js */ "./tools/OverlayTool.js");
  24902. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "OverlayTool", function() { return _OverlayTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]; });
  24903. /* harmony import */ var _OrientationMarkersTool_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./OrientationMarkersTool.js */ "./tools/OrientationMarkersTool.js");
  24904. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "OrientationMarkersTool", function() { return _OrientationMarkersTool_js__WEBPACK_IMPORTED_MODULE_7__["default"]; });
  24905. /* harmony import */ var _PanMultiTouchTool_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./PanMultiTouchTool.js */ "./tools/PanMultiTouchTool.js");
  24906. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "PanMultiTouchTool", function() { return _PanMultiTouchTool_js__WEBPACK_IMPORTED_MODULE_8__["default"]; });
  24907. /* harmony import */ var _PanTool_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./PanTool.js */ "./tools/PanTool.js");
  24908. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "PanTool", function() { return _PanTool_js__WEBPACK_IMPORTED_MODULE_9__["default"]; });
  24909. /* harmony import */ var _ReferenceLinesTool_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./ReferenceLinesTool.js */ "./tools/ReferenceLinesTool.js");
  24910. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ReferenceLinesTool", function() { return _ReferenceLinesTool_js__WEBPACK_IMPORTED_MODULE_10__["default"]; });
  24911. /* harmony import */ var _RotateTool_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./RotateTool.js */ "./tools/RotateTool.js");
  24912. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "RotateTool", function() { return _RotateTool_js__WEBPACK_IMPORTED_MODULE_11__["default"]; });
  24913. /* harmony import */ var _RotateTouchTool_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./RotateTouchTool.js */ "./tools/RotateTouchTool.js");
  24914. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "RotateTouchTool", function() { return _RotateTouchTool_js__WEBPACK_IMPORTED_MODULE_12__["default"]; });
  24915. /* harmony import */ var _ScaleOverlayTool_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./ScaleOverlayTool.js */ "./tools/ScaleOverlayTool.js");
  24916. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ScaleOverlayTool", function() { return _ScaleOverlayTool_js__WEBPACK_IMPORTED_MODULE_13__["default"]; });
  24917. /* harmony import */ var _StackScrollMouseWheelTool_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./StackScrollMouseWheelTool.js */ "./tools/StackScrollMouseWheelTool.js");
  24918. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "StackScrollMouseWheelTool", function() { return _StackScrollMouseWheelTool_js__WEBPACK_IMPORTED_MODULE_14__["default"]; });
  24919. /* harmony import */ var _StackScrollMultiTouchTool_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./StackScrollMultiTouchTool.js */ "./tools/StackScrollMultiTouchTool.js");
  24920. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "StackScrollMultiTouchTool", function() { return _StackScrollMultiTouchTool_js__WEBPACK_IMPORTED_MODULE_15__["default"]; });
  24921. /* harmony import */ var _StackScrollTool_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./StackScrollTool.js */ "./tools/StackScrollTool.js");
  24922. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "StackScrollTool", function() { return _StackScrollTool_js__WEBPACK_IMPORTED_MODULE_16__["default"]; });
  24923. /* harmony import */ var _WwwcRegionTool_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./WwwcRegionTool.js */ "./tools/WwwcRegionTool.js");
  24924. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "WwwcRegionTool", function() { return _WwwcRegionTool_js__WEBPACK_IMPORTED_MODULE_17__["default"]; });
  24925. /* harmony import */ var _WwwcTool_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./WwwcTool.js */ "./tools/WwwcTool.js");
  24926. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "WwwcTool", function() { return _WwwcTool_js__WEBPACK_IMPORTED_MODULE_18__["default"]; });
  24927. /* harmony import */ var _ZoomMouseWheelTool_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./ZoomMouseWheelTool.js */ "./tools/ZoomMouseWheelTool.js");
  24928. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ZoomMouseWheelTool", function() { return _ZoomMouseWheelTool_js__WEBPACK_IMPORTED_MODULE_19__["default"]; });
  24929. /* harmony import */ var _ZoomTool_js__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./ZoomTool.js */ "./tools/ZoomTool.js");
  24930. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ZoomTool", function() { return _ZoomTool_js__WEBPACK_IMPORTED_MODULE_20__["default"]; });
  24931. /* harmony import */ var _ZoomTouchPinchTool_js__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./ZoomTouchPinchTool.js */ "./tools/ZoomTouchPinchTool.js");
  24932. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ZoomTouchPinchTool", function() { return _ZoomTouchPinchTool_js__WEBPACK_IMPORTED_MODULE_21__["default"]; });
  24933. // Named Exports
  24934. // Namespace, default export
  24935. /* harmony default export */ __webpack_exports__["default"] = ({
  24936. CrosshairsTool: _CrosshairsTool_js__WEBPACK_IMPORTED_MODULE_0__["default"],
  24937. DoubleTapFitToWindowTool: _DoubleTapFitToWindowTool_js__WEBPACK_IMPORTED_MODULE_1__["default"],
  24938. DragProbeTool: _DragProbeTool_js__WEBPACK_IMPORTED_MODULE_2__["default"],
  24939. EraserTool: _EraserTool_js__WEBPACK_IMPORTED_MODULE_3__["default"],
  24940. FreehandRoiSculptorTool: _FreehandRoiSculptorTool_js__WEBPACK_IMPORTED_MODULE_4__["default"],
  24941. MagnifyTool: _MagnifyTool_js__WEBPACK_IMPORTED_MODULE_5__["default"],
  24942. OverlayTool: _OverlayTool_js__WEBPACK_IMPORTED_MODULE_6__["default"],
  24943. OrientationMarkersTool: _OrientationMarkersTool_js__WEBPACK_IMPORTED_MODULE_7__["default"],
  24944. PanMultiTouchTool: _PanMultiTouchTool_js__WEBPACK_IMPORTED_MODULE_8__["default"],
  24945. PanTool: _PanTool_js__WEBPACK_IMPORTED_MODULE_9__["default"],
  24946. ReferenceLinesTool: _ReferenceLinesTool_js__WEBPACK_IMPORTED_MODULE_10__["default"],
  24947. RotateTool: _RotateTool_js__WEBPACK_IMPORTED_MODULE_11__["default"],
  24948. RotateTouchTool: _RotateTouchTool_js__WEBPACK_IMPORTED_MODULE_12__["default"],
  24949. ScaleOverlayTool: _ScaleOverlayTool_js__WEBPACK_IMPORTED_MODULE_13__["default"],
  24950. StackScrollMouseWheelTool: _StackScrollMouseWheelTool_js__WEBPACK_IMPORTED_MODULE_14__["default"],
  24951. StackScrollMultiTouchTool: _StackScrollMultiTouchTool_js__WEBPACK_IMPORTED_MODULE_15__["default"],
  24952. StackScrollTool: _StackScrollTool_js__WEBPACK_IMPORTED_MODULE_16__["default"],
  24953. WwwcRegionTool: _WwwcRegionTool_js__WEBPACK_IMPORTED_MODULE_17__["default"],
  24954. WwwcTool: _WwwcTool_js__WEBPACK_IMPORTED_MODULE_18__["default"],
  24955. ZoomMouseWheelTool: _ZoomMouseWheelTool_js__WEBPACK_IMPORTED_MODULE_19__["default"],
  24956. ZoomTool: _ZoomTool_js__WEBPACK_IMPORTED_MODULE_20__["default"],
  24957. ZoomTouchPinchTool: _ZoomTouchPinchTool_js__WEBPACK_IMPORTED_MODULE_21__["default"]
  24958. });
  24959. /***/ }),
  24960. /***/ "./tools/referenceLines/calculateReferenceLine.js":
  24961. /*!********************************************************!*\
  24962. !*** ./tools/referenceLines/calculateReferenceLine.js ***!
  24963. \********************************************************/
  24964. /*! exports provided: default */
  24965. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  24966. "use strict";
  24967. __webpack_require__.r(__webpack_exports__);
  24968. /* harmony import */ var _util_pointProjector_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../util/pointProjector.js */ "./util/pointProjector.js");
  24969. /**
  24970. * Calculates a reference line between two planes by projecting the top left hand corner and bottom right hand corner
  24971. * Of the reference image onto the target image. Ideally we would calculate the intersection between the planes but
  24972. * That requires a bit more math and this works fine for most cases.
  24973. *
  24974. * @export
  24975. * @public
  24976. * @method
  24977. * @name calculateReferenceLine
  24978. * @param {Object} targetImagePlane The imagePlane on which the reference line will be drawn.
  24979. * @param {Object} referenceImagePlane The imagePlane being referenced.
  24980. * @returns {Object} The start and end points of the line to be drawn.
  24981. */
  24982. /* harmony default export */ __webpack_exports__["default"] = (function (targetImagePlane, referenceImagePlane) {
  24983. var points = Object(_util_pointProjector_js__WEBPACK_IMPORTED_MODULE_0__["planePlaneIntersection"])(targetImagePlane, referenceImagePlane);
  24984. if (!points) {
  24985. return;
  24986. }
  24987. return {
  24988. start: Object(_util_pointProjector_js__WEBPACK_IMPORTED_MODULE_0__["projectPatientPointToImagePlane"])(points.start, targetImagePlane),
  24989. end: Object(_util_pointProjector_js__WEBPACK_IMPORTED_MODULE_0__["projectPatientPointToImagePlane"])(points.end, targetImagePlane)
  24990. };
  24991. });
  24992. /***/ }),
  24993. /***/ "./tools/referenceLines/renderActiveReferenceLine.js":
  24994. /*!***********************************************************!*\
  24995. !*** ./tools/referenceLines/renderActiveReferenceLine.js ***!
  24996. \***********************************************************/
  24997. /*! exports provided: default */
  24998. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  24999. "use strict";
  25000. __webpack_require__.r(__webpack_exports__);
  25001. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../externalModules.js */ "./externalModules.js");
  25002. /* harmony import */ var _calculateReferenceLine_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./calculateReferenceLine.js */ "./tools/referenceLines/calculateReferenceLine.js");
  25003. /* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./../../stateManagement/toolColors.js */ "./stateManagement/toolColors.js");
  25004. /* harmony import */ var _util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./../../util/convertToVector3.js */ "./util/convertToVector3.js");
  25005. /* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./../../drawing/index.js */ "./drawing/index.js");
  25006. /**
  25007. * Renders the active reference line.
  25008. *
  25009. * @export @public @method
  25010. * @name renderActiveReferenceLine
  25011. * @param {Object} context The canvas context.
  25012. * @param {Object} eventData The data associated with the event.
  25013. * @param {HTMLElement} targetElement The element on which to render the reference line.
  25014. * @param {HTMLElement} referenceElement The element referenced by the line.
  25015. * @returns {void}
  25016. */
  25017. /* harmony default export */ __webpack_exports__["default"] = (function (context, eventData, targetElement, referenceElement) {
  25018. var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone;
  25019. var targetImage = cornerstone.getEnabledElement(targetElement).image;
  25020. var referenceImage = cornerstone.getEnabledElement(referenceElement).image; // Make sure the images are actually loaded for the target and reference
  25021. if (!targetImage || !referenceImage) {
  25022. return;
  25023. }
  25024. var targetImagePlane = cornerstone.metaData.get('imagePlaneModule', targetImage.imageId);
  25025. var referenceImagePlane = cornerstone.metaData.get('imagePlaneModule', referenceImage.imageId); // Make sure the target and reference actually have image plane metadata
  25026. if (!targetImagePlane || !referenceImagePlane || !targetImagePlane.rowCosines || !targetImagePlane.columnCosines || !targetImagePlane.imagePositionPatient || !referenceImagePlane.rowCosines || !referenceImagePlane.columnCosines || !referenceImagePlane.imagePositionPatient) {
  25027. return;
  25028. } // The image planes must be in the same frame of reference
  25029. if (targetImagePlane.frameOfReferenceUID !== referenceImagePlane.frameOfReferenceUID) {
  25030. return;
  25031. }
  25032. targetImagePlane.rowCosines = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_3__["default"])(targetImagePlane.rowCosines);
  25033. targetImagePlane.columnCosines = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_3__["default"])(targetImagePlane.columnCosines);
  25034. targetImagePlane.imagePositionPatient = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_3__["default"])(targetImagePlane.imagePositionPatient);
  25035. referenceImagePlane.rowCosines = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_3__["default"])(referenceImagePlane.rowCosines);
  25036. referenceImagePlane.columnCosines = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_3__["default"])(referenceImagePlane.columnCosines);
  25037. referenceImagePlane.imagePositionPatient = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_3__["default"])(referenceImagePlane.imagePositionPatient); // The image plane normals must be > 30 degrees apart
  25038. var targetNormal = targetImagePlane.rowCosines.clone().cross(targetImagePlane.columnCosines);
  25039. var referenceNormal = referenceImagePlane.rowCosines.clone().cross(referenceImagePlane.columnCosines);
  25040. var angleInRadians = targetNormal.angleTo(referenceNormal);
  25041. angleInRadians = Math.abs(angleInRadians);
  25042. if (angleInRadians < 0.5) {
  25043. // 0.5 radians = ~30 degrees
  25044. return;
  25045. }
  25046. var referenceLine = Object(_calculateReferenceLine_js__WEBPACK_IMPORTED_MODULE_1__["default"])(targetImagePlane, referenceImagePlane);
  25047. if (!referenceLine) {
  25048. return;
  25049. }
  25050. var color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_2__["default"].getActiveColor(); // Draw the referenceLines
  25051. context.setTransform(1, 0, 0, 1, 0, 0);
  25052. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_4__["draw"])(context, function (context) {
  25053. Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_4__["drawLine"])(context, eventData.element, referenceLine.start, referenceLine.end, {
  25054. color: color
  25055. });
  25056. });
  25057. });
  25058. /***/ }),
  25059. /***/ "./tools/segmentation/BrushTool.js":
  25060. /*!*****************************************!*\
  25061. !*** ./tools/segmentation/BrushTool.js ***!
  25062. \*****************************************/
  25063. /*! exports provided: default */
  25064. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  25065. "use strict";
  25066. __webpack_require__.r(__webpack_exports__);
  25067. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return BrushTool; });
  25068. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
  25069. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
  25070. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
  25071. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
  25072. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
  25073. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
  25074. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
  25075. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
  25076. /* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js");
  25077. /* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__);
  25078. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
  25079. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__);
  25080. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./../../externalModules.js */ "./externalModules.js");
  25081. /* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../base */ "./tools/base/index.js");
  25082. /* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./../../store/index.js */ "./store/index.js");
  25083. /* harmony import */ var _util_segmentation_index_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../util/segmentation/index.js */ "./util/segmentation/index.js");
  25084. /* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../util/logger.js */ "./util/logger.js");
  25085. var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_10__["getLogger"])('tools:BrushTool');
  25086. var segmentationModule = Object(_store_index_js__WEBPACK_IMPORTED_MODULE_8__["getModule"])('segmentation');
  25087. /**
  25088. * @public
  25089. * @class BrushTool
  25090. * @memberof Tools.Brush
  25091. * @classdesc Tool for drawing segmentations on an image.
  25092. * @extends Tools.Base.BaseBrushTool
  25093. */
  25094. var BrushTool =
  25095. /*#__PURE__*/
  25096. function (_BaseBrushTool) {
  25097. _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(BrushTool, _BaseBrushTool);
  25098. function BrushTool() {
  25099. var _this;
  25100. var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  25101. _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, BrushTool);
  25102. var defaultProps = {
  25103. name: 'Brush',
  25104. supportedInteractionTypes: ['Mouse', 'Touch'],
  25105. configuration: {},
  25106. mixins: ['renderBrushMixin']
  25107. };
  25108. _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(BrushTool).call(this, props, defaultProps));
  25109. _this.touchDragCallback = _this._paint.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  25110. return _this;
  25111. }
  25112. /**
  25113. * Paints the data to the labelmap.
  25114. *
  25115. * @protected
  25116. * @param {Object} evt The data object associated with the event.
  25117. * @returns {void}
  25118. */
  25119. _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(BrushTool, [{
  25120. key: "_paint",
  25121. value: function _paint(evt) {
  25122. var configuration = segmentationModule.configuration;
  25123. var eventData = evt.detail;
  25124. var element = eventData.element;
  25125. var _eventData$image = eventData.image,
  25126. rows = _eventData$image.rows,
  25127. columns = _eventData$image.columns;
  25128. var _eventData$currentPoi = eventData.currentPoints.image,
  25129. x = _eventData$currentPoi.x,
  25130. y = _eventData$currentPoi.y;
  25131. if (x < 0 || x > columns || y < 0 || y > rows) {
  25132. return;
  25133. }
  25134. var radius = configuration.radius;
  25135. var pointerArray = Object(_util_segmentation_index_js__WEBPACK_IMPORTED_MODULE_9__["getCircle"])(radius, rows, columns, x, y);
  25136. var _this$paintEventData = this.paintEventData,
  25137. labelmap2D = _this$paintEventData.labelmap2D,
  25138. labelmap3D = _this$paintEventData.labelmap3D,
  25139. shouldErase = _this$paintEventData.shouldErase; // Draw / Erase the active color.
  25140. Object(_util_segmentation_index_js__WEBPACK_IMPORTED_MODULE_9__["drawBrushPixels"])(pointerArray, labelmap2D.pixelData, labelmap3D.activeSegmentIndex, columns, shouldErase);
  25141. _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.updateImage(evt.detail.element);
  25142. }
  25143. }]);
  25144. return BrushTool;
  25145. }(_base__WEBPACK_IMPORTED_MODULE_7__["BaseBrushTool"]);
  25146. /***/ }),
  25147. /***/ "./tools/segmentation/CircleScissorsTool.js":
  25148. /*!**************************************************!*\
  25149. !*** ./tools/segmentation/CircleScissorsTool.js ***!
  25150. \**************************************************/
  25151. /*! exports provided: default */
  25152. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  25153. "use strict";
  25154. __webpack_require__.r(__webpack_exports__);
  25155. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return CircleScissorsTool; });
  25156. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
  25157. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
  25158. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
  25159. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_1__);
  25160. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
  25161. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_2__);
  25162. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
  25163. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_3__);
  25164. /* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../base */ "./tools/base/index.js");
  25165. /* harmony import */ var _strategies__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./strategies */ "./tools/segmentation/strategies/index.js");
  25166. /* harmony import */ var _cursors__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../cursors */ "./tools/cursors/index.js");
  25167. /**
  25168. * @public
  25169. * @class CircleScissorsTool
  25170. * @memberof Tools
  25171. * @classdesc Tool for manipulating labelmap data by drawing a circle.
  25172. * @extends Tools.Base.BaseTool
  25173. */
  25174. var CircleScissorsTool =
  25175. /*#__PURE__*/
  25176. function (_BaseTool) {
  25177. _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_3___default()(CircleScissorsTool, _BaseTool);
  25178. /** @inheritdoc */
  25179. function CircleScissorsTool() {
  25180. var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  25181. _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, CircleScissorsTool);
  25182. var defaultProps = {
  25183. name: 'CircleScissors',
  25184. strategies: {
  25185. FILL_INSIDE: _strategies__WEBPACK_IMPORTED_MODULE_5__["fillInsideCircle"],
  25186. FILL_OUTSIDE: _strategies__WEBPACK_IMPORTED_MODULE_5__["fillOutsideCircle"],
  25187. ERASE_OUTSIDE: _strategies__WEBPACK_IMPORTED_MODULE_5__["eraseOutsideCircle"],
  25188. ERASE_INSIDE: _strategies__WEBPACK_IMPORTED_MODULE_5__["eraseInsideCircle"]
  25189. },
  25190. cursors: {
  25191. FILL_INSIDE: _cursors__WEBPACK_IMPORTED_MODULE_6__["segCircleFillInsideCursor"],
  25192. FILL_OUTSIDE: _cursors__WEBPACK_IMPORTED_MODULE_6__["segCircleFillOutsideCursor"],
  25193. ERASE_OUTSIDE: _cursors__WEBPACK_IMPORTED_MODULE_6__["segCircleEraseOutsideCursor"],
  25194. ERASE_INSIDE: _cursors__WEBPACK_IMPORTED_MODULE_6__["segCircleEraseInsideCursor"]
  25195. },
  25196. defaultStrategy: 'FILL_INSIDE',
  25197. supportedInteractionTypes: ['Mouse', 'Touch'],
  25198. svgCursor: _cursors__WEBPACK_IMPORTED_MODULE_6__["segCircleFillInsideCursor"],
  25199. mixins: ['circleSegmentationMixin']
  25200. };
  25201. return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_1___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_2___default()(CircleScissorsTool).call(this, props, defaultProps));
  25202. }
  25203. return CircleScissorsTool;
  25204. }(_base__WEBPACK_IMPORTED_MODULE_4__["BaseTool"]);
  25205. /***/ }),
  25206. /***/ "./tools/segmentation/CorrectionScissorsTool.js":
  25207. /*!******************************************************!*\
  25208. !*** ./tools/segmentation/CorrectionScissorsTool.js ***!
  25209. \******************************************************/
  25210. /*! exports provided: default */
  25211. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  25212. "use strict";
  25213. __webpack_require__.r(__webpack_exports__);
  25214. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return CorrectionScissorsTool; });
  25215. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
  25216. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
  25217. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
  25218. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_1__);
  25219. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
  25220. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_2__);
  25221. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
  25222. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_3__);
  25223. /* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../base */ "./tools/base/index.js");
  25224. /* harmony import */ var _cursors__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../cursors */ "./tools/cursors/index.js");
  25225. /* harmony import */ var _strategies__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./strategies */ "./tools/segmentation/strategies/index.js");
  25226. /**
  25227. * @public
  25228. * @class CorrectionScissorsTool
  25229. * @memberof Tools
  25230. * @classdesc Tool for correcting segments on a labelmap.
  25231. * @extends Tools.Base.BaseTool
  25232. */
  25233. var CorrectionScissorsTool =
  25234. /*#__PURE__*/
  25235. function (_BaseTool) {
  25236. _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_3___default()(CorrectionScissorsTool, _BaseTool);
  25237. /** @inheritdoc */
  25238. function CorrectionScissorsTool() {
  25239. var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  25240. _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, CorrectionScissorsTool);
  25241. var defaultProps = {
  25242. name: 'CorrectionScissors',
  25243. strategies: {
  25244. CORRECTION: _strategies__WEBPACK_IMPORTED_MODULE_6__["correction"]
  25245. },
  25246. cursors: {
  25247. CORRECTION: _cursors__WEBPACK_IMPORTED_MODULE_5__["freehandFillInsideCursor"]
  25248. },
  25249. defaultStrategy: 'CORRECTION',
  25250. supportedInteractionTypes: ['Mouse', 'Touch'],
  25251. svgCursor: _cursors__WEBPACK_IMPORTED_MODULE_5__["freehandFillInsideCursor"],
  25252. mixins: ['polylineSegmentationMixin']
  25253. };
  25254. return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_1___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_2___default()(CorrectionScissorsTool).call(this, props, defaultProps));
  25255. }
  25256. return CorrectionScissorsTool;
  25257. }(_base__WEBPACK_IMPORTED_MODULE_4__["BaseTool"]);
  25258. /***/ }),
  25259. /***/ "./tools/segmentation/FreehandScissorsTool.js":
  25260. /*!****************************************************!*\
  25261. !*** ./tools/segmentation/FreehandScissorsTool.js ***!
  25262. \****************************************************/
  25263. /*! exports provided: default */
  25264. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  25265. "use strict";
  25266. __webpack_require__.r(__webpack_exports__);
  25267. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return FreehandScissorsTool; });
  25268. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
  25269. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
  25270. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
  25271. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_1__);
  25272. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
  25273. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_2__);
  25274. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
  25275. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_3__);
  25276. /* harmony import */ var _cursors__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../cursors */ "./tools/cursors/index.js");
  25277. /* harmony import */ var _strategies__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./strategies */ "./tools/segmentation/strategies/index.js");
  25278. /* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../base */ "./tools/base/index.js");
  25279. /**
  25280. * @public
  25281. * @class FreehandScissorsTool
  25282. * @memberof Tools
  25283. * @classdesc Tool for manipulating labelmap data by drawing a freehand polygon.
  25284. * @extends Tools.Base.BaseTool
  25285. */
  25286. var FreehandScissorsTool =
  25287. /*#__PURE__*/
  25288. function (_BaseTool) {
  25289. _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_3___default()(FreehandScissorsTool, _BaseTool);
  25290. /** @inheritdoc */
  25291. function FreehandScissorsTool() {
  25292. var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  25293. _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, FreehandScissorsTool);
  25294. var defaultProps = {
  25295. name: 'FreehandScissors',
  25296. strategies: {
  25297. FILL_INSIDE: _strategies__WEBPACK_IMPORTED_MODULE_5__["fillInsideFreehand"],
  25298. FILL_OUTSIDE: _strategies__WEBPACK_IMPORTED_MODULE_5__["fillOutsideFreehand"],
  25299. ERASE_OUTSIDE: _strategies__WEBPACK_IMPORTED_MODULE_5__["eraseOutsideFreehand"],
  25300. ERASE_INSIDE: _strategies__WEBPACK_IMPORTED_MODULE_5__["eraseInsideFreehand"]
  25301. },
  25302. cursors: {
  25303. FILL_INSIDE: _cursors__WEBPACK_IMPORTED_MODULE_4__["freehandFillInsideCursor"],
  25304. FILL_OUTSIDE: _cursors__WEBPACK_IMPORTED_MODULE_4__["freehandFillOutsideCursor"],
  25305. ERASE_OUTSIDE: _cursors__WEBPACK_IMPORTED_MODULE_4__["freehandEraseOutsideCursor"],
  25306. ERASE_INSIDE: _cursors__WEBPACK_IMPORTED_MODULE_4__["freehandEraseInsideCursor"]
  25307. },
  25308. defaultStrategy: 'FILL_INSIDE',
  25309. supportedInteractionTypes: ['Mouse', 'Touch'],
  25310. svgCursor: _cursors__WEBPACK_IMPORTED_MODULE_4__["freehandFillInsideCursor"],
  25311. mixins: ['freehandSegmentationMixin']
  25312. };
  25313. return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_1___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_2___default()(FreehandScissorsTool).call(this, props, defaultProps));
  25314. }
  25315. return FreehandScissorsTool;
  25316. }(_base__WEBPACK_IMPORTED_MODULE_6__["BaseTool"]);
  25317. /***/ }),
  25318. /***/ "./tools/segmentation/RectangleScissorsTool.js":
  25319. /*!*****************************************************!*\
  25320. !*** ./tools/segmentation/RectangleScissorsTool.js ***!
  25321. \*****************************************************/
  25322. /*! exports provided: default */
  25323. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  25324. "use strict";
  25325. __webpack_require__.r(__webpack_exports__);
  25326. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return RectangleScissorsTool; });
  25327. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
  25328. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
  25329. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
  25330. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_1__);
  25331. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
  25332. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_2__);
  25333. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
  25334. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_3__);
  25335. /* harmony import */ var _base__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../base */ "./tools/base/index.js");
  25336. /* harmony import */ var _strategies__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./strategies */ "./tools/segmentation/strategies/index.js");
  25337. /* harmony import */ var _cursors__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../cursors */ "./tools/cursors/index.js");
  25338. /**
  25339. * @public
  25340. * @class RectangleScissorsTool
  25341. * @memberof Tools
  25342. * @classdesc Tool for manipulating labelmap data by drawing a rectangle.
  25343. * @extends Tools.Base.BaseTool
  25344. */
  25345. var RectangleScissorsTool =
  25346. /*#__PURE__*/
  25347. function (_BaseTool) {
  25348. _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_3___default()(RectangleScissorsTool, _BaseTool);
  25349. /** @inheritdoc */
  25350. function RectangleScissorsTool() {
  25351. var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  25352. _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, RectangleScissorsTool);
  25353. var defaultProps = {
  25354. name: 'RectangleScissors',
  25355. strategies: {
  25356. FILL_INSIDE: _strategies__WEBPACK_IMPORTED_MODULE_5__["fillInsideRectangle"],
  25357. FILL_OUTSIDE: _strategies__WEBPACK_IMPORTED_MODULE_5__["fillOutsideRectangle"],
  25358. ERASE_OUTSIDE: _strategies__WEBPACK_IMPORTED_MODULE_5__["eraseOutsideRectangle"],
  25359. ERASE_INSIDE: _strategies__WEBPACK_IMPORTED_MODULE_5__["eraseInsideRectangle"]
  25360. },
  25361. cursors: {
  25362. FILL_INSIDE: _cursors__WEBPACK_IMPORTED_MODULE_6__["segRectangleFillInsideCursor"],
  25363. FILL_OUTSIDE: _cursors__WEBPACK_IMPORTED_MODULE_6__["segRectangleFillOutsideCursor"],
  25364. ERASE_OUTSIDE: _cursors__WEBPACK_IMPORTED_MODULE_6__["segRectangleEraseOutsideCursor"],
  25365. ERASE_INSIDE: _cursors__WEBPACK_IMPORTED_MODULE_6__["segRectangleEraseInsideCursor"]
  25366. },
  25367. defaultStrategy: 'FILL_INSIDE',
  25368. supportedInteractionTypes: ['Mouse', 'Touch'],
  25369. mixins: ['rectangleSegmentationMixin']
  25370. };
  25371. return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_1___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_2___default()(RectangleScissorsTool).call(this, props, defaultProps));
  25372. }
  25373. return RectangleScissorsTool;
  25374. }(_base__WEBPACK_IMPORTED_MODULE_4__["BaseTool"]);
  25375. /***/ }),
  25376. /***/ "./tools/segmentation/SphericalBrushTool.js":
  25377. /*!**************************************************!*\
  25378. !*** ./tools/segmentation/SphericalBrushTool.js ***!
  25379. \**************************************************/
  25380. /*! exports provided: default */
  25381. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  25382. "use strict";
  25383. __webpack_require__.r(__webpack_exports__);
  25384. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return SphericalBrushTool; });
  25385. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
  25386. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
  25387. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
  25388. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
  25389. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js");
  25390. /* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__);
  25391. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
  25392. /* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__);
  25393. /* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js");
  25394. /* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__);
  25395. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js");
  25396. /* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__);
  25397. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./../../externalModules.js */ "./externalModules.js");
  25398. /* harmony import */ var _base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../base/BaseBrushTool.js */ "./tools/base/BaseBrushTool.js");
  25399. /* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./../../store/index.js */ "./store/index.js");
  25400. /* harmony import */ var _util_segmentation__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./../../util/segmentation */ "./util/segmentation/index.js");
  25401. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  25402. /* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../util/logger.js */ "./util/logger.js");
  25403. var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_11__["getLogger"])('tools:SphericalBrushTool');
  25404. var segmentationModule = Object(_store_index_js__WEBPACK_IMPORTED_MODULE_8__["getModule"])('segmentation');
  25405. /**
  25406. * @public
  25407. * @class BrushTool
  25408. * @memberof Tools.Brush
  25409. * @classdesc Tool for drawing segmentations on an image.
  25410. * @extends Tools.Base.BaseBrushTool
  25411. */
  25412. var SphericalBrushTool =
  25413. /*#__PURE__*/
  25414. function (_BaseBrushTool) {
  25415. _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(SphericalBrushTool, _BaseBrushTool);
  25416. function SphericalBrushTool() {
  25417. var _this;
  25418. var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  25419. _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, SphericalBrushTool);
  25420. var defaultProps = {
  25421. name: 'SphericalBrush',
  25422. supportedInteractionTypes: ['Mouse', 'Touch'],
  25423. configuration: {
  25424. alwaysEraseOnClick: false
  25425. },
  25426. mixins: ['renderBrushMixin']
  25427. };
  25428. _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(SphericalBrushTool).call(this, props, defaultProps));
  25429. _this.touchDragCallback = _this._paint.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this));
  25430. return _this;
  25431. }
  25432. /**
  25433. * Initialise painting with BaseBrushTool.
  25434. *
  25435. * @abstract
  25436. * @event
  25437. * @param {Object} evt - The event.
  25438. * @returns {void}
  25439. */
  25440. _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(SphericalBrushTool, [{
  25441. key: "_startPainting",
  25442. value: function _startPainting(evt) {
  25443. var configuration = segmentationModule.configuration,
  25444. getters = segmentationModule.getters;
  25445. var eventData = evt.detail;
  25446. var element = eventData.element,
  25447. image = eventData.image;
  25448. var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone;
  25449. var radius = configuration.radius;
  25450. var rows = image.rows,
  25451. columns = image.columns;
  25452. var pixelSpacing = Math.max(image.rowPixelSpacing, image.columnPixelSpacing);
  25453. var stackState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_10__["getToolState"])(element, 'stack');
  25454. var stackData = stackState.data[0];
  25455. var imageIds = stackData.imageIds;
  25456. var _getters$labelmap2D = getters.labelmap2D(element),
  25457. labelmap2D = _getters$labelmap2D.labelmap2D,
  25458. labelmap3D = _getters$labelmap2D.labelmap3D,
  25459. currentImageIdIndex = _getters$labelmap2D.currentImageIdIndex,
  25460. activeLabelmapIndex = _getters$labelmap2D.activeLabelmapIndex;
  25461. var shouldErase = this._isCtrlDown(eventData) || this.configuration.alwaysEraseOnClick;
  25462. var imagePlaneOfCurrentImage = cornerstone.metaData.get('imagePlaneModule', image.imageId);
  25463. var imagesInRange;
  25464. if (imagePlaneOfCurrentImage) {
  25465. var ippOfCurrentImage = imagePlaneOfCurrentImage.imagePositionPatient;
  25466. imagesInRange = this._getImagesInRange(currentImageIdIndex, ippOfCurrentImage, imageIds, radius, pixelSpacing);
  25467. } else {
  25468. logger.warn("No imagePlane metadata found for image, defaulting to circle brush application.");
  25469. imagesInRange = [// The current image.
  25470. {
  25471. imageIdIndex: currentImageIdIndex,
  25472. radiusOnImage: radius
  25473. }];
  25474. }
  25475. this.paintEventData = {
  25476. labelmap2D: labelmap2D,
  25477. labelmap3D: labelmap3D,
  25478. currentImageIdIndex: currentImageIdIndex,
  25479. activeLabelmapIndex: activeLabelmapIndex,
  25480. shouldErase: shouldErase,
  25481. imagesInRange: imagesInRange
  25482. };
  25483. if (configuration.storeHistory) {
  25484. var previousPixeldataForImagesInRange = [];
  25485. for (var i = 0; i < imagesInRange.length; i++) {
  25486. var imageIdIndex = imagesInRange[i].imageIdIndex;
  25487. var labelmap2DForImageIdIndex = getters.labelmap2DByImageIdIndex(labelmap3D, imageIdIndex, rows, columns);
  25488. var previousPixeldata = labelmap2DForImageIdIndex.pixelData.slice();
  25489. previousPixeldataForImagesInRange.push(previousPixeldata);
  25490. }
  25491. this.paintEventData.previousPixeldataForImagesInRange = previousPixeldataForImagesInRange;
  25492. }
  25493. }
  25494. /**
  25495. * Paints the data to the labelmap.
  25496. *
  25497. * @private
  25498. * @param {Object} evt The data object associated with the event.
  25499. * @returns {void}
  25500. */
  25501. }, {
  25502. key: "_paint",
  25503. value: function _paint(evt) {
  25504. var getters = segmentationModule.getters;
  25505. var eventData = evt.detail;
  25506. var element = eventData.element;
  25507. var image = eventData.image;
  25508. var rows = image.rows,
  25509. columns = image.columns;
  25510. var _eventData$currentPoi = eventData.currentPoints.image,
  25511. x = _eventData$currentPoi.x,
  25512. y = _eventData$currentPoi.y;
  25513. if (x < 0 || x > columns || y < 0 || y > rows) {
  25514. return;
  25515. }
  25516. var _this$paintEventData = this.paintEventData,
  25517. labelmap3D = _this$paintEventData.labelmap3D,
  25518. imagesInRange = _this$paintEventData.imagesInRange,
  25519. shouldErase = _this$paintEventData.shouldErase;
  25520. for (var i = 0; i < imagesInRange.length; i++) {
  25521. var _imagesInRange$i = imagesInRange[i],
  25522. imageIdIndex = _imagesInRange$i.imageIdIndex,
  25523. radiusOnImage = _imagesInRange$i.radiusOnImage;
  25524. var pointerArray = Object(_util_segmentation__WEBPACK_IMPORTED_MODULE_9__["getCircle"])(radiusOnImage, rows, columns, x, y); // Cache the view on this image if its not present.
  25525. var labelmap2DForImageIdIndex = getters.labelmap2DByImageIdIndex(labelmap3D, imageIdIndex, rows, columns); // Draw / Erase the active color.
  25526. Object(_util_segmentation__WEBPACK_IMPORTED_MODULE_9__["drawBrushPixels"])(pointerArray, labelmap2DForImageIdIndex.pixelData, labelmap3D.activeSegmentIndex, columns, shouldErase);
  25527. }
  25528. _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.updateImage(evt.detail.element);
  25529. }
  25530. /**
  25531. * _getImagesInRange - Returns an array of image Ids within range of the
  25532. * sphere, and the in-plane brush radii of those images.
  25533. *
  25534. * @param {string} currentImageIdIndex The imageId of the image displayed on
  25535. * the cornerstone enabled element.
  25536. * @param {number[]} ippOfCurrentImage The image position patient of the image.
  25537. * @param {string[]} imageIds An array of images in the stack.
  25538. * @param {number} radius The radius of the sphere.
  25539. * @param {number} pixelSpacing The pixelSpacing.
  25540. * @returns {Object[]} An array of imageIds in range and their
  25541. * in plane brush radii.
  25542. */
  25543. }, {
  25544. key: "_getImagesInRange",
  25545. value: function _getImagesInRange(currentImageIdIndex, ippOfCurrentImage, imageIds, radius, pixelSpacing) {
  25546. var radiusInMM = radius * pixelSpacing;
  25547. var imagesInRange = [// The current image.
  25548. {
  25549. imageIdIndex: currentImageIdIndex,
  25550. radiusOnImage: radius
  25551. }]; // Check images above
  25552. for (var i = currentImageIdIndex + 1; i < imageIds.length; i++) {
  25553. var radiusOnImage = this._getRadiusOnImage(imageIds[i], ippOfCurrentImage, radiusInMM, pixelSpacing);
  25554. if (!radiusOnImage) {
  25555. break;
  25556. }
  25557. imagesInRange.push({
  25558. imageIdIndex: i,
  25559. radiusOnImage: radiusOnImage
  25560. });
  25561. } // Check images below
  25562. for (var _i = currentImageIdIndex - 1; _i >= 0; _i--) {
  25563. var _radiusOnImage = this._getRadiusOnImage(imageIds[_i], ippOfCurrentImage, radiusInMM, pixelSpacing);
  25564. if (!_radiusOnImage) {
  25565. break;
  25566. }
  25567. imagesInRange.push({
  25568. imageIdIndex: _i,
  25569. radiusOnImage: _radiusOnImage
  25570. });
  25571. }
  25572. return imagesInRange;
  25573. }
  25574. /**
  25575. * _getRadiusOnImage - If the image is in range of the spherical brush, returns
  25576. * the in-plane brush radius on that image.
  25577. *
  25578. * @param {string} imageId The cornerstone imageId of the image.
  25579. * @param {number[]} ippOfCurrentImage The image position patient of the current image.
  25580. * @param {number} radiusInMM The radius of the sphere in millimeters.
  25581. * @param {string} pixelSpacing The pixelspacing.
  25582. * @returns {number|undefined} The brush radius on the image, undefined if
  25583. * the image is out of range of the sphere.
  25584. */
  25585. }, {
  25586. key: "_getRadiusOnImage",
  25587. value: function _getRadiusOnImage(imageId, ippOfCurrentImage, radiusInMM, pixelSpacing) {
  25588. var imagePlane = _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.metaData.get('imagePlaneModule', imageId);
  25589. if (!imagePlane) {
  25590. logger.warn("Can't find imagePlane metadata for image, cancelling spherical brushing on: ".concat(imageId, ","));
  25591. return;
  25592. }
  25593. var ipp = imagePlane.imagePositionPatient;
  25594. var distance = Math.sqrt(Math.pow(ipp[0] - ippOfCurrentImage[0], 2) + Math.pow(ipp[1] - ippOfCurrentImage[1], 2) + Math.pow(ipp[2] - ippOfCurrentImage[2], 2));
  25595. if (distance > radiusInMM) {
  25596. // Image too far away, break!
  25597. return;
  25598. }
  25599. return Math.floor(Math.sqrt(Math.pow(radiusInMM, 2) - Math.pow(distance, 2)) / pixelSpacing);
  25600. }
  25601. }, {
  25602. key: "_endPainting",
  25603. value: function _endPainting(evt) {
  25604. var _this$paintEventData2 = this.paintEventData,
  25605. labelmap3D = _this$paintEventData2.labelmap3D,
  25606. imagesInRange = _this$paintEventData2.imagesInRange;
  25607. var operations = [];
  25608. var configuration = segmentationModule.configuration,
  25609. setters = segmentationModule.setters;
  25610. for (var i = 0; i < imagesInRange.length; i++) {
  25611. var imageIdIndex = imagesInRange[i].imageIdIndex;
  25612. var labelmap2D = labelmap3D.labelmaps2D[imageIdIndex]; // Grab the labels on the slice.
  25613. var segmentSet = new Set(labelmap2D.pixelData);
  25614. var iterator = segmentSet.values();
  25615. var segmentsOnLabelmap = [];
  25616. var done = false;
  25617. while (!done) {
  25618. var next = iterator.next();
  25619. done = next.done;
  25620. if (!done) {
  25621. segmentsOnLabelmap.push(next.value);
  25622. }
  25623. }
  25624. labelmap2D.segmentsOnLabelmap = segmentsOnLabelmap;
  25625. if (configuration.storeHistory) {
  25626. var previousPixeldataForImagesInRange = this.paintEventData.previousPixeldataForImagesInRange;
  25627. var previousPixeldata = previousPixeldataForImagesInRange[i];
  25628. var _labelmap2D = labelmap3D.labelmaps2D[imageIdIndex];
  25629. var newPixelData = _labelmap2D.pixelData;
  25630. operations.push({
  25631. imageIdIndex: imageIdIndex,
  25632. diff: Object(_util_segmentation__WEBPACK_IMPORTED_MODULE_9__["getDiffBetweenPixelData"])(previousPixeldata, newPixelData)
  25633. });
  25634. }
  25635. }
  25636. if (configuration.storeHistory) {
  25637. setters.pushState(this.element, operations);
  25638. }
  25639. Object(_util_segmentation__WEBPACK_IMPORTED_MODULE_9__["triggerLabelmapModifiedEvent"])(this.element);
  25640. }
  25641. }]);
  25642. return SphericalBrushTool;
  25643. }(_base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_7__["default"]);
  25644. /***/ }),
  25645. /***/ "./tools/segmentation/index.js":
  25646. /*!*************************************!*\
  25647. !*** ./tools/segmentation/index.js ***!
  25648. \*************************************/
  25649. /*! exports provided: BrushTool, SphericalBrushTool, FreehandScissorsTool, RectangleScissorsTool, CircleScissorsTool, CorrectionScissorsTool, default */
  25650. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  25651. "use strict";
  25652. __webpack_require__.r(__webpack_exports__);
  25653. /* harmony import */ var _BrushTool__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BrushTool */ "./tools/segmentation/BrushTool.js");
  25654. /* harmony import */ var _SphericalBrushTool__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./SphericalBrushTool */ "./tools/segmentation/SphericalBrushTool.js");
  25655. /* harmony import */ var _FreehandScissorsTool__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./FreehandScissorsTool */ "./tools/segmentation/FreehandScissorsTool.js");
  25656. /* harmony import */ var _RectangleScissorsTool__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./RectangleScissorsTool */ "./tools/segmentation/RectangleScissorsTool.js");
  25657. /* harmony import */ var _CircleScissorsTool__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./CircleScissorsTool */ "./tools/segmentation/CircleScissorsTool.js");
  25658. /* harmony import */ var _CorrectionScissorsTool__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./CorrectionScissorsTool */ "./tools/segmentation/CorrectionScissorsTool.js");
  25659. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BrushTool", function() { return _BrushTool__WEBPACK_IMPORTED_MODULE_0__["default"]; });
  25660. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SphericalBrushTool", function() { return _SphericalBrushTool__WEBPACK_IMPORTED_MODULE_1__["default"]; });
  25661. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FreehandScissorsTool", function() { return _FreehandScissorsTool__WEBPACK_IMPORTED_MODULE_2__["default"]; });
  25662. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "RectangleScissorsTool", function() { return _RectangleScissorsTool__WEBPACK_IMPORTED_MODULE_3__["default"]; });
  25663. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "CircleScissorsTool", function() { return _CircleScissorsTool__WEBPACK_IMPORTED_MODULE_4__["default"]; });
  25664. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "CorrectionScissorsTool", function() { return _CorrectionScissorsTool__WEBPACK_IMPORTED_MODULE_5__["default"]; });
  25665. // Named Exports
  25666. // Namespace, default export
  25667. /* harmony default export */ __webpack_exports__["default"] = ({
  25668. BrushTool: _BrushTool__WEBPACK_IMPORTED_MODULE_0__["default"],
  25669. SphericalBrushTool: _SphericalBrushTool__WEBPACK_IMPORTED_MODULE_1__["default"],
  25670. CircleScissorsTool: _CircleScissorsTool__WEBPACK_IMPORTED_MODULE_4__["default"],
  25671. CorrectionScissorsTool: _CorrectionScissorsTool__WEBPACK_IMPORTED_MODULE_5__["default"],
  25672. FreehandScissorsTool: _FreehandScissorsTool__WEBPACK_IMPORTED_MODULE_2__["default"],
  25673. RectangleScissorsTool: _RectangleScissorsTool__WEBPACK_IMPORTED_MODULE_3__["default"]
  25674. });
  25675. /***/ }),
  25676. /***/ "./tools/segmentation/strategies/correction.js":
  25677. /*!*****************************************************!*\
  25678. !*** ./tools/segmentation/strategies/correction.js ***!
  25679. \*****************************************************/
  25680. /*! exports provided: default */
  25681. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  25682. "use strict";
  25683. __webpack_require__.r(__webpack_exports__);
  25684. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return correction; });
  25685. /* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "../node_modules/@babel/runtime/helpers/toConsumableArray.js");
  25686. /* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__);
  25687. /* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./index.js */ "./tools/segmentation/strategies/index.js");
  25688. /* harmony import */ var _util_segmentation__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../util/segmentation */ "./util/segmentation/index.js");
  25689. /* harmony import */ var _util_clip__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../util/clip */ "./util/clip.js");
  25690. /* harmony import */ var _util_isPointInImage__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../util/isPointInImage */ "./util/isPointInImage.js");
  25691. /* harmony import */ var _util_logger__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../util/logger */ "./util/logger.js");
  25692. var logger = Object(_util_logger__WEBPACK_IMPORTED_MODULE_5__["getLogger"])('util:segmentation:operations:correction');
  25693. /**
  25694. * Using the stroke given, determine which action(s) to perfom:
  25695. * - Stroke starts and ends inside a segmentation: Behaves as an subtractive freehand scissors.
  25696. * - Stroke starts and ends outside a segmentation: Behaves as an additive freehand scissors.
  25697. * - Stroke out-in-out: Section is subtracted.
  25698. * - Stroke in-out-in: Section is added.
  25699. *
  25700. * @param {Object} evt The cornerstone event.
  25701. * @param {Object} operationData An object containing the `pixelData` to
  25702. * modify, the `segmentIndex` and the `points` array.
  25703. *
  25704. * @returns {null}
  25705. */
  25706. function correction(evt, operationData) {
  25707. var pixelData = operationData.pixelData,
  25708. segmentIndex = operationData.segmentIndex,
  25709. segmentationMixinType = operationData.segmentationMixinType;
  25710. if (segmentationMixinType !== "freehandSegmentationMixin") {
  25711. logger.error("correction operation requires freehandSegmentationMixin operationData, recieved ".concat(segmentationMixinType));
  25712. return;
  25713. }
  25714. var nodes = snapPointsToGrid(evt, operationData);
  25715. var scissorOperation = checkIfSimpleScissorOperation(nodes, segmentIndex);
  25716. if (scissorOperation.isScissorOperation) {
  25717. if (scissorOperation.operation === 'fillInsideFreehand') {
  25718. logger.warn('The line never intersects a segment.');
  25719. Object(_index_js__WEBPACK_IMPORTED_MODULE_1__["fillInsideFreehand"])(evt, operationData);
  25720. } else if (scissorOperation.operation === 'eraseInsideFreehand') {
  25721. logger.warn('The line is only ever inside the segment.');
  25722. Object(_index_js__WEBPACK_IMPORTED_MODULE_1__["eraseInsideFreehand"])(evt, operationData);
  25723. }
  25724. return;
  25725. } // Create binary labelmap with only this segment for calculations of each operation.
  25726. var workingLabelMap = new Uint8Array(pixelData.length);
  25727. var operations = splitLineIntoSeperateOperations(nodes, segmentIndex);
  25728. operations.forEach(function (operation) {
  25729. performOperation(operation, pixelData, workingLabelMap, segmentIndex, evt);
  25730. });
  25731. }
  25732. /**
  25733. * Snap the freehand points to the labelmap grid and attach a label for each node.
  25734. *
  25735. * @param {Object[]} points An array of points drawn by the user.
  25736. * @param {UInt16Array|Float32Array} pixelData The 2D labelmap.
  25737. * @param {Object} evt The cornerstone event.
  25738. * @returns {Object[]}
  25739. */
  25740. function snapPointsToGrid(evt, operationData) {
  25741. var pixelData = operationData.pixelData,
  25742. points = operationData.points;
  25743. var image = evt.detail.image;
  25744. var cols = image.width;
  25745. var rows = image.height;
  25746. var nodes = [];
  25747. for (var i = 0; i < points.length; i++) {
  25748. var point = points[i];
  25749. var x = Math.floor(point.x);
  25750. var y = Math.floor(point.y); // Clamp within the confines of the image.
  25751. x = Object(_util_clip__WEBPACK_IMPORTED_MODULE_3__["default"])(x, 0, cols - 1);
  25752. y = Object(_util_clip__WEBPACK_IMPORTED_MODULE_3__["default"])(y, 0, rows - 1);
  25753. var lastNode = nodes[nodes.length - 1]; // Skip double counting of closely drawn freehand points.
  25754. if (lastNode && x === lastNode.x && y === lastNode.y) {
  25755. continue;
  25756. }
  25757. nodes.push({
  25758. x: x,
  25759. y: y,
  25760. segment: pixelData[y * cols + x]
  25761. });
  25762. }
  25763. return nodes;
  25764. }
  25765. /**
  25766. * Check if the operation is a simple scissors add/remove.
  25767. * @param {Object[]} nodes - The nodes snapped to the grid.
  25768. * @param {number} segmentIndex
  25769. * @returns {Object} Information about the operation.
  25770. * `isScissorOperation` is true if the operation is a simple scissor.
  25771. * If `isScissorOperation` is true, `operation` says which operation.
  25772. */
  25773. function checkIfSimpleScissorOperation(nodes, segmentIndex) {
  25774. var allInside = true;
  25775. var allOutside = true;
  25776. for (var i = 0; i < nodes.length; i++) {
  25777. var node = nodes[i];
  25778. if (node.segment === segmentIndex) {
  25779. allOutside = false;
  25780. } else {
  25781. allInside = false;
  25782. }
  25783. if (!allInside && !allOutside) {
  25784. break;
  25785. }
  25786. }
  25787. if (allOutside) {
  25788. return {
  25789. isScissorOperation: true,
  25790. operation: 'fillInsideFreehand'
  25791. };
  25792. } else if (allInside) {
  25793. return {
  25794. isScissorOperation: true,
  25795. operation: 'eraseInsideFreehand'
  25796. };
  25797. }
  25798. return {
  25799. isScissorOperation: false
  25800. };
  25801. }
  25802. /**
  25803. * Performs the given add/subtract operation using a modification of the Tobias Heimann Correction Algorithm:
  25804. * The algorithm is described in full length in Tobias Heimann's diploma thesis (MBI Technical Report 145, p. 37 - 40).
  25805. *
  25806. * @param {Object} operation The operation.
  25807. * @param {UInt16Array|Float32Array} pixelData The 2D labelmap.
  25808. * @param {UInt16Array|Float32Array} workingLabelMap A copy of the labelmap for processing purposes.
  25809. * @param {number} segmentIndex The label of the tool being used.
  25810. * @param {Object} evt The cornerstone event.
  25811. */
  25812. function performOperation(operation, pixelData, workingLabelMap, segmentIndex, evt) {
  25813. var _evt$detail$image = evt.detail.image,
  25814. cols = _evt$detail$image.width,
  25815. rows = _evt$detail$image.height;
  25816. var nodes = operation.nodes,
  25817. additive = operation.additive;
  25818. var shouldFillOver = additive ? 0 : 1; // Local getters to swap from cornerstone vector notation and flattened array indicies.
  25819. var getPixelIndex = function getPixelIndex(pixelCoord) {
  25820. return pixelCoord.y * cols + pixelCoord.x;
  25821. };
  25822. var getPixelCoordinateFromPixelIndex = function getPixelCoordinateFromPixelIndex(pixelIndex) {
  25823. return {
  25824. x: pixelIndex % cols,
  25825. y: Math.floor(pixelIndex / cols)
  25826. };
  25827. };
  25828. if (additive) {
  25829. logger.warn('additive operation...');
  25830. } else {
  25831. logger.warn('subtractive operation...');
  25832. }
  25833. var _getPixelPaths = getPixelPaths(nodes),
  25834. pixelPath = _getPixelPaths.pixelPath,
  25835. leftPath = _getPixelPaths.leftPath,
  25836. rightPath = _getPixelPaths.rightPath; // Find extent of region for floodfill (This segment + the drawn loop).
  25837. // This is to reduce the extent of the outwards floodfill, which constitutes 99% of the computation.
  25838. var firstPixelOnPath = pixelPath[0];
  25839. var boundingBox = {
  25840. xMin: firstPixelOnPath.x,
  25841. xMax: firstPixelOnPath.x,
  25842. yMin: firstPixelOnPath.y,
  25843. yMax: firstPixelOnPath.y
  25844. }; // ...whilst also initializing the workingLabelmap
  25845. for (var i = 0; i < workingLabelMap.length; i++) {
  25846. if (pixelData[i] === segmentIndex) {
  25847. var pixel = getPixelCoordinateFromPixelIndex(i);
  25848. expandBoundingBox(boundingBox, pixel);
  25849. workingLabelMap[i] = 1;
  25850. } else {
  25851. workingLabelMap[i] = 0;
  25852. }
  25853. } // Set workingLabelmap pixelPath to 2 to form a
  25854. // Boundary in the working labelmap to contain the flood fills.
  25855. for (var _i = 0; _i < pixelPath.length; _i++) {
  25856. var _pixel = pixelPath[_i];
  25857. workingLabelMap[getPixelIndex(_pixel)] = 2;
  25858. expandBoundingBox(boundingBox, _pixel);
  25859. }
  25860. clipBoundingBox(boundingBox, rows, cols);
  25861. var xMin = boundingBox.xMin,
  25862. xMax = boundingBox.xMax,
  25863. yMin = boundingBox.yMin,
  25864. yMax = boundingBox.yMax; // Define a getter for the fill routine to access the working label map.
  25865. function getter(x, y) {
  25866. // Check if out of bounds, as the flood filler doesn't know about the dimensions of
  25867. // The data structure. E.g. if cols is 10, (0,1) and (10, 0) would point to the same
  25868. // position in this getter.
  25869. if (x >= xMax || x < xMin || y >= yMax || y < yMin) {
  25870. return;
  25871. }
  25872. return workingLabelMap[y * cols + x];
  25873. }
  25874. var leftArea = 0;
  25875. var rightArea = 0; // Traverse the path whilst pouring paint off the left and right sides.
  25876. for (var _i2 = 0; _i2 < leftPath.length; _i2++) {
  25877. // Left fill
  25878. var leftPixel = leftPath[_i2];
  25879. var leftValue = workingLabelMap[getPixelIndex(leftPixel)];
  25880. if (leftValue === shouldFillOver && Object(_util_isPointInImage__WEBPACK_IMPORTED_MODULE_4__["default"])(leftPixel, rows, cols)) {
  25881. leftArea += fillFromPixel(leftPixel, 3, workingLabelMap, getter, cols);
  25882. } // Right fill
  25883. var rightPixel = rightPath[_i2];
  25884. var rightValue = workingLabelMap[getPixelIndex(rightPixel)];
  25885. if (rightValue === shouldFillOver && Object(_util_isPointInImage__WEBPACK_IMPORTED_MODULE_4__["default"])(rightPixel, rows, cols)) {
  25886. rightArea += fillFromPixel(rightPixel, 4, workingLabelMap, getter, cols);
  25887. }
  25888. }
  25889. if (leftArea === 0 || rightArea === 0) {
  25890. // The areas are connected, therefore the start and end
  25891. // Of the path go through unconnected regions, exit.
  25892. return;
  25893. }
  25894. var replaceValue = additive ? segmentIndex : 0; // Fill in smallest area.
  25895. var fillValue = leftArea < rightArea ? 3 : 4;
  25896. for (var _i3 = 0; _i3 < workingLabelMap.length; _i3++) {
  25897. if (workingLabelMap[_i3] === fillValue) {
  25898. pixelData[_i3] = replaceValue;
  25899. }
  25900. }
  25901. if (replaceValue === segmentIndex) {
  25902. // Fill in the path.
  25903. for (var _i4 = 0; _i4 < pixelPath.length; _i4++) {
  25904. pixelData[getPixelIndex(pixelPath[_i4])] = segmentIndex;
  25905. }
  25906. } else {
  25907. // Only erase this segment.
  25908. for (var _i5 = 0; _i5 < pixelPath.length; _i5++) {
  25909. var pixelIndex = getPixelIndex(pixelPath[_i5]);
  25910. if (pixelData[pixelIndex] === segmentIndex) {
  25911. pixelData[pixelIndex] = 0;
  25912. }
  25913. }
  25914. }
  25915. }
  25916. /**
  25917. * Expands the bounding box if the pixel falls outside it.
  25918. *
  25919. * @param {Object} boundingBox The bounding box.
  25920. * @param {Object} pixel The pixel.
  25921. * @returns {null}
  25922. */
  25923. function expandBoundingBox(boundingBox, pixel) {
  25924. var x = pixel.x,
  25925. y = pixel.y;
  25926. if (x < boundingBox.xMin) {
  25927. boundingBox.xMin = x;
  25928. }
  25929. if (x > boundingBox.xMax) {
  25930. boundingBox.xMax = x;
  25931. }
  25932. if (y < boundingBox.yMin) {
  25933. boundingBox.yMin = y;
  25934. }
  25935. if (y > boundingBox.yMax) {
  25936. boundingBox.yMax = y;
  25937. }
  25938. }
  25939. /**
  25940. * Expands the bounding box by 2 px and then clips it to the image size.
  25941. * @param {Object} boundingBox The bounding box.
  25942. * @param {number} rows The number of rows.
  25943. * @param {number} cols The number of columns.
  25944. * @returns {null}
  25945. */
  25946. function clipBoundingBox(boundingBox, rows, cols) {
  25947. // Add a 2px border to stop the floodfill starting out of bounds and exploading.
  25948. var border = 2;
  25949. boundingBox.xMax = Math.min(boundingBox.xMax + border, cols);
  25950. boundingBox.xMin = Math.max(boundingBox.xMin - border, 0);
  25951. boundingBox.yMax = Math.min(boundingBox.yMax + border, rows);
  25952. boundingBox.yMin = Math.max(boundingBox.yMin - border, 0);
  25953. }
  25954. /**
  25955. * Performs a floodfill from the given pixel to the workingLabelMap.
  25956. * @param {Object} pixel The pixel.
  25957. * @param {number} fillValue The fill value.
  25958. * @param {UInt8Array} workingLabelMap The working labelmap.
  25959. * @param {function} getter The getter function for pixels in the labelmap.
  25960. * @param {number} cols The number of columns.
  25961. * @returns {number} The number of pixels flooded.
  25962. */
  25963. function fillFromPixel(pixel, fillValue, workingLabelMap, getter, cols) {
  25964. var result = Object(_util_segmentation__WEBPACK_IMPORTED_MODULE_2__["floodFill"])(getter, [pixel.x, pixel.y]);
  25965. var flooded = result.flooded;
  25966. for (var p = 0; p < flooded.length; p++) {
  25967. var floodedI = flooded[p];
  25968. workingLabelMap[floodedI[1] * cols + floodedI[0]] = fillValue;
  25969. }
  25970. return flooded.length;
  25971. }
  25972. /**
  25973. * Interpolates the pixelPath using an obstacleless path finding algorithm.
  25974. * @param {Object[]} nodes The nodes to interpolate between.
  25975. * @returns {Object} The pixelPath, and the path to the left and right of it.
  25976. */
  25977. function getPixelPaths(nodes) {
  25978. var pixelPath = [];
  25979. for (var i = 0; i < nodes.length - 1; i++) {
  25980. // Push the node.
  25981. pixelPath.push(nodes[i]); // Path towards next node.
  25982. pixelPath.push.apply(pixelPath, _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(Object(_util_segmentation__WEBPACK_IMPORTED_MODULE_2__["getPixelPathBetweenPixels"])(nodes[i], nodes[i + 1])));
  25983. } // Push final node.
  25984. pixelPath.push[nodes[nodes.length - 1]]; // Get paths on either side.
  25985. var leftPath = [];
  25986. var rightPath = [];
  25987. for (var _i6 = 0; _i6 < pixelPath.length - 1; _i6++) {
  25988. var _getNodesPerpendicula = getNodesPerpendicularToPathPixel(pixelPath[_i6], pixelPath[_i6 + 1]),
  25989. left = _getNodesPerpendicula.left,
  25990. right = _getNodesPerpendicula.right;
  25991. leftPath.push(left);
  25992. rightPath.push(right);
  25993. }
  25994. return {
  25995. pixelPath: pixelPath,
  25996. leftPath: leftPath,
  25997. rightPath: rightPath
  25998. };
  25999. }
  26000. /**
  26001. * Using the current and next pixel on the path, determine the adjacent pixels
  26002. * which are perpendicular to the path direction. (i.e. to the left and to the right).
  26003. *
  26004. * @param {Object} pathPixel The pixel being queried.
  26005. * @param {Object} nextPathPixel the pathPixel's successor.
  26006. *
  26007. * @returns {Object} The coordinates of the left and right perpendicular pixels.
  26008. */
  26009. function getNodesPerpendicularToPathPixel(pathPixel, nextPathPixel) {
  26010. var direction = {
  26011. x: nextPathPixel.x - pathPixel.x,
  26012. y: nextPathPixel.y - pathPixel.y
  26013. }; // P = pathPixel, n = nextPathPixel, L = left, R = right
  26014. //
  26015. // |n| |R| | |n| | |L| |n|
  26016. // | |p| | |L|p|R| | |p| |
  26017. // |L| | | | | | | | | |R|
  26018. //
  26019. // | |R| | | |L| |
  26020. // |n|p| | | |p|n|
  26021. // | |L| | | |R| |
  26022. //
  26023. // |R| | | | | | | | | |L|
  26024. // | |p| | |R|p|L| | |p| |
  26025. // |n| |L| | |n| | |R| |n|
  26026. if (direction.x === -1 && direction.y === 1) {
  26027. return {
  26028. left: {
  26029. x: pathPixel.x - 1,
  26030. y: pathPixel.y - 1
  26031. },
  26032. right: {
  26033. x: pathPixel.x + 1,
  26034. y: pathPixel.y + 1
  26035. }
  26036. };
  26037. } else if (direction.x === 0 && direction.y === 1) {
  26038. return {
  26039. left: {
  26040. x: pathPixel.x - 1,
  26041. y: pathPixel.y
  26042. },
  26043. right: {
  26044. x: pathPixel.x + 1,
  26045. y: pathPixel.y
  26046. }
  26047. };
  26048. } else if (direction.x === 1 && direction.y === 1) {
  26049. return {
  26050. left: {
  26051. x: pathPixel.x - 1,
  26052. y: pathPixel.y + 1
  26053. },
  26054. right: {
  26055. x: pathPixel.x + 1,
  26056. y: pathPixel.y - 1
  26057. }
  26058. };
  26059. } else if (direction.x === 1 && direction.y === 0) {
  26060. return {
  26061. left: {
  26062. x: pathPixel.x,
  26063. y: pathPixel.y + 1
  26064. },
  26065. right: {
  26066. x: pathPixel.x,
  26067. y: pathPixel.y - 1
  26068. }
  26069. };
  26070. } else if (direction.x === 1 && direction.y === -1) {
  26071. return {
  26072. left: {
  26073. x: pathPixel.x + 1,
  26074. y: pathPixel.y + 1
  26075. },
  26076. right: {
  26077. x: pathPixel.x - 1,
  26078. y: pathPixel.y - 1
  26079. }
  26080. };
  26081. } else if (direction.x === 0 && direction.y === -1) {
  26082. return {
  26083. left: {
  26084. x: pathPixel.x + 1,
  26085. y: pathPixel.y
  26086. },
  26087. right: {
  26088. x: pathPixel.x - 1,
  26089. y: pathPixel.y
  26090. }
  26091. };
  26092. } else if (direction.x === -1 && direction.y === -1) {
  26093. return {
  26094. left: {
  26095. x: pathPixel.x + 1,
  26096. y: pathPixel.y - 1
  26097. },
  26098. right: {
  26099. x: pathPixel.x - 1,
  26100. y: pathPixel.y + 1
  26101. }
  26102. };
  26103. } else if (direction.x === -1 && direction.y === 0) {
  26104. return {
  26105. left: {
  26106. x: pathPixel.x,
  26107. y: pathPixel.y - 1
  26108. },
  26109. right: {
  26110. x: pathPixel.x,
  26111. y: pathPixel.y + 1
  26112. }
  26113. };
  26114. }
  26115. logger.error("Unable to find left and right paths for flood fill ", pathPixel, nextPathPixel, direction);
  26116. }
  26117. /**
  26118. * @typedef {Object} Node
  26119. * @property {number} x - the X position
  26120. * @property {number} y - the Y position
  26121. * @property {number} segment - The segment index
  26122. */
  26123. /**
  26124. * @typedef {Object} SegmentationOperations
  26125. * @property {boolean} additive - Whether the operation is additive or not
  26126. * @property {Node[]} nodes - The array of nodes
  26127. */
  26128. /**
  26129. * Splits the path of nodes into separate add/remove operations.
  26130. *
  26131. * @param {Object[]} nodes The array of nodes.
  26132. * @param {number} segmentIndex The label value to replace.
  26133. * @returns {SegmentationOperations[]} An array of operations to perform,
  26134. * whether they are `additive` and the
  26135. * corresponding `nodes` of the operation.
  26136. */
  26137. function splitLineIntoSeperateOperations(nodes, segmentIndex) {
  26138. // Check whether the first node is inside a segment of the appropriate label or not.
  26139. var isLabel = nodes[0].segment === segmentIndex;
  26140. var operations = [];
  26141. operations.push({
  26142. additive: !isLabel,
  26143. nodes: []
  26144. });
  26145. var operationIndex = 0;
  26146. for (var i = 0; i < nodes.length; i++) {
  26147. var node = nodes[i];
  26148. if (isLabel) {
  26149. operations[operationIndex].nodes.push(node);
  26150. if (node.segment !== segmentIndex) {
  26151. // Start a new operation and include the last two nodes.
  26152. operationIndex++;
  26153. isLabel = !isLabel;
  26154. operations.push({
  26155. additive: true,
  26156. nodes: []
  26157. });
  26158. operations[operationIndex].nodes.push(nodes[i - 1]);
  26159. operations[operationIndex].nodes.push(node);
  26160. }
  26161. } else {
  26162. operations[operationIndex].nodes.push(node);
  26163. if (node.segment === segmentIndex) {
  26164. // Start a new operation and add include the last two nodes.
  26165. operationIndex++;
  26166. isLabel = !isLabel;
  26167. operations.push({
  26168. additive: false,
  26169. nodes: []
  26170. });
  26171. operations[operationIndex].nodes.push(nodes[i - 1]);
  26172. operations[operationIndex].nodes.push(node);
  26173. }
  26174. }
  26175. } // Trim the first and last entries, as they don't form full operations.
  26176. operations.pop();
  26177. operations.shift();
  26178. return operations;
  26179. }
  26180. /***/ }),
  26181. /***/ "./tools/segmentation/strategies/eraseCircle.js":
  26182. /*!******************************************************!*\
  26183. !*** ./tools/segmentation/strategies/eraseCircle.js ***!
  26184. \******************************************************/
  26185. /*! exports provided: eraseInsideCircle, eraseOutsideCircle */
  26186. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  26187. "use strict";
  26188. __webpack_require__.r(__webpack_exports__);
  26189. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "eraseInsideCircle", function() { return eraseInsideCircle; });
  26190. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "eraseOutsideCircle", function() { return eraseOutsideCircle; });
  26191. /* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/slicedToArray */ "../node_modules/@babel/runtime/helpers/slicedToArray.js");
  26192. /* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0__);
  26193. /* harmony import */ var _util_ellipse__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../util/ellipse */ "./util/ellipse/index.js");
  26194. /* harmony import */ var _util_logger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../util/logger */ "./util/logger.js");
  26195. /* harmony import */ var _util_segmentation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../util/segmentation */ "./util/segmentation/index.js");
  26196. /* harmony import */ var _util_getCircleCoords_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../util/getCircleCoords.js */ "./util/getCircleCoords.js");
  26197. var logger = Object(_util_logger__WEBPACK_IMPORTED_MODULE_2__["getLogger"])('util:segmentation:operations:eraseInsideCircle');
  26198. /**
  26199. * EraseInsideCircle - Erase all pixels labeled with the activeSegmentIndex,
  26200. * in the region defined by the circle.
  26201. * @param {Object} evt The Cornerstone event.
  26202. * @param {Object} operationData An object containing the `pixelData` to
  26203. * modify, the `segmentIndex` and the `points` array.
  26204. * @returns {null}
  26205. */
  26206. function eraseCircle(evt, operationData) {
  26207. var inside = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
  26208. var segmentationMixinType = operationData.segmentationMixinType;
  26209. if (segmentationMixinType !== "circleSegmentationMixin") {
  26210. logger.error("eraseInsideCircle operation requires circleSegmentationMixin operationData, recieved ".concat(segmentationMixinType));
  26211. return;
  26212. }
  26213. var eventData = evt.detail;
  26214. var _getBoundingBoxAround = Object(_util_segmentation__WEBPACK_IMPORTED_MODULE_3__["getBoundingBoxAroundCircle"])(evt),
  26215. _getBoundingBoxAround2 = _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0___default()(_getBoundingBoxAround, 2),
  26216. topLeft = _getBoundingBoxAround2[0],
  26217. bottomRight = _getBoundingBoxAround2[1];
  26218. var ellipse = Object(_util_getCircleCoords_js__WEBPACK_IMPORTED_MODULE_4__["default"])(eventData.handles.start, eventData.handles.end);
  26219. inside ? Object(_util_segmentation__WEBPACK_IMPORTED_MODULE_3__["eraseInsideShape"])(evt, operationData, function (point) {
  26220. return Object(_util_ellipse__WEBPACK_IMPORTED_MODULE_1__["pointInEllipse"])(ellipse, point);
  26221. }, topLeft, bottomRight) : Object(_util_segmentation__WEBPACK_IMPORTED_MODULE_3__["eraseOutsideShape"])(evt, operationData, function (point) {
  26222. return Object(_util_ellipse__WEBPACK_IMPORTED_MODULE_1__["pointInEllipse"])(ellipse, point);
  26223. }, topLeft, bottomRight);
  26224. }
  26225. /**
  26226. * Erase all pixels inside/outside the region defined by the circle.
  26227. * @param {} evt The Cornerstone event.
  26228. * @param {} operationData An object containing the `pixelData` to
  26229. * modify, the `segmentIndex` and the `points` array.
  26230. * @returns {null}
  26231. */
  26232. function eraseInsideCircle(evt, operationData) {
  26233. eraseCircle(evt, operationData, true);
  26234. }
  26235. /**
  26236. * Erase all pixels outside the region defined by the circle.
  26237. * @param {} evt The Cornerstone event.
  26238. * @param {} operationData An object containing the `pixelData` to
  26239. * modify, the `segmentIndex` and the `points` array.
  26240. * @returns {null}
  26241. */
  26242. function eraseOutsideCircle(evt, operationData) {
  26243. eraseCircle(evt, operationData, false);
  26244. }
  26245. /***/ }),
  26246. /***/ "./tools/segmentation/strategies/eraseFreehand.js":
  26247. /*!********************************************************!*\
  26248. !*** ./tools/segmentation/strategies/eraseFreehand.js ***!
  26249. \********************************************************/
  26250. /*! exports provided: eraseInsideFreehand, eraseOutsideFreehand */
  26251. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  26252. "use strict";
  26253. __webpack_require__.r(__webpack_exports__);
  26254. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "eraseInsideFreehand", function() { return eraseInsideFreehand; });
  26255. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "eraseOutsideFreehand", function() { return eraseOutsideFreehand; });
  26256. /* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/slicedToArray */ "../node_modules/@babel/runtime/helpers/slicedToArray.js");
  26257. /* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0__);
  26258. /* harmony import */ var _util_segmentation__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../util/segmentation */ "./util/segmentation/index.js");
  26259. /* harmony import */ var _util_isPointInPolygon__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../util/isPointInPolygon */ "./util/isPointInPolygon.js");
  26260. /* harmony import */ var _util_logger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../util/logger */ "./util/logger.js");
  26261. var logger = Object(_util_logger__WEBPACK_IMPORTED_MODULE_3__["getLogger"])('util:segmentation:operations:eraseInsideFreehand');
  26262. /**
  26263. * Erase all pixels labeled with the activeSegmentIndex,
  26264. * in the region defined by evt.operationData.points.
  26265. * @param {} evt The Cornerstone event.
  26266. * @param {} operationData An object containing the `pixelData` to
  26267. * modify, the `segmentIndex` and the `points` array.
  26268. * @returns {null}
  26269. */
  26270. function eraseFreehand(evt, operationData) {
  26271. var inside = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
  26272. var points = operationData.points,
  26273. segmentationMixinType = operationData.segmentationMixinType;
  26274. if (segmentationMixinType !== "freehandSegmentationMixin") {
  26275. logger.error("eraseInsideFreehand operation requires freehandSegmentationMixin operationData, recieved ".concat(segmentationMixinType));
  26276. return;
  26277. }
  26278. var image = evt.detail.image;
  26279. var vertices = points.map(function (a) {
  26280. return [a.x, a.y];
  26281. });
  26282. var _getBoundingBoxAround = Object(_util_segmentation__WEBPACK_IMPORTED_MODULE_1__["getBoundingBoxAroundPolygon"])(vertices, image),
  26283. _getBoundingBoxAround2 = _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0___default()(_getBoundingBoxAround, 2),
  26284. topLeft = _getBoundingBoxAround2[0],
  26285. bottomRight = _getBoundingBoxAround2[1];
  26286. inside ? Object(_util_segmentation__WEBPACK_IMPORTED_MODULE_1__["eraseInsideShape"])(evt, operationData, function (point) {
  26287. return Object(_util_isPointInPolygon__WEBPACK_IMPORTED_MODULE_2__["default"])([point.x, point.y], vertices);
  26288. }, topLeft, bottomRight) : Object(_util_segmentation__WEBPACK_IMPORTED_MODULE_1__["eraseOutsideShape"])(evt, operationData, function (point) {
  26289. return Object(_util_isPointInPolygon__WEBPACK_IMPORTED_MODULE_2__["default"])([point.x, point.y], vertices);
  26290. }, topLeft, bottomRight);
  26291. }
  26292. /**
  26293. * Erase all pixels inside/outside the region defined by `operationData.points`.
  26294. * @param {} evt The Cornerstone event.
  26295. * @param {} operationData An object containing the `pixelData` to
  26296. * modify, the `segmentIndex` and the `points` array.
  26297. * @returns {null}
  26298. */
  26299. function eraseInsideFreehand(evt, operationData) {
  26300. eraseFreehand(evt, operationData, true);
  26301. }
  26302. /**
  26303. * Erase all pixels outside the region defined by `operationData.points`.
  26304. * @param {} evt The Cornerstone event.
  26305. * @param {} operationData An object containing the `pixelData` to
  26306. * modify, the `segmentIndex` and the `points` array.
  26307. * @returns {null}
  26308. */
  26309. function eraseOutsideFreehand(evt, operationData) {
  26310. eraseFreehand(evt, operationData, false);
  26311. }
  26312. /***/ }),
  26313. /***/ "./tools/segmentation/strategies/eraseRectangle.js":
  26314. /*!*********************************************************!*\
  26315. !*** ./tools/segmentation/strategies/eraseRectangle.js ***!
  26316. \*********************************************************/
  26317. /*! exports provided: eraseInsideRectangle, eraseOutsideRectangle */
  26318. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  26319. "use strict";
  26320. __webpack_require__.r(__webpack_exports__);
  26321. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "eraseInsideRectangle", function() { return eraseInsideRectangle; });
  26322. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "eraseOutsideRectangle", function() { return eraseOutsideRectangle; });
  26323. /* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/slicedToArray */ "../node_modules/@babel/runtime/helpers/slicedToArray.js");
  26324. /* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0__);
  26325. /* harmony import */ var _util_logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../util/logger */ "./util/logger.js");
  26326. /* harmony import */ var _util_segmentation__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../util/segmentation */ "./util/segmentation/index.js");
  26327. var logger = Object(_util_logger__WEBPACK_IMPORTED_MODULE_1__["getLogger"])('util:segmentation:operations:eraseInsideRectangle');
  26328. /**
  26329. * Erase all pixels inside the region defined by the rectangle.
  26330. * @param {Object} evt The Cornerstone event.
  26331. * @param {Object} operationData An object containing the `pixelData` to
  26332. * modify, the `segmentIndex` and the `points` array.
  26333. * @returns {null}
  26334. */
  26335. function eraseRectangle(evt, operationData) {
  26336. var inside = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
  26337. var points = operationData.points,
  26338. segmentationMixinType = operationData.segmentationMixinType;
  26339. if (segmentationMixinType !== "rectangleSegmentationMixin") {
  26340. logger.error("eraseInsideRectangle operation requires rectangleSegmentationMixin operationData, recieved ".concat(segmentationMixinType));
  26341. return;
  26342. }
  26343. var eventData = evt.detail; // Loop through all pixels in the segmentation data mask
  26344. // Obtain the bounding box of the entire drawing so that
  26345. // we can subset our search.
  26346. var image = eventData.image;
  26347. var vertices = points.map(function (a) {
  26348. return [a.x, a.y];
  26349. });
  26350. var _getBoundingBoxAround = Object(_util_segmentation__WEBPACK_IMPORTED_MODULE_2__["getBoundingBoxAroundPolygon"])(vertices, image),
  26351. _getBoundingBoxAround2 = _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0___default()(_getBoundingBoxAround, 2),
  26352. topLeft = _getBoundingBoxAround2[0],
  26353. bottomRight = _getBoundingBoxAround2[1];
  26354. inside ? Object(_util_segmentation__WEBPACK_IMPORTED_MODULE_2__["eraseInsideShape"])(evt, operationData, function () {
  26355. return true;
  26356. }, topLeft, bottomRight) : Object(_util_segmentation__WEBPACK_IMPORTED_MODULE_2__["eraseOutsideBoundingBox"])(evt, operationData, topLeft, bottomRight);
  26357. }
  26358. /**
  26359. * Erase all pixels inside/outside the region defined by the rectangle.
  26360. * @param {} evt The Cornerstone event.
  26361. * @param {} operationData An object containing the `pixelData` to
  26362. * modify, the `segmentIndex` and the `points` array.
  26363. * @returns {null}
  26364. */
  26365. function eraseInsideRectangle(evt, operationData) {
  26366. eraseRectangle(evt, operationData, true);
  26367. }
  26368. /**
  26369. * Erase all pixels outside the region defined by the rectangle.
  26370. * @param {} evt The Cornerstone event.
  26371. * @param {} operationData An object containing the `pixelData` to
  26372. * modify, the `segmentIndex` and the `points` array.
  26373. * @returns {null}
  26374. */
  26375. function eraseOutsideRectangle(evt, operationData) {
  26376. eraseRectangle(evt, operationData, false);
  26377. }
  26378. /***/ }),
  26379. /***/ "./tools/segmentation/strategies/fillCircle.js":
  26380. /*!*****************************************************!*\
  26381. !*** ./tools/segmentation/strategies/fillCircle.js ***!
  26382. \*****************************************************/
  26383. /*! exports provided: fillInsideCircle, fillOutsideCircle */
  26384. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  26385. "use strict";
  26386. __webpack_require__.r(__webpack_exports__);
  26387. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fillInsideCircle", function() { return fillInsideCircle; });
  26388. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fillOutsideCircle", function() { return fillOutsideCircle; });
  26389. /* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/slicedToArray */ "../node_modules/@babel/runtime/helpers/slicedToArray.js");
  26390. /* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0__);
  26391. /* harmony import */ var _util_segmentation__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../util/segmentation */ "./util/segmentation/index.js");
  26392. /* harmony import */ var _util_ellipse__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../util/ellipse */ "./util/ellipse/index.js");
  26393. /* harmony import */ var _util_getCircleCoords__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../util/getCircleCoords */ "./util/getCircleCoords.js");
  26394. /* harmony import */ var _util_logger__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../util/logger */ "./util/logger.js");
  26395. var logger = Object(_util_logger__WEBPACK_IMPORTED_MODULE_4__["getLogger"])('util:segmentation:operations:fillCircle');
  26396. /**
  26397. * Fill all pixels inside/outside the region defined by the circle.
  26398. * @param {} evt The Cornerstone event.
  26399. * @param {} operationData An object containing the `pixelData` to
  26400. * modify, the `segmentIndex` and the `points` array.
  26401. * @returns {null}
  26402. */
  26403. function fillCircle(evt, operationData) {
  26404. var inside = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
  26405. var segmentationMixinType = operationData.segmentationMixinType;
  26406. if (segmentationMixinType !== "circleSegmentationMixin") {
  26407. logger.error("fillInsideCircle operation requires circleSegmentationMixin operationData, recieved ".concat(segmentationMixinType));
  26408. return;
  26409. }
  26410. var eventData = evt.detail;
  26411. var _getBoundingBoxAround = Object(_util_segmentation__WEBPACK_IMPORTED_MODULE_1__["getBoundingBoxAroundCircle"])(evt),
  26412. _getBoundingBoxAround2 = _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0___default()(_getBoundingBoxAround, 2),
  26413. topLeft = _getBoundingBoxAround2[0],
  26414. bottomRight = _getBoundingBoxAround2[1];
  26415. var ellipse = Object(_util_getCircleCoords__WEBPACK_IMPORTED_MODULE_3__["default"])(eventData.handles.start, eventData.handles.end);
  26416. inside ? Object(_util_segmentation__WEBPACK_IMPORTED_MODULE_1__["fillInsideShape"])(evt, operationData, function (point) {
  26417. return Object(_util_ellipse__WEBPACK_IMPORTED_MODULE_2__["pointInEllipse"])(ellipse, point);
  26418. }, topLeft, bottomRight) : Object(_util_segmentation__WEBPACK_IMPORTED_MODULE_1__["fillOutsideShape"])(evt, operationData, function (point) {
  26419. return Object(_util_ellipse__WEBPACK_IMPORTED_MODULE_2__["pointInEllipse"])(ellipse, point);
  26420. }, topLeft, bottomRight);
  26421. }
  26422. /**
  26423. * Fill all pixels inside/outside the region defined by the circle.
  26424. * @param {} evt The Cornerstone event.
  26425. * @param {} operationData An object containing the `pixelData` to
  26426. * modify, the `segmentIndex` and the `points` array.
  26427. * @returns {null}
  26428. */
  26429. function fillInsideCircle(evt, operationData) {
  26430. fillCircle(evt, operationData, true);
  26431. }
  26432. /**
  26433. * Fill all pixels outside the region defined by the circle.
  26434. * @param {} evt The Cornerstone event.
  26435. * @param {} operationData An object containing the `pixelData` to
  26436. * modify, the `segmentIndex` and the `points` array.
  26437. * @returns {null}
  26438. */
  26439. function fillOutsideCircle(evt, operationData) {
  26440. fillCircle(evt, operationData, false);
  26441. }
  26442. /***/ }),
  26443. /***/ "./tools/segmentation/strategies/fillFreehand.js":
  26444. /*!*******************************************************!*\
  26445. !*** ./tools/segmentation/strategies/fillFreehand.js ***!
  26446. \*******************************************************/
  26447. /*! exports provided: fillInsideFreehand, fillOutsideFreehand */
  26448. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  26449. "use strict";
  26450. __webpack_require__.r(__webpack_exports__);
  26451. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fillInsideFreehand", function() { return fillInsideFreehand; });
  26452. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fillOutsideFreehand", function() { return fillOutsideFreehand; });
  26453. /* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/slicedToArray */ "../node_modules/@babel/runtime/helpers/slicedToArray.js");
  26454. /* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0__);
  26455. /* harmony import */ var _util_segmentation__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../util/segmentation */ "./util/segmentation/index.js");
  26456. /* harmony import */ var _util_isPointInPolygon__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../util/isPointInPolygon */ "./util/isPointInPolygon.js");
  26457. /* harmony import */ var _util_logger__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../util/logger */ "./util/logger.js");
  26458. var logger = Object(_util_logger__WEBPACK_IMPORTED_MODULE_3__["getLogger"])('util:segmentation:operations:fillInsideFreehand');
  26459. /**
  26460. * Fill all pixels inside/outside the region defined by
  26461. * `operationData.points` with the `activeSegmentIndex` value.
  26462. * @param {} evt The Cornerstone event.
  26463. * @param {} operationData An object containing the `pixelData` to
  26464. * modify, the `segmentIndex` and the `points` array.
  26465. * @returns {null}
  26466. */
  26467. function fillFreehand(evt, operationData) {
  26468. var inside = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
  26469. var points = operationData.points,
  26470. segmentationMixinType = operationData.segmentationMixinType;
  26471. if (segmentationMixinType !== "freehandSegmentationMixin") {
  26472. logger.error("eraseInsideFreehand operation requires freehandSegmentationMixin operationData, recieved ".concat(segmentationMixinType));
  26473. return;
  26474. } // Obtain the bounding box of the entire drawing so that
  26475. // we can subset our search. Outside of the bounding box,
  26476. // everything is outside of the polygon.
  26477. var image = evt.detail.image;
  26478. var vertices = points.map(function (a) {
  26479. return [a.x, a.y];
  26480. });
  26481. var _getBoundingBoxAround = Object(_util_segmentation__WEBPACK_IMPORTED_MODULE_1__["getBoundingBoxAroundPolygon"])(vertices, image),
  26482. _getBoundingBoxAround2 = _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0___default()(_getBoundingBoxAround, 2),
  26483. topLeft = _getBoundingBoxAround2[0],
  26484. bottomRight = _getBoundingBoxAround2[1];
  26485. inside ? Object(_util_segmentation__WEBPACK_IMPORTED_MODULE_1__["fillInsideShape"])(evt, operationData, function (point) {
  26486. return Object(_util_isPointInPolygon__WEBPACK_IMPORTED_MODULE_2__["default"])([point.x, point.y], vertices);
  26487. }, topLeft, bottomRight) : Object(_util_segmentation__WEBPACK_IMPORTED_MODULE_1__["fillOutsideShape"])(evt, operationData, function (point) {
  26488. return Object(_util_isPointInPolygon__WEBPACK_IMPORTED_MODULE_2__["default"])([point.x, point.y], vertices);
  26489. }, topLeft, bottomRight);
  26490. }
  26491. /**
  26492. * Fill all pixels inside/outside the region defined by `operationData.points`.
  26493. * @param {} evt The Cornerstone event.
  26494. * @param {} operationData An object containing the `pixelData` to
  26495. * modify, the `segmentIndex` and the `points` array.
  26496. * @returns {null}
  26497. */
  26498. function fillInsideFreehand(evt, operationData) {
  26499. fillFreehand(evt, operationData, true);
  26500. }
  26501. /**
  26502. * Fill all pixels outside the region defined by `operationData.points`.
  26503. * @param {} evt The Cornerstone event.
  26504. * @param {} operationData An object containing the `pixelData` to
  26505. * modify, the `segmentIndex` and the `points` array.
  26506. * @returns {null}
  26507. */
  26508. function fillOutsideFreehand(evt, operationData) {
  26509. fillFreehand(evt, operationData, false);
  26510. }
  26511. /***/ }),
  26512. /***/ "./tools/segmentation/strategies/fillRectangle.js":
  26513. /*!********************************************************!*\
  26514. !*** ./tools/segmentation/strategies/fillRectangle.js ***!
  26515. \********************************************************/
  26516. /*! exports provided: fillInsideRectangle, fillOutsideRectangle */
  26517. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  26518. "use strict";
  26519. __webpack_require__.r(__webpack_exports__);
  26520. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fillInsideRectangle", function() { return fillInsideRectangle; });
  26521. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fillOutsideRectangle", function() { return fillOutsideRectangle; });
  26522. /* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/slicedToArray */ "../node_modules/@babel/runtime/helpers/slicedToArray.js");
  26523. /* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0__);
  26524. /* harmony import */ var _util_segmentation__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../util/segmentation */ "./util/segmentation/index.js");
  26525. /* harmony import */ var _util_logger__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../util/logger */ "./util/logger.js");
  26526. var logger = Object(_util_logger__WEBPACK_IMPORTED_MODULE_2__["getLogger"])('util:segmentation:operations:fillInsideRectangle');
  26527. /**
  26528. * FillInsideRectangle - Fill all pixels inside/outside the region defined
  26529. * by the rectangle.
  26530. * @param {} evt The Cornerstone event.
  26531. * @param {} operationData An object containing the `pixelData` to
  26532. * modify, the `segmentIndex` and the `points` array.
  26533. * @returns {null}
  26534. */
  26535. function fillRectangle(evt, operationData) {
  26536. var inside = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
  26537. var points = operationData.points,
  26538. segmentationMixinType = operationData.segmentationMixinType;
  26539. if (segmentationMixinType !== "rectangleSegmentationMixin") {
  26540. logger.error("eraseInsideRectangle operation requires rectangleSegmentationMixin operationData, recieved ".concat(segmentationMixinType));
  26541. return;
  26542. }
  26543. var image = evt.detail.image;
  26544. var vertices = points.map(function (a) {
  26545. return [a.x, a.y];
  26546. });
  26547. var _getBoundingBoxAround = Object(_util_segmentation__WEBPACK_IMPORTED_MODULE_1__["getBoundingBoxAroundPolygon"])(vertices, image),
  26548. _getBoundingBoxAround2 = _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0___default()(_getBoundingBoxAround, 2),
  26549. topLeft = _getBoundingBoxAround2[0],
  26550. bottomRight = _getBoundingBoxAround2[1];
  26551. inside ? Object(_util_segmentation__WEBPACK_IMPORTED_MODULE_1__["fillInsideShape"])(evt, operationData, function () {
  26552. return true;
  26553. }, topLeft, bottomRight) : Object(_util_segmentation__WEBPACK_IMPORTED_MODULE_1__["fillOutsideBoundingBox"])(evt, operationData, topLeft, bottomRight);
  26554. }
  26555. /**
  26556. * Fill all pixels inside/outside the region defined by the rectangle.
  26557. * @param {} evt The Cornerstone event.
  26558. * @param {} operationData An object containing the `pixelData` to
  26559. * modify, the `segmentIndex` and the `points` array.
  26560. * @returns {null}
  26561. */
  26562. function fillInsideRectangle(evt, operationData) {
  26563. fillRectangle(evt, operationData, true);
  26564. }
  26565. /**
  26566. * Fill all pixels outside the region defined by the rectangle.
  26567. * @param {} evt The Cornerstone event.
  26568. * @param {} operationData An object containing the `pixelData` to
  26569. * modify, the `segmentIndex` and the `points` array.
  26570. * @returns {null}
  26571. */
  26572. function fillOutsideRectangle(evt, operationData) {
  26573. fillRectangle(evt, operationData, false);
  26574. }
  26575. /***/ }),
  26576. /***/ "./tools/segmentation/strategies/index.js":
  26577. /*!************************************************!*\
  26578. !*** ./tools/segmentation/strategies/index.js ***!
  26579. \************************************************/
  26580. /*! exports provided: correction, eraseInsideFreehand, eraseOutsideFreehand, eraseInsideRectangle, eraseOutsideRectangle, fillInsideFreehand, fillOutsideFreehand, fillInsideRectangle, fillOutsideRectangle, fillInsideCircle, fillOutsideCircle, eraseInsideCircle, eraseOutsideCircle */
  26581. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  26582. "use strict";
  26583. __webpack_require__.r(__webpack_exports__);
  26584. /* harmony import */ var _correction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./correction */ "./tools/segmentation/strategies/correction.js");
  26585. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "correction", function() { return _correction__WEBPACK_IMPORTED_MODULE_0__["default"]; });
  26586. /* harmony import */ var _eraseFreehand__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./eraseFreehand */ "./tools/segmentation/strategies/eraseFreehand.js");
  26587. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "eraseInsideFreehand", function() { return _eraseFreehand__WEBPACK_IMPORTED_MODULE_1__["eraseInsideFreehand"]; });
  26588. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "eraseOutsideFreehand", function() { return _eraseFreehand__WEBPACK_IMPORTED_MODULE_1__["eraseOutsideFreehand"]; });
  26589. /* harmony import */ var _eraseRectangle_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./eraseRectangle.js */ "./tools/segmentation/strategies/eraseRectangle.js");
  26590. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "eraseInsideRectangle", function() { return _eraseRectangle_js__WEBPACK_IMPORTED_MODULE_2__["eraseInsideRectangle"]; });
  26591. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "eraseOutsideRectangle", function() { return _eraseRectangle_js__WEBPACK_IMPORTED_MODULE_2__["eraseOutsideRectangle"]; });
  26592. /* harmony import */ var _fillFreehand__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./fillFreehand */ "./tools/segmentation/strategies/fillFreehand.js");
  26593. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "fillInsideFreehand", function() { return _fillFreehand__WEBPACK_IMPORTED_MODULE_3__["fillInsideFreehand"]; });
  26594. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "fillOutsideFreehand", function() { return _fillFreehand__WEBPACK_IMPORTED_MODULE_3__["fillOutsideFreehand"]; });
  26595. /* harmony import */ var _fillRectangle__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./fillRectangle */ "./tools/segmentation/strategies/fillRectangle.js");
  26596. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "fillInsideRectangle", function() { return _fillRectangle__WEBPACK_IMPORTED_MODULE_4__["fillInsideRectangle"]; });
  26597. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "fillOutsideRectangle", function() { return _fillRectangle__WEBPACK_IMPORTED_MODULE_4__["fillOutsideRectangle"]; });
  26598. /* harmony import */ var _fillCircle__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./fillCircle */ "./tools/segmentation/strategies/fillCircle.js");
  26599. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "fillInsideCircle", function() { return _fillCircle__WEBPACK_IMPORTED_MODULE_5__["fillInsideCircle"]; });
  26600. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "fillOutsideCircle", function() { return _fillCircle__WEBPACK_IMPORTED_MODULE_5__["fillOutsideCircle"]; });
  26601. /* harmony import */ var _eraseCircle__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./eraseCircle */ "./tools/segmentation/strategies/eraseCircle.js");
  26602. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "eraseInsideCircle", function() { return _eraseCircle__WEBPACK_IMPORTED_MODULE_6__["eraseInsideCircle"]; });
  26603. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "eraseOutsideCircle", function() { return _eraseCircle__WEBPACK_IMPORTED_MODULE_6__["eraseOutsideCircle"]; });
  26604. /***/ }),
  26605. /***/ "./util/SaveAs.js":
  26606. /*!************************!*\
  26607. !*** ./util/SaveAs.js ***!
  26608. \************************/
  26609. /*! exports provided: default */
  26610. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  26611. "use strict";
  26612. __webpack_require__.r(__webpack_exports__);
  26613. /**
  26614. * Exports an image of the canvas.
  26615. * @export @public @method
  26616. * @name saveAs
  26617. *
  26618. * @param {HTMLElement} element The element to export.
  26619. * @param {string} filename The name of the exported image.
  26620. * @param {string} [mimetype = 'image/png'] The mimetype of the exported image.
  26621. * @returns {void}
  26622. */
  26623. /* harmony default export */ __webpack_exports__["default"] = (function (element, filename) {
  26624. var mimetype = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'image/png';
  26625. var canvas = element.querySelector('canvas'); // If we are using IE, use canvas.msToBlob
  26626. if (canvas.msToBlob) {
  26627. var blob = canvas.msToBlob();
  26628. return window.navigator.msSaveBlob(blob, filename);
  26629. } // Thanks to Ken Fyrstenber
  26630. // http://stackoverflow.com/questions/18480474/how-to-save-an-image-from-canvas
  26631. var lnk = document.createElement('a'); // The key here is to set the download attribute of the a tag
  26632. lnk.download = filename; // Convert canvas content to data-uri for link. When download
  26633. // Attribute is set the content pointed to by link will be
  26634. // Pushed as 'download' in HTML5 capable browsers
  26635. lnk.href = canvas.toDataURL(mimetype, 1); // Create a 'fake' click-event to trigger the download
  26636. if (document.createEvent) {
  26637. var e = document.createEvent('MouseEvents');
  26638. e.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
  26639. lnk.dispatchEvent(e);
  26640. } else if (lnk.fireEvent) {
  26641. lnk.fireEvent('onclick');
  26642. }
  26643. });
  26644. /***/ }),
  26645. /***/ "./util/angleBetweenPoints.js":
  26646. /*!************************************!*\
  26647. !*** ./util/angleBetweenPoints.js ***!
  26648. \************************************/
  26649. /*! exports provided: default */
  26650. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  26651. "use strict";
  26652. __webpack_require__.r(__webpack_exports__);
  26653. /**
  26654. * Calculates the (interior) angle in degrees from the initial mouse location
  26655. * to the current mouse location in relation to the center point.
  26656. * @public
  26657. * @function angleBetweenPoints
  26658. *
  26659. * @param {Object} p0 The center point.
  26660. * @param {Object} p1 The initial point.
  26661. * @param {Object} p2 The final point.
  26662. * @returns {Object} { angle, direction }
  26663. */
  26664. /* harmony default export */ __webpack_exports__["default"] = (function (p0, p1, p2) {
  26665. var p12 = Math.sqrt(Math.pow(p0.x - p1.x, 2) + Math.pow(p0.y - p1.y, 2));
  26666. var p13 = Math.sqrt(Math.pow(p0.x - p2.x, 2) + Math.pow(p0.y - p2.y, 2));
  26667. var p23 = Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2));
  26668. var angle = Math.acos((Math.pow(p12, 2) + Math.pow(p13, 2) - Math.pow(p23, 2)) / (2 * p12 * p13)) * 180 / Math.PI; // The direction of the angle (> 0 clockwise, < 0 anti-clockwise)
  26669. var direction = (p1.x - p0.x) * (p2.y - p0.y) - (p1.y - p0.y) * (p2.x - p0.x);
  26670. return {
  26671. angle: angle,
  26672. direction: direction
  26673. };
  26674. });
  26675. /***/ }),
  26676. /***/ "./util/calculateSUV.js":
  26677. /*!******************************!*\
  26678. !*** ./util/calculateSUV.js ***!
  26679. \******************************/
  26680. /*! exports provided: default */
  26681. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  26682. "use strict";
  26683. __webpack_require__.r(__webpack_exports__);
  26684. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
  26685. /**
  26686. * Calculates a Standardized Uptake Value.
  26687. * @export @public @method
  26688. * @name calculateSUV
  26689. *
  26690. * @param {Object} image The image.
  26691. * @param {number} storedPixelValue The raw pixel value.
  26692. * @param {bool} [skipRescale=fale]
  26693. * @returns {number} The SUV.
  26694. */
  26695. /* harmony default export */ __webpack_exports__["default"] = (function (image, storedPixelValue) {
  26696. var skipRescale = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
  26697. var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone;
  26698. var patientStudyModule = cornerstone.metaData.get('patientStudyModule', image.imageId);
  26699. var seriesModule = cornerstone.metaData.get('generalSeriesModule', image.imageId);
  26700. if (!patientStudyModule || !seriesModule) {
  26701. return;
  26702. }
  26703. var modality = seriesModule.modality; // Image must be PET
  26704. if (modality !== 'PT') {
  26705. return;
  26706. }
  26707. var modalityPixelValue = skipRescale ? storedPixelValue : storedPixelValue * image.slope + image.intercept;
  26708. var patientWeight = patientStudyModule.patientWeight; // In kg
  26709. if (!patientWeight) {
  26710. return;
  26711. }
  26712. var petSequenceModule = cornerstone.metaData.get('petIsotopeModule', image.imageId);
  26713. if (!petSequenceModule) {
  26714. return;
  26715. }
  26716. var radiopharmaceuticalInfo = petSequenceModule.radiopharmaceuticalInfo;
  26717. var startTime = radiopharmaceuticalInfo.radiopharmaceuticalStartTime;
  26718. var totalDose = radiopharmaceuticalInfo.radionuclideTotalDose;
  26719. var halfLife = radiopharmaceuticalInfo.radionuclideHalfLife;
  26720. var seriesAcquisitionTime = seriesModule.seriesTime;
  26721. if (!startTime || !totalDose || !halfLife || !seriesAcquisitionTime) {
  26722. return;
  26723. }
  26724. var acquisitionTimeInSeconds = fracToDec(seriesAcquisitionTime.fractionalSeconds || 0) + seriesAcquisitionTime.seconds + seriesAcquisitionTime.minutes * 60 + seriesAcquisitionTime.hours * 60 * 60;
  26725. var injectionStartTimeInSeconds = fracToDec(startTime.fractionalSeconds || 0) + startTime.seconds + startTime.minutes * 60 + startTime.hours * 60 * 60;
  26726. var durationInSeconds = acquisitionTimeInSeconds - injectionStartTimeInSeconds;
  26727. var correctedDose = totalDose * Math.exp(-durationInSeconds * Math.log(2) / halfLife);
  26728. var suv = modalityPixelValue * patientWeight / correctedDose * 1000;
  26729. return suv;
  26730. });
  26731. /**
  26732. * Returns a decimal value given a fractional value.
  26733. * @private
  26734. * @method
  26735. * @name fracToDec
  26736. *
  26737. * @param {number} fractionalValue The value to convert.
  26738. * @returns {number} The value converted to decimal.
  26739. */
  26740. function fracToDec(fractionalValue) {
  26741. return parseFloat(".".concat(fractionalValue));
  26742. }
  26743. /***/ }),
  26744. /***/ "./util/clip.js":
  26745. /*!**********************!*\
  26746. !*** ./util/clip.js ***!
  26747. \**********************/
  26748. /*! exports provided: clip, clipToBox, clipBoxToDisplayedArea, default */
  26749. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  26750. "use strict";
  26751. __webpack_require__.r(__webpack_exports__);
  26752. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clip", function() { return clip; });
  26753. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clipToBox", function() { return clipToBox; });
  26754. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clipBoxToDisplayedArea", function() { return clipBoxToDisplayedArea; });
  26755. /* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "../node_modules/@babel/runtime/helpers/toConsumableArray.js");
  26756. /* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__);
  26757. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
  26758. /**
  26759. * Clips a value to an upper and lower bound.
  26760. * @export @public @method
  26761. * @name clip
  26762. *
  26763. * @param {number} val The value to clip.
  26764. * @param {number} low The lower bound.
  26765. * @param {number} high The upper bound.
  26766. * @returns {number} The clipped value.
  26767. */
  26768. function clip(val, low, high) {
  26769. return Math.min(Math.max(low, val), high);
  26770. }
  26771. /**
  26772. * Clips a value within a box.
  26773. * @export @public @method
  26774. * @name clipToBox
  26775. *
  26776. * @param {Object} point The point to clip
  26777. * @param {Object} box The bounding box to clip to.
  26778. * @returns {void}
  26779. */
  26780. function clipToBox(point, box) {
  26781. // Clip an {x, y} point to a box {top, left, width, height}
  26782. var left = box.left || 0;
  26783. var top = box.top || 0;
  26784. point.x = clip(point.x, left, left + box.width);
  26785. point.y = clip(point.y, top, top + box.height);
  26786. }
  26787. /**
  26788. * Returns a new bounding box of rotated text box, relative to the pixel
  26789. * coordinate system. It will get the coordinate of the 4 points of the rotated
  26790. * text box and calculate the AABB (axis-aligned bounding box - lower and upper
  26791. * boundaries for `x` and `y` axes).
  26792. *
  26793. * @param {HTMLElement} element The element to manipulate pixel positioning
  26794. * @param {Object} box - `{ left, top, width, height }` in canvas coordinates
  26795. * @returns {Object} - `{ minX, minY, maxX, maxY }` boundaries of the box
  26796. */
  26797. var getBoxPixelBoundaries = function getBoxPixelBoundaries(element, box) {
  26798. var toPixel = function toPixel(point) {
  26799. return _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.canvasToPixel(element, point);
  26800. };
  26801. var top = box.top,
  26802. left = box.left,
  26803. width = box.width,
  26804. height = box.height;
  26805. var topLeft = toPixel({
  26806. x: left,
  26807. y: top
  26808. });
  26809. var topRight = toPixel({
  26810. x: left + width,
  26811. y: top
  26812. });
  26813. var bottomLeft = toPixel({
  26814. x: left,
  26815. y: top + height
  26816. });
  26817. var bottomRight = toPixel({
  26818. x: left + width,
  26819. y: top + height
  26820. });
  26821. var points = [topLeft, topRight, bottomLeft, bottomRight];
  26822. var xArray = points.map(function (p) {
  26823. return p.x;
  26824. });
  26825. var yArray = points.map(function (p) {
  26826. return p.y;
  26827. });
  26828. return {
  26829. minX: Math.min.apply(Math, _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(xArray)),
  26830. minY: Math.min.apply(Math, _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(yArray)),
  26831. maxX: Math.max.apply(Math, _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(xArray)),
  26832. maxY: Math.max.apply(Math, _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(yArray))
  26833. };
  26834. };
  26835. /**
  26836. * Reposition a box point coordinates in the given axis' upper/lower limits
  26837. *
  26838. * @param {Object} point `{ x, y }` The coordinate point of the box
  26839. * @param {string} axis The axis to be manipulated: `x` or `y`
  26840. * @param {number} boxMin The box position's lower value on axis
  26841. * @param {number} boxMax The box position's upper value on axis
  26842. * @param {number} lowerLimit The lower limit of allowed box position on axis
  26843. * @param {number} upperLimit The upper limit of allowed box position on axis
  26844. * @returns {void}
  26845. */
  26846. var clipBoxOnAxis = function clipBoxOnAxis(point, axis, boxMin, boxMax, lowerLimit, upperLimit) {
  26847. if (upperLimit - lowerLimit < boxMax - boxMin) {
  26848. // Box is bigger than allowed range, leaking both lower/upper boundaries
  26849. point[axis] += lowerLimit - boxMin; // Stick to the lower boundary
  26850. point[axis] += (upperLimit - lowerLimit) / 2; // Centralize in range
  26851. point[axis] -= (boxMax - boxMin) / 2; // Translate -1/2 of box's size
  26852. } else if (boxMin < lowerLimit) {
  26853. // Box leaked lower boundary
  26854. point[axis] += lowerLimit - boxMin; // Stick to the lower boundary
  26855. } else if (boxMax > upperLimit) {
  26856. // Box leaked upper boundary
  26857. point[axis] -= boxMax - upperLimit; // Stick to the upper boundary
  26858. }
  26859. };
  26860. /**
  26861. * Clips a box to the viewport's displayed area
  26862. * @export @public @method
  26863. * @name clipBoxToDisplayedArea
  26864. *
  26865. * @param {HTMLElement} element The element to manipulate pixel positioning
  26866. * @param {Object} box - `{ left, top, width, height }` in canvas coordinates
  26867. * @returns {void}
  26868. */
  26869. function clipBoxToDisplayedArea(element, box) {
  26870. var _external$cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone,
  26871. pixelToCanvas = _external$cornerstone.pixelToCanvas,
  26872. canvasToPixel = _external$cornerstone.canvasToPixel,
  26873. getViewport = _external$cornerstone.getViewport,
  26874. getEnabledElement = _external$cornerstone.getEnabledElement,
  26875. getDisplayedArea = _external$cornerstone.getDisplayedArea; // Transform the position of given box from canvas to pixel coordinates
  26876. var pixelPosition = canvasToPixel(element, {
  26877. x: box.left,
  26878. y: box.top
  26879. }); // Get the rotated corners' position for the box in pixel coordinate system
  26880. var _getBoxPixelBoundarie = getBoxPixelBoundaries(element, box),
  26881. minX = _getBoxPixelBoundarie.minX,
  26882. minY = _getBoxPixelBoundarie.minY,
  26883. maxX = _getBoxPixelBoundarie.maxX,
  26884. maxY = _getBoxPixelBoundarie.maxY; // Get the displayed area's top, left, bottom and right boundaries
  26885. var viewport = getViewport(element);
  26886. var enabledElement = getEnabledElement(element);
  26887. var defaultDisplayedArea = getDisplayedArea(enabledElement.image, viewport);
  26888. var _ref = viewport.displayedArea ? viewport.displayedArea : defaultDisplayedArea,
  26889. tlhc = _ref.tlhc,
  26890. brhc = _ref.brhc;
  26891. var top = tlhc.y - 1;
  26892. var left = tlhc.x - 1;
  26893. var bottom = brhc.y;
  26894. var right = brhc.x; // Clip the box on vertical axis
  26895. clipBoxOnAxis(pixelPosition, 'y', minY, maxY, top, bottom); // Clip the box on horizontal axis
  26896. clipBoxOnAxis(pixelPosition, 'x', minX, maxX, left, right); // Transform the box coordinate system back to canvas
  26897. var newCanvasPosition = pixelToCanvas(element, pixelPosition); // Update the box with the new coordinates
  26898. box.top = newCanvasPosition.y;
  26899. box.left = newCanvasPosition.x;
  26900. }
  26901. /* harmony default export */ __webpack_exports__["default"] = (clip);
  26902. /***/ }),
  26903. /***/ "./util/convertToVector3.js":
  26904. /*!**********************************!*\
  26905. !*** ./util/convertToVector3.js ***!
  26906. \**********************************/
  26907. /*! exports provided: default */
  26908. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  26909. "use strict";
  26910. __webpack_require__.r(__webpack_exports__);
  26911. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return convertToVector3; });
  26912. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
  26913. /**
  26914. * Convert an Array to a cornerstoneMath.Vector3
  26915. * @export @public @method
  26916. * @name convertToVector3
  26917. *
  26918. * @param {Array|cornerstoneMath.Vector3} arrayOrVector3 Input array or Vector3
  26919. * @returns {cornerstoneMath.Vector3}
  26920. */
  26921. function convertToVector3(arrayOrVector3) {
  26922. var cornerstoneMath = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath;
  26923. if (arrayOrVector3 instanceof cornerstoneMath.Vector3) {
  26924. return arrayOrVector3;
  26925. }
  26926. var keys = Object.keys(arrayOrVector3);
  26927. if (keys.includes('x') && keys.includes('y') && keys.includes('z')) {
  26928. return new cornerstoneMath.Vector3(arrayOrVector3.x, arrayOrVector3.y, arrayOrVector3.z);
  26929. }
  26930. return new cornerstoneMath.Vector3(arrayOrVector3[0], arrayOrVector3[1], arrayOrVector3[2]);
  26931. }
  26932. /***/ }),
  26933. /***/ "./util/copyPoints.js":
  26934. /*!****************************!*\
  26935. !*** ./util/copyPoints.js ***!
  26936. \****************************/
  26937. /*! exports provided: default */
  26938. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  26939. "use strict";
  26940. __webpack_require__.r(__webpack_exports__);
  26941. /**
  26942. * Returns a copy of the points object.
  26943. * @public
  26944. * @function copyPoints
  26945. *
  26946. * @param {Object} points - The object to copy.
  26947. * @returns {Object} - The copy.
  26948. */
  26949. /* harmony default export */ __webpack_exports__["default"] = (function (points) {
  26950. var page = _copy(points.page);
  26951. var image = _copy(points.image);
  26952. var client = _copy(points.client);
  26953. var canvas = _copy(points.canvas);
  26954. return {
  26955. page: page,
  26956. image: image,
  26957. client: client,
  26958. canvas: canvas
  26959. };
  26960. });
  26961. /**
  26962. *
  26963. * @private
  26964. * @function _copy
  26965. *
  26966. * @param {Object} point - { x, y }
  26967. * @returns {Object} { x, y }
  26968. */
  26969. function _copy() {
  26970. var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
  26971. x = _ref.x,
  26972. y = _ref.y;
  26973. return {
  26974. x: x,
  26975. y: y
  26976. };
  26977. }
  26978. /***/ }),
  26979. /***/ "./util/debounce.js":
  26980. /*!**************************!*\
  26981. !*** ./util/debounce.js ***!
  26982. \**************************/
  26983. /*! exports provided: default */
  26984. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  26985. "use strict";
  26986. __webpack_require__.r(__webpack_exports__);
  26987. /* harmony import */ var _isObject_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./isObject.js */ "./util/isObject.js");
  26988. /**
  26989. * Creates a debounced function that delays invoking `func` until after `wait`
  26990. * milliseconds have elapsed since the last time the debounced function was
  26991. * invoked, or until the next browser frame is drawn. The debounced function
  26992. * comes with a `cancel` method to cancel delayed `func` invocations and a
  26993. * `flush` method to immediately invoke them. Provide `options` to indicate
  26994. * whether `func` should be invoked on the leading and/or trailing edge of the
  26995. * `wait` timeout. The `func` is invoked with the last arguments provided to the
  26996. * debounced function. Subsequent calls to the debounced function return the
  26997. * result of the last `func` invocation.
  26998. *
  26999. * **Note:** If `leading` and `trailing` options are `true`, `func` is
  27000. * invoked on the trailing edge of the timeout only if the debounced function
  27001. * is invoked more than once during the `wait` timeout.
  27002. *
  27003. * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
  27004. * until the next tick, similar to `setTimeout` with a timeout of `0`.
  27005. *
  27006. * If `wait` is omitted in an environment with `requestAnimationFrame`, `func`
  27007. * invocation will be deferred until the next frame is drawn (typically about
  27008. * 16ms).
  27009. *
  27010. * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
  27011. * for details over the differences between `debounce` and `throttle`.
  27012. *
  27013. * @since 0.1.0
  27014. * @category Function
  27015. * @param {Function} func The function to debounce.
  27016. * @param {number} [wait=0]
  27017. * The number of milliseconds to delay; if omitted, `requestAnimationFrame` is
  27018. * used (if available).
  27019. * @param {Object} [options={}] The options object.
  27020. * @param {boolean} [options.leading=false]
  27021. * Specify invoking on the leading edge of the timeout.
  27022. * @param {number} [options.maxWait]
  27023. * The maximum time `func` is allowed to be delayed before it's invoked.
  27024. * @param {boolean} [options.trailing=true]
  27025. * Specify invoking on the trailing edge of the timeout.
  27026. * @returns {Function} Returns the new debounced function.
  27027. * @example
  27028. *
  27029. * // Avoid costly calculations while the window size is in flux.
  27030. * jQuery(window).on('resize', debounce(calculateLayout, 150))
  27031. *
  27032. * // Invoke `sendMail` when clicked, debouncing subsequent calls.
  27033. * jQuery(element).on('click', debounce(sendMail, 300, {
  27034. * 'leading': true,
  27035. * 'trailing': false
  27036. * }))
  27037. *
  27038. * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
  27039. * const debounced = debounce(batchLog, 250, { 'maxWait': 1000 })
  27040. * const source = new EventSource('/stream')
  27041. * jQuery(source).on('message', debounced)
  27042. *
  27043. * // Cancel the trailing debounced invocation.
  27044. * jQuery(window).on('popstate', debounced.cancel)
  27045. *
  27046. * // Check for pending invocations.
  27047. * const status = debounced.pending() ? "Pending..." : "Ready"
  27048. */
  27049. function debounce(func, wait, options) {
  27050. var lastArgs, lastThis, maxWait, result, timerId, lastCallTime;
  27051. var lastInvokeTime = 0;
  27052. var leading = false;
  27053. var maxing = false;
  27054. var trailing = true; // Bypass `requestAnimationFrame` by explicitly setting `wait=0`.
  27055. var useRAF = !wait && wait !== 0 && typeof window.requestAnimationFrame === 'function';
  27056. if (typeof func !== 'function') {
  27057. throw new TypeError('Expected a function');
  27058. }
  27059. wait = Number(wait) || 0;
  27060. if (Object(_isObject_js__WEBPACK_IMPORTED_MODULE_0__["default"])(options)) {
  27061. leading = Boolean(options.leading);
  27062. maxing = 'maxWait' in options;
  27063. maxWait = maxing ? Math.max(Number(options.maxWait) || 0, wait) : maxWait;
  27064. trailing = 'trailing' in options ? Boolean(options.trailing) : trailing;
  27065. }
  27066. function invokeFunc(time) {
  27067. var args = lastArgs;
  27068. var thisArg = lastThis;
  27069. lastArgs = lastThis = undefined;
  27070. lastInvokeTime = time;
  27071. result = func.apply(thisArg, args);
  27072. return result;
  27073. }
  27074. function startTimer(pendingFunc, wait) {
  27075. if (useRAF) {
  27076. return window.requestAnimationFrame(pendingFunc);
  27077. }
  27078. return setTimeout(pendingFunc, wait);
  27079. }
  27080. function cancelTimer(id) {
  27081. if (useRAF) {
  27082. return window.cancelAnimationFrame(id);
  27083. }
  27084. clearTimeout(id);
  27085. }
  27086. function leadingEdge(time) {
  27087. // Reset any `maxWait` timer.
  27088. lastInvokeTime = time; // Start the timer for the trailing edge.
  27089. timerId = startTimer(timerExpired, wait); // Invoke the leading edge.
  27090. return leading ? invokeFunc(time) : result;
  27091. }
  27092. function remainingWait(time) {
  27093. var timeSinceLastCall = time - lastCallTime;
  27094. var timeSinceLastInvoke = time - lastInvokeTime;
  27095. var timeWaiting = wait - timeSinceLastCall;
  27096. return maxing ? Math.min(timeWaiting, maxWait - timeSinceLastInvoke) : timeWaiting;
  27097. }
  27098. function shouldInvoke(time) {
  27099. var timeSinceLastCall = time - lastCallTime;
  27100. var timeSinceLastInvoke = time - lastInvokeTime; // Either this is the first call, activity has stopped and we're at the
  27101. // trailing edge, the system time has gone backwards and we're treating
  27102. // it as the trailing edge, or we've hit the `maxWait` limit.
  27103. return lastCallTime === undefined || timeSinceLastCall >= wait || timeSinceLastCall < 0 || maxing && timeSinceLastInvoke >= maxWait;
  27104. }
  27105. function timerExpired() {
  27106. var time = Date.now();
  27107. if (shouldInvoke(time)) {
  27108. return trailingEdge(time);
  27109. } // Restart the timer.
  27110. timerId = startTimer(timerExpired, remainingWait(time));
  27111. }
  27112. function trailingEdge(time) {
  27113. timerId = undefined; // Only invoke if we have `lastArgs` which means `func` has been
  27114. // debounced at least once.
  27115. if (trailing && lastArgs) {
  27116. return invokeFunc(time);
  27117. }
  27118. lastArgs = lastThis = undefined;
  27119. return result;
  27120. }
  27121. function cancel() {
  27122. if (timerId !== undefined) {
  27123. cancelTimer(timerId);
  27124. }
  27125. lastInvokeTime = 0;
  27126. lastArgs = lastCallTime = lastThis = timerId = undefined;
  27127. }
  27128. function flush() {
  27129. return timerId === undefined ? result : trailingEdge(Date.now());
  27130. }
  27131. function pending() {
  27132. return timerId !== undefined;
  27133. }
  27134. function debounced() {
  27135. var time = Date.now();
  27136. var isInvoking = shouldInvoke(time);
  27137. for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
  27138. args[_key] = arguments[_key];
  27139. }
  27140. lastArgs = args;
  27141. lastThis = this; // eslint-disable-line consistent-this
  27142. lastCallTime = time;
  27143. if (isInvoking) {
  27144. if (timerId === undefined) {
  27145. return leadingEdge(lastCallTime);
  27146. }
  27147. if (maxing) {
  27148. // Handle invocations in a tight loop.
  27149. timerId = startTimer(timerExpired, wait);
  27150. return invokeFunc(lastCallTime);
  27151. }
  27152. }
  27153. if (timerId === undefined) {
  27154. timerId = startTimer(timerExpired, wait);
  27155. }
  27156. return result;
  27157. }
  27158. debounced.cancel = cancel;
  27159. debounced.flush = flush;
  27160. debounced.pending = pending;
  27161. return debounced;
  27162. }
  27163. /* harmony default export */ __webpack_exports__["default"] = (debounce);
  27164. /***/ }),
  27165. /***/ "./util/debugLib/common.js":
  27166. /*!*********************************!*\
  27167. !*** ./util/debugLib/common.js ***!
  27168. \*********************************/
  27169. /*! exports provided: default */
  27170. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  27171. "use strict";
  27172. __webpack_require__.r(__webpack_exports__);
  27173. /* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "../node_modules/@babel/runtime/helpers/toConsumableArray.js");
  27174. /* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__);
  27175. /**
  27176. * This is the common logic for both the Node.js and web browser
  27177. * implementations of `debug()`.
  27178. */
  27179. function setup(env) {
  27180. createDebug.debug = createDebug;
  27181. createDebug.default = createDebug;
  27182. createDebug.coerce = coerce;
  27183. createDebug.disable = disable;
  27184. createDebug.enable = enable;
  27185. createDebug.enabled = enabled;
  27186. createDebug.humanize = __webpack_require__(/*! ms */ "../node_modules/ms/index.js");
  27187. Object.keys(env).forEach(function (key) {
  27188. createDebug[key] = env[key];
  27189. });
  27190. /**
  27191. * Active `debug` instances.
  27192. */
  27193. createDebug.instances = [];
  27194. /**
  27195. * The currently active debug mode names, and names to skip.
  27196. */
  27197. createDebug.names = [];
  27198. createDebug.skips = [];
  27199. /**
  27200. * Map of special "%n" handling functions, for the debug "format" argument.
  27201. *
  27202. * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
  27203. */
  27204. createDebug.formatters = {};
  27205. /**
  27206. * Selects a color for a debug namespace
  27207. * @param {String} namespace The namespace string for the for the debug instance to be colored
  27208. * @returns {Number|String} An ANSI color code for the given namespace
  27209. * @api private
  27210. */
  27211. function selectColor(namespace) {
  27212. var hash = 0;
  27213. for (var i = 0; i < namespace.length; i++) {
  27214. hash = (hash << 5) - hash + namespace.charCodeAt(i);
  27215. hash |= 0; // Convert to 32bit integer
  27216. }
  27217. return createDebug.colors[Math.abs(hash) % createDebug.colors.length];
  27218. }
  27219. createDebug.selectColor = selectColor;
  27220. /**
  27221. * Create a debugger with the given `namespace`.
  27222. *
  27223. * @param {String} namespace
  27224. * @returns {Function}
  27225. * @api public
  27226. */
  27227. function createDebug(namespace) {
  27228. var prevTime;
  27229. function debug() {
  27230. for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
  27231. args[_key] = arguments[_key];
  27232. }
  27233. // Disabled?
  27234. if (!debug.enabled) {
  27235. return;
  27236. }
  27237. var self = debug; // Set `diff` timestamp
  27238. var curr = Number(new Date());
  27239. var ms = curr - (prevTime || curr);
  27240. self.diff = ms;
  27241. self.prev = prevTime;
  27242. self.curr = curr;
  27243. prevTime = curr;
  27244. args[0] = createDebug.coerce(args[0]);
  27245. if (typeof args[0] !== 'string') {
  27246. // Anything else let's inspect with %O
  27247. args.unshift('%O');
  27248. } // Apply any `formatters` transformations
  27249. var index = 0;
  27250. args[0] = args[0].replace(/%([a-zA-Z%])/g, function (match, format) {
  27251. // If we encounter an escaped % then don't increase the array index
  27252. if (match === '%%') {
  27253. return match;
  27254. }
  27255. index++;
  27256. var formatter = createDebug.formatters[format];
  27257. if (typeof formatter === 'function') {
  27258. var val = args[index];
  27259. match = formatter.call(self, val); // Now we need to remove `args[index]` since it's inlined in the `format`
  27260. args.splice(index, 1);
  27261. index--;
  27262. }
  27263. return match;
  27264. }); // Apply env-specific formatting (colors, etc.)
  27265. createDebug.formatArgs.call(self, args);
  27266. var logFn = self.log || createDebug.log;
  27267. logFn.apply(self, args);
  27268. }
  27269. debug.namespace = namespace;
  27270. debug.enabled = createDebug.enabled(namespace);
  27271. debug.useColors = createDebug.useColors();
  27272. debug.color = selectColor(namespace);
  27273. debug.destroy = destroy;
  27274. debug.extend = extend; // Debug.formatArgs = formatArgs;
  27275. // debug.rawLog = rawLog;
  27276. // env-specific initialization logic for debug instances
  27277. if (typeof createDebug.init === 'function') {
  27278. createDebug.init(debug);
  27279. }
  27280. createDebug.instances.push(debug);
  27281. return debug;
  27282. }
  27283. function destroy() {
  27284. var index = createDebug.instances.indexOf(this);
  27285. if (index !== -1) {
  27286. createDebug.instances.splice(index, 1);
  27287. return true;
  27288. }
  27289. return false;
  27290. }
  27291. function extend(namespace, delimiter) {
  27292. var newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);
  27293. newDebug.log = this.log;
  27294. return newDebug;
  27295. }
  27296. /**
  27297. * Enables a debug mode by namespaces. This can include modes
  27298. * separated by a colon and wildcards.
  27299. *
  27300. * @param {String} namespaces
  27301. * @api public
  27302. */
  27303. function enable(namespaces) {
  27304. createDebug.save(namespaces);
  27305. createDebug.names = [];
  27306. createDebug.skips = [];
  27307. var i;
  27308. var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/);
  27309. var len = split.length;
  27310. for (i = 0; i < len; i++) {
  27311. if (!split[i]) {
  27312. // Ignore empty strings
  27313. continue;
  27314. }
  27315. namespaces = split[i].replace(/\*/g, '.*?');
  27316. if (namespaces[0] === '-') {
  27317. createDebug.skips.push(new RegExp("^".concat(namespaces.substr(1), "$")));
  27318. } else {
  27319. createDebug.names.push(new RegExp("^".concat(namespaces, "$")));
  27320. }
  27321. }
  27322. for (i = 0; i < createDebug.instances.length; i++) {
  27323. var instance = createDebug.instances[i];
  27324. instance.enabled = createDebug.enabled(instance.namespace);
  27325. }
  27326. }
  27327. /**
  27328. * Disable debug output.
  27329. *
  27330. * @returns {String} namespaces
  27331. * @api public
  27332. */
  27333. function disable() {
  27334. var namespaces = [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(createDebug.names.map(toNamespace)), _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(createDebug.skips.map(toNamespace).map(function (namespace) {
  27335. return "-".concat(namespace);
  27336. }))).join(',');
  27337. createDebug.enable('');
  27338. return namespaces;
  27339. }
  27340. /**
  27341. * Returns true if the given mode name is enabled, false otherwise.
  27342. *
  27343. * @param {String} name
  27344. * @returns {Boolean}
  27345. * @api public
  27346. */
  27347. function enabled(name) {
  27348. if (name[name.length - 1] === '*') {
  27349. return true;
  27350. }
  27351. var i;
  27352. var len;
  27353. for (i = 0, len = createDebug.skips.length; i < len; i++) {
  27354. if (createDebug.skips[i].test(name)) {
  27355. return false;
  27356. }
  27357. }
  27358. for (i = 0, len = createDebug.names.length; i < len; i++) {
  27359. if (createDebug.names[i].test(name)) {
  27360. return true;
  27361. }
  27362. }
  27363. return false;
  27364. }
  27365. /**
  27366. * Convert regexp to namespace
  27367. *
  27368. * @param {RegExp} regxep
  27369. * @returns {String} namespace
  27370. * @api private
  27371. */
  27372. function toNamespace(regexp) {
  27373. return regexp.toString().substring(2, regexp.toString().length - 2).replace(/\.\*\?$/, '*');
  27374. }
  27375. /**
  27376. * Coerce `val`.
  27377. *
  27378. * @param {Mixed} val
  27379. * @returns {Mixed}
  27380. * @api private
  27381. */
  27382. function coerce(val) {
  27383. if (val instanceof Error) {
  27384. return val.stack || val.message;
  27385. }
  27386. return val;
  27387. }
  27388. createDebug.enable(createDebug.load());
  27389. return createDebug;
  27390. }
  27391. /* harmony default export */ __webpack_exports__["default"] = (setup);
  27392. /***/ }),
  27393. /***/ "./util/debugLib/index.js":
  27394. /*!********************************!*\
  27395. !*** ./util/debugLib/index.js ***!
  27396. \********************************/
  27397. /*! exports provided: default */
  27398. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  27399. "use strict";
  27400. __webpack_require__.r(__webpack_exports__);
  27401. /* WEBPACK VAR INJECTION */(function(process) {/* harmony import */ var _common_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./common.js */ "./util/debugLib/common.js");
  27402. /* eslint-env browser */
  27403. /**
  27404. * This is the web browser implementation of `debug()`.
  27405. */
  27406. var storage = localstorage();
  27407. var debugLib = {
  27408. formatArgs: formatArgs,
  27409. save: save,
  27410. load: load,
  27411. useColors: useColors,
  27412. storage: storage
  27413. };
  27414. /**
  27415. * Colors.
  27416. */
  27417. debugLib.colors = ['#0000CC', '#0000FF', '#0033CC', '#0033FF', '#0066CC', '#0066FF', '#0099CC', '#0099FF', '#00CC00', '#00CC33', '#00CC66', '#00CC99', '#00CCCC', '#00CCFF', '#3300CC', '#3300FF', '#3333CC', '#3333FF', '#3366CC', '#3366FF', '#3399CC', '#3399FF', '#33CC00', '#33CC33', '#33CC66', '#33CC99', '#33CCCC', '#33CCFF', '#6600CC', '#6600FF', '#6633CC', '#6633FF', '#66CC00', '#66CC33', '#9900CC', '#9900FF', '#9933CC', '#9933FF', '#99CC00', '#99CC33', '#CC0000', '#CC0033', '#CC0066', '#CC0099', '#CC00CC', '#CC00FF', '#CC3300', '#CC3333', '#CC3366', '#CC3399', '#CC33CC', '#CC33FF', '#CC6600', '#CC6633', '#CC9900', '#CC9933', '#CCCC00', '#CCCC33', '#FF0000', '#FF0033', '#FF0066', '#FF0099', '#FF00CC', '#FF00FF', '#FF3300', '#FF3333', '#FF3366', '#FF3399', '#FF33CC', '#FF33FF', '#FF6600', '#FF6633', '#FF9900', '#FF9933', '#FFCC00', '#FFCC33'];
  27418. /**
  27419. * Currently only WebKit-based Web Inspectors, Firefox >= v31,
  27420. * and the Firebug extension (any Firefox version) are known
  27421. * to support "%c" CSS customizations.
  27422. *
  27423. * TODO: add a `localStorage` variable to explicitly enable/disable colors
  27424. */
  27425. // eslint-disable-next-line complexity
  27426. function useColors() {
  27427. // NB: In an Electron preload script, document will be defined but not fully
  27428. // initialized. Since we know we're in Chrome, we'll just detect this case
  27429. // explicitly
  27430. if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {
  27431. return true;
  27432. } // Internet Explorer and Edge do not support colors.
  27433. if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) {
  27434. return false;
  27435. } // Is webkit? http://stackoverflow.com/a/16459606/376773
  27436. // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
  27437. return typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance || // Is firebug? http://stackoverflow.com/a/398120/376773
  27438. typeof window !== 'undefined' && window.console && (window.console.firebug || window.console.exception && window.console.table) || // Is firefox >= v31?
  27439. // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
  27440. typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31 || // Double check webkit in userAgent just in case we are in a worker
  27441. typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/);
  27442. }
  27443. /**
  27444. * Colorize log arguments if enabled.
  27445. *
  27446. * @api public
  27447. */
  27448. function formatArgs(args) {
  27449. args[0] = "".concat((this.useColors ? '%c' : '') + this.namespace + (this.useColors ? ' %c' : ' ') + args[0] + (this.useColors ? '%c ' : ' '), "+").concat(setupDebug.humanize(this.diff));
  27450. if (!this.useColors) {
  27451. return;
  27452. }
  27453. var c = "color: ".concat(this.color);
  27454. args.splice(1, 0, c, 'color: inherit'); // The final "%c" is somewhat tricky, because there could be other
  27455. // arguments passed either before or after the %c, so we need to
  27456. // figure out the correct index to insert the CSS into
  27457. var index = 0;
  27458. var lastC = 0;
  27459. args[0].replace(/%[a-zA-Z%]/g, function (match) {
  27460. if (match === '%%') {
  27461. return;
  27462. }
  27463. index++;
  27464. if (match === '%c') {
  27465. // We only are interested in the *last* %c
  27466. // (the user may have provided their own)
  27467. lastC = index;
  27468. }
  27469. });
  27470. args.splice(lastC, 0, c);
  27471. }
  27472. /**
  27473. * Invokes `console.debug()` when available.
  27474. * No-op when `console.debug` is not a "function".
  27475. * If `console.debug` is not available, falls back
  27476. * to `console.log`.
  27477. *
  27478. * @api public
  27479. */
  27480. debugLib.log = console.debug || console.log || function () {};
  27481. /**
  27482. * Save `namespaces`.
  27483. *
  27484. * @param {String} namespaces
  27485. * @api private
  27486. */
  27487. function save(namespaces) {
  27488. try {
  27489. if (namespaces) {
  27490. debugLib.storage.setItem('debug', namespaces);
  27491. } else {
  27492. debugLib.storage.removeItem('debug');
  27493. }
  27494. } catch (error) {// Swallow
  27495. // XXX (@Qix-) should we be logging these?
  27496. }
  27497. }
  27498. /**
  27499. * Load `namespaces`.
  27500. *
  27501. * @return {String} returns the previously persisted debug modes
  27502. * @api private
  27503. */
  27504. function load() {
  27505. var r;
  27506. try {
  27507. r = debugLib.storage.getItem('debug');
  27508. } catch (error) {
  27509. console.warn(error);
  27510. } // Swallow
  27511. // XXX (@Qix-) should we be logging these?
  27512. // If debug isn't set in LS, and we're in Electron, try to load $DEBUG
  27513. if (!r && typeof process !== 'undefined' && 'env' in process) {
  27514. r = process.env.DEBUG;
  27515. }
  27516. return r;
  27517. }
  27518. /**
  27519. * Localstorage attempts to return the localstorage.
  27520. *
  27521. * This is necessary because safari throws
  27522. * when a user disables cookies/localstorage
  27523. * and you attempt to access it.
  27524. *
  27525. * @return {LocalStorage}
  27526. * @api private
  27527. */
  27528. function localstorage() {
  27529. try {
  27530. // TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context
  27531. // The Browser also has localStorage in the global context.
  27532. return localStorage;
  27533. } catch (error) {// Swallow
  27534. // XXX (@Qix-) should we be logging these?
  27535. }
  27536. }
  27537. var setupDebug = Object(_common_js__WEBPACK_IMPORTED_MODULE_0__["default"])(debugLib);
  27538. var formatters = setupDebug.formatters;
  27539. /**
  27540. * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
  27541. */
  27542. formatters.j = function (v) {
  27543. try {
  27544. return JSON.stringify(v);
  27545. } catch (error) {
  27546. return "[UnexpectedJSONParseError]: ".concat(error.message);
  27547. }
  27548. };
  27549. /* harmony default export */ __webpack_exports__["default"] = (setupDebug);
  27550. /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../node_modules/process/browser.js */ "../node_modules/process/browser.js")))
  27551. /***/ }),
  27552. /***/ "./util/deepmerge.js":
  27553. /*!***************************!*\
  27554. !*** ./util/deepmerge.js ***!
  27555. \***************************/
  27556. /*! exports provided: default */
  27557. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  27558. "use strict";
  27559. __webpack_require__.r(__webpack_exports__);
  27560. /* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "../node_modules/@babel/runtime/helpers/typeof.js");
  27561. /* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__);
  27562. var isMergeableObject = function isMergeableObject(val) {
  27563. var nonNullObject = val && _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default()(val) === 'object';
  27564. return nonNullObject && Object.prototype.toString.call(val) !== '[object RegExp]' && Object.prototype.toString.call(val) !== '[object Date]';
  27565. };
  27566. var emptyTarget = function emptyTarget(val) {
  27567. var isEmpty = Array.isArray(val) ? [] : {};
  27568. return isEmpty;
  27569. };
  27570. var cloneIfNecessary = function cloneIfNecessary(value, optionsArgument) {
  27571. var clone = optionsArgument && optionsArgument.clone === true;
  27572. return clone && isMergeableObject(value) ? deepmerge(emptyTarget(value), value, optionsArgument) : value;
  27573. };
  27574. var defaultArrayMerge = function defaultArrayMerge(target, source, optionsArgument) {
  27575. var destination = target.slice();
  27576. source.forEach(function (e, i) {
  27577. if (typeof destination[i] === 'undefined') {
  27578. destination[i] = cloneIfNecessary(e, optionsArgument);
  27579. } else if (isMergeableObject(e)) {
  27580. destination[i] = deepmerge(target[i], e, optionsArgument);
  27581. } else if (target.indexOf(e) === -1) {
  27582. destination.push(cloneIfNecessary(e, optionsArgument));
  27583. }
  27584. });
  27585. return destination;
  27586. };
  27587. var mergeObject = function mergeObject(target, source, optionsArgument) {
  27588. var destination = {};
  27589. if (isMergeableObject(target)) {
  27590. Object.keys(target).forEach(function (key) {
  27591. destination[key] = cloneIfNecessary(target[key], optionsArgument);
  27592. });
  27593. }
  27594. Object.keys(source).forEach(function (key) {
  27595. if (!isMergeableObject(source[key]) || !target[key]) {
  27596. destination[key] = cloneIfNecessary(source[key], optionsArgument);
  27597. } else {
  27598. destination[key] = deepmerge(target[key], source[key], optionsArgument);
  27599. }
  27600. });
  27601. return destination;
  27602. };
  27603. var deepmerge = function deepmerge() {
  27604. var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  27605. var source = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  27606. var optionsArgument = arguments.length > 2 ? arguments[2] : undefined;
  27607. var array = Array.isArray(source);
  27608. var options = optionsArgument || {
  27609. arrayMerge: defaultArrayMerge
  27610. };
  27611. var arrayMerge = options.arrayMerge || defaultArrayMerge;
  27612. if (array) {
  27613. return Array.isArray(target) ? arrayMerge(target, source, optionsArgument) : cloneIfNecessary(source, optionsArgument);
  27614. }
  27615. var mergedObject = mergeObject(target, source, optionsArgument);
  27616. if (Object.getPrototypeOf(target) !== Object.prototype) {
  27617. Object.setPrototypeOf(mergedObject, Object.getPrototypeOf(target));
  27618. }
  27619. return mergedObject;
  27620. };
  27621. /* harmony default export */ __webpack_exports__["default"] = (deepmerge);
  27622. /***/ }),
  27623. /***/ "./util/ellipse/calculateEllipseStatistics.js":
  27624. /*!****************************************************!*\
  27625. !*** ./util/ellipse/calculateEllipseStatistics.js ***!
  27626. \****************************************************/
  27627. /*! exports provided: default */
  27628. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  27629. "use strict";
  27630. __webpack_require__.r(__webpack_exports__);
  27631. /* harmony import */ var _pointInEllipse_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./pointInEllipse.js */ "./util/ellipse/pointInEllipse.js");
  27632. /**
  27633. * Calculates the statistics of an elliptical region of interest.
  27634. *
  27635. * @private
  27636. * @function calculateEllipseStatistics
  27637. *
  27638. * @param {number[]} sp - Array of the image data's pixel values.
  27639. * @param {Object} ellipse - { top, left, height, width } - An object describing the ellipse.
  27640. * @returns {Object} { count, mean, variance, stdDev, min, max }
  27641. */
  27642. /* harmony default export */ __webpack_exports__["default"] = (function (sp, ellipse) {
  27643. var sum = 0;
  27644. var sumSquared = 0;
  27645. var count = 0;
  27646. var index = 0;
  27647. var min = null;
  27648. var max = null;
  27649. for (var y = ellipse.top; y < ellipse.top + ellipse.height; y++) {
  27650. for (var x = ellipse.left; x < ellipse.left + ellipse.width; x++) {
  27651. var point = {
  27652. x: x,
  27653. y: y
  27654. };
  27655. if (Object(_pointInEllipse_js__WEBPACK_IMPORTED_MODULE_0__["default"])(ellipse, point)) {
  27656. if (min === null) {
  27657. min = sp[index];
  27658. max = sp[index];
  27659. }
  27660. sum += sp[index];
  27661. sumSquared += sp[index] * sp[index];
  27662. min = Math.min(min, sp[index]);
  27663. max = Math.max(max, sp[index]);
  27664. count++;
  27665. }
  27666. index++;
  27667. }
  27668. }
  27669. if (count === 0) {
  27670. return {
  27671. count: count,
  27672. mean: 0.0,
  27673. variance: 0.0,
  27674. stdDev: 0.0,
  27675. min: 0.0,
  27676. max: 0.0
  27677. };
  27678. }
  27679. var mean = sum / count;
  27680. var variance = sumSquared / count - mean * mean;
  27681. return {
  27682. count: count,
  27683. mean: mean,
  27684. variance: variance,
  27685. stdDev: Math.sqrt(variance),
  27686. min: min,
  27687. max: max
  27688. };
  27689. });
  27690. /***/ }),
  27691. /***/ "./util/ellipse/index.js":
  27692. /*!*******************************!*\
  27693. !*** ./util/ellipse/index.js ***!
  27694. \*******************************/
  27695. /*! exports provided: calculateEllipseStatistics, pointInEllipse, default */
  27696. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  27697. "use strict";
  27698. __webpack_require__.r(__webpack_exports__);
  27699. /* harmony import */ var _calculateEllipseStatistics_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./calculateEllipseStatistics.js */ "./util/ellipse/calculateEllipseStatistics.js");
  27700. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "calculateEllipseStatistics", function() { return _calculateEllipseStatistics_js__WEBPACK_IMPORTED_MODULE_0__["default"]; });
  27701. /* harmony import */ var _pointInEllipse_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./pointInEllipse.js */ "./util/ellipse/pointInEllipse.js");
  27702. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pointInEllipse", function() { return _pointInEllipse_js__WEBPACK_IMPORTED_MODULE_1__["default"]; });
  27703. // Named
  27704. // Default
  27705. /* harmony default export */ __webpack_exports__["default"] = ({
  27706. calculateEllipseStatistics: _calculateEllipseStatistics_js__WEBPACK_IMPORTED_MODULE_0__["default"],
  27707. pointInEllipse: _pointInEllipse_js__WEBPACK_IMPORTED_MODULE_1__["default"]
  27708. });
  27709. /***/ }),
  27710. /***/ "./util/ellipse/pointInEllipse.js":
  27711. /*!****************************************!*\
  27712. !*** ./util/ellipse/pointInEllipse.js ***!
  27713. \****************************************/
  27714. /*! exports provided: default */
  27715. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  27716. "use strict";
  27717. __webpack_require__.r(__webpack_exports__);
  27718. /**
  27719. * Returns true if a point is within an ellipse
  27720. * @export @public @method
  27721. * @name pointInEllipse
  27722. *
  27723. * @param {Object} ellipse Object defining the ellipse.
  27724. * @param {Object} location The location of the point.
  27725. * @returns {boolean} True if the point is within the ellipse.
  27726. */
  27727. /* harmony default export */ __webpack_exports__["default"] = (function (ellipse, location) {
  27728. var xRadius = ellipse.width / 2;
  27729. var yRadius = ellipse.height / 2;
  27730. if (xRadius <= 0.0 || yRadius <= 0.0) {
  27731. return false;
  27732. }
  27733. var center = {
  27734. x: ellipse.left + xRadius,
  27735. y: ellipse.top + yRadius
  27736. };
  27737. /* This is a more general form of the circle equation
  27738. *
  27739. * X^2/a^2 + Y^2/b^2 <= 1
  27740. */
  27741. var normalized = {
  27742. x: location.x - center.x,
  27743. y: location.y - center.y
  27744. };
  27745. var inEllipse = normalized.x * normalized.x / (xRadius * xRadius) + normalized.y * normalized.y / (yRadius * yRadius) <= 1.0;
  27746. return inEllipse;
  27747. });
  27748. /***/ }),
  27749. /***/ "./util/findAndMoveHelpers.js":
  27750. /*!************************************!*\
  27751. !*** ./util/findAndMoveHelpers.js ***!
  27752. \************************************/
  27753. /*! exports provided: moveHandleNearImagePoint, findHandleDataNearImagePoint, moveAnnotation */
  27754. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  27755. "use strict";
  27756. __webpack_require__.r(__webpack_exports__);
  27757. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "moveHandleNearImagePoint", function() { return moveHandleNearImagePoint; });
  27758. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "findHandleDataNearImagePoint", function() { return findHandleDataNearImagePoint; });
  27759. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "moveAnnotation", function() { return moveAnnotation; });
  27760. /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "../node_modules/@babel/runtime/helpers/defineProperty.js");
  27761. /* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__);
  27762. /* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../store/index.js */ "./store/index.js");
  27763. /* harmony import */ var _manipulators_getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../manipulators/getHandleNearImagePoint.js */ "./manipulators/getHandleNearImagePoint.js");
  27764. /* harmony import */ var _manipulators_index_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./../manipulators/index.js */ "./manipulators/index.js");
  27765. /* harmony import */ var _getProximityThreshold_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./getProximityThreshold.js */ "./util/getProximityThreshold.js");
  27766. /* harmony import */ var _events__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../events */ "./events.js");
  27767. /* harmony import */ var _triggerEvent__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./triggerEvent */ "./util/triggerEvent.js");
  27768. function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
  27769. function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
  27770. // TODO this should just be in manipulators? They are just manipulator wrappers anyway.
  27771. /**
  27772. * Moves a handle near the image point.
  27773. * @public
  27774. * @function moveHandleNearImagePoint
  27775. * @memberof Util
  27776. *
  27777. * @param {Event} evt The event.
  27778. * @param {*} tool The tool
  27779. * @param {Object} toolData The toolData that corresponds to the handle.
  27780. * @param {Object} handle The handle to be moved.
  27781. * @param {string} interactionType
  27782. * @returns {undefined}
  27783. */
  27784. var moveHandleNearImagePoint = function moveHandleNearImagePoint(evt, tool, toolData, handle, interactionType) {
  27785. toolData.active = true;
  27786. _store_index_js__WEBPACK_IMPORTED_MODULE_1__["state"].isToolLocked = true;
  27787. var doneHandler = function doneHandler(success) {
  27788. var element = evt.detail.element;
  27789. var toolName = toolData.toolType || toolData.toolName;
  27790. var modifiedEventData = {
  27791. toolName: toolName,
  27792. toolType: toolName,
  27793. // Deprecation notice: toolType will be replaced by toolName
  27794. element: element,
  27795. measurementData: _objectSpread({}, toolData, {
  27796. active: false
  27797. })
  27798. };
  27799. Object(_triggerEvent__WEBPACK_IMPORTED_MODULE_6__["default"])(element, _events__WEBPACK_IMPORTED_MODULE_5__["default"].MEASUREMENT_COMPLETED, modifiedEventData);
  27800. };
  27801. Object(_manipulators_index_js__WEBPACK_IMPORTED_MODULE_3__["moveHandle"])(evt.detail, tool.name, toolData, handle, tool.options, interactionType, doneHandler);
  27802. evt.stopImmediatePropagation();
  27803. evt.stopPropagation();
  27804. evt.preventDefault();
  27805. return;
  27806. };
  27807. /**
  27808. * Finds the handle near the image point and its corresponding data.
  27809. *
  27810. * @public
  27811. * @function findHandleDataNearImagePoint
  27812. * @memberof Util
  27813. *
  27814. * @param {HTMLElement} element The elment.
  27815. * @param {Object} toolState The state of the tool.
  27816. * @param {string} toolName The name of the tool the handle corrosponds to.
  27817. * @param {Object} coords The coordinates that need to be checked.
  27818. * @param {String} [interactionType=mouse]
  27819. * @returns {*}
  27820. */
  27821. var findHandleDataNearImagePoint = function findHandleDataNearImagePoint(element, toolState, toolName, coords) {
  27822. var interactionType = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 'mouse';
  27823. for (var i = 0; i < toolState.data.length; i++) {
  27824. var data = toolState.data[i];
  27825. var handle = Object(_manipulators_getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_2__["default"])(element, data.handles, coords, Object(_getProximityThreshold_js__WEBPACK_IMPORTED_MODULE_4__["default"])(interactionType, toolName));
  27826. if (handle) {
  27827. return {
  27828. handle: handle,
  27829. data: data
  27830. };
  27831. }
  27832. }
  27833. };
  27834. /**
  27835. * Moves an entire annotation near the click.
  27836. *
  27837. * @public
  27838. * @function moveAnnotation
  27839. * @memberof Util
  27840. *
  27841. * @param {Event} evt The event.
  27842. * @param {Object} tool The tool that the annotation belongs to.
  27843. * @param {string} tool.name
  27844. * @param {Object} [tool.options={}]
  27845. * @param {Boolean} [tool.options.preventHandleOutsideImage]
  27846. * @param {Boolean} [tool.options.deleteIfHandleOutsideImage]
  27847. * @param {Object} annotation The toolData that corresponds to the annotation.
  27848. * @param {String} [interactionType=mouse]
  27849. * @returns {undefined}
  27850. */
  27851. var moveAnnotation = function moveAnnotation(evt, tool, annotation) {
  27852. var interactionType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'mouse';
  27853. annotation.active = true;
  27854. _store_index_js__WEBPACK_IMPORTED_MODULE_1__["state"].isToolLocked = true;
  27855. Object(_manipulators_index_js__WEBPACK_IMPORTED_MODULE_3__["moveAllHandles"])(evt.detail, tool.name, annotation, null, tool.options, interactionType, function () {
  27856. annotation.active = false;
  27857. _store_index_js__WEBPACK_IMPORTED_MODULE_1__["state"].isToolLocked = false;
  27858. });
  27859. evt.stopImmediatePropagation();
  27860. evt.stopPropagation();
  27861. evt.preventDefault();
  27862. return;
  27863. };
  27864. /***/ }),
  27865. /***/ "./util/freehand/ClickedLineData.js":
  27866. /*!******************************************!*\
  27867. !*** ./util/freehand/ClickedLineData.js ***!
  27868. \******************************************/
  27869. /*! exports provided: default */
  27870. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  27871. "use strict";
  27872. __webpack_require__.r(__webpack_exports__);
  27873. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ClickedLineData; });
  27874. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
  27875. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
  27876. /**
  27877. * @public
  27878. * @name ClickedLineData
  27879. * @classdesc Creates an object containing information about the clicked line.
  27880. * @property {number} toolIndex ID of the tool that the line corresponds to.
  27881. * @property {Object} handleIndexArray An array of the handle indicies that correspond to the line segment.
  27882. */
  27883. var ClickedLineData =
  27884. /**
  27885. * Constructs an object containing information about the clicked line.
  27886. * @param {number} toolIndex - The ID of the tool the line corresponds to.
  27887. * @param {Object} handleIndexArray - An array of the handle indicies that correspond to the line segment.
  27888. */
  27889. function ClickedLineData(toolIndex, handleIndexArray) {
  27890. _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, ClickedLineData);
  27891. this.toolIndex = toolIndex;
  27892. this.handleIndexArray = handleIndexArray;
  27893. };
  27894. /***/ }),
  27895. /***/ "./util/freehand/FreehandHandleData.js":
  27896. /*!*********************************************!*\
  27897. !*** ./util/freehand/FreehandHandleData.js ***!
  27898. \*********************************************/
  27899. /*! exports provided: default */
  27900. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  27901. "use strict";
  27902. __webpack_require__.r(__webpack_exports__);
  27903. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return FreehandHandleData; });
  27904. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
  27905. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
  27906. /**
  27907. * @public
  27908. * @name FreehandHandleData
  27909. * @classdesc Creates a single handle for the freehand tool.
  27910. *
  27911. * @property {number} x The x position.
  27912. * @property {number} y The y position.
  27913. * @property {boolean} highlight Whether the handle should be rendered as the highlighted color.
  27914. * @property {boolean} active Whether the handle is active.
  27915. * @property {Object} lines An array of lines associated with the handle.
  27916. */
  27917. var FreehandHandleData =
  27918. /**
  27919. * Constructs a a single handle for the freehand tool
  27920. *
  27921. * @param {Object} position - The position of the handle.
  27922. * @param {boolean} highlight - whether the handle should be rendered as the highlighted color.
  27923. * @param {boolean} active - whether the handle is active.
  27924. */
  27925. function FreehandHandleData(position) {
  27926. var highlight = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
  27927. var active = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
  27928. _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, FreehandHandleData);
  27929. this.x = position.x;
  27930. this.y = position.y;
  27931. this.highlight = highlight;
  27932. this.active = active;
  27933. this.lines = [];
  27934. };
  27935. /***/ }),
  27936. /***/ "./util/freehand/FreehandLineFinder.js":
  27937. /*!*********************************************!*\
  27938. !*** ./util/freehand/FreehandLineFinder.js ***!
  27939. \*********************************************/
  27940. /*! exports provided: default */
  27941. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  27942. "use strict";
  27943. __webpack_require__.r(__webpack_exports__);
  27944. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return FreehandLineFinder; });
  27945. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js");
  27946. /* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__);
  27947. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js");
  27948. /* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__);
  27949. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  27950. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../externalModules.js */ "./externalModules.js");
  27951. /* harmony import */ var _ClickedLineData_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./ClickedLineData.js */ "./util/freehand/ClickedLineData.js");
  27952. var distanceThreshold = 10;
  27953. /**
  27954. * @public
  27955. * @class FreehandLineFinder
  27956. * @classdesc Class that finds lines of freehand ROIs based on click proximity.
  27957. */
  27958. var FreehandLineFinder =
  27959. /*#__PURE__*/
  27960. function () {
  27961. /**
  27962. * Creates an instance of FreehandLineFinder.
  27963. * @param {*} eventData - Data object associated with the event.
  27964. * @param {string} toolName - The tool name
  27965. * @memberof FreehandLineFinder
  27966. */
  27967. function FreehandLineFinder(eventData, toolName) {
  27968. _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, FreehandLineFinder);
  27969. this._eventData = eventData;
  27970. this._toolName = toolName;
  27971. }
  27972. /**
  27973. * Looks for lines near the mouse cursor.
  27974. *
  27975. * @public
  27976. * @method
  27977. * @returns {ClickedLineData} Data object corresponding to the clicked line.
  27978. */
  27979. _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(FreehandLineFinder, [{
  27980. key: "findLine",
  27981. value: function findLine() {
  27982. var closestToolIndex = this.findTool();
  27983. if (closestToolIndex === null) {
  27984. return null;
  27985. }
  27986. var closeLines = this._getCloseLinesInTool(closestToolIndex);
  27987. if (closeLines) {
  27988. var clickedLineData = this._findCorrectLine(closestToolIndex, closeLines); // Note: clickedLineData may be null if no valid projections are found.
  27989. return clickedLineData;
  27990. } // Return null if no valid close lines found.
  27991. return null;
  27992. }
  27993. /**
  27994. * Looks for tools near the mouse cursor.
  27995. *
  27996. * @public
  27997. * @method
  27998. *
  27999. * @returns {ClickedLineData} Data object corresponding to the clicked line.
  28000. */
  28001. }, {
  28002. key: "findTool",
  28003. value: function findTool() {
  28004. this._toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_2__["getToolState"])(this._eventData.element, this._toolName);
  28005. this._mousePoint = this._eventData.currentPoints.canvas;
  28006. if (!this._toolData) {
  28007. return null;
  28008. }
  28009. var closestHandle = this._nearestHandleToPointAllTools();
  28010. return closestHandle.toolIndex;
  28011. }
  28012. /**
  28013. * Finds the nearest handle to the mouse cursor for all tools.
  28014. * @private
  28015. * @method
  28016. * @returns {Object} The handle closest to the point.
  28017. */
  28018. }, {
  28019. key: "_nearestHandleToPointAllTools",
  28020. value: function _nearestHandleToPointAllTools() {
  28021. var toolData = this._toolData;
  28022. var closestHandle = {
  28023. toolIndex: null,
  28024. handleIndex: null,
  28025. distance: Infinity // Some large number
  28026. };
  28027. for (var toolIndex = 0; toolIndex < toolData.data.length; toolIndex++) {
  28028. var closestHandleForToolI = this._nearestHandleToPoint(toolIndex);
  28029. if (closestHandleForToolI === null) {
  28030. continue;
  28031. }
  28032. if (closestHandleForToolI.distance < closestHandle.distance) {
  28033. closestHandle = closestHandleForToolI;
  28034. }
  28035. }
  28036. return closestHandle;
  28037. }
  28038. /**
  28039. * Finds the nearest handle to the mouse cursor for a specific tool.
  28040. * @private
  28041. * @method
  28042. *
  28043. * @param {number} toolIndex The index of the particular freehand tool.
  28044. * @returns {Object} An object containing information about the closest handle.
  28045. */
  28046. }, {
  28047. key: "_nearestHandleToPoint",
  28048. value: function _nearestHandleToPoint(toolIndex) {
  28049. var eventData = this._eventData;
  28050. var toolData = this._toolData;
  28051. var data = toolData.data[toolIndex];
  28052. var points = data.handles.points;
  28053. if (points === undefined) {
  28054. return null;
  28055. }
  28056. if (data.visible === false) {
  28057. return null;
  28058. }
  28059. var closest = {
  28060. toolIndex: toolIndex,
  28061. handleIndex: null,
  28062. distance: Infinity // Some large number
  28063. };
  28064. for (var i = 0; i < points.length; i++) {
  28065. var handleCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstone.pixelToCanvas(eventData.element, points[i]);
  28066. var handleDistanceFromMousePoint = _externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstoneMath.point.distance(handleCanvas, this._mousePoint);
  28067. if (handleDistanceFromMousePoint < closest.distance) {
  28068. closest.handleIndex = i;
  28069. closest.distance = handleDistanceFromMousePoint;
  28070. }
  28071. }
  28072. return closest;
  28073. }
  28074. /**
  28075. * Finds all the lines close to the mouse point for a particular tool.
  28076. * @private
  28077. * @method
  28078. *
  28079. * @param {number} toolIndex The index of the particular freehand tool.
  28080. * @returns {Object} An array of lines close to the mouse point.
  28081. */
  28082. }, {
  28083. key: "_getCloseLinesInTool",
  28084. value: function _getCloseLinesInTool(toolIndex) {
  28085. var toolData = this._toolData;
  28086. var points = toolData.data[toolIndex].handles.points;
  28087. var closeLines = [];
  28088. for (var i = 0; i < points.length; i++) {
  28089. var nextIndex = FreehandLineFinder.getNextHandleIndex(i, points.length);
  28090. var d = this._distanceOfPointfromLine(points[i], points[nextIndex]);
  28091. if (d < distanceThreshold) {
  28092. closeLines.push([i, nextIndex]);
  28093. }
  28094. }
  28095. return closeLines;
  28096. }
  28097. /**
  28098. * Finds the line the user clicked on from an array of close lines.\
  28099. * @private
  28100. * @method
  28101. *
  28102. * @param {number} toolIndex The index of the particular freehand tool.
  28103. * @param {Object} closeLines An array of lines close to the mouse point.
  28104. * @returns {ClickedLineData|null} An instance of ClickedLineData containing information about the line, or null if no line is correct.
  28105. */
  28106. }, {
  28107. key: "_findCorrectLine",
  28108. value: function _findCorrectLine(toolIndex, closeLines) {
  28109. // Test if any candidate lines can be projected onto by the mousePoint
  28110. for (var i = 0; i < closeLines.length; i++) {
  28111. if (this._pointProjectsToLineSegment(toolIndex, closeLines[i])) {
  28112. return new _ClickedLineData_js__WEBPACK_IMPORTED_MODULE_4__["default"](toolIndex, closeLines[i]);
  28113. }
  28114. } // No valid line found
  28115. return null;
  28116. }
  28117. /**
  28118. * Returns true if the mouse point projects onto the line segment.
  28119. * @private
  28120. * @method
  28121. *
  28122. * @param {number} toolIndex The index of the particular freehand tool.
  28123. * @param {Object} handleIndexArray An array of indicies corresponding to the line segment.
  28124. * @returns {boolean} True if the mouse point projects onto the line segment
  28125. */
  28126. }, {
  28127. key: "_pointProjectsToLineSegment",
  28128. value: function _pointProjectsToLineSegment(toolIndex, handleIndexArray) {
  28129. var eventData = this._eventData;
  28130. var toolData = this._toolData;
  28131. var data = toolData.data[toolIndex];
  28132. var points = data.handles.points;
  28133. if (data.handles.points === undefined) {
  28134. return;
  28135. }
  28136. if (data.visible === false) {
  28137. return false;
  28138. }
  28139. var handle1 = points[handleIndexArray[0]];
  28140. var handle2 = points[handleIndexArray[1]];
  28141. var p = FreehandLineFinder.getCanvasPointsFromHandles(handle1, handle2, eventData.element);
  28142. var r = FreehandLineFinder.getLineAsVector(p);
  28143. var m = this._getLineOriginToMouseAsVector(p); // Project vector m onto r to see if the point is within bounds of line segment
  28144. var mProj = (m[0] * r[0] + m[1] * r[1]) / r.magnitude;
  28145. if (mProj > 0 && mProj < r.magnitude) {
  28146. return true;
  28147. }
  28148. return false;
  28149. }
  28150. /**
  28151. * Returns the canvas positions from the handle's pixel positions.
  28152. *
  28153. * @static
  28154. * @public
  28155. * @method
  28156. * @param {FreehandHandleData} handle1 The first handle.
  28157. * @param {FreehandHandleData} handle2 The second handle.
  28158. * @param {Object} element The element on which the handles reside.
  28159. * @returns {Object} An array contsining the handle positions in canvas coordinates.
  28160. */
  28161. }, {
  28162. key: "_getLineOriginToMouseAsVector",
  28163. /**
  28164. * Constructs a vector from the direction and magnitude of the line from the the line origin to the mouse cursor.
  28165. * @private
  28166. * @method
  28167. *
  28168. * @param {Object} p An array of two points respresenting the line segment.
  28169. * @returns {Object} An array containing the x and y components of the vector.
  28170. */
  28171. value: function _getLineOriginToMouseAsVector(p) {
  28172. var m = [this._mousePoint.x - p[0].x, this._mousePoint.y - p[0].y];
  28173. return m;
  28174. }
  28175. /**
  28176. * Calculates the perpendicular distance of the mouse cursor from a line segment.
  28177. * @private
  28178. * @method
  28179. *
  28180. * @param {FreehandHandleData} handle1 The first handle.
  28181. * @param {FreehandHandleData} handle2 The first handle.
  28182. * @returns {number} The perpendicular distance of the mouse cursor from the line segment.
  28183. */
  28184. }, {
  28185. key: "_distanceOfPointfromLine",
  28186. value: function _distanceOfPointfromLine(handle1, handle2) {
  28187. var eventData = this._eventData;
  28188. var p1 = _externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstone.pixelToCanvas(eventData.element, handle1);
  28189. var p2 = _externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstone.pixelToCanvas(eventData.element, handle2);
  28190. var pMouse = this._mousePoint; // Perpendicular distance of point from line:
  28191. // = 2* area of triangle(p1,p2,pm) / length of triangle's base |p2 - p1|
  28192. var twiceAreaOfTriangle = Math.abs((p2.y - p1.y) * pMouse.x - (p2.x - p1.x) * pMouse.y + p2.x * p1.y - p2.y * p1.x);
  28193. var rMagnitude = _externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstoneMath.point.distance(p1, p2);
  28194. var d = twiceAreaOfTriangle / rMagnitude;
  28195. return d;
  28196. }
  28197. /**
  28198. * Gets the next handl index from a cyclical array of points.
  28199. *
  28200. * @static
  28201. * @public
  28202. * @method
  28203. *
  28204. * @param {number} currentIndex The current index.
  28205. * @param {number} length The number of handles in the polygon.
  28206. * @returns {number} The index of the next handle.
  28207. */
  28208. }], [{
  28209. key: "getCanvasPointsFromHandles",
  28210. value: function getCanvasPointsFromHandles(handle1, handle2, element) {
  28211. var p = []; // Point r from left to right so that we only have one orientation to test.
  28212. if (handle1.x < handle2.x) {
  28213. p.push(_externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstone.pixelToCanvas(element, handle1));
  28214. p.push(_externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstone.pixelToCanvas(element, handle2));
  28215. } else {
  28216. p.push(_externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstone.pixelToCanvas(element, handle2));
  28217. p.push(_externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstone.pixelToCanvas(element, handle1));
  28218. }
  28219. return p;
  28220. }
  28221. /**
  28222. * Converts a line segment to a vector.
  28223. *
  28224. * @static
  28225. * @public
  28226. * @method
  28227. * @param {Object} p An array of two points respresenting the line segment.
  28228. * @returns {Object} An array containing the x and y components of the vector, as well as a magnitude property.
  28229. */
  28230. }, {
  28231. key: "getLineAsVector",
  28232. value: function getLineAsVector(p) {
  28233. var r = [p[1].x - p[0].x, p[1].y - p[0].y];
  28234. r.magnitude = _externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstoneMath.point.distance(p[0], p[1]);
  28235. return r;
  28236. }
  28237. }, {
  28238. key: "getNextHandleIndex",
  28239. value: function getNextHandleIndex(currentIndex, length) {
  28240. var nextIndex;
  28241. if (currentIndex < length - 1) {
  28242. nextIndex = currentIndex + 1;
  28243. } else {
  28244. nextIndex = 0;
  28245. }
  28246. return nextIndex;
  28247. }
  28248. }]);
  28249. return FreehandLineFinder;
  28250. }();
  28251. /***/ }),
  28252. /***/ "./util/freehand/addLine.js":
  28253. /*!**********************************!*\
  28254. !*** ./util/freehand/addLine.js ***!
  28255. \**********************************/
  28256. /*! exports provided: default */
  28257. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  28258. "use strict";
  28259. __webpack_require__.r(__webpack_exports__);
  28260. /**
  28261. * AddLine - Adds a line to a specifc index of a freehand tool points array.
  28262. *
  28263. * @param {Object[]} points The array of points.
  28264. * @param {Number} insertIndex The index to insert the line.
  28265. * @returns {Null} description
  28266. */
  28267. /* harmony default export */ __webpack_exports__["default"] = (function (points, insertIndex) {
  28268. // Add the line from the inserted handle to the handle after
  28269. if (insertIndex === points.length - 1) {
  28270. points[insertIndex].lines.push(points[0]);
  28271. } else {
  28272. points[insertIndex].lines.push(points[insertIndex + 1]);
  28273. }
  28274. });
  28275. /***/ }),
  28276. /***/ "./util/freehand/calculateFreehandStatistics.js":
  28277. /*!******************************************************!*\
  28278. !*** ./util/freehand/calculateFreehandStatistics.js ***!
  28279. \******************************************************/
  28280. /*! exports provided: default */
  28281. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  28282. "use strict";
  28283. __webpack_require__.r(__webpack_exports__);
  28284. /* harmony import */ var _pointInFreehand_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./pointInFreehand.js */ "./util/freehand/pointInFreehand.js");
  28285. /**
  28286. * Calculates the statistics of all the pixels within the freehand object.
  28287. * @export @public @method
  28288. * @name calculateFreehandStatistics
  28289. *
  28290. * @param {Object} sp An array of the pixel data.
  28291. * @param {Object} boundingBox Rectangular box enclosing the polygon.
  28292. * @param {Object} dataHandles Data object associated with the tool.
  28293. * @returns {Object} Object containing the derived statistics.
  28294. */
  28295. /* harmony default export */ __webpack_exports__["default"] = (function (sp, boundingBox, dataHandles) {
  28296. var statisticsObj = {
  28297. count: 0,
  28298. mean: 0.0,
  28299. variance: 0.0,
  28300. stdDev: 0.0
  28301. };
  28302. var sum = getSum(sp, boundingBox, dataHandles);
  28303. if (sum.count === 0) {
  28304. return statisticsObj;
  28305. }
  28306. statisticsObj.count = sum.count;
  28307. statisticsObj.mean = sum.value / sum.count;
  28308. statisticsObj.variance = sum.squared / sum.count - statisticsObj.mean * statisticsObj.mean;
  28309. statisticsObj.stdDev = Math.sqrt(statisticsObj.variance);
  28310. return statisticsObj;
  28311. });
  28312. /**
  28313. * Calculates the sum, squared sum and count of all pixels within the polygon.
  28314. * @private
  28315. * @method
  28316. * @name getSum
  28317. *
  28318. * @param {Object} sp An array of the pixel data.
  28319. * @param {Object} boundingBox Rectangular box enclosing the polygon.
  28320. * @param {Object} dataHandles Data object associated with the tool.
  28321. * @returns {Object} Object containing the sum, squared sum and pixel count.
  28322. */
  28323. function getSum(sp, boundingBox, dataHandles) {
  28324. var sum = {
  28325. value: 0,
  28326. squared: 0,
  28327. count: 0
  28328. };
  28329. var index = 0;
  28330. for (var y = boundingBox.top; y < boundingBox.top + boundingBox.height; y++) {
  28331. for (var x = boundingBox.left; x < boundingBox.left + boundingBox.width; x++) {
  28332. var point = {
  28333. x: x,
  28334. y: y
  28335. };
  28336. sumPointIfInFreehand(dataHandles, point, sum, sp[index]);
  28337. index++;
  28338. }
  28339. }
  28340. return sum;
  28341. }
  28342. /**
  28343. * Adds the pixel to the workingSum if it is within the polygon.
  28344. * @private
  28345. * @method sumPointIfInFreehand
  28346. *
  28347. * @param {Object} dataHandles Data object associated with the tool.
  28348. * @param {Object} point The pixel coordinates.
  28349. * @param {Object} workingSum The working sum, squared sum and pixel count.
  28350. * @param {Object} pixelValue The pixel value. // @modifies {workingSum}
  28351. * @returns {undefined}
  28352. */
  28353. function sumPointIfInFreehand(dataHandles, point, workingSum, pixelValue) {
  28354. if (Object(_pointInFreehand_js__WEBPACK_IMPORTED_MODULE_0__["default"])(dataHandles, point)) {
  28355. workingSum.value += pixelValue;
  28356. workingSum.squared += pixelValue * pixelValue;
  28357. workingSum.count++;
  28358. }
  28359. }
  28360. /***/ }),
  28361. /***/ "./util/freehand/freehandArea.js":
  28362. /*!***************************************!*\
  28363. !*** ./util/freehand/freehandArea.js ***!
  28364. \***************************************/
  28365. /*! exports provided: default */
  28366. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  28367. "use strict";
  28368. __webpack_require__.r(__webpack_exports__);
  28369. /**
  28370. * Calculates the area of a freehand tool polygon.
  28371. * @export @public @method
  28372. * @name freehandArea
  28373. *
  28374. * @param {Object} dataHandles Data object associated with the tool.
  28375. * @param {Object} scaling Area scaling of image.
  28376. * @returns {number} The area of the polygon.
  28377. */
  28378. /* harmony default export */ __webpack_exports__["default"] = (function (dataHandles, scaling) {
  28379. var freeHandArea = 0;
  28380. var j = dataHandles.length - 1; // The last vertex is the previous one to the first
  28381. scaling = scaling || 1; // If scaling is falsy, set scaling to 1
  28382. for (var i = 0; i < dataHandles.length; i++) {
  28383. freeHandArea += (dataHandles[j].x + dataHandles[i].x) * (dataHandles[j].y - dataHandles[i].y);
  28384. j = i; // Here j is previous vertex to i
  28385. }
  28386. return Math.abs(freeHandArea * scaling / 2.0);
  28387. });
  28388. /***/ }),
  28389. /***/ "./util/freehand/freehandIntersect.js":
  28390. /*!********************************************!*\
  28391. !*** ./util/freehand/freehandIntersect.js ***!
  28392. \********************************************/
  28393. /*! exports provided: default */
  28394. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  28395. "use strict";
  28396. __webpack_require__.r(__webpack_exports__);
  28397. /**
  28398. * Orientation algoritm to determine if two lines cross.
  28399. * Credit and details: geeksforgeeks.org/check-if-two-given-line-segments-intersect/
  28400. */
  28401. /**
  28402. * Determines whether a new handle causes an intersection of the lines of the polygon.
  28403. * @public
  28404. * @function newHandle
  28405. *
  28406. * @param {Object} candidateHandle The new handle to check.
  28407. * @param {Object} dataHandles data object associated with the tool.
  28408. * @returns {boolean} - Whether the new line intersects with any other lines of the polygon.
  28409. */
  28410. function newHandle(candidateHandle, dataHandles) {
  28411. // Check if the proposed line will intersect any existent line
  28412. var lastHandleId = dataHandles.length - 1;
  28413. var lastHandle = getCoords(dataHandles[lastHandleId]);
  28414. var newHandle = getCoords(candidateHandle);
  28415. return doesIntersectOtherLines(dataHandles, lastHandle, newHandle, [lastHandleId]);
  28416. }
  28417. /**
  28418. * Checks if the last line of a polygon will intersect the other lines of the polgyon.
  28419. * @public
  28420. * @function end
  28421. *
  28422. * @param {Object} dataHandles data object associated with the tool.
  28423. * @returns {boolean} Whether the last line intersects with any other lines of the polygon.
  28424. */
  28425. function end(dataHandles) {
  28426. var lastHandleId = dataHandles.length - 1;
  28427. var lastHandle = getCoords(dataHandles[lastHandleId]);
  28428. var firstHandle = getCoords(dataHandles[0]);
  28429. return doesIntersectOtherLines(dataHandles, lastHandle, firstHandle, [lastHandleId, 0]);
  28430. }
  28431. /**
  28432. * Checks whether the modification of a handle's position causes intersection of the lines of the polygon.
  28433. * @public
  28434. * @method modify
  28435. *
  28436. * @param {Object} dataHandles Data object associated with the tool.
  28437. * @param {number} modifiedHandleId The id of the handle being modified.
  28438. * @returns {boolean} Whether the modfication causes any intersections.
  28439. */
  28440. function modify(dataHandles, modifiedHandleId) {
  28441. // Check if the modifiedHandle's previous and next lines will intersect any other line in the polygon
  28442. var modifiedHandle = getCoords(dataHandles[modifiedHandleId]); // Previous neightbor handle
  28443. var neighborHandleId = modifiedHandleId - 1;
  28444. if (modifiedHandleId === 0) {
  28445. neighborHandleId = dataHandles.length - 1;
  28446. }
  28447. var neighborHandle = getCoords(dataHandles[neighborHandleId]);
  28448. if (doesIntersectOtherLines(dataHandles, modifiedHandle, neighborHandle, [modifiedHandleId, neighborHandleId])) {
  28449. return true;
  28450. } // Next neightbor handle
  28451. if (modifiedHandleId === dataHandles.length - 1) {
  28452. neighborHandleId = 0;
  28453. } else {
  28454. neighborHandleId = modifiedHandleId + 1;
  28455. }
  28456. neighborHandle = getCoords(dataHandles[neighborHandleId]);
  28457. return doesIntersectOtherLines(dataHandles, modifiedHandle, neighborHandle, [modifiedHandleId, neighborHandleId]);
  28458. }
  28459. /**
  28460. * Checks whether the line (p1,q1) intersects any of the other lines in the polygon.
  28461. * @private
  28462. * @function doesIntersectOtherLines
  28463. *
  28464. * @param {Object} dataHandles Data object associated with the tool.
  28465. * @param {Object} p1 Coordinates of the start of the line.
  28466. * @param {Object} q1 Coordinates of the end of the line.
  28467. * @param {Object} ignoredHandleIds Ids of handles to ignore (i.e. lines that share a vertex with the line being tested).
  28468. * @returns {boolean} Whether the line intersects any of the other lines in the polygon.
  28469. */
  28470. function doesIntersectOtherLines(dataHandles, p1, q1, ignoredHandleIds) {
  28471. var j = dataHandles.length - 1;
  28472. for (var i = 0; i < dataHandles.length; i++) {
  28473. if (ignoredHandleIds.indexOf(i) !== -1 || ignoredHandleIds.indexOf(j) !== -1) {
  28474. j = i;
  28475. continue;
  28476. }
  28477. var p2 = getCoords(dataHandles[j]);
  28478. var q2 = getCoords(dataHandles[i]);
  28479. if (doesIntersect(p1, q1, p2, q2)) {
  28480. return true;
  28481. }
  28482. j = i;
  28483. }
  28484. return false;
  28485. }
  28486. /**
  28487. * Checks whether the line (p1,q1) intersects the line (p2,q2) via an orientation algorithm.
  28488. * @private
  28489. * @function doesIntersect
  28490. *
  28491. * @param {Object} p1 Coordinates of the start of the line 1.
  28492. * @param {Object} q1 Coordinates of the end of the line 1.
  28493. * @param {Object} p2 Coordinates of the start of the line 2.
  28494. * @param {Object} q2 Coordinates of the end of the line 2.
  28495. * @returns {boolean} Whether lines (p1,q1) and (p2,q2) intersect.
  28496. */
  28497. function doesIntersect(p1, q1, p2, q2) {
  28498. var result = false;
  28499. var orient = [orientation(p1, q1, p2), orientation(p1, q1, q2), orientation(p2, q2, p1), orientation(p2, q2, q1)]; // General Case
  28500. if (orient[0] !== orient[1] && orient[2] !== orient[3]) {
  28501. return true;
  28502. } // Special Cases
  28503. if (orient[0] === 0 && onSegment(p1, p2, q1)) {
  28504. // If p1, q1 and p2 are colinear and p2 lies on segment p1q1
  28505. result = true;
  28506. } else if (orient[1] === 0 && onSegment(p1, q2, q1)) {
  28507. // If p1, q1 and p2 are colinear and q2 lies on segment p1q1
  28508. result = true;
  28509. } else if (orient[2] === 0 && onSegment(p2, p1, q2)) {
  28510. // If p2, q2 and p1 are colinear and p1 lies on segment p2q2
  28511. result = true;
  28512. } else if (orient[3] === 0 && onSegment(p2, q1, q2)) {
  28513. // If p2, q2 and q1 are colinear and q1 lies on segment p2q2
  28514. result = true;
  28515. }
  28516. return result;
  28517. }
  28518. /**
  28519. * Returns an object with two properties, x and y, from a heavier FreehandHandleData object.
  28520. * @private
  28521. * @function getCoords
  28522. *
  28523. * @param {Object} dataHandle Data object associated with a single handle in the freehand tool.
  28524. * @returns {Object} An object containing position propeties x and y.
  28525. */
  28526. function getCoords(dataHandle) {
  28527. return {
  28528. x: dataHandle.x,
  28529. y: dataHandle.y
  28530. };
  28531. }
  28532. /**
  28533. * Checks the orientation of 3 points.
  28534. * @private
  28535. * @function orientation
  28536. *
  28537. * @param {Object} p First point.
  28538. * @param {Object} q Second point.
  28539. * @param {Object} r Third point.
  28540. * @returns {number} - 0: Colinear, 1: Clockwise, 2: Anticlockwise
  28541. */
  28542. function orientation(p, q, r) {
  28543. var orientationValue = (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);
  28544. if (orientationValue === 0) {
  28545. return 0; // Colinear
  28546. }
  28547. return orientationValue > 0 ? 1 : 2;
  28548. }
  28549. /**
  28550. * Checks if point q lines on the segment (p,r).
  28551. * @private
  28552. * @function onSegment
  28553. *
  28554. * @param {Object} p Point p.
  28555. * @param {Object} q Point q.
  28556. * @param {Object} r Point r.
  28557. * @returns {boolean} - If q lies on line segment (p,r).
  28558. */
  28559. function onSegment(p, q, r) {
  28560. if (q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) && q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y)) {
  28561. return true;
  28562. }
  28563. return false;
  28564. }
  28565. /* harmony default export */ __webpack_exports__["default"] = ({
  28566. newHandle: newHandle,
  28567. end: end,
  28568. modify: modify
  28569. });
  28570. /***/ }),
  28571. /***/ "./util/freehand/index.js":
  28572. /*!********************************!*\
  28573. !*** ./util/freehand/index.js ***!
  28574. \********************************/
  28575. /*! exports provided: default */
  28576. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  28577. "use strict";
  28578. __webpack_require__.r(__webpack_exports__);
  28579. /* harmony import */ var _calculateFreehandStatistics_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./calculateFreehandStatistics.js */ "./util/freehand/calculateFreehandStatistics.js");
  28580. /* harmony import */ var _ClickedLineData_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ClickedLineData.js */ "./util/freehand/ClickedLineData.js");
  28581. /* harmony import */ var _freehandArea_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./freehandArea.js */ "./util/freehand/freehandArea.js");
  28582. /* harmony import */ var _FreehandHandleData_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./FreehandHandleData.js */ "./util/freehand/FreehandHandleData.js");
  28583. /* harmony import */ var _freehandIntersect_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./freehandIntersect.js */ "./util/freehand/freehandIntersect.js");
  28584. /* harmony import */ var _FreehandLineFinder_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./FreehandLineFinder.js */ "./util/freehand/FreehandLineFinder.js");
  28585. /* harmony import */ var _insertOrDelete_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./insertOrDelete.js */ "./util/freehand/insertOrDelete.js");
  28586. /* harmony import */ var _pointInFreehand_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./pointInFreehand.js */ "./util/freehand/pointInFreehand.js");
  28587. /* harmony import */ var _addLine_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./addLine.js */ "./util/freehand/addLine.js");
  28588. /* harmony default export */ __webpack_exports__["default"] = ({
  28589. calculateFreehandStatistics: _calculateFreehandStatistics_js__WEBPACK_IMPORTED_MODULE_0__["default"],
  28590. ClickedLineData: _ClickedLineData_js__WEBPACK_IMPORTED_MODULE_1__["default"],
  28591. freehandArea: _freehandArea_js__WEBPACK_IMPORTED_MODULE_2__["default"],
  28592. FreehandHandleData: _FreehandHandleData_js__WEBPACK_IMPORTED_MODULE_3__["default"],
  28593. freehandIntersect: _freehandIntersect_js__WEBPACK_IMPORTED_MODULE_4__["default"],
  28594. FreehandLineFinder: _FreehandLineFinder_js__WEBPACK_IMPORTED_MODULE_5__["default"],
  28595. insertOrDelete: _insertOrDelete_js__WEBPACK_IMPORTED_MODULE_6__["default"],
  28596. pointInFreehand: _pointInFreehand_js__WEBPACK_IMPORTED_MODULE_7__["default"],
  28597. addLine: _addLine_js__WEBPACK_IMPORTED_MODULE_8__["default"]
  28598. });
  28599. /***/ }),
  28600. /***/ "./util/freehand/insertOrDelete.js":
  28601. /*!*****************************************!*\
  28602. !*** ./util/freehand/insertOrDelete.js ***!
  28603. \*****************************************/
  28604. /*! exports provided: default */
  28605. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  28606. "use strict";
  28607. __webpack_require__.r(__webpack_exports__);
  28608. /* harmony import */ var _FreehandLineFinder_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./FreehandLineFinder.js */ "./util/freehand/FreehandLineFinder.js");
  28609. /* harmony import */ var _FreehandHandleData_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./FreehandHandleData.js */ "./util/freehand/FreehandHandleData.js");
  28610. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  28611. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../externalModules.js */ "./externalModules.js");
  28612. /* harmony import */ var _addLine_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./addLine.js */ "./util/freehand/addLine.js");
  28613. /**
  28614. * Inserts or deletes a point from a freehand tool.
  28615. * @export @public @method
  28616. * @name insertOrDelete
  28617. *
  28618. * @param {Object} evt The event.
  28619. * @param {Object} nearby Object containing information about a nearby handle.
  28620. * @returns {void}
  28621. */
  28622. /* harmony default export */ __webpack_exports__["default"] = (function (evt, nearby) {
  28623. var eventData = evt.detail;
  28624. if (nearby && nearby.handleNearby !== null) {
  28625. var deleteInfo = {
  28626. toolIndex: nearby.toolIndex,
  28627. handleIndex: nearby.handleNearby
  28628. };
  28629. _deletePoint.call(this, eventData, deleteInfo);
  28630. } else {
  28631. var freehandLineFinder = new _FreehandLineFinder_js__WEBPACK_IMPORTED_MODULE_0__["default"](eventData, this.name);
  28632. var insertInfo = freehandLineFinder.findLine();
  28633. if (insertInfo) {
  28634. _insertPoint.call(this, eventData, insertInfo);
  28635. }
  28636. }
  28637. });
  28638. /**
  28639. * Deletes a point from a freehand tool.
  28640. * @private
  28641. * @method
  28642. *
  28643. * @param {Object} eventData The data object associated with the event.
  28644. * @param {Object} deleteInfo Object containing information about which point to delete.
  28645. * @returns {void}
  28646. */
  28647. function _deletePoint(eventData, deleteInfo) {
  28648. var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_2__["getToolState"])(eventData.element, this.name);
  28649. if (toolData === undefined) {
  28650. return;
  28651. }
  28652. var deleteHandle = deleteInfo.handleIndex;
  28653. var toolIndex = deleteInfo.toolIndex; // Get the toolData from insertInfo
  28654. var data = toolData.data[toolIndex];
  28655. var points = data.handles.points; // Only allow delete if > 3 points
  28656. if (points.length <= 3) {
  28657. return;
  28658. } // Link the line of the previous handle to the one after handles[deleteHandle];
  28659. if (deleteHandle === points.length - 1) {
  28660. points[deleteHandle - 1].lines.pop();
  28661. points[deleteHandle - 1].lines.push(points[0]);
  28662. } else if (deleteHandle === 0) {
  28663. points[points.length - 1].lines.pop();
  28664. points[points.length - 1].lines.push(points[deleteHandle + 1]);
  28665. } else {
  28666. points[deleteHandle - 1].lines.pop();
  28667. points[deleteHandle - 1].lines.push(points[deleteHandle + 1]);
  28668. } // Remove the handle
  28669. points.splice(deleteHandle, 1);
  28670. data.invalidated = true;
  28671. data.active = true;
  28672. data.highlight = true; // Force onImageRendered to fire
  28673. _externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstone.updateImage(eventData.element);
  28674. }
  28675. /**
  28676. * Inserts a new point into a freehand tool.
  28677. * @private
  28678. * @method
  28679. *
  28680. * @param {Object} eventData - The data object associated with the event.
  28681. * @param {Object} insertInfo - Object containing information about where to insert the point.
  28682. * @returns {void}
  28683. */
  28684. function _insertPoint(eventData, insertInfo) {
  28685. var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_2__["getToolState"])(eventData.element, this.name);
  28686. if (toolData === undefined) {
  28687. return;
  28688. } // Get the toolData from insertInfo
  28689. var data = toolData.data[insertInfo.toolIndex];
  28690. var insertIndex = _getInsertionIndex(insertInfo);
  28691. if (insertIndex === Infinity) {
  28692. return;
  28693. }
  28694. var handleData = new _FreehandHandleData_js__WEBPACK_IMPORTED_MODULE_1__["default"](eventData.currentPoints.image);
  28695. var points = data.handles.points; // Add the new handle
  28696. points.splice(insertIndex, 0, handleData); // Add the line from the previous handle to the inserted handle (note the tool is now one increment longer)
  28697. points[insertIndex - 1].lines.pop();
  28698. points[insertIndex - 1].lines.push(eventData.currentPoints.image);
  28699. Object(_addLine_js__WEBPACK_IMPORTED_MODULE_4__["default"])(points, insertIndex);
  28700. data.active = true;
  28701. data.highlight = true; // Force onImageRendered to fire
  28702. data.invalidated = true;
  28703. _externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstone.updateImage(eventData.element);
  28704. }
  28705. /**
  28706. * Gets the handle index of a tool in which to insert the new point.
  28707. * @private
  28708. * @method
  28709. *
  28710. * @param {Object} insertInfo - Object containing information about where to insert the point.
  28711. * @returns {void}
  28712. */
  28713. function _getInsertionIndex(insertInfo) {
  28714. // Get lowest index that isn't zero
  28715. var handleIndexArray = insertInfo.handleIndexArray;
  28716. var insertIndex = Infinity;
  28717. var arrayContainsZero = handleIndexArray.includes(0);
  28718. for (var i = 0; i < handleIndexArray.length; i++) {
  28719. var index = handleIndexArray[i];
  28720. if (index !== 0 && index < insertIndex) {
  28721. insertIndex = index;
  28722. }
  28723. } // Treat the special case of handleIndexArray === [0,1] || [1,0]
  28724. if (arrayContainsZero && insertIndex === 1) {
  28725. insertIndex = 0;
  28726. } // The insertion index shall be just after the lower index
  28727. insertIndex++;
  28728. return insertIndex;
  28729. }
  28730. /***/ }),
  28731. /***/ "./util/freehand/pointInFreehand.js":
  28732. /*!******************************************!*\
  28733. !*** ./util/freehand/pointInFreehand.js ***!
  28734. \******************************************/
  28735. /*! exports provided: default */
  28736. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  28737. "use strict";
  28738. __webpack_require__.r(__webpack_exports__);
  28739. /**
  28740. * Calculates whether "location" is inside the polygon defined by dataHandles
  28741. * by counting the number of times a ray originating from "point" crosses the
  28742. * edges of the polygon. Odd === inside, Even === outside.
  28743. * @export @public @method
  28744. * @name pointInFreehand
  28745. *
  28746. * @param {Object} dataHandles Data object associated with the tool.
  28747. * @param {Object} location The coordinates being queried.
  28748. * @returns {boolean} True if the location is inside the polygon defined by dataHandles.
  28749. */
  28750. /* harmony default export */ __webpack_exports__["default"] = (function (dataHandles, location) {
  28751. var inROI = false; // Cycle round pairs of points
  28752. var j = dataHandles.length - 1; // The last vertex is the previous one to the first
  28753. for (var i = 0; i < dataHandles.length; i++) {
  28754. if (rayFromPointCrosssesLine(location, dataHandles[i], dataHandles[j])) {
  28755. inROI = !inROI;
  28756. }
  28757. j = i; // Here j is previous vertex to i
  28758. }
  28759. return inROI;
  28760. });
  28761. /**
  28762. * Returns true if the y-position yp is enclosed within y-positions y1 and y2.
  28763. * @private
  28764. * @method
  28765. * @name isEnclosedY
  28766. *
  28767. * @param {number} yp The y position of point p.
  28768. * @param {number} y1 The y position of point 1.
  28769. * @param {number} y2 The y position of point 2.
  28770. * @returns {boolean} True if the y-position yp is enclosed within y-positions y1 and y2.
  28771. */
  28772. function isEnclosedY(yp, y1, y2) {
  28773. if (y1 < yp && yp < y2 || y2 < yp && yp < y1) {
  28774. return true;
  28775. }
  28776. return false;
  28777. }
  28778. /**
  28779. * Returns true if the line segment is to the right of the point.
  28780. * @private
  28781. * @method
  28782. * @name isLineRightOfPoint
  28783. *
  28784. * @param {Object} point The point being queried.
  28785. * @param {Object} lp1 The first point of the line segment.
  28786. * @param {Object} lp2 The second point of the line segment.
  28787. * @returns {boolean} True if the line is to the right of the point.
  28788. */
  28789. function isLineRightOfPoint(point, lp1, lp2) {
  28790. // If both right of point return true
  28791. if (lp1.x > point.x && lp2.x > point.x) {
  28792. return true;
  28793. } // Catch when line is vertical.
  28794. if (lp1.x === lp2.x) {
  28795. return point.x < lp1.x;
  28796. } // Put leftmost point in lp1
  28797. if (lp1.x > lp2.x) {
  28798. var lptemp = lp1;
  28799. lp1 = lp2;
  28800. lp2 = lptemp;
  28801. }
  28802. var lPointY = lineSegmentAtPoint(point, lp1, lp2); // If the lp1.x and lp2.x enclose point.x check gradient of line and see if
  28803. // Point is above or below the line to calculate if it inside.
  28804. if (Math.sign(lPointY.gradient) * point.y > Math.sign(lPointY.gradient) * lPointY.value) {
  28805. return true;
  28806. }
  28807. return false;
  28808. }
  28809. /**
  28810. * Returns the y value of the line segment at the x value of the point.
  28811. * @private
  28812. * @method
  28813. * @name lineSegmentAtPoint
  28814. *
  28815. * @param {Object} point The point being queried.
  28816. * @param {Object} lp1 The first point of the line segment.
  28817. * @param {Object} lp2 The second point of the line segment.
  28818. * @returns {Object} An object containing the y value as well as the gradient of the line segment.
  28819. */
  28820. function lineSegmentAtPoint(point, lp1, lp2) {
  28821. var dydx = (lp2.y - lp1.y) / (lp2.x - lp1.x);
  28822. var fx = {
  28823. value: lp1.y + dydx * (point.x - lp1.x),
  28824. gradient: dydx
  28825. };
  28826. return fx;
  28827. }
  28828. /**
  28829. * Returns true if a rightwards ray originating from the point crosses the line defined by handleI and handleJ.
  28830. * @private
  28831. * @method
  28832. * @name rayFromPointCrosssesLine
  28833. *
  28834. * @param {Object} point The point being queried.
  28835. * @param {Object} handleI The first handle of the line segment.
  28836. * @param {Object} handleJ The second handle of the line segment.
  28837. * @returns {boolean} True if a rightwards ray originating from the point crosses the line defined by handleI and handleJ.
  28838. */
  28839. function rayFromPointCrosssesLine(point, handleI, handleJ) {
  28840. if (isEnclosedY(point.y, handleI.y, handleJ.y) && isLineRightOfPoint(point, handleI, handleJ)) {
  28841. return true;
  28842. }
  28843. return false;
  28844. }
  28845. /***/ }),
  28846. /***/ "./util/getActiveTool.js":
  28847. /*!*******************************!*\
  28848. !*** ./util/getActiveTool.js ***!
  28849. \*******************************/
  28850. /*! exports provided: default */
  28851. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  28852. "use strict";
  28853. __webpack_require__.r(__webpack_exports__);
  28854. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getActiveTool; });
  28855. /* harmony import */ var _store__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../store */ "./store/index.js");
  28856. /* harmony import */ var _store_getActiveToolsForElement__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../store/getActiveToolsForElement */ "./store/getActiveToolsForElement.js");
  28857. /* harmony import */ var _store_filterToolsUsableWithMultiPartTools__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../store/filterToolsUsableWithMultiPartTools */ "./store/filterToolsUsableWithMultiPartTools.js");
  28858. // Todo: We could simplify this if we only allow one active
  28859. // Tool per mouse button mask?
  28860. function getActiveTool(element, buttons) {
  28861. var interactionType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'mouse';
  28862. var tools;
  28863. if (interactionType === 'touch') {
  28864. tools = Object(_store_getActiveToolsForElement__WEBPACK_IMPORTED_MODULE_1__["default"])(element, _store__WEBPACK_IMPORTED_MODULE_0__["getters"].touchTools());
  28865. tools = tools.filter(function (tool) {
  28866. return tool.options.isTouchActive;
  28867. });
  28868. } else {
  28869. // Filter out disabled, enabled, and passive
  28870. tools = Object(_store_getActiveToolsForElement__WEBPACK_IMPORTED_MODULE_1__["default"])(element, _store__WEBPACK_IMPORTED_MODULE_0__["getters"].mouseTools()); // Filter out tools that do not match mouseButtonMask
  28871. tools = tools.filter(function (tool) {
  28872. return Array.isArray(tool.options.mouseButtonMask) && buttons && tool.options.mouseButtonMask.includes(buttons) && tool.options.isMouseActive;
  28873. });
  28874. if (_store__WEBPACK_IMPORTED_MODULE_0__["state"].isMultiPartToolActive) {
  28875. tools = Object(_store_filterToolsUsableWithMultiPartTools__WEBPACK_IMPORTED_MODULE_2__["default"])(tools);
  28876. }
  28877. }
  28878. if (tools.length === 0) {
  28879. return;
  28880. }
  28881. return tools[0];
  28882. }
  28883. /***/ }),
  28884. /***/ "./util/getCircleCoords.js":
  28885. /*!*********************************!*\
  28886. !*** ./util/getCircleCoords.js ***!
  28887. \*********************************/
  28888. /*! exports provided: default */
  28889. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  28890. "use strict";
  28891. __webpack_require__.r(__webpack_exports__);
  28892. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getCircleCoords; });
  28893. /* harmony import */ var _externalModules__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules */ "./externalModules.js");
  28894. /**
  28895. * Retrieve the bounds of the circle in image coordinates
  28896. *
  28897. * @param {*} startHandle
  28898. * @param {*} endHandle
  28899. * @returns {{ left: number, top: number, width: number, height: number }}
  28900. */
  28901. function getCircleCoords(startHandle, endHandle) {
  28902. var distance = _externalModules__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.point.distance;
  28903. var radius = distance(startHandle, endHandle);
  28904. return {
  28905. left: Math.floor(Math.min(startHandle.x - radius, endHandle.x)),
  28906. top: Math.floor(Math.min(startHandle.y - radius, endHandle.y)),
  28907. width: radius * 2,
  28908. height: radius * 2
  28909. };
  28910. }
  28911. /***/ }),
  28912. /***/ "./util/getDefault.js":
  28913. /*!****************************!*\
  28914. !*** ./util/getDefault.js ***!
  28915. \****************************/
  28916. /*! exports provided: default */
  28917. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  28918. "use strict";
  28919. __webpack_require__.r(__webpack_exports__);
  28920. /**
  28921. * Returns the first argument if defined, otherwise returns the second
  28922. *
  28923. * @param {*} value
  28924. * @param {*} defaultValue
  28925. * @returns {*}
  28926. */
  28927. /* harmony default export */ __webpack_exports__["default"] = (function (value, defaultValue) {
  28928. return value === undefined ? defaultValue : value;
  28929. });
  28930. /***/ }),
  28931. /***/ "./util/getKeyPressData.js":
  28932. /*!*********************************!*\
  28933. !*** ./util/getKeyPressData.js ***!
  28934. \*********************************/
  28935. /*! exports provided: default */
  28936. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  28937. "use strict";
  28938. __webpack_require__.r(__webpack_exports__);
  28939. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getKeyPressData; });
  28940. /* harmony import */ var _store___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../store/ */ "./store/index.js");
  28941. /* harmony import */ var _externalModules__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../externalModules */ "./externalModules.js");
  28942. function getKeyPressData(e) {
  28943. var cornerstone = _externalModules__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone;
  28944. var element = e.currentTarget;
  28945. var enabledElement = cornerstone.getEnabledElement(element);
  28946. if (!enabledElement || !enabledElement.image) {
  28947. return;
  28948. }
  28949. var currentPointsImage = _store___WEBPACK_IMPORTED_MODULE_0__["default"].state.mousePositionImage;
  28950. return {
  28951. event: window.event || e,
  28952. // Old IE support
  28953. element: element,
  28954. viewport: cornerstone.getViewport(element),
  28955. image: enabledElement.image,
  28956. currentPoints: {
  28957. image: currentPointsImage,
  28958. canvas: cornerstone.pixelToCanvas(element, currentPointsImage)
  28959. },
  28960. keyCode: e.keyCode,
  28961. which: e.which
  28962. };
  28963. }
  28964. /***/ }),
  28965. /***/ "./util/getLuminance.js":
  28966. /*!******************************!*\
  28967. !*** ./util/getLuminance.js ***!
  28968. \******************************/
  28969. /*! exports provided: default */
  28970. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  28971. "use strict";
  28972. __webpack_require__.r(__webpack_exports__);
  28973. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
  28974. /**
  28975. * Returns the luminance of a region.
  28976. * @public
  28977. * @function getLuminance
  28978. *
  28979. * @param {HTMLElement} element The element.
  28980. * @param {number} x The x position of the top-left corner of the region.
  28981. * @param {number} y The y position of the top-left corner of the region.
  28982. * @param {number} width The width of the region.
  28983. * @param {number} height The height of the region
  28984. * @returns {number[]} The luminance.
  28985. */
  28986. /* harmony default export */ __webpack_exports__["default"] = (function (element, x, y, width, height) {
  28987. if (!element) {
  28988. throw new Error('getLuminance: parameter element must not be undefined');
  28989. }
  28990. x = Math.round(x);
  28991. y = Math.round(y);
  28992. var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.getEnabledElement(element);
  28993. var image = enabledElement.image;
  28994. var luminance = [];
  28995. var index = 0;
  28996. var pixelData = image.getPixelData();
  28997. var spIndex, row, column;
  28998. if (image.color) {
  28999. for (row = 0; row < height; row++) {
  29000. for (column = 0; column < width; column++) {
  29001. spIndex = ((row + y) * image.columns + (column + x)) * 4;
  29002. var red = pixelData[spIndex];
  29003. var green = pixelData[spIndex + 1];
  29004. var blue = pixelData[spIndex + 2];
  29005. luminance[index++] = 0.2126 * red + 0.7152 * green + 0.0722 * blue;
  29006. }
  29007. }
  29008. } else {
  29009. for (row = 0; row < height; row++) {
  29010. for (column = 0; column < width; column++) {
  29011. spIndex = (row + y) * image.columns + (column + x);
  29012. luminance[index++] = pixelData[spIndex] * image.slope + image.intercept;
  29013. }
  29014. }
  29015. }
  29016. return luminance;
  29017. });
  29018. /***/ }),
  29019. /***/ "./util/getMaxSimultaneousRequests.js":
  29020. /*!********************************************!*\
  29021. !*** ./util/getMaxSimultaneousRequests.js ***!
  29022. \********************************************/
  29023. /*! exports provided: getDefaultSimultaneousRequests, getMaxSimultaneousRequests, setMaxSimultaneousRequests, getBrowserInfo, isMobileDevice */
  29024. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  29025. "use strict";
  29026. __webpack_require__.r(__webpack_exports__);
  29027. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getDefaultSimultaneousRequests", function() { return getDefaultSimultaneousRequests; });
  29028. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getMaxSimultaneousRequests", function() { return getMaxSimultaneousRequests; });
  29029. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setMaxSimultaneousRequests", function() { return setMaxSimultaneousRequests; });
  29030. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getBrowserInfo", function() { return getBrowserInfo; });
  29031. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isMobileDevice", function() { return isMobileDevice; });
  29032. var configMaxSimultaneousRequests; // Maximum concurrent connections to the same server
  29033. // Information from http://sgdev-blog.blogspot.fr/2014/01/maximum-concurrent-connection-to-same.html
  29034. var maxSimultaneousRequests = {
  29035. default: 6,
  29036. IE: {
  29037. 9: 6,
  29038. 10: 8,
  29039. default: 8
  29040. },
  29041. Firefox: {
  29042. default: 6
  29043. },
  29044. Opera: {
  29045. 10: 8,
  29046. 11: 6,
  29047. 12: 6,
  29048. default: 6
  29049. },
  29050. Chrome: {
  29051. default: 6
  29052. },
  29053. Safari: {
  29054. default: 6
  29055. }
  29056. }; // Browser name / version detection
  29057. //
  29058. //
  29059. /**
  29060. * Browser name / version detection
  29061. * http://stackoverflow.com/questions/2400935/browser-detection-in-javascript
  29062. * @export @public @method
  29063. * @name getBrowserInfo
  29064. *
  29065. * @returns {string} The name and version of the browser.
  29066. */
  29067. function getBrowserInfo() {
  29068. var ua = navigator.userAgent;
  29069. var M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [];
  29070. var tem;
  29071. if (/trident/i.test(M[1])) {
  29072. tem = /\brv[ :]+(\d+)/g.exec(ua) || [];
  29073. return "IE ".concat(tem[1] || '');
  29074. }
  29075. if (M[1] === 'Chrome') {
  29076. tem = ua.match(/\b(OPR|Edge)\/(\d+)/);
  29077. if (tem !== null) {
  29078. return tem.slice(1).join(' ').replace('OPR', 'Opera');
  29079. }
  29080. }
  29081. M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];
  29082. if ((tem = ua.match(/version\/(\d+)/i)) !== null) {
  29083. M.splice(1, 1, tem[1]);
  29084. }
  29085. return M.join(' ');
  29086. }
  29087. /**
  29088. * Sets the maximum number of simultaneous requests.
  29089. * @export @public @method
  29090. * @name setMaxSimultaneousRequests
  29091. *
  29092. * @param {number} newMaxSimultaneousRequests The value.
  29093. * @returns {void}
  29094. */
  29095. function setMaxSimultaneousRequests(newMaxSimultaneousRequests) {
  29096. configMaxSimultaneousRequests = newMaxSimultaneousRequests;
  29097. }
  29098. /**
  29099. * Returns the maximum number of simultaneous requests.
  29100. * @export @public @method
  29101. * @name getMaxSimultaneousRequests
  29102. *
  29103. * @returns {number} The maximum number of simultaneous requests
  29104. */
  29105. function getMaxSimultaneousRequests() {
  29106. if (configMaxSimultaneousRequests) {
  29107. return configMaxSimultaneousRequests;
  29108. }
  29109. return getDefaultSimultaneousRequests();
  29110. }
  29111. /**
  29112. * Returns the default number of simultaneous requests.
  29113. * @export @public @method
  29114. * @name getDefaultSimultaneousRequests
  29115. *
  29116. * @returns {number} The default number of simultaneous requests.
  29117. */
  29118. function getDefaultSimultaneousRequests() {
  29119. var infoString = getBrowserInfo();
  29120. var info = infoString.split(' ');
  29121. var browserName = info[0];
  29122. var browserVersion = info[1];
  29123. var browserData = maxSimultaneousRequests[browserName];
  29124. if (!browserData) {
  29125. return maxSimultaneousRequests.default;
  29126. }
  29127. if (!browserData[browserVersion]) {
  29128. return browserData.default;
  29129. }
  29130. return browserData[browserVersion];
  29131. }
  29132. /**
  29133. * Checks if cornerstoneTools is operating on a mobile device.
  29134. * @export @public @method
  29135. * @name isMobileDevice
  29136. *
  29137. * @returns {boolean} True if running on a mobile device.
  29138. */
  29139. function isMobileDevice() {
  29140. var pattern = new RegExp('Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini');
  29141. return pattern.test(navigator.userAgent);
  29142. }
  29143. /***/ }),
  29144. /***/ "./util/getPixelSpacing.js":
  29145. /*!*********************************!*\
  29146. !*** ./util/getPixelSpacing.js ***!
  29147. \*********************************/
  29148. /*! exports provided: default */
  29149. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  29150. "use strict";
  29151. __webpack_require__.r(__webpack_exports__);
  29152. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getPixelSpacing; });
  29153. /* harmony import */ var _externalModules__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules */ "./externalModules.js");
  29154. function getPixelSpacing(image) {
  29155. var imagePlane = _externalModules__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.metaData.get('imagePlaneModule', image.imageId);
  29156. if (imagePlane) {
  29157. return {
  29158. rowPixelSpacing: imagePlane.rowPixelSpacing || imagePlane.rowImagePixelSpacing,
  29159. colPixelSpacing: imagePlane.columnPixelSpacing || imagePlane.colImagePixelSpacing
  29160. };
  29161. }
  29162. return {
  29163. rowPixelSpacing: image.rowPixelSpacing,
  29164. colPixelSpacing: image.columnPixelSpacing
  29165. };
  29166. }
  29167. /***/ }),
  29168. /***/ "./util/getProximityThreshold.js":
  29169. /*!***************************************!*\
  29170. !*** ./util/getProximityThreshold.js ***!
  29171. \***************************************/
  29172. /*! exports provided: default */
  29173. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  29174. "use strict";
  29175. __webpack_require__.r(__webpack_exports__);
  29176. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getProximityThreshold; });
  29177. /* harmony import */ var _store__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../store */ "./store/index.js");
  29178. /**
  29179. * Returns the proximity threshold for the given interaction type, looking first
  29180. * at the tool configuration and then at global configuration.
  29181. *
  29182. * @public
  29183. * @function getProximityThreshold
  29184. *
  29185. * @param {string} interactionType The interaction type (mouse or touch)
  29186. * @param {string} toolName The name of the tool
  29187. * @returns {Number} The proximity threshold based on the tool
  29188. */
  29189. function getProximityThreshold(interactionType, toolName) {
  29190. var clickProximity = _store__WEBPACK_IMPORTED_MODULE_0__["state"].clickProximity,
  29191. touchProximity = _store__WEBPACK_IMPORTED_MODULE_0__["state"].touchProximity;
  29192. var tool = _store__WEBPACK_IMPORTED_MODULE_0__["state"].tools.find(function (_ref) {
  29193. var name = _ref.name;
  29194. return name === toolName;
  29195. });
  29196. if (tool && tool.configuration) {
  29197. clickProximity = tool.configuration.clickProximity || clickProximity;
  29198. touchProximity = tool.configuration.touchProximity || touchProximity;
  29199. }
  29200. return interactionType === 'mouse' ? clickProximity : touchProximity;
  29201. }
  29202. /***/ }),
  29203. /***/ "./util/getRGBPixels.js":
  29204. /*!******************************!*\
  29205. !*** ./util/getRGBPixels.js ***!
  29206. \******************************/
  29207. /*! exports provided: default */
  29208. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  29209. "use strict";
  29210. __webpack_require__.r(__webpack_exports__);
  29211. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
  29212. /**
  29213. * Gets pixels of an RGB image.
  29214. * @export @public @method
  29215. * @name getRGBPixels
  29216. *
  29217. * @param {HTMLElement} element The element.
  29218. * @param {number} x The x position of the top-left corner of the region.
  29219. * @param {number} y The y position of the top-left corner of the region.
  29220. * @param {number} width The width of the region.
  29221. * @param {number} height The height of the region
  29222. * @returns {number[]} The pixel data.
  29223. */
  29224. /* harmony default export */ __webpack_exports__["default"] = (function (element, x, y, width, height) {
  29225. if (!element) {
  29226. throw new Error('getRGBPixels: parameter element must not be undefined');
  29227. }
  29228. x = Math.round(x);
  29229. y = Math.round(y);
  29230. var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.getEnabledElement(element);
  29231. var storedPixelData = [];
  29232. var index = 0;
  29233. var pixelData = enabledElement.image.getPixelData();
  29234. var spIndex, row, column;
  29235. if (enabledElement.image.color) {
  29236. for (row = 0; row < height; row++) {
  29237. for (column = 0; column < width; column++) {
  29238. spIndex = ((row + y) * enabledElement.image.columns + (column + x)) * 4;
  29239. var red = pixelData[spIndex];
  29240. var green = pixelData[spIndex + 1];
  29241. var blue = pixelData[spIndex + 2];
  29242. var alpha = pixelData[spIndex + 3];
  29243. storedPixelData[index++] = red;
  29244. storedPixelData[index++] = green;
  29245. storedPixelData[index++] = blue;
  29246. storedPixelData[index++] = alpha;
  29247. }
  29248. }
  29249. }
  29250. return storedPixelData;
  29251. });
  29252. /***/ }),
  29253. /***/ "./util/getROITextBoxCoords.js":
  29254. /*!*************************************!*\
  29255. !*** ./util/getROITextBoxCoords.js ***!
  29256. \*************************************/
  29257. /*! exports provided: default */
  29258. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  29259. "use strict";
  29260. __webpack_require__.r(__webpack_exports__);
  29261. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getROITextBoxCoords; });
  29262. /**
  29263. * Determine the coordinates that will place the textbox to the right of the
  29264. * annotation, taking rotation, hflip, and vflip into account.
  29265. *
  29266. * @param {Object} viewport - The object that stores rotation, hflip, and vflip.
  29267. * @param {Object} handles - The handles of the annotation.
  29268. * @returns {Object} - The coordinates for default placement of the textbox
  29269. */
  29270. function getROITextBoxCoords(viewport, handles) {
  29271. var corners = _determineCorners(handles);
  29272. var centerX = (corners.left.x + corners.right.x) / 2;
  29273. var centerY = (corners.top.y + corners.bottom.y) / 2;
  29274. var textBox = {};
  29275. if (viewport.rotation >= 0 && viewport.rotation < 90) {
  29276. textBox.x = viewport.hflip ? corners.left.x : corners.right.x;
  29277. textBox.y = centerY;
  29278. }
  29279. if (viewport.rotation >= 90 && viewport.rotation < 180) {
  29280. textBox.x = centerX;
  29281. textBox.y = viewport.vflip ? corners.bottom.y : corners.top.y;
  29282. }
  29283. if (viewport.rotation >= 180 && viewport.rotation < 270) {
  29284. textBox.x = viewport.hflip ? corners.right.x : corners.left.x;
  29285. textBox.y = centerY;
  29286. }
  29287. if (viewport.rotation >= 270 && viewport.rotation < 360) {
  29288. textBox.x = centerX;
  29289. textBox.y = viewport.vflip ? corners.top.y : corners.bottom.y;
  29290. }
  29291. return textBox;
  29292. }
  29293. /**
  29294. * Determine the handles that have the min/max x and y values.
  29295. *
  29296. * @param {Object} handles - The handles of the annotation.
  29297. * @returns {Object} - The top, left, bottom, and right handles
  29298. */
  29299. function _determineCorners(handles) {
  29300. var handlesLeftToRight = [handles.start, handles.end].sort(_compareX);
  29301. var handlesTopToBottom = [handles.start, handles.end].sort(_compareY);
  29302. var left = handlesLeftToRight[0];
  29303. var right = handlesLeftToRight[handlesLeftToRight.length - 1];
  29304. var top = handlesTopToBottom[0];
  29305. var bottom = handlesTopToBottom[handlesTopToBottom.length - 1];
  29306. return {
  29307. top: top,
  29308. left: left,
  29309. bottom: bottom,
  29310. right: right
  29311. };
  29312. function _compareX(a, b) {
  29313. return a.x < b.x ? -1 : 1;
  29314. }
  29315. function _compareY(a, b) {
  29316. return a.y < b.y ? -1 : 1;
  29317. }
  29318. }
  29319. /***/ }),
  29320. /***/ "./util/isEmptyObject.js":
  29321. /*!*******************************!*\
  29322. !*** ./util/isEmptyObject.js ***!
  29323. \*******************************/
  29324. /*! exports provided: default */
  29325. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  29326. "use strict";
  29327. __webpack_require__.r(__webpack_exports__);
  29328. /**
  29329. * Helper to determine if an object has no keys and is the correct type (is empty)
  29330. *
  29331. * @private
  29332. * @function isEmptyObject
  29333. * @param {Object} obj The object to check
  29334. * @returns {Boolean} true if the object is empty
  29335. */
  29336. var isEmptyObject = function isEmptyObject(obj) {
  29337. return Object.keys(obj).length === 0 && obj.constructor === Object;
  29338. };
  29339. /* harmony default export */ __webpack_exports__["default"] = (isEmptyObject);
  29340. /***/ }),
  29341. /***/ "./util/isObject.js":
  29342. /*!**************************!*\
  29343. !*** ./util/isObject.js ***!
  29344. \**************************/
  29345. /*! exports provided: default */
  29346. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  29347. "use strict";
  29348. __webpack_require__.r(__webpack_exports__);
  29349. /* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "../node_modules/@babel/runtime/helpers/typeof.js");
  29350. /* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__);
  29351. /**
  29352. * Checks if `value` is the
  29353. * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
  29354. * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
  29355. *
  29356. * @since 0.1.0
  29357. * @category Lang
  29358. * @param {*} value The value to check.
  29359. * @returns {boolean} Returns `true` if `value` is an object, else `false`.
  29360. * @example
  29361. *
  29362. * isObject({})
  29363. * // => true
  29364. *
  29365. * isObject([1, 2, 3])
  29366. * // => true
  29367. *
  29368. * isObject(Function)
  29369. * // => true
  29370. *
  29371. * isObject(null)
  29372. * // => false
  29373. */
  29374. function isObject(value) {
  29375. var type = _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default()(value);
  29376. return value !== null && (type === 'object' || type === 'function');
  29377. }
  29378. /* harmony default export */ __webpack_exports__["default"] = (isObject);
  29379. /***/ }),
  29380. /***/ "./util/isPointInImage.js":
  29381. /*!********************************!*\
  29382. !*** ./util/isPointInImage.js ***!
  29383. \********************************/
  29384. /*! exports provided: default */
  29385. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  29386. "use strict";
  29387. __webpack_require__.r(__webpack_exports__);
  29388. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return isPointInImage; });
  29389. /**
  29390. * Checks if the point is within the image boundaries.
  29391. * @param {Object} pixel The pixel.
  29392. * @param {number} rows The number of rows.
  29393. * @param {number} cols The number of columns.
  29394. * @returns {boolean}
  29395. */
  29396. function isPointInImage(_ref, rows, cols) {
  29397. var x = _ref.x,
  29398. y = _ref.y;
  29399. return x < cols && x >= 0 && y < rows && y >= 0;
  29400. }
  29401. /***/ }),
  29402. /***/ "./util/isPointInPolygon.js":
  29403. /*!**********************************!*\
  29404. !*** ./util/isPointInPolygon.js ***!
  29405. \**********************************/
  29406. /*! exports provided: default */
  29407. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  29408. "use strict";
  29409. __webpack_require__.r(__webpack_exports__);
  29410. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return isPointInPolygon; });
  29411. /**
  29412. * Checks whether a point is inside a polygon
  29413. *
  29414. * {@link https://github.com/substack/point-in-polygon/blob/master/index.js}
  29415. * ray-casting algorithm based on
  29416. * {@link http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html}
  29417. *
  29418. * @param {Array} point The point [x1, y1]
  29419. * @param {Array} vs The vertices [[x1, y1], [x2, y2], ...] of the Polygon
  29420. * @returns {boolean}
  29421. */
  29422. function isPointInPolygon(point, vs) {
  29423. var x = point[0];
  29424. var y = point[1];
  29425. var inside = false;
  29426. for (var i = 0, j = vs.length - 1; i < vs.length; j = i++) {
  29427. var xi = vs[i][0];
  29428. var yi = vs[i][1];
  29429. var xj = vs[j][0];
  29430. var yj = vs[j][1];
  29431. var intersect = yi > y !== yj > y && x < (xj - xi) * (y - yi) / (yj - yi) + xi;
  29432. if (intersect) {
  29433. inside = !inside;
  29434. }
  29435. }
  29436. return inside;
  29437. }
  29438. /***/ }),
  29439. /***/ "./util/lineSegDistance.js":
  29440. /*!*********************************!*\
  29441. !*** ./util/lineSegDistance.js ***!
  29442. \*********************************/
  29443. /*! exports provided: default */
  29444. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  29445. "use strict";
  29446. __webpack_require__.r(__webpack_exports__);
  29447. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
  29448. /**
  29449. * Calculates the distance of a line segment from a point.
  29450. * @export @public @method
  29451. * @name lineSegDistance
  29452. *
  29453. * @param {HTMLElement} element The element.
  29454. * @param {Object} start The starting position of the line.
  29455. * @param {Object} end The end position of the line.
  29456. * @param {Object} coords The coordinates of the point.
  29457. * @returns {name} The distance between the line and the point.
  29458. */
  29459. /* harmony default export */ __webpack_exports__["default"] = (function (element, start, end, coords) {
  29460. var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone;
  29461. var lineSegment = {
  29462. start: cornerstone.pixelToCanvas(element, start),
  29463. end: cornerstone.pixelToCanvas(element, end)
  29464. };
  29465. return _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);
  29466. });
  29467. /***/ }),
  29468. /***/ "./util/logger.js":
  29469. /*!************************!*\
  29470. !*** ./util/logger.js ***!
  29471. \************************/
  29472. /*! exports provided: getLogger, enable, disable */
  29473. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  29474. "use strict";
  29475. __webpack_require__.r(__webpack_exports__);
  29476. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLogger", function() { return getLogger; });
  29477. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "enable", function() { return enable; });
  29478. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "disable", function() { return disable; });
  29479. /* harmony import */ var _debugLib_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./debugLib/index.js */ "./util/debugLib/index.js");
  29480. var BASE_SCOPE = 'cornerstoneTools';
  29481. var baseLogger = Object(_debugLib_index_js__WEBPACK_IMPORTED_MODULE_0__["default"])(BASE_SCOPE); // eslint-disable-next-line no-process-env
  29482. var devMode = "development" === 'development'; // If we're in dev-mode, tell the user how to get logs
  29483. if (devMode && !baseLogger.enabled) {
  29484. // eslint-disable-next-line no-console
  29485. console.log('%cCornerstone Tools', 'background: #339955; padding: 4px; font-weight: bold; color: white'); // eslint-disable-next-line no-console
  29486. console.info('run %clocalStorage.setItem("debug", "cornerstoneTools")%c to see console output', 'background: #eaeaea; color: #333; font-family: monospace', '');
  29487. }
  29488. /**
  29489. * @method debug
  29490. * Create's a scoped debuging logger
  29491. */
  29492. var getLogger = function getLogger(scope) {
  29493. var log = baseLogger.extend(scope);
  29494. return {
  29495. log: log,
  29496. // eslint-disable-next-line no-console
  29497. warn: devMode ? console.warn.bind(console) : log,
  29498. // eslint-disable-next-line no-console
  29499. error: console.error.bind(console)
  29500. };
  29501. };
  29502. /**
  29503. * @method enable
  29504. * @param {string} scope The scope to enabled
  29505. * @returns {void}
  29506. */
  29507. var enable = function enable() {
  29508. var scope = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "".concat(BASE_SCOPE, ":*");
  29509. return _debugLib_index_js__WEBPACK_IMPORTED_MODULE_0__["default"].enable(scope);
  29510. };
  29511. /**
  29512. * @method disable
  29513. * @param {string} scope
  29514. * @returns {string} The previously enabled scope
  29515. */
  29516. var disable = function disable() {
  29517. return _debugLib_index_js__WEBPACK_IMPORTED_MODULE_0__["default"].disable();
  29518. };
  29519. /***/ }),
  29520. /***/ "./util/makeUnselectable.js":
  29521. /*!**********************************!*\
  29522. !*** ./util/makeUnselectable.js ***!
  29523. \**********************************/
  29524. /*! exports provided: default */
  29525. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  29526. "use strict";
  29527. __webpack_require__.r(__webpack_exports__);
  29528. /**
  29529. * A helper function to make an element (and its content) being non selectable.
  29530. * @export @public @method
  29531. * @name makeUnselectable
  29532. *
  29533. * @param {HTMLElement} element The element to make unselectable
  29534. * @param {Boolean} ignorePointerEvents true to make this element also
  29535. * ignore events (e.g. mouse click), false otherwise.
  29536. * @returns {void}
  29537. */
  29538. /* harmony default export */ __webpack_exports__["default"] = (function (element, ignorePointerEvents) {
  29539. element.style.webkitUserSelect = 'none';
  29540. element.style.webkitTouchCallout = 'none';
  29541. element.style.mozUserSelect = 'none';
  29542. element.style.msUserSelect = 'none';
  29543. element.style.oUserSelect = 'none';
  29544. element.style.khtmlUserSelect = 'none';
  29545. element.style.userSelect = 'none';
  29546. element.unselectable = 'on';
  29547. element.oncontextmenu = function () {
  29548. return false;
  29549. };
  29550. if (ignorePointerEvents === true) {
  29551. element.style.pointerEvents = 'none';
  29552. }
  29553. });
  29554. /***/ }),
  29555. /***/ "./util/numbersWithCommas.js":
  29556. /*!***********************************!*\
  29557. !*** ./util/numbersWithCommas.js ***!
  29558. \***********************************/
  29559. /*! exports provided: default */
  29560. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  29561. "use strict";
  29562. __webpack_require__.r(__webpack_exports__);
  29563. /**
  29564. * Converts a number to a string with comma separators.
  29565. * http://stackoverflow.com/questions/2901102/how-to-print-a-number-with-commas-as-thousands-separators-in-javascript
  29566. * @export @public @method
  29567. * @name numbersWithCommas
  29568. *
  29569. * @param {number} x The number to convert.
  29570. * @returns {string} The pretty-printed number as a string.
  29571. */
  29572. /* harmony default export */ __webpack_exports__["default"] = (function (x) {
  29573. var parts = x.toString().split('.');
  29574. parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ',');
  29575. return parts.join('.');
  29576. });
  29577. /***/ }),
  29578. /***/ "./util/pointInsideBoundingBox.js":
  29579. /*!****************************************!*\
  29580. !*** ./util/pointInsideBoundingBox.js ***!
  29581. \****************************************/
  29582. /*! exports provided: default */
  29583. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  29584. "use strict";
  29585. __webpack_require__.r(__webpack_exports__);
  29586. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
  29587. /**
  29588. * Returns true if a point is enclosed within a bounding box.
  29589. * @export @public @method
  29590. * @name pointInsideBoundingBox
  29591. *
  29592. * @param {Object} handle The handle containing the boundingBox.
  29593. * @param {Object} coords The coordinate to check.
  29594. * @returns {boolean} True if the point is enclosed within the bounding box.
  29595. */
  29596. /* harmony default export */ __webpack_exports__["default"] = (function (handle, coords) {
  29597. if (!handle.boundingBox) {
  29598. return;
  29599. }
  29600. return _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.point.insideRect(coords, handle.boundingBox);
  29601. });
  29602. /***/ }),
  29603. /***/ "./util/pointProjector.js":
  29604. /*!********************************!*\
  29605. !*** ./util/pointProjector.js ***!
  29606. \********************************/
  29607. /*! exports provided: projectPatientPointToImagePlane, imagePointToPatientPoint, planePlaneIntersection, rotatePoint */
  29608. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  29609. "use strict";
  29610. __webpack_require__.r(__webpack_exports__);
  29611. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "projectPatientPointToImagePlane", function() { return projectPatientPointToImagePlane; });
  29612. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "imagePointToPatientPoint", function() { return imagePointToPatientPoint; });
  29613. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "planePlaneIntersection", function() { return planePlaneIntersection; });
  29614. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rotatePoint", function() { return rotatePoint; });
  29615. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
  29616. /* harmony import */ var _util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../util/convertToVector3.js */ "./util/convertToVector3.js");
  29617. /**
  29618. * Projects a patient point to an image point
  29619. * @export @public @method
  29620. * @name projectPatientPointToImagePlane
  29621. *
  29622. * @param {Object} patientPoint The patient point.
  29623. * @param {Object} imagePlane The image plane used for projection.
  29624. * @returns {Object} The projected coordinates.
  29625. */
  29626. function projectPatientPointToImagePlane(patientPoint, imagePlane) {
  29627. var rowCosines = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__["default"])(imagePlane.rowCosines);
  29628. var columnCosines = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__["default"])(imagePlane.columnCosines);
  29629. var imagePositionPatient = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__["default"])(imagePlane.imagePositionPatient);
  29630. var point = patientPoint.clone().sub(imagePositionPatient);
  29631. var x = rowCosines.dot(point) / imagePlane.columnPixelSpacing;
  29632. var y = columnCosines.dot(point) / imagePlane.rowPixelSpacing;
  29633. return {
  29634. x: x,
  29635. y: y
  29636. };
  29637. } //
  29638. /**
  29639. * Projects an image point to a patient point
  29640. * @export @public @method
  29641. * @name imagePointToPatientPoint
  29642. *
  29643. * @param {Object} imagePoint The image point.
  29644. * @param {Object} imagePlane The image plane used for projection.
  29645. * @returns {Object} The projected coordinates.
  29646. */
  29647. function imagePointToPatientPoint(imagePoint, imagePlane) {
  29648. var rowCosines = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__["default"])(imagePlane.rowCosines);
  29649. var columnCosines = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__["default"])(imagePlane.columnCosines);
  29650. var imagePositionPatient = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__["default"])(imagePlane.imagePositionPatient);
  29651. var x = rowCosines.clone().multiplyScalar(imagePoint.x);
  29652. x.multiplyScalar(imagePlane.columnPixelSpacing);
  29653. var y = columnCosines.clone().multiplyScalar(imagePoint.y);
  29654. y.multiplyScalar(imagePlane.rowPixelSpacing);
  29655. var patientPoint = x.add(y);
  29656. patientPoint.add(imagePositionPatient);
  29657. return patientPoint;
  29658. }
  29659. /**
  29660. * Returns a rectangle from the imagePlane.
  29661. * @export @public @method
  29662. * @name getRectangleFromImagePlane
  29663. *
  29664. * @param {Object} imagePlane The imagePlane.
  29665. * @returns {Object} The rect.
  29666. */
  29667. function getRectangleFromImagePlane(imagePlane) {
  29668. // Get the points
  29669. var topLeft = imagePointToPatientPoint({
  29670. x: 0,
  29671. y: 0
  29672. }, imagePlane);
  29673. var topRight = imagePointToPatientPoint({
  29674. x: imagePlane.columns,
  29675. y: 0
  29676. }, imagePlane);
  29677. var bottomLeft = imagePointToPatientPoint({
  29678. x: 0,
  29679. y: imagePlane.rows
  29680. }, imagePlane);
  29681. var bottomRight = imagePointToPatientPoint({
  29682. x: imagePlane.columns,
  29683. y: imagePlane.rows
  29684. }, imagePlane); // Get each side as a vector
  29685. var rect = {
  29686. top: new _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.Line3(topLeft, topRight),
  29687. left: new _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.Line3(topLeft, bottomLeft),
  29688. right: new _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.Line3(topRight, bottomRight),
  29689. bottom: new _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.Line3(bottomLeft, bottomRight)
  29690. };
  29691. return rect;
  29692. }
  29693. /**
  29694. * Gets all the intersections of a line with a rect.
  29695. * @private
  29696. * @method
  29697. * @name lineRectangleIntersection
  29698. *
  29699. * @param {Object} line The line to check.
  29700. * @param {Object} rect The rect being intersected.
  29701. * @returns {Object[]} An array of the intersections.
  29702. */
  29703. function lineRectangleIntersection(line, rect) {
  29704. var intersections = [];
  29705. Object.keys(rect).forEach(function (side) {
  29706. var segment = rect[side];
  29707. var intersection = line.intersectLine(segment);
  29708. if (intersection) {
  29709. intersections.push(intersection);
  29710. }
  29711. });
  29712. return intersections;
  29713. }
  29714. /**
  29715. * Gets the line of intersection between two planes in patient space.
  29716. * @export @public @method
  29717. * @name planePlaneIntersection
  29718. *
  29719. * @param {Object} targetImagePlane The target plane.
  29720. * @param {Object} referenceImagePlane The reference plane
  29721. * @returns {Object} The intersections.
  29722. */
  29723. function planePlaneIntersection(targetImagePlane, referenceImagePlane) {
  29724. var targetRowCosines = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__["default"])(targetImagePlane.rowCosines);
  29725. var targetColumnCosines = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__["default"])(targetImagePlane.columnCosines);
  29726. var targetImagePositionPatient = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__["default"])(targetImagePlane.imagePositionPatient);
  29727. var referenceRowCosines = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__["default"])(referenceImagePlane.rowCosines);
  29728. var referenceColumnCosines = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__["default"])(referenceImagePlane.columnCosines);
  29729. var referenceImagePositionPatient = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__["default"])(referenceImagePlane.imagePositionPatient); // First, get the normals of each image plane
  29730. var targetNormal = targetRowCosines.clone().cross(targetColumnCosines);
  29731. var targetPlane = new _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.Plane();
  29732. targetPlane.setFromNormalAndCoplanarPoint(targetNormal, targetImagePositionPatient);
  29733. var referenceNormal = referenceRowCosines.clone().cross(referenceColumnCosines);
  29734. var referencePlane = new _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.Plane();
  29735. referencePlane.setFromNormalAndCoplanarPoint(referenceNormal, referenceImagePositionPatient);
  29736. var originDirection = referencePlane.clone().intersectPlane(targetPlane);
  29737. var origin = originDirection.origin;
  29738. var direction = originDirection.direction; // Calculate the longest possible length in the reference image plane (the length of the diagonal)
  29739. var bottomRight = imagePointToPatientPoint({
  29740. x: referenceImagePlane.columns,
  29741. y: referenceImagePlane.rows
  29742. }, referenceImagePlane);
  29743. var distance = referenceImagePositionPatient.distanceTo(bottomRight); // Use this distance to bound the ray intersecting the two planes
  29744. var line = new _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.Line3();
  29745. line.start = origin;
  29746. line.end = origin.clone().add(direction.multiplyScalar(distance)); // Find the intersections between this line and the reference image plane's four sides
  29747. var rect = getRectangleFromImagePlane(referenceImagePlane);
  29748. var intersections = lineRectangleIntersection(line, rect); // Return the intersections between this line and the reference image plane's sides
  29749. // In order to draw the reference line from the target image.
  29750. if (intersections.length !== 2) {
  29751. return;
  29752. }
  29753. return {
  29754. start: intersections[0],
  29755. end: intersections[1]
  29756. };
  29757. }
  29758. /**
  29759. * Translate a point using a rotation angle.
  29760. * @export @public @method
  29761. * @name rotatePoint
  29762. *
  29763. * @param {Object} point - `{ x, y }` in either pixel or canvas coordinates.
  29764. * @param {Object} center - `{ x, y }` in either pixel or canvas coordinates.
  29765. * @param {Number} angle - angle in degrees
  29766. * @returns {Object} - `{ x, y }` new point translated
  29767. */
  29768. function rotatePoint(point, center, angle) {
  29769. var angleRadians = angle * (Math.PI / 180); // Convert to radians
  29770. var rotatedX = Math.cos(angleRadians) * (point.x - center.x) - Math.sin(angleRadians) * (point.y - center.y) + center.x;
  29771. var rotatedY = Math.sin(angleRadians) * (point.x - center.x) + Math.cos(angleRadians) * (point.y - center.y) + center.y;
  29772. return {
  29773. x: rotatedX,
  29774. y: rotatedY
  29775. };
  29776. }
  29777. /***/ }),
  29778. /***/ "./util/roundToDecimal.js":
  29779. /*!********************************!*\
  29780. !*** ./util/roundToDecimal.js ***!
  29781. \********************************/
  29782. /*! exports provided: default */
  29783. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  29784. "use strict";
  29785. __webpack_require__.r(__webpack_exports__);
  29786. /**
  29787. * Rounds a number to the specified precision.
  29788. * @export @public @method
  29789. * @name roundToDecimal
  29790. *
  29791. * @param {number} value The value to round.
  29792. * @param {number} precision The required precision.
  29793. * @returns {number} The rounded number.
  29794. */
  29795. /* harmony default export */ __webpack_exports__["default"] = (function (value, precision) {
  29796. var multiplier = Math.pow(10, precision);
  29797. return Math.round(value * multiplier) / multiplier;
  29798. });
  29799. /***/ }),
  29800. /***/ "./util/scroll.js":
  29801. /*!************************!*\
  29802. !*** ./util/scroll.js ***!
  29803. \************************/
  29804. /*! exports provided: default */
  29805. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  29806. "use strict";
  29807. __webpack_require__.r(__webpack_exports__);
  29808. /* harmony import */ var _scrollToIndex_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./scrollToIndex.js */ "./util/scrollToIndex.js");
  29809. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  29810. /* harmony import */ var _clip_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./clip.js */ "./util/clip.js");
  29811. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js");
  29812. /**
  29813. * Scrolls through the stack.
  29814. * @export @public @method
  29815. * @name scroll
  29816. *
  29817. * @param {HTMLElement} element The element to scroll.
  29818. * @param {number} images The number of images to scroll through.
  29819. * @param {type} [loop = false] Whether to loop the scrolling.
  29820. * @param {type} [allowSkipping = true] Whether frames can be skipped.
  29821. * @returns {void}
  29822. */
  29823. /* harmony default export */ __webpack_exports__["default"] = (function (element, images) {
  29824. var loop = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
  29825. var allowSkipping = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
  29826. var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getToolState"])(element, 'stack');
  29827. if (!toolData || !toolData.data || !toolData.data.length) {
  29828. return;
  29829. }
  29830. var stackData = toolData.data[0];
  29831. if (!stackData.pending) {
  29832. stackData.pending = [];
  29833. }
  29834. var newImageIdIndex = stackData.currentImageIdIndex + images;
  29835. if (loop) {
  29836. var nbImages = stackData.imageIds.length;
  29837. newImageIdIndex %= nbImages;
  29838. } else {
  29839. newImageIdIndex = Object(_clip_js__WEBPACK_IMPORTED_MODULE_2__["default"])(newImageIdIndex, 0, stackData.imageIds.length - 1);
  29840. }
  29841. if (allowSkipping) {
  29842. Object(_scrollToIndex_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element, newImageIdIndex);
  29843. } else {
  29844. var pendingEvent = {
  29845. index: newImageIdIndex
  29846. };
  29847. stackData.pending.push(pendingEvent);
  29848. scrollWithoutSkipping(stackData, pendingEvent, element);
  29849. }
  29850. });
  29851. /**
  29852. * Recursively scrolls the stack until the desired image is reached.
  29853. * @private
  29854. * @method
  29855. * @name scrollWithoutSkipping
  29856. *
  29857. * @param {type} stackData Data object containing information about the stack.
  29858. * @param {Object} pendingEvent The event to process next.
  29859. * @param {HTMLElement} element The element being scrolled through.
  29860. * @returns {void}
  29861. */
  29862. function scrollWithoutSkipping(stackData, pendingEvent, element) {
  29863. if (stackData.pending[0] === pendingEvent) {
  29864. if (stackData.currentImageIdIndex === pendingEvent.index) {
  29865. stackData.pending.splice(stackData.pending.indexOf(pendingEvent), 1);
  29866. if (stackData.pending.length > 0) {
  29867. scrollWithoutSkipping(stackData, stackData.pending[0], element);
  29868. }
  29869. return;
  29870. }
  29871. var newImageHandler = function newImageHandler(event) {
  29872. var index = stackData.imageIds.indexOf(event.detail.image.imageId);
  29873. if (index === pendingEvent.index) {
  29874. stackData.pending.splice(stackData.pending.indexOf(pendingEvent), 1);
  29875. element.removeEventListener(_externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstone.EVENTS.NEW_IMAGE, newImageHandler);
  29876. if (stackData.pending.length > 0) {
  29877. scrollWithoutSkipping(stackData, stackData.pending[0], element);
  29878. }
  29879. }
  29880. };
  29881. element.addEventListener(_externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstone.EVENTS.NEW_IMAGE, newImageHandler);
  29882. Object(_scrollToIndex_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element, pendingEvent.index);
  29883. }
  29884. }
  29885. /***/ }),
  29886. /***/ "./util/scrollToIndex.js":
  29887. /*!*******************************!*\
  29888. !*** ./util/scrollToIndex.js ***!
  29889. \*******************************/
  29890. /*! exports provided: default */
  29891. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  29892. "use strict";
  29893. __webpack_require__.r(__webpack_exports__);
  29894. /* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../events.js */ "./events.js");
  29895. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
  29896. /* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js");
  29897. /* harmony import */ var _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../stateManagement/loadHandlerManager.js */ "./stateManagement/loadHandlerManager.js");
  29898. /* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/triggerEvent.js */ "./util/triggerEvent.js");
  29899. /**
  29900. * Scrolls through the stack to the image index requested.
  29901. * @export @public @method
  29902. * @name scrollToIndex
  29903. *
  29904. * @param {type} element The element to scroll through.
  29905. * @param {type} newImageIdIndex The target image index.
  29906. * @returns {void}
  29907. */
  29908. /* harmony default export */ __webpack_exports__["default"] = (function (element, newImageIdIndex) {
  29909. var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_2__["getToolState"])(element, 'stack');
  29910. if (!toolData || !toolData.data || !toolData.data.length) {
  29911. return;
  29912. }
  29913. var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone; // If we have more than one stack, check if we have a stack renderer defined
  29914. var stackRenderer;
  29915. if (toolData.data.length > 1) {
  29916. var stackRendererData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_2__["getToolState"])(element, 'stackRenderer');
  29917. if (stackRendererData && stackRendererData.data && stackRendererData.data.length) {
  29918. stackRenderer = stackRendererData.data[0];
  29919. }
  29920. }
  29921. var stackData = toolData.data[0]; // Allow for negative indexing
  29922. if (newImageIdIndex < 0) {
  29923. newImageIdIndex += stackData.imageIds.length;
  29924. }
  29925. var startLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_3__["default"].getStartLoadHandler(element);
  29926. var endLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_3__["default"].getEndLoadHandler(element);
  29927. var errorLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_3__["default"].getErrorLoadingHandler(element);
  29928. function doneCallback(image) {
  29929. if (stackData.currentImageIdIndex !== newImageIdIndex) {
  29930. return;
  29931. } // Check if the element is still enabled in Cornerstone,
  29932. // If an error is thrown, stop here.
  29933. try {
  29934. // TODO: Add 'isElementEnabled' to Cornerstone?
  29935. cornerstone.getEnabledElement(element);
  29936. } catch (error) {
  29937. return;
  29938. }
  29939. if (stackRenderer) {
  29940. stackRenderer.currentImageIdIndex = newImageIdIndex;
  29941. stackRenderer.render(element, toolData.data);
  29942. } else {
  29943. cornerstone.displayImage(element, image);
  29944. }
  29945. if (endLoadingHandler) {
  29946. endLoadingHandler(element, image);
  29947. }
  29948. }
  29949. function failCallback(error) {
  29950. var imageId = stackData.imageIds[newImageIdIndex];
  29951. if (errorLoadingHandler) {
  29952. errorLoadingHandler(element, imageId, error);
  29953. }
  29954. }
  29955. if (newImageIdIndex === stackData.currentImageIdIndex) {
  29956. return;
  29957. }
  29958. if (startLoadingHandler) {
  29959. startLoadingHandler(element);
  29960. }
  29961. var eventData = {
  29962. newImageIdIndex: newImageIdIndex,
  29963. direction: newImageIdIndex - stackData.currentImageIdIndex
  29964. };
  29965. stackData.currentImageIdIndex = newImageIdIndex;
  29966. var newImageId = stackData.imageIds[newImageIdIndex]; // Retry image loading in cases where previous image promise
  29967. // Was rejected, if the option is set
  29968. /*
  29969. Const config = stackScroll.getConfiguration();
  29970. TODO: Revisit this. It appears that Core's imageCache is not
  29971. keeping rejected promises anywhere, so we have no way to know
  29972. if something was previously rejected.
  29973. if (config && config.retryLoadOnScroll === true) {
  29974. }
  29975. */
  29976. // Convert the preventCache value in stack data to a boolean
  29977. var preventCache = Boolean(stackData.preventCache);
  29978. var imagePromise;
  29979. if (preventCache) {
  29980. imagePromise = cornerstone.loadImage(newImageId);
  29981. } else {
  29982. imagePromise = cornerstone.loadAndCacheImage(newImageId);
  29983. }
  29984. imagePromise.then(doneCallback, failCallback);
  29985. Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].STACK_SCROLL, eventData);
  29986. });
  29987. /***/ }),
  29988. /***/ "./util/segmentation/drawBrush.js":
  29989. /*!****************************************!*\
  29990. !*** ./util/segmentation/drawBrush.js ***!
  29991. \****************************************/
  29992. /*! exports provided: drawBrushPixels */
  29993. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  29994. "use strict";
  29995. __webpack_require__.r(__webpack_exports__);
  29996. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawBrushPixels", function() { return drawBrushPixels; });
  29997. /* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "../node_modules/@babel/runtime/helpers/toConsumableArray.js");
  29998. /* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__);
  29999. /* harmony import */ var _eraseIfSegmentIndex_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./eraseIfSegmentIndex.js */ "./util/segmentation/eraseIfSegmentIndex.js");
  30000. /**
  30001. * DrawBrushPixels - Adds or removes labels to a labelmap.
  30002. *
  30003. * @param {number[]} pointerArray The array of pixels to paint.
  30004. * @param {Object} labelmap2D The `pixelData` array to paint to.
  30005. * @param {number} segmentIndex The segment being drawn.
  30006. * @param {number} columns The number of columns in the image.
  30007. * @param {boolean} shouldErase = false Whether we should erase rather than color pixels.
  30008. * @returns {null}
  30009. */
  30010. function drawBrushPixels(pointerArray, pixelData, segmentIndex, columns) {
  30011. var shouldErase = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
  30012. var getPixelIndex = function getPixelIndex(x, y) {
  30013. return y * columns + x;
  30014. };
  30015. pointerArray.forEach(function (point) {
  30016. var spIndex = getPixelIndex.apply(void 0, _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(point));
  30017. if (shouldErase) {
  30018. Object(_eraseIfSegmentIndex_js__WEBPACK_IMPORTED_MODULE_1__["default"])(spIndex, pixelData, segmentIndex);
  30019. } else {
  30020. pixelData[spIndex] = segmentIndex;
  30021. }
  30022. });
  30023. }
  30024. /***/ }),
  30025. /***/ "./util/segmentation/eraseIfSegmentIndex.js":
  30026. /*!**************************************************!*\
  30027. !*** ./util/segmentation/eraseIfSegmentIndex.js ***!
  30028. \**************************************************/
  30029. /*! exports provided: default */
  30030. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  30031. "use strict";
  30032. __webpack_require__.r(__webpack_exports__);
  30033. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return eraseIfSegmentIndex; });
  30034. /**
  30035. * If the pixelData for the given pixelIndex is equal to the segmentIndex
  30036. * erase it (set it to 0).
  30037. * @param {number} pixelIndex The index of the pixel.
  30038. * @param {UInt16Array} pixelData The pixelData array.
  30039. * @param {number} segmentIndex The segment Index to erase.
  30040. */
  30041. function eraseIfSegmentIndex(pixelIndex, pixelData, segmentIndex) {
  30042. if (pixelData[pixelIndex] === segmentIndex) {
  30043. pixelData[pixelIndex] = 0;
  30044. }
  30045. }
  30046. /***/ }),
  30047. /***/ "./util/segmentation/eraseOutsideBoundingBox.js":
  30048. /*!******************************************************!*\
  30049. !*** ./util/segmentation/eraseOutsideBoundingBox.js ***!
  30050. \******************************************************/
  30051. /*! exports provided: default */
  30052. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  30053. "use strict";
  30054. __webpack_require__.r(__webpack_exports__);
  30055. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return eraseOutsideBoundingBox; });
  30056. /* harmony import */ var _eraseIfSegmentIndex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./eraseIfSegmentIndex */ "./util/segmentation/eraseIfSegmentIndex.js");
  30057. /**
  30058. * EraseOutsideBoundingBox - Erase all pixels labeled with the activeSegmentIndex,
  30059. * outside the bouding box defined by the `topLeft` and `topRight`.
  30060. * @param {} evt The Cornerstone event.
  30061. * @param {} operationData An object containing the `pixelData` to
  30062. * modify, the `segmentIndex` and the `points` array.
  30063. * @param {number[]} topLeft The top left of the bounding box.
  30064. * @param {number[]} bottomRight The bottom right of the bounding box.
  30065. * @returns {null}
  30066. */
  30067. function eraseOutsideBoundingBox(evt, operationData, topLeft, bottomRight) {
  30068. var eventData = evt.detail;
  30069. var pixelData = operationData.pixelData,
  30070. segmentIndex = operationData.segmentIndex;
  30071. var image = eventData.image;
  30072. var width = image.width,
  30073. height = image.height; // Loop until top of bounding box from top of image, color the entire row
  30074. for (var i = 0; i < width; i++) {
  30075. for (var j = 0; j < topLeft[1]; j++) {
  30076. Object(_eraseIfSegmentIndex__WEBPACK_IMPORTED_MODULE_0__["default"])(j * width + i, pixelData, segmentIndex);
  30077. }
  30078. } // Loop within rows of bounding box, to the left of the box
  30079. for (var _i = 0; _i < topLeft[0]; _i++) {
  30080. for (var _j = topLeft[1]; _j < bottomRight[1]; _j++) {
  30081. Object(_eraseIfSegmentIndex__WEBPACK_IMPORTED_MODULE_0__["default"])(_j * width + _i, pixelData, segmentIndex);
  30082. }
  30083. } // Loop within rows of bounding box, to the right of the box
  30084. for (var _i2 = bottomRight[0]; _i2 < width; _i2++) {
  30085. for (var _j2 = topLeft[1]; _j2 < bottomRight[1]; _j2++) {
  30086. Object(_eraseIfSegmentIndex__WEBPACK_IMPORTED_MODULE_0__["default"])(_j2 * width + _i2, pixelData, segmentIndex);
  30087. }
  30088. } // Loop from bottom of bounding box until bottom of image, color entire row
  30089. for (var _i3 = 0; _i3 < width; _i3++) {
  30090. for (var _j3 = bottomRight[1]; _j3 < height; _j3++) {
  30091. Object(_eraseIfSegmentIndex__WEBPACK_IMPORTED_MODULE_0__["default"])(_j3 * width + _i3, pixelData, segmentIndex);
  30092. }
  30093. }
  30094. }
  30095. /***/ }),
  30096. /***/ "./util/segmentation/eraseShape.js":
  30097. /*!*****************************************!*\
  30098. !*** ./util/segmentation/eraseShape.js ***!
  30099. \*****************************************/
  30100. /*! exports provided: eraseInsideShape, eraseOutsideShape */
  30101. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  30102. "use strict";
  30103. __webpack_require__.r(__webpack_exports__);
  30104. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "eraseInsideShape", function() { return eraseInsideShape; });
  30105. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "eraseOutsideShape", function() { return eraseOutsideShape; });
  30106. /* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/slicedToArray */ "../node_modules/@babel/runtime/helpers/slicedToArray.js");
  30107. /* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0__);
  30108. /* harmony import */ var _eraseOutsideBoundingBox__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./eraseOutsideBoundingBox */ "./util/segmentation/eraseOutsideBoundingBox.js");
  30109. /* harmony import */ var _isSameSegment_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./isSameSegment.js */ "./util/segmentation/isSameSegment.js");
  30110. /* harmony import */ var _logger_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../logger.js */ "./util/logger.js");
  30111. var logger = Object(_logger_js__WEBPACK_IMPORTED_MODULE_3__["getLogger"])('util:segmentation:operations:eraseOutsideCircle');
  30112. /**
  30113. * Erase all pixels labeled with the activeSegmentIndex,
  30114. * inside/outside the region defined by the shape.
  30115. * @param {Object} evt The Cornerstone event.
  30116. * @param {Object} operationData An object containing the `pixelData` to
  30117. * modify, the `segmentIndex` and the `points` array.
  30118. * @param {Object} pointInShape - A function that checks if a point, x,y is within a shape.
  30119. * @param {number[]} topLeft The top left of the bounding box.
  30120. * @param {number[]} bottomRight The bottom right of the bounding box.
  30121. * @returns {null}
  30122. */
  30123. function eraseShape(evt, operationData, pointInShape, topLeft, bottomRight) {
  30124. var insideOrOutside = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 'inside';
  30125. var width = evt.detail.image.width;
  30126. var pixelData = operationData.pixelData,
  30127. segmentIndex = operationData.segmentIndex;
  30128. var _topLeft = _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0___default()(topLeft, 2),
  30129. xMin = _topLeft[0],
  30130. yMin = _topLeft[1];
  30131. var _bottomRight = _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0___default()(bottomRight, 2),
  30132. xMax = _bottomRight[0],
  30133. yMax = _bottomRight[1];
  30134. if (insideOrOutside === 'outside') {
  30135. Object(_eraseOutsideBoundingBox__WEBPACK_IMPORTED_MODULE_1__["default"])(evt, operationData, topLeft, bottomRight);
  30136. }
  30137. for (var x = xMin; x < xMax; x++) {
  30138. for (var y = yMin; y < yMax; y++) {
  30139. var pixelIndex = y * width + x; // If the pixel is the same segmentIndex and is inside the
  30140. // Region defined by the array of points, set their value to segmentIndex.
  30141. if (Object(_isSameSegment_js__WEBPACK_IMPORTED_MODULE_2__["default"])(pixelIndex, pixelData, segmentIndex) && pointInShape({
  30142. x: x,
  30143. y: y
  30144. })) {
  30145. pixelData[pixelIndex] = 0;
  30146. }
  30147. }
  30148. }
  30149. }
  30150. /**
  30151. * Erase all pixels labeled with the activeSegmentIndex,
  30152. * inside the region defined by the shape.
  30153. * @param {Object} evt The Cornerstone event.
  30154. * @param {Object} operationData An object containing the `pixelData` to
  30155. * modify, the `segmentIndex` and the `points` array.
  30156. * @param {Object} pointInShape - A function that checks if a point, x,y is within a shape.
  30157. * @param {number[]} topLeft The top left of the bounding box.
  30158. * @param {number[]} bottomRight The bottom right of the bounding box.
  30159. * @returns {null}
  30160. */
  30161. function eraseInsideShape(evt, operationData, pointInShape, topLeft, bottomRight) {
  30162. eraseShape(evt, operationData, pointInShape, topLeft, bottomRight, 'inside');
  30163. }
  30164. /**
  30165. * Erase all pixels labeled with the activeSegmentIndex,
  30166. * outside the region defined by the shape.
  30167. * @param {Object} evt The Cornerstone event.
  30168. * @param {Object} operationData An object containing the `pixelData` to
  30169. * modify, the `segmentIndex` and the `points` array.
  30170. * @param {Object} pointInShape - A function that checks if a point, x,y is within a shape.
  30171. * @param {number[]} topLeft The top left of the bounding box.
  30172. * @param {number[]} bottomRight The bottom right of the bounding box.
  30173. * @returns {null}
  30174. */
  30175. function eraseOutsideShape(evt, operationData, pointInShape, topLeft, bottomRight) {
  30176. eraseShape(evt, operationData, function (point) {
  30177. return !pointInShape(point);
  30178. }, topLeft, bottomRight, 'outside');
  30179. }
  30180. /***/ }),
  30181. /***/ "./util/segmentation/fillOutsideBoundingBox.js":
  30182. /*!*****************************************************!*\
  30183. !*** ./util/segmentation/fillOutsideBoundingBox.js ***!
  30184. \*****************************************************/
  30185. /*! exports provided: default */
  30186. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  30187. "use strict";
  30188. __webpack_require__.r(__webpack_exports__);
  30189. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return fillOutsideBoundingBox; });
  30190. /**
  30191. * EraseInside - fill all pixels labeled with the activeSegmentIndex,
  30192. * outside the bouding box defined by the `topLeft` and `topRight`.
  30193. * @param {} evt The Cornerstone event.
  30194. * @param {} operationData An object containing the `pixelData` to
  30195. * modify, the `segmentIndex` and the `points` array.
  30196. * @param {number[]} topLeft The top left of the bounding box.
  30197. * @param {number[]} bottomRight The bottom right of the bounding box.
  30198. * @returns {null}
  30199. */
  30200. function fillOutsideBoundingBox(evt, operationData, topLeft, bottomRight) {
  30201. var pixelData = operationData.pixelData,
  30202. segmentIndex = operationData.segmentIndex;
  30203. var _evt$detail$image = evt.detail.image,
  30204. width = _evt$detail$image.width,
  30205. height = _evt$detail$image.height; // Loop until top of bounding box from top of image, color the entire row
  30206. for (var i = 0; i < width; i++) {
  30207. for (var j = 0; j < topLeft[1]; j++) {
  30208. pixelData[j * width + i] = segmentIndex;
  30209. }
  30210. } // Loop within rows of bounding box, to the left of the box
  30211. for (var _i = 0; _i < topLeft[0]; _i++) {
  30212. for (var _j = topLeft[1]; _j < bottomRight[1]; _j++) {
  30213. pixelData[_j * width + _i] = segmentIndex;
  30214. }
  30215. } // Loop within rows of bounding box, to the right of the box
  30216. for (var _i2 = bottomRight[0]; _i2 < width; _i2++) {
  30217. for (var _j2 = topLeft[1]; _j2 < bottomRight[1]; _j2++) {
  30218. pixelData[_j2 * width + _i2] = segmentIndex;
  30219. }
  30220. } // Loop from bottom of bounding box until bottom of image, color entire row
  30221. for (var _i3 = 0; _i3 < width; _i3++) {
  30222. for (var _j3 = bottomRight[1]; _j3 < height; _j3++) {
  30223. pixelData[_j3 * width + _i3] = segmentIndex;
  30224. }
  30225. }
  30226. }
  30227. /***/ }),
  30228. /***/ "./util/segmentation/fillShape.js":
  30229. /*!****************************************!*\
  30230. !*** ./util/segmentation/fillShape.js ***!
  30231. \****************************************/
  30232. /*! exports provided: fillInsideShape, fillOutsideShape */
  30233. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  30234. "use strict";
  30235. __webpack_require__.r(__webpack_exports__);
  30236. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fillInsideShape", function() { return fillInsideShape; });
  30237. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fillOutsideShape", function() { return fillOutsideShape; });
  30238. /* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/slicedToArray */ "../node_modules/@babel/runtime/helpers/slicedToArray.js");
  30239. /* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0__);
  30240. /* harmony import */ var _fillOutsideBoundingBox__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./fillOutsideBoundingBox */ "./util/segmentation/fillOutsideBoundingBox.js");
  30241. /* harmony import */ var _logger_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../logger.js */ "./util/logger.js");
  30242. var logger = Object(_logger_js__WEBPACK_IMPORTED_MODULE_2__["getLogger"])('util:segmentation:operations:helpers:fillShape');
  30243. /**
  30244. * Fill all pixels labeled with the activeSegmentIndex,
  30245. * inside/outside the region defined by the shape.
  30246. * @param {Object} evt The Cornerstone event.
  30247. * @param {Object} operationData An object containing the `pixelData` to
  30248. * modify, the `segmentIndex` and the `points` array.
  30249. * @param {Object} pointInShape - A function that checks if a point, x,y is within a shape.
  30250. * @param {number[]} topLeft The top left of the bounding box.
  30251. * @param {number[]} bottomRight The bottom right of the bounding box.
  30252. * @returns {null}
  30253. */
  30254. function fillShape(evt, operationData, pointInShape, topLeft, bottomRight) {
  30255. var insideOrOutside = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 'inside';
  30256. var pixelData = operationData.pixelData,
  30257. segmentIndex = operationData.segmentIndex;
  30258. if (pixelData === undefined || segmentIndex === undefined) {
  30259. logger.error("fillInsideShape requires operationData to contain pixelData and segmentIndex");
  30260. return;
  30261. }
  30262. var width = evt.detail.image.width;
  30263. var _topLeft = _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0___default()(topLeft, 2),
  30264. xMin = _topLeft[0],
  30265. yMin = _topLeft[1];
  30266. var _bottomRight = _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0___default()(bottomRight, 2),
  30267. xMax = _bottomRight[0],
  30268. yMax = _bottomRight[1];
  30269. if (insideOrOutside === 'outside') {
  30270. Object(_fillOutsideBoundingBox__WEBPACK_IMPORTED_MODULE_1__["default"])(evt, operationData, topLeft, bottomRight);
  30271. }
  30272. for (var x = xMin; x < xMax; x++) {
  30273. for (var y = yMin; y < yMax; y++) {
  30274. var pixelIndex = y * width + x; // If the pixel is the same segmentIndex and is inside the
  30275. // Region defined by the array of points, set their value to segmentIndex.
  30276. if (pointInShape({
  30277. x: x,
  30278. y: y
  30279. })) {
  30280. pixelData[pixelIndex] = segmentIndex;
  30281. }
  30282. }
  30283. }
  30284. }
  30285. /**
  30286. * Fill all pixels labeled with the activeSegmentIndex,
  30287. * inside the region defined by the shape.
  30288. * @param {Object} evt The Cornerstone event.
  30289. * @param {Object} operationData An object containing the `pixelData` to
  30290. * modify, the `segmentIndex` and the `points` array.
  30291. * @param {Object} pointInShape - A function that checks if a point, x,y is within a shape.
  30292. * @param {number[]} topLeft The top left of the bounding box.
  30293. * @param {number[]} bottomRight The bottom right of the bounding box.
  30294. * @returns {null}
  30295. */
  30296. function fillInsideShape(evt, operationData, pointInShape, topLeft, bottomRight) {
  30297. fillShape(evt, operationData, pointInShape, topLeft, bottomRight, 'inside');
  30298. }
  30299. /**
  30300. * Fill all pixels labeled with the activeSegmentIndex,
  30301. * outside the region defined by the shape.
  30302. * @param {Object} evt The Cornerstone event.
  30303. * @param {Object} operationData An object containing the `pixelData` to
  30304. * modify, the `segmentIndex` and the `points` array.
  30305. * @param {Object} pointInShape - A function that checks if a point, x,y is within a shape.
  30306. * @param {number[]} topLeft The top left of the bounding box.
  30307. * @param {number[]} bottomRight The bottom right of the bounding box.
  30308. * @returns {null}
  30309. */
  30310. function fillOutsideShape(evt, operationData, pointInShape, topLeft, bottomRight) {
  30311. fillShape(evt, operationData, function (point) {
  30312. return !pointInShape(point);
  30313. }, topLeft, bottomRight, 'outside');
  30314. }
  30315. /***/ }),
  30316. /***/ "./util/segmentation/floodFill.js":
  30317. /*!****************************************!*\
  30318. !*** ./util/segmentation/floodFill.js ***!
  30319. \****************************************/
  30320. /*! exports provided: default */
  30321. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  30322. "use strict";
  30323. __webpack_require__.r(__webpack_exports__);
  30324. /* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "../node_modules/@babel/runtime/helpers/toConsumableArray.js");
  30325. /* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__);
  30326. /**
  30327. * floodFill.js - Taken from MIT OSS lib - https://github.com/tuzz/n-dimensional-flood-fill
  30328. * Refactored to ES6.
  30329. *
  30330. * @param {function} getter The getter to the elements of your data structure,
  30331. * e.g. getter(x,y) for a 2D interprettation of your structure.
  30332. * @param {number[]} seed The seed for your fill. The dimensionality is infered
  30333. * by the number of dimensions of the seed.
  30334. * @param {function} [options.onFlood] An optional callback to execute when each pixel is flooded.
  30335. * e.g. onFlood(x,y).
  30336. * @param {function} [options.onBoundary] An optional callback to execute whenever a boundary is reached.
  30337. * a boundary could be another segmentIndex, or the edge of your
  30338. * data structure (i.e. when your getter returns undefined).
  30339. * @param {function} [options.equals] An optional equality method for your datastructure.
  30340. * Default is simply value1 = value2.
  30341. * @param {boolean} [options.diagonals] Whether you allow flooding through diagonals. Defaults to false.
  30342. *
  30343. * @returns {Object}
  30344. */
  30345. /* harmony default export */ __webpack_exports__["default"] = (function (getter, seed) {
  30346. var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
  30347. var onFlood = options.onFlood || function () {};
  30348. var onBoundary = options.onBoundary || function () {};
  30349. var equals = options.equals || defaultEquals;
  30350. var diagonals = options.diagonals || false;
  30351. var startNode = get(seed);
  30352. var permutations = prunedPermutations();
  30353. var stack = [];
  30354. var flooded = [];
  30355. var visits = {};
  30356. var bounds = {};
  30357. stack.push({
  30358. currentArgs: seed
  30359. });
  30360. while (stack.length > 0) {
  30361. flood(stack.pop());
  30362. }
  30363. return {
  30364. flooded: flooded,
  30365. boundaries: boundaries()
  30366. };
  30367. function flood(job) {
  30368. var getArgs = job.currentArgs;
  30369. var prevArgs = job.previousArgs;
  30370. if (visited(getArgs)) {
  30371. return;
  30372. }
  30373. markAsVisited(getArgs);
  30374. if (member(getArgs)) {
  30375. markAsFlooded(getArgs);
  30376. pushAdjacent(getArgs);
  30377. } else {
  30378. markAsBoundary(prevArgs);
  30379. }
  30380. }
  30381. function visited(key) {
  30382. return visits[key] === true;
  30383. }
  30384. function markAsVisited(key) {
  30385. visits[key] = true;
  30386. }
  30387. function member(getArgs) {
  30388. var node = safely(get, [getArgs]);
  30389. return safely(equals, [node, startNode]);
  30390. }
  30391. function markAsFlooded(getArgs) {
  30392. flooded.push(getArgs);
  30393. onFlood.apply(void 0, _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(getArgs));
  30394. }
  30395. function markAsBoundary(prevArgs) {
  30396. bounds[prevArgs] = prevArgs;
  30397. onBoundary.apply(void 0, _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(prevArgs));
  30398. }
  30399. function pushAdjacent(getArgs) {
  30400. for (var i = 0; i < permutations.length; i += 1) {
  30401. var perm = permutations[i];
  30402. var nextArgs = getArgs.slice(0);
  30403. for (var j = 0; j < getArgs.length; j += 1) {
  30404. nextArgs[j] += perm[j];
  30405. }
  30406. stack.push({
  30407. currentArgs: nextArgs,
  30408. previousArgs: getArgs
  30409. });
  30410. }
  30411. }
  30412. function get(getArgs) {
  30413. return getter.apply(void 0, _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(getArgs));
  30414. }
  30415. function safely(f, args) {
  30416. try {
  30417. return f.apply(void 0, _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(args));
  30418. } catch (error) {
  30419. return;
  30420. }
  30421. }
  30422. function prunedPermutations() {
  30423. var permutations = permute(seed.length);
  30424. return permutations.filter(function (perm) {
  30425. var count = countNonZeroes(perm);
  30426. return count !== 0 && (count === 1 || diagonals);
  30427. });
  30428. }
  30429. function permute(length) {
  30430. var perms = [];
  30431. var permutation = function permutation(string) {
  30432. return string.split('').map(function (c) {
  30433. return parseInt(c, 10) - 1;
  30434. });
  30435. };
  30436. for (var i = 0; i < Math.pow(3, length); i += 1) {
  30437. var string = lpad(i.toString(3), '0', length);
  30438. perms.push(permutation(string));
  30439. }
  30440. return perms;
  30441. }
  30442. function boundaries() {
  30443. var array = [];
  30444. for (var key in bounds) {
  30445. if (bounds.hasOwnProperty(key)) {
  30446. array.unshift(bounds[key]);
  30447. }
  30448. }
  30449. return array;
  30450. }
  30451. });
  30452. function defaultEquals(a, b) {
  30453. return a === b;
  30454. }
  30455. function countNonZeroes(array) {
  30456. var count = 0;
  30457. for (var i = 0; i < array.length; i += 1) {
  30458. if (array[i] !== 0) {
  30459. count += 1;
  30460. }
  30461. }
  30462. return count;
  30463. }
  30464. function lpad(string, character, length) {
  30465. var array = new Array(length + 1);
  30466. var pad = array.join(character);
  30467. return (pad + string).slice(-length);
  30468. }
  30469. /***/ }),
  30470. /***/ "./util/segmentation/getBoundingBoxAroundCircle.js":
  30471. /*!*********************************************************!*\
  30472. !*** ./util/segmentation/getBoundingBoxAroundCircle.js ***!
  30473. \*********************************************************/
  30474. /*! exports provided: default */
  30475. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  30476. "use strict";
  30477. __webpack_require__.r(__webpack_exports__);
  30478. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getBoundingBoxAroundCircle; });
  30479. /* harmony import */ var _getCircleCoords__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../getCircleCoords */ "./util/getCircleCoords.js");
  30480. function getBoundingBoxAroundCircle(evt) {
  30481. var handles = evt.detail.handles;
  30482. var _evt$detail$image = evt.detail.image,
  30483. imageWidth = _evt$detail$image.width,
  30484. imageHeight = _evt$detail$image.height;
  30485. var circleCoordinates = Object(_getCircleCoords__WEBPACK_IMPORTED_MODULE_0__["default"])(handles.start, handles.end);
  30486. var xMax = circleCoordinates.width + circleCoordinates.left;
  30487. var xMin = circleCoordinates.left;
  30488. var yMax = circleCoordinates.top + circleCoordinates.height;
  30489. var yMin = circleCoordinates.top;
  30490. xMin = Math.floor(xMin);
  30491. yMin = Math.floor(yMin);
  30492. xMax = Math.floor(xMax);
  30493. yMax = Math.floor(yMax);
  30494. xMax = Math.min(imageWidth, xMax);
  30495. xMin = Math.max(0, xMin);
  30496. yMax = Math.min(imageHeight, yMax);
  30497. yMin = Math.max(0, yMin);
  30498. return [[xMin, yMin], [xMax, yMax]];
  30499. }
  30500. /***/ }),
  30501. /***/ "./util/segmentation/getBoundingBoxAroundPolygon.js":
  30502. /*!**********************************************************!*\
  30503. !*** ./util/segmentation/getBoundingBoxAroundPolygon.js ***!
  30504. \**********************************************************/
  30505. /*! exports provided: default */
  30506. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  30507. "use strict";
  30508. __webpack_require__.r(__webpack_exports__);
  30509. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getBoundingBoxAroundPolygon; });
  30510. function getBoundingBoxAroundPolygon(vertices, image) {
  30511. var xMin = Infinity;
  30512. var xMax = 0;
  30513. var yMin = Infinity;
  30514. var yMax = 0;
  30515. var width = image.width,
  30516. height = image.height;
  30517. vertices.forEach(function (v) {
  30518. xMin = Math.min(v[0], xMin);
  30519. xMax = Math.max(v[0], xMax);
  30520. yMin = Math.min(v[1], yMin);
  30521. yMax = Math.max(v[1], yMax);
  30522. });
  30523. xMin = Math.floor(xMin);
  30524. yMin = Math.floor(yMin);
  30525. xMax = Math.floor(xMax);
  30526. yMax = Math.floor(yMax);
  30527. xMax = Math.min(width, xMax);
  30528. xMin = Math.max(0, xMin);
  30529. yMax = Math.min(height, yMax);
  30530. yMin = Math.max(0, yMin);
  30531. return [[xMin, yMin], [xMax, yMax]];
  30532. }
  30533. /***/ }),
  30534. /***/ "./util/segmentation/getCircle.js":
  30535. /*!****************************************!*\
  30536. !*** ./util/segmentation/getCircle.js ***!
  30537. \****************************************/
  30538. /*! exports provided: default */
  30539. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  30540. "use strict";
  30541. __webpack_require__.r(__webpack_exports__);
  30542. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getCircle; });
  30543. /**
  30544. * Gets the pixels within the circle.
  30545. * @export @public @method
  30546. * @name getCircle
  30547. *
  30548. * @param {number} radius The radius of the circle.
  30549. * @param {number} rows The number of rows.
  30550. * @param {number} columns The number of columns.
  30551. * @param {number} [xCoord = 0] The x-location of the center of the circle.
  30552. * @param {number} [yCoord = 0] The y-location of the center of the circle.
  30553. * @returns {Array.number[]} Array of pixels contained within the circle.
  30554. */
  30555. function getCircle(radius, rows, columns) {
  30556. var xCoord = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
  30557. var yCoord = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0;
  30558. var x0 = Math.floor(xCoord);
  30559. var y0 = Math.floor(yCoord);
  30560. if (radius === 1) {
  30561. return [[x0, y0]];
  30562. }
  30563. var circleArray = [];
  30564. var index = 0;
  30565. for (var y = -radius; y <= radius; y++) {
  30566. var _yCoord = y0 + y;
  30567. if (_yCoord > rows || _yCoord < 0) {
  30568. continue;
  30569. }
  30570. for (var x = -radius; x <= radius; x++) {
  30571. var _xCoord = x0 + x;
  30572. if (_xCoord >= columns || _xCoord < 0) {
  30573. continue;
  30574. }
  30575. if (x * x + y * y < radius * radius) {
  30576. circleArray[index++] = [x0 + x, y0 + y];
  30577. }
  30578. }
  30579. }
  30580. return circleArray;
  30581. }
  30582. /***/ }),
  30583. /***/ "./util/segmentation/getDiffBetweenPixelData.js":
  30584. /*!******************************************************!*\
  30585. !*** ./util/segmentation/getDiffBetweenPixelData.js ***!
  30586. \******************************************************/
  30587. /*! exports provided: default */
  30588. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  30589. "use strict";
  30590. __webpack_require__.r(__webpack_exports__);
  30591. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getDiffBetweenPixelData; });
  30592. function getDiffBetweenPixelData(previousPixelData, newPixelData) {
  30593. var diff = [];
  30594. for (var i = 0; i < previousPixelData.length; i++) {
  30595. if (previousPixelData[i] !== newPixelData[i]) {
  30596. diff.push([i, previousPixelData[i], newPixelData[i]]);
  30597. }
  30598. }
  30599. return diff;
  30600. }
  30601. /***/ }),
  30602. /***/ "./util/segmentation/getPixelPathBetweenPixels.js":
  30603. /*!********************************************************!*\
  30604. !*** ./util/segmentation/getPixelPathBetweenPixels.js ***!
  30605. \********************************************************/
  30606. /*! exports provided: default */
  30607. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  30608. "use strict";
  30609. __webpack_require__.r(__webpack_exports__);
  30610. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../externalModules.js */ "./externalModules.js");
  30611. var oneOverRoot2 = 1 / Math.sqrt(2); // Cache this to avoid repeated computation.
  30612. var DIRECTIONS = {
  30613. up: {
  30614. x: 0,
  30615. y: 1
  30616. },
  30617. upRight: {
  30618. x: oneOverRoot2,
  30619. y: oneOverRoot2
  30620. },
  30621. right: {
  30622. x: 1,
  30623. y: 0
  30624. },
  30625. downRight: {
  30626. x: oneOverRoot2,
  30627. y: -oneOverRoot2
  30628. },
  30629. down: {
  30630. x: 0,
  30631. y: 1
  30632. },
  30633. downLeft: {
  30634. x: -oneOverRoot2,
  30635. y: -oneOverRoot2
  30636. },
  30637. left: {
  30638. x: -1,
  30639. y: 0
  30640. },
  30641. upLeft: {
  30642. x: -oneOverRoot2,
  30643. y: oneOverRoot2
  30644. }
  30645. };
  30646. /**
  30647. * GetPixelPathBetweenPixels - Generates a 1-pixel wide path of pixels between two pixels.
  30648. * This is essentially simplified A* pathfinding, as we know there are no "obstacles".
  30649. *
  30650. * @param {Object} p1 The starting pixel
  30651. * @param {Object} p2 The end pixel.
  30652. *
  30653. * @returns {Object[]} All of the pixels on the shortest path between p1 and p2.
  30654. */
  30655. /* harmony default export */ __webpack_exports__["default"] = (function (p1, p2) {
  30656. var p = {
  30657. x: p1.x,
  30658. y: p1.y
  30659. };
  30660. var path = [];
  30661. while (p2.x !== p.x || p2.y !== p.y) {
  30662. if (p2.x === p.x) {
  30663. // Goal is above or bellow us.
  30664. if (p2.y > p.y) {
  30665. p.y++;
  30666. } else {
  30667. p.y--;
  30668. }
  30669. } else if (p2.y === p.y) {
  30670. // Goal is to the left or right of us.
  30671. if (p2.x > p.x) {
  30672. p.x++;
  30673. } else {
  30674. p.x--;
  30675. }
  30676. } else if (p2.y > p.y) {
  30677. if (p2.x > p.x) {
  30678. // Can go up, right or diagonally up-right towards goal.
  30679. moveUpRight(p, p2);
  30680. } else {
  30681. // Can go up, left, or diagonally up-left towards goal.
  30682. moveUpLeft(p, p2);
  30683. }
  30684. } else if (p2.x > p.x) {
  30685. // Can go down, right, or diagonally down-right towards goal.
  30686. moveDownRight(p, p2);
  30687. } else {
  30688. // Can go down, left, or diagonally down-left towards goal.
  30689. moveDownLeft(p, p2);
  30690. }
  30691. path.push({
  30692. x: p.x,
  30693. y: p.y
  30694. });
  30695. }
  30696. path.pop(); // Remove last node as is the same as the destination.
  30697. return path;
  30698. });
  30699. /**
  30700. * MoveUpRight - Moves p up, right or diagonally up right towards p2.
  30701. * @param {Object} p
  30702. * @param {Object} p2
  30703. *
  30704. * @returns {null}
  30705. */
  30706. function moveUpRight(p, p2) {
  30707. var unitVector = unitVectorFromPtoP2(p, p2); // Largest dot product is fastest way to travel.
  30708. var dotProducts = [dotProduct2D(unitVector, DIRECTIONS.up), dotProduct2D(unitVector, DIRECTIONS.right), dotProduct2D(unitVector, DIRECTIONS.upRight)];
  30709. var largestIndex = getIndexOfLargestInLengthThreeArray(dotProducts);
  30710. switch (largestIndex) {
  30711. case 0:
  30712. p.y++;
  30713. break;
  30714. case 1:
  30715. p.x++;
  30716. break;
  30717. case 2:
  30718. p.y++;
  30719. p.x++;
  30720. }
  30721. }
  30722. /**
  30723. * MoveUpLeft - Moves p up, left or diagonally up left towards p2.
  30724. * @param {Object} p
  30725. * @param {Object} p2
  30726. *
  30727. * @returns {null}
  30728. */
  30729. function moveUpLeft(p, p2) {
  30730. var unitVector = unitVectorFromPtoP2(p, p2); // Largest dot product is fastest way to travel.
  30731. var dotProducts = [dotProduct2D(unitVector, DIRECTIONS.up), dotProduct2D(unitVector, DIRECTIONS.left), dotProduct2D(unitVector, DIRECTIONS.upLeft)];
  30732. var largestIndex = getIndexOfLargestInLengthThreeArray(dotProducts);
  30733. switch (largestIndex) {
  30734. case 0:
  30735. p.y++;
  30736. break;
  30737. case 1:
  30738. p.x--;
  30739. break;
  30740. case 2:
  30741. p.y++;
  30742. p.x--;
  30743. }
  30744. }
  30745. /**
  30746. * MoveDownRight - Moves p down, right or diagonally down right towards p2.
  30747. * @param {Object} p
  30748. * @param {Object} p2
  30749. *
  30750. * @returns {null}
  30751. */
  30752. function moveDownRight(p, p2) {
  30753. var unitVector = unitVectorFromPtoP2(p, p2); // Largest dot product is fastest way to travel.
  30754. var dotProducts = [dotProduct2D(unitVector, DIRECTIONS.down), dotProduct2D(unitVector, DIRECTIONS.right), dotProduct2D(unitVector, DIRECTIONS.downRight)];
  30755. var largestIndex = getIndexOfLargestInLengthThreeArray(dotProducts);
  30756. switch (largestIndex) {
  30757. case 0:
  30758. p.y--;
  30759. break;
  30760. case 1:
  30761. p.x++;
  30762. break;
  30763. case 2:
  30764. p.y--;
  30765. p.x++;
  30766. }
  30767. }
  30768. /**
  30769. * MoveDownLeft - Moves p down, left or diagonally down left towards p2.
  30770. * @param {Object} p
  30771. * @param {Object} p2
  30772. *
  30773. * @returns {null}
  30774. */
  30775. function moveDownLeft(p, p2) {
  30776. var unitVector = unitVectorFromPtoP2(p, p2); // Largest dot product is fastest way to travel.
  30777. var dotProducts = [dotProduct2D(unitVector, DIRECTIONS.down), dotProduct2D(unitVector, DIRECTIONS.left), dotProduct2D(unitVector, DIRECTIONS.downLeft)];
  30778. var largestIndex = getIndexOfLargestInLengthThreeArray(dotProducts);
  30779. switch (largestIndex) {
  30780. case 0:
  30781. p.y--;
  30782. break;
  30783. case 1:
  30784. p.x--;
  30785. break;
  30786. case 2:
  30787. p.y--;
  30788. p.x--;
  30789. }
  30790. }
  30791. /**
  30792. * UnitVectorFromPtoP2 - Returns a unit vector pointing from p to p2.
  30793. * @param {Object} p
  30794. * @param {Object} p2
  30795. *
  30796. * @returns {Object} The unit vector.
  30797. */
  30798. function unitVectorFromPtoP2(p, p2) {
  30799. var distance = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.point.distance(p, p2);
  30800. return {
  30801. x: (p2.x - p.x) / distance,
  30802. y: (p2.y - p.y) / distance
  30803. };
  30804. }
  30805. function dotProduct2D(p, p2) {
  30806. return p.x * p2.x + p.y * p2.y;
  30807. }
  30808. /**
  30809. * GetIndexOfLargestInLengthThreeArray - Returns the index of the largest value
  30810. * in the 3 element array.
  30811. * @param {number[]} array
  30812. * @returns {number}
  30813. */
  30814. function getIndexOfLargestInLengthThreeArray(array) {
  30815. var largestIndex = array[0] > array[1] ? 0 : 1;
  30816. if (array[2] > array[largestIndex]) {
  30817. largestIndex = 2;
  30818. }
  30819. return largestIndex;
  30820. }
  30821. /***/ }),
  30822. /***/ "./util/segmentation/index.js":
  30823. /*!************************************!*\
  30824. !*** ./util/segmentation/index.js ***!
  30825. \************************************/
  30826. /*! exports provided: drawBrushPixels, eraseIfSegmentIndex, eraseOutsideBoundingBox, eraseInsideShape, eraseOutsideShape, fillOutsideBoundingBox, fillInsideShape, fillOutsideShape, floodFill, getBoundingBoxAroundCircle, getBoundingBoxAroundPolygon, getCircle, getPixelPathBetweenPixels, isSameSegment, triggerLabelmapModifiedEvent, getDiffBetweenPixelData */
  30827. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  30828. "use strict";
  30829. __webpack_require__.r(__webpack_exports__);
  30830. /* harmony import */ var _drawBrush__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./drawBrush */ "./util/segmentation/drawBrush.js");
  30831. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "drawBrushPixels", function() { return _drawBrush__WEBPACK_IMPORTED_MODULE_0__["drawBrushPixels"]; });
  30832. /* harmony import */ var _eraseIfSegmentIndex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./eraseIfSegmentIndex */ "./util/segmentation/eraseIfSegmentIndex.js");
  30833. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "eraseIfSegmentIndex", function() { return _eraseIfSegmentIndex__WEBPACK_IMPORTED_MODULE_1__["default"]; });
  30834. /* harmony import */ var _eraseOutsideBoundingBox__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./eraseOutsideBoundingBox */ "./util/segmentation/eraseOutsideBoundingBox.js");
  30835. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "eraseOutsideBoundingBox", function() { return _eraseOutsideBoundingBox__WEBPACK_IMPORTED_MODULE_2__["default"]; });
  30836. /* harmony import */ var _eraseShape__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./eraseShape */ "./util/segmentation/eraseShape.js");
  30837. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "eraseInsideShape", function() { return _eraseShape__WEBPACK_IMPORTED_MODULE_3__["eraseInsideShape"]; });
  30838. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "eraseOutsideShape", function() { return _eraseShape__WEBPACK_IMPORTED_MODULE_3__["eraseOutsideShape"]; });
  30839. /* harmony import */ var _fillOutsideBoundingBox__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./fillOutsideBoundingBox */ "./util/segmentation/fillOutsideBoundingBox.js");
  30840. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "fillOutsideBoundingBox", function() { return _fillOutsideBoundingBox__WEBPACK_IMPORTED_MODULE_4__["default"]; });
  30841. /* harmony import */ var _fillShape__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./fillShape */ "./util/segmentation/fillShape.js");
  30842. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "fillInsideShape", function() { return _fillShape__WEBPACK_IMPORTED_MODULE_5__["fillInsideShape"]; });
  30843. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "fillOutsideShape", function() { return _fillShape__WEBPACK_IMPORTED_MODULE_5__["fillOutsideShape"]; });
  30844. /* harmony import */ var _floodFill__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./floodFill */ "./util/segmentation/floodFill.js");
  30845. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "floodFill", function() { return _floodFill__WEBPACK_IMPORTED_MODULE_6__["default"]; });
  30846. /* harmony import */ var _getBoundingBoxAroundCircle__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./getBoundingBoxAroundCircle */ "./util/segmentation/getBoundingBoxAroundCircle.js");
  30847. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getBoundingBoxAroundCircle", function() { return _getBoundingBoxAroundCircle__WEBPACK_IMPORTED_MODULE_7__["default"]; });
  30848. /* harmony import */ var _getBoundingBoxAroundPolygon__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./getBoundingBoxAroundPolygon */ "./util/segmentation/getBoundingBoxAroundPolygon.js");
  30849. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getBoundingBoxAroundPolygon", function() { return _getBoundingBoxAroundPolygon__WEBPACK_IMPORTED_MODULE_8__["default"]; });
  30850. /* harmony import */ var _getCircle__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./getCircle */ "./util/segmentation/getCircle.js");
  30851. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getCircle", function() { return _getCircle__WEBPACK_IMPORTED_MODULE_9__["default"]; });
  30852. /* harmony import */ var _getPixelPathBetweenPixels__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./getPixelPathBetweenPixels */ "./util/segmentation/getPixelPathBetweenPixels.js");
  30853. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getPixelPathBetweenPixels", function() { return _getPixelPathBetweenPixels__WEBPACK_IMPORTED_MODULE_10__["default"]; });
  30854. /* harmony import */ var _isSameSegment__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./isSameSegment */ "./util/segmentation/isSameSegment.js");
  30855. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isSameSegment", function() { return _isSameSegment__WEBPACK_IMPORTED_MODULE_11__["default"]; });
  30856. /* harmony import */ var _triggerLabelmapModifiedEvent__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./triggerLabelmapModifiedEvent */ "./util/segmentation/triggerLabelmapModifiedEvent.js");
  30857. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "triggerLabelmapModifiedEvent", function() { return _triggerLabelmapModifiedEvent__WEBPACK_IMPORTED_MODULE_12__["default"]; });
  30858. /* harmony import */ var _getDiffBetweenPixelData__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./getDiffBetweenPixelData */ "./util/segmentation/getDiffBetweenPixelData.js");
  30859. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getDiffBetweenPixelData", function() { return _getDiffBetweenPixelData__WEBPACK_IMPORTED_MODULE_13__["default"]; });
  30860. /***/ }),
  30861. /***/ "./util/segmentation/isSameSegment.js":
  30862. /*!********************************************!*\
  30863. !*** ./util/segmentation/isSameSegment.js ***!
  30864. \********************************************/
  30865. /*! exports provided: default */
  30866. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  30867. "use strict";
  30868. __webpack_require__.r(__webpack_exports__);
  30869. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return isSameSegment; });
  30870. /**
  30871. * Returns true if the pixelIndex of pixelData is the same as the segmentIndex.
  30872. *
  30873. * @param {number} pixelIndex The index of the pixel.
  30874. * @param {UInt16Array} pixelData The pixelData array.
  30875. * @param {number} segmentIndex The segment Index to erase.
  30876. *
  30877. * @returns {boolean}
  30878. */
  30879. function isSameSegment(pixelIndex, pixelData, segmentIndex) {
  30880. return pixelData[pixelIndex] === segmentIndex;
  30881. }
  30882. /***/ }),
  30883. /***/ "./util/segmentation/triggerLabelmapModifiedEvent.js":
  30884. /*!***********************************************************!*\
  30885. !*** ./util/segmentation/triggerLabelmapModifiedEvent.js ***!
  30886. \***********************************************************/
  30887. /*! exports provided: default */
  30888. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  30889. "use strict";
  30890. __webpack_require__.r(__webpack_exports__);
  30891. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return triggerLabelmapModifiedEvent; });
  30892. /* harmony import */ var _externalModules__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../externalModules */ "./externalModules.js");
  30893. /* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../events.js */ "./events.js");
  30894. /* harmony import */ var _store__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../store */ "./store/index.js");
  30895. /**
  30896. * Triggers the LABELMAP_MODIFIED event for the active element, providing the labelmapIndex that was modified.
  30897. *
  30898. * @param {HTMLElement} element
  30899. * @param {number} labelmapIndex The labelmapIndex. Defaults to the active for that element if not set.
  30900. */
  30901. function triggerLabelmapModifiedEvent(element, labelmapIndex) {
  30902. var _getModule = Object(_store__WEBPACK_IMPORTED_MODULE_2__["getModule"])('segmentation'),
  30903. getters = _getModule.getters;
  30904. labelmapIndex = labelmapIndex === undefined ? getters.activeLabelmapIndex(element) : labelmapIndex;
  30905. _externalModules__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.triggerEvent(element, _events_js__WEBPACK_IMPORTED_MODULE_1__["default"].LABELMAP_MODIFIED, {
  30906. labelmapIndex: labelmapIndex
  30907. });
  30908. }
  30909. /***/ }),
  30910. /***/ "./util/setContextToDisplayFontSize.js":
  30911. /*!*********************************************!*\
  30912. !*** ./util/setContextToDisplayFontSize.js ***!
  30913. \*********************************************/
  30914. /*! exports provided: default */
  30915. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  30916. "use strict";
  30917. __webpack_require__.r(__webpack_exports__);
  30918. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js");
  30919. /**
  30920. * Sets the canvas context transformation matrix so it is scaled to show text
  30921. * more cleanly even if the image is scaled up. See
  30922. * https://github.com/cornerstonejs/cornerstoneTools/wiki/DrawingText
  30923. * for more information
  30924. * @export @public @function
  30925. * @name setContextToDisplayFontSize
  30926. *
  30927. * @param {HTMLElement} enabledElement The cornerstone enabled element.
  30928. * @param {CanvasRenderingContext2D} context The canvas context.
  30929. * @param {number} fontSize The font size.
  30930. * @returns {Object} {fontSize: number, lineHeight: number, fontScale: number}
  30931. */
  30932. /* harmony default export */ __webpack_exports__["default"] = (function (enabledElement, context, fontSize) {
  30933. var fontScale = 0.1;
  30934. _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.setToPixelCoordinateSystem(enabledElement, context, fontScale); // Return the font size to use
  30935. var scaledFontSize = fontSize / enabledElement.viewport.scale / fontScale; // TODO: actually calculate this?
  30936. var lineHeight = fontSize / enabledElement.viewport.scale / fontScale;
  30937. return {
  30938. fontSize: scaledFontSize,
  30939. lineHeight: lineHeight,
  30940. fontScale: fontScale
  30941. };
  30942. });
  30943. /***/ }),
  30944. /***/ "./util/throttle.js":
  30945. /*!**************************!*\
  30946. !*** ./util/throttle.js ***!
  30947. \**************************/
  30948. /*! exports provided: default */
  30949. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  30950. "use strict";
  30951. __webpack_require__.r(__webpack_exports__);
  30952. /* harmony import */ var _debounce_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./debounce.js */ "./util/debounce.js");
  30953. /* harmony import */ var _isObject_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./isObject.js */ "./util/isObject.js");
  30954. /**
  30955. * Creates a throttled function that only invokes `func` at most once per
  30956. * every `wait` milliseconds (or once per browser frame). The throttled function
  30957. * comes with a `cancel` method to cancel delayed `func` invocations and a
  30958. * `flush` method to immediately invoke them. Provide `options` to indicate
  30959. * whether `func` should be invoked on the leading and/or trailing edge of the
  30960. * `wait` timeout. The `func` is invoked with the last arguments provided to the
  30961. * throttled function. Subsequent calls to the throttled function return the
  30962. * result of the last `func` invocation.
  30963. *
  30964. * **Note:** If `leading` and `trailing` options are `true`, `func` is
  30965. * invoked on the trailing edge of the timeout only if the throttled function
  30966. * is invoked more than once during the `wait` timeout.
  30967. *
  30968. * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
  30969. * until the next tick, similar to `setTimeout` with a timeout of `0`.
  30970. *
  30971. * If `wait` is omitted in an environment with `requestAnimationFrame`, `func`
  30972. * invocation will be deferred until the next frame is drawn (typically about
  30973. * 16ms).
  30974. *
  30975. * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
  30976. * for details over the differences between `throttle` and `debounce`.
  30977. *
  30978. * @since 0.1.0
  30979. * @category Function
  30980. * @param {Function} func The function to throttle.
  30981. * @param {number} [wait=0]
  30982. * The number of milliseconds to throttle invocations to; if omitted,
  30983. * `requestAnimationFrame` is used (if available).
  30984. * @param {Object} [options={}] The options object.
  30985. * @param {boolean} [options.leading=true]
  30986. * Specify invoking on the leading edge of the timeout.
  30987. * @param {boolean} [options.trailing=true]
  30988. * Specify invoking on the trailing edge of the timeout.
  30989. * @returns {Function} Returns the new throttled function.
  30990. * @example
  30991. *
  30992. * // Avoid excessively updating the position while scrolling.
  30993. * jQuery(window).on('scroll', throttle(updatePosition, 100))
  30994. *
  30995. * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
  30996. * const throttled = throttle(renewToken, 300000, { 'trailing': false })
  30997. * jQuery(element).on('click', throttled)
  30998. *
  30999. * // Cancel the trailing throttled invocation.
  31000. * jQuery(window).on('popstate', throttled.cancel)
  31001. */
  31002. function throttle(func, wait, options) {
  31003. var leading = true;
  31004. var trailing = true;
  31005. if (typeof func !== 'function') {
  31006. throw new TypeError('Expected a function');
  31007. }
  31008. if (Object(_isObject_js__WEBPACK_IMPORTED_MODULE_1__["default"])(options)) {
  31009. leading = 'leading' in options ? Boolean(options.leading) : leading;
  31010. trailing = 'trailing' in options ? Boolean(options.trailing) : trailing;
  31011. }
  31012. return Object(_debounce_js__WEBPACK_IMPORTED_MODULE_0__["default"])(func, wait, {
  31013. leading: leading,
  31014. trailing: trailing,
  31015. maxWait: wait
  31016. });
  31017. }
  31018. /* harmony default export */ __webpack_exports__["default"] = (throttle);
  31019. /***/ }),
  31020. /***/ "./util/triggerEvent.js":
  31021. /*!******************************!*\
  31022. !*** ./util/triggerEvent.js ***!
  31023. \******************************/
  31024. /*! exports provided: default */
  31025. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  31026. "use strict";
  31027. __webpack_require__.r(__webpack_exports__);
  31028. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return triggerEvent; });
  31029. /**
  31030. * Triggers a CustomEvent.
  31031. * @public
  31032. * @method triggerEvent
  31033. *
  31034. * @param {EventTarget} el The element or EventTarget to trigger the event upon.
  31035. * @param {String} type The event type name.
  31036. * @param {Object|null} [detail=null] The event data to be sent.
  31037. * @returns {Boolean} The return value is false if at least one event listener called preventDefault(). Otherwise it returns true.
  31038. */
  31039. function triggerEvent(el, type) {
  31040. var detail = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
  31041. var event; // This check is needed to polyfill CustomEvent on IE11-
  31042. if (typeof window.CustomEvent === 'function') {
  31043. event = new CustomEvent(type, {
  31044. detail: detail,
  31045. cancelable: true
  31046. });
  31047. } else {
  31048. event = document.createEvent('CustomEvent');
  31049. event.initCustomEvent(type, true, true, detail);
  31050. }
  31051. return el.dispatchEvent(event);
  31052. }
  31053. /***/ }),
  31054. /***/ "./util/uuidv4.js":
  31055. /*!************************!*\
  31056. !*** ./util/uuidv4.js ***!
  31057. \************************/
  31058. /*! exports provided: default */
  31059. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  31060. "use strict";
  31061. __webpack_require__.r(__webpack_exports__);
  31062. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return uuidv4; });
  31063. function uuidv4() {
  31064. return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
  31065. var r = Math.random() * 16 | 0; // eslint-disable-line no-bitwise
  31066. var v = c === 'x' ? r : r & 0x3 | 0x8; // eslint-disable-line no-bitwise
  31067. return v.toString(16);
  31068. });
  31069. }
  31070. /***/ }),
  31071. /***/ "./util/wait.js":
  31072. /*!**********************!*\
  31073. !*** ./util/wait.js ***!
  31074. \**********************/
  31075. /*! exports provided: wait, waitForEnabledElementImageToLoad, default */
  31076. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  31077. "use strict";
  31078. __webpack_require__.r(__webpack_exports__);
  31079. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "wait", function() { return wait; });
  31080. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "waitForEnabledElementImageToLoad", function() { return waitForEnabledElementImageToLoad; });
  31081. /* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js");
  31082. /**
  31083. * Waits a set amount of time, then resolves. Can be chained off of to delay
  31084. * next call in promise chain.
  31085. * @public
  31086. * @function wait
  31087. * @param {number} ms - number in ms to wait
  31088. * @returns {Promise} - A promise that resolves when setTimeout elapses
  31089. */
  31090. var wait = function wait(ms) {
  31091. return new Promise(function (resolve) {
  31092. return setTimeout(resolve, ms);
  31093. });
  31094. };
  31095. /**
  31096. * A promise that returns an EnabledElement who's image has loaded, or
  31097. * null if the provided element ceases being an enabledElement before an
  31098. * image has been loaded.
  31099. * @public
  31100. * @function waitForEnabledElementImageToLoad
  31101. *
  31102. * @param {HTMLElement} element - An element that is an EnabledElement
  31103. * @returns {EnabledElement} - The enabled element that has loaded an image
  31104. */
  31105. function waitForEnabledElementImageToLoad(element) {
  31106. try {
  31107. var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.getEnabledElement(element);
  31108. if (!enabledElement.image) {
  31109. return wait(250).then(function () {
  31110. return waitForEnabledElementImageToLoad(element);
  31111. });
  31112. } // EnabledElement's image is loaded.
  31113. return enabledElement;
  31114. } catch (ex) {
  31115. // Is no longer, or never was an enabled element, stop polling
  31116. return null;
  31117. }
  31118. }
  31119. /* harmony default export */ __webpack_exports__["default"] = (wait);
  31120. /***/ }),
  31121. /***/ "./util/zoom/changeViewportScale.js":
  31122. /*!******************************************!*\
  31123. !*** ./util/zoom/changeViewportScale.js ***!
  31124. \******************************************/
  31125. /*! exports provided: default */
  31126. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  31127. "use strict";
  31128. __webpack_require__.r(__webpack_exports__);
  31129. /**
  31130. * Changes the scale of the viewport.
  31131. *
  31132. * @private
  31133. * @function changeViewportScale
  31134. *
  31135. * @param {Object} viewport The viewport to scale.
  31136. * @param {number} ticks The change in magnifcation factor.
  31137. * @param {Object} scaleLimits The limits in scale.
  31138. * @returns {Object} The scaled viewport.
  31139. */
  31140. /* harmony default export */ __webpack_exports__["default"] = (function (viewport, ticks, scaleLimits) {
  31141. var maxScale = scaleLimits.maxScale,
  31142. minScale = scaleLimits.minScale;
  31143. var pow = 1.7;
  31144. var oldFactor = Math.log(viewport.scale) / Math.log(pow);
  31145. var factor = oldFactor + ticks;
  31146. var scale = Math.pow(pow, factor);
  31147. if (maxScale && scale > maxScale) {
  31148. viewport.scale = maxScale;
  31149. } else if (minScale && scale < minScale) {
  31150. viewport.scale = minScale;
  31151. } else {
  31152. viewport.scale = scale;
  31153. }
  31154. return viewport;
  31155. });
  31156. /***/ }),
  31157. /***/ "./util/zoom/correctShift.js":
  31158. /*!***********************************!*\
  31159. !*** ./util/zoom/correctShift.js ***!
  31160. \***********************************/
  31161. /*! exports provided: default */
  31162. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  31163. "use strict";
  31164. __webpack_require__.r(__webpack_exports__);
  31165. /**
  31166. * Corrects the shift by accountoing for viewport rotation and flips.
  31167. * @export @public @method
  31168. * @name correctShift
  31169. *
  31170. * @param {Object} shift The shift to correct.
  31171. * @param {Object} viewportOrientation Object containing information on the viewport orientation.
  31172. * @returns {Object} The corrected shift.
  31173. */
  31174. /* harmony default export */ __webpack_exports__["default"] = (function (shift, viewportOrientation) {
  31175. var hflip = viewportOrientation.hflip,
  31176. vflip = viewportOrientation.vflip,
  31177. rotation = viewportOrientation.rotation; // Apply Flips
  31178. shift.x *= hflip ? -1 : 1;
  31179. shift.y *= vflip ? -1 : 1; // Apply rotations
  31180. if (rotation !== 0) {
  31181. var angle = rotation * Math.PI / 180;
  31182. var cosA = Math.cos(angle);
  31183. var sinA = Math.sin(angle);
  31184. var newX = shift.x * cosA - shift.y * sinA;
  31185. var newY = shift.x * sinA + shift.y * cosA;
  31186. shift.x = newX;
  31187. shift.y = newY;
  31188. }
  31189. return shift;
  31190. });
  31191. /***/ }),
  31192. /***/ "./util/zoom/index.js":
  31193. /*!****************************!*\
  31194. !*** ./util/zoom/index.js ***!
  31195. \****************************/
  31196. /*! exports provided: changeViewportScale, correctShift, default */
  31197. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  31198. "use strict";
  31199. __webpack_require__.r(__webpack_exports__);
  31200. /* harmony import */ var _changeViewportScale_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./changeViewportScale.js */ "./util/zoom/changeViewportScale.js");
  31201. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "changeViewportScale", function() { return _changeViewportScale_js__WEBPACK_IMPORTED_MODULE_0__["default"]; });
  31202. /* harmony import */ var _correctShift_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./correctShift.js */ "./util/zoom/correctShift.js");
  31203. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "correctShift", function() { return _correctShift_js__WEBPACK_IMPORTED_MODULE_1__["default"]; });
  31204. // Named
  31205. // Default
  31206. /* harmony default export */ __webpack_exports__["default"] = ({
  31207. changeViewportScale: _changeViewportScale_js__WEBPACK_IMPORTED_MODULE_0__["default"],
  31208. correctShift: _correctShift_js__WEBPACK_IMPORTED_MODULE_1__["default"]
  31209. });
  31210. /***/ }),
  31211. /***/ "./version.js":
  31212. /*!********************!*\
  31213. !*** ./version.js ***!
  31214. \********************/
  31215. /*! exports provided: default */
  31216. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  31217. "use strict";
  31218. __webpack_require__.r(__webpack_exports__);
  31219. /* harmony default export */ __webpack_exports__["default"] = ('6.0.9');
  31220. /***/ })
  31221. /******/ });
  31222. });
  31223. //# sourceMappingURL=cornerstoneTools.js.map