cornerstone.js 391 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084
  1. /*! cornerstone-core - 2.6.1 - 2021-11-19 | (c) 2016 Chris Hafey | https://github.com/cornerstonejs/cornerstone */
  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-core", [], factory);
  7. else if(typeof exports === 'object')
  8. exports["cornerstone-core"] = factory();
  9. else
  10. root["cornerstone"] = 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 head = document.getElementsByTagName("head")[0];
  26. /******/ var script = document.createElement("script");
  27. /******/ script.charset = "utf-8";
  28. /******/ script.src = __webpack_require__.p + "" + chunkId + "." + hotCurrentHash + ".hot-update.js";
  29. /******/ ;
  30. /******/ head.appendChild(script);
  31. /******/ }
  32. /******/
  33. /******/ // eslint-disable-next-line no-unused-vars
  34. /******/ function hotDownloadManifest(requestTimeout) {
  35. /******/ requestTimeout = requestTimeout || 10000;
  36. /******/ return new Promise(function(resolve, reject) {
  37. /******/ if (typeof XMLHttpRequest === "undefined") {
  38. /******/ return reject(new Error("No browser support"));
  39. /******/ }
  40. /******/ try {
  41. /******/ var request = new XMLHttpRequest();
  42. /******/ var requestPath = __webpack_require__.p + "" + hotCurrentHash + ".hot-update.json";
  43. /******/ request.open("GET", requestPath, true);
  44. /******/ request.timeout = requestTimeout;
  45. /******/ request.send(null);
  46. /******/ } catch (err) {
  47. /******/ return reject(err);
  48. /******/ }
  49. /******/ request.onreadystatechange = function() {
  50. /******/ if (request.readyState !== 4) return;
  51. /******/ if (request.status === 0) {
  52. /******/ // timeout
  53. /******/ reject(
  54. /******/ new Error("Manifest request to " + requestPath + " timed out.")
  55. /******/ );
  56. /******/ } else if (request.status === 404) {
  57. /******/ // no update available
  58. /******/ resolve();
  59. /******/ } else if (request.status !== 200 && request.status !== 304) {
  60. /******/ // other failure
  61. /******/ reject(new Error("Manifest request to " + requestPath + " failed."));
  62. /******/ } else {
  63. /******/ // success
  64. /******/ try {
  65. /******/ var update = JSON.parse(request.responseText);
  66. /******/ } catch (e) {
  67. /******/ reject(e);
  68. /******/ return;
  69. /******/ }
  70. /******/ resolve(update);
  71. /******/ }
  72. /******/ };
  73. /******/ });
  74. /******/ }
  75. /******/
  76. /******/ var hotApplyOnUpdate = true;
  77. /******/ // eslint-disable-next-line no-unused-vars
  78. /******/ var hotCurrentHash = "4d8d88ba53621f59b9a9";
  79. /******/ var hotRequestTimeout = 10000;
  80. /******/ var hotCurrentModuleData = {};
  81. /******/ var hotCurrentChildModule;
  82. /******/ // eslint-disable-next-line no-unused-vars
  83. /******/ var hotCurrentParents = [];
  84. /******/ // eslint-disable-next-line no-unused-vars
  85. /******/ var hotCurrentParentsTemp = [];
  86. /******/
  87. /******/ // eslint-disable-next-line no-unused-vars
  88. /******/ function hotCreateRequire(moduleId) {
  89. /******/ var me = installedModules[moduleId];
  90. /******/ if (!me) return __webpack_require__;
  91. /******/ var fn = function(request) {
  92. /******/ if (me.hot.active) {
  93. /******/ if (installedModules[request]) {
  94. /******/ if (installedModules[request].parents.indexOf(moduleId) === -1) {
  95. /******/ installedModules[request].parents.push(moduleId);
  96. /******/ }
  97. /******/ } else {
  98. /******/ hotCurrentParents = [moduleId];
  99. /******/ hotCurrentChildModule = request;
  100. /******/ }
  101. /******/ if (me.children.indexOf(request) === -1) {
  102. /******/ me.children.push(request);
  103. /******/ }
  104. /******/ } else {
  105. /******/ console.warn(
  106. /******/ "[HMR] unexpected require(" +
  107. /******/ request +
  108. /******/ ") from disposed module " +
  109. /******/ moduleId
  110. /******/ );
  111. /******/ hotCurrentParents = [];
  112. /******/ }
  113. /******/ return __webpack_require__(request);
  114. /******/ };
  115. /******/ var ObjectFactory = function ObjectFactory(name) {
  116. /******/ return {
  117. /******/ configurable: true,
  118. /******/ enumerable: true,
  119. /******/ get: function() {
  120. /******/ return __webpack_require__[name];
  121. /******/ },
  122. /******/ set: function(value) {
  123. /******/ __webpack_require__[name] = value;
  124. /******/ }
  125. /******/ };
  126. /******/ };
  127. /******/ for (var name in __webpack_require__) {
  128. /******/ if (
  129. /******/ Object.prototype.hasOwnProperty.call(__webpack_require__, name) &&
  130. /******/ name !== "e" &&
  131. /******/ name !== "t"
  132. /******/ ) {
  133. /******/ Object.defineProperty(fn, name, ObjectFactory(name));
  134. /******/ }
  135. /******/ }
  136. /******/ fn.e = function(chunkId) {
  137. /******/ if (hotStatus === "ready") hotSetStatus("prepare");
  138. /******/ hotChunksLoading++;
  139. /******/ return __webpack_require__.e(chunkId).then(finishChunkLoading, function(err) {
  140. /******/ finishChunkLoading();
  141. /******/ throw err;
  142. /******/ });
  143. /******/
  144. /******/ function finishChunkLoading() {
  145. /******/ hotChunksLoading--;
  146. /******/ if (hotStatus === "prepare") {
  147. /******/ if (!hotWaitingFilesMap[chunkId]) {
  148. /******/ hotEnsureUpdateChunk(chunkId);
  149. /******/ }
  150. /******/ if (hotChunksLoading === 0 && hotWaitingFiles === 0) {
  151. /******/ hotUpdateDownloaded();
  152. /******/ }
  153. /******/ }
  154. /******/ }
  155. /******/ };
  156. /******/ fn.t = function(value, mode) {
  157. /******/ if (mode & 1) value = fn(value);
  158. /******/ return __webpack_require__.t(value, mode & ~1);
  159. /******/ };
  160. /******/ return fn;
  161. /******/ }
  162. /******/
  163. /******/ // eslint-disable-next-line no-unused-vars
  164. /******/ function hotCreateModule(moduleId) {
  165. /******/ var hot = {
  166. /******/ // private stuff
  167. /******/ _acceptedDependencies: {},
  168. /******/ _declinedDependencies: {},
  169. /******/ _selfAccepted: false,
  170. /******/ _selfDeclined: false,
  171. /******/ _disposeHandlers: [],
  172. /******/ _main: hotCurrentChildModule !== moduleId,
  173. /******/
  174. /******/ // Module API
  175. /******/ active: true,
  176. /******/ accept: function(dep, callback) {
  177. /******/ if (dep === undefined) hot._selfAccepted = true;
  178. /******/ else if (typeof dep === "function") hot._selfAccepted = dep;
  179. /******/ else if (typeof dep === "object")
  180. /******/ for (var i = 0; i < dep.length; i++)
  181. /******/ hot._acceptedDependencies[dep[i]] = callback || function() {};
  182. /******/ else hot._acceptedDependencies[dep] = callback || function() {};
  183. /******/ },
  184. /******/ decline: function(dep) {
  185. /******/ if (dep === undefined) hot._selfDeclined = true;
  186. /******/ else if (typeof dep === "object")
  187. /******/ for (var i = 0; i < dep.length; i++)
  188. /******/ hot._declinedDependencies[dep[i]] = true;
  189. /******/ else hot._declinedDependencies[dep] = true;
  190. /******/ },
  191. /******/ dispose: function(callback) {
  192. /******/ hot._disposeHandlers.push(callback);
  193. /******/ },
  194. /******/ addDisposeHandler: function(callback) {
  195. /******/ hot._disposeHandlers.push(callback);
  196. /******/ },
  197. /******/ removeDisposeHandler: function(callback) {
  198. /******/ var idx = hot._disposeHandlers.indexOf(callback);
  199. /******/ if (idx >= 0) hot._disposeHandlers.splice(idx, 1);
  200. /******/ },
  201. /******/
  202. /******/ // Management API
  203. /******/ check: hotCheck,
  204. /******/ apply: hotApply,
  205. /******/ status: function(l) {
  206. /******/ if (!l) return hotStatus;
  207. /******/ hotStatusHandlers.push(l);
  208. /******/ },
  209. /******/ addStatusHandler: function(l) {
  210. /******/ hotStatusHandlers.push(l);
  211. /******/ },
  212. /******/ removeStatusHandler: function(l) {
  213. /******/ var idx = hotStatusHandlers.indexOf(l);
  214. /******/ if (idx >= 0) hotStatusHandlers.splice(idx, 1);
  215. /******/ },
  216. /******/
  217. /******/ //inherit from previous dispose call
  218. /******/ data: hotCurrentModuleData[moduleId]
  219. /******/ };
  220. /******/ hotCurrentChildModule = undefined;
  221. /******/ return hot;
  222. /******/ }
  223. /******/
  224. /******/ var hotStatusHandlers = [];
  225. /******/ var hotStatus = "idle";
  226. /******/
  227. /******/ function hotSetStatus(newStatus) {
  228. /******/ hotStatus = newStatus;
  229. /******/ for (var i = 0; i < hotStatusHandlers.length; i++)
  230. /******/ hotStatusHandlers[i].call(null, newStatus);
  231. /******/ }
  232. /******/
  233. /******/ // while downloading
  234. /******/ var hotWaitingFiles = 0;
  235. /******/ var hotChunksLoading = 0;
  236. /******/ var hotWaitingFilesMap = {};
  237. /******/ var hotRequestedFilesMap = {};
  238. /******/ var hotAvailableFilesMap = {};
  239. /******/ var hotDeferred;
  240. /******/
  241. /******/ // The update info
  242. /******/ var hotUpdate, hotUpdateNewHash;
  243. /******/
  244. /******/ function toModuleId(id) {
  245. /******/ var isNumber = +id + "" === id;
  246. /******/ return isNumber ? +id : id;
  247. /******/ }
  248. /******/
  249. /******/ function hotCheck(apply) {
  250. /******/ if (hotStatus !== "idle") {
  251. /******/ throw new Error("check() is only allowed in idle status");
  252. /******/ }
  253. /******/ hotApplyOnUpdate = apply;
  254. /******/ hotSetStatus("check");
  255. /******/ return hotDownloadManifest(hotRequestTimeout).then(function(update) {
  256. /******/ if (!update) {
  257. /******/ hotSetStatus("idle");
  258. /******/ return null;
  259. /******/ }
  260. /******/ hotRequestedFilesMap = {};
  261. /******/ hotWaitingFilesMap = {};
  262. /******/ hotAvailableFilesMap = update.c;
  263. /******/ hotUpdateNewHash = update.h;
  264. /******/
  265. /******/ hotSetStatus("prepare");
  266. /******/ var promise = new Promise(function(resolve, reject) {
  267. /******/ hotDeferred = {
  268. /******/ resolve: resolve,
  269. /******/ reject: reject
  270. /******/ };
  271. /******/ });
  272. /******/ hotUpdate = {};
  273. /******/ var chunkId = "cornerstone";
  274. /******/ // eslint-disable-next-line no-lone-blocks
  275. /******/ {
  276. /******/ /*globals chunkId */
  277. /******/ hotEnsureUpdateChunk(chunkId);
  278. /******/ }
  279. /******/ if (
  280. /******/ hotStatus === "prepare" &&
  281. /******/ hotChunksLoading === 0 &&
  282. /******/ hotWaitingFiles === 0
  283. /******/ ) {
  284. /******/ hotUpdateDownloaded();
  285. /******/ }
  286. /******/ return promise;
  287. /******/ });
  288. /******/ }
  289. /******/
  290. /******/ // eslint-disable-next-line no-unused-vars
  291. /******/ function hotAddUpdateChunk(chunkId, moreModules) {
  292. /******/ if (!hotAvailableFilesMap[chunkId] || !hotRequestedFilesMap[chunkId])
  293. /******/ return;
  294. /******/ hotRequestedFilesMap[chunkId] = false;
  295. /******/ for (var moduleId in moreModules) {
  296. /******/ if (Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {
  297. /******/ hotUpdate[moduleId] = moreModules[moduleId];
  298. /******/ }
  299. /******/ }
  300. /******/ if (--hotWaitingFiles === 0 && hotChunksLoading === 0) {
  301. /******/ hotUpdateDownloaded();
  302. /******/ }
  303. /******/ }
  304. /******/
  305. /******/ function hotEnsureUpdateChunk(chunkId) {
  306. /******/ if (!hotAvailableFilesMap[chunkId]) {
  307. /******/ hotWaitingFilesMap[chunkId] = true;
  308. /******/ } else {
  309. /******/ hotRequestedFilesMap[chunkId] = true;
  310. /******/ hotWaitingFiles++;
  311. /******/ hotDownloadUpdateChunk(chunkId);
  312. /******/ }
  313. /******/ }
  314. /******/
  315. /******/ function hotUpdateDownloaded() {
  316. /******/ hotSetStatus("ready");
  317. /******/ var deferred = hotDeferred;
  318. /******/ hotDeferred = null;
  319. /******/ if (!deferred) return;
  320. /******/ if (hotApplyOnUpdate) {
  321. /******/ // Wrap deferred object in Promise to mark it as a well-handled Promise to
  322. /******/ // avoid triggering uncaught exception warning in Chrome.
  323. /******/ // See https://bugs.chromium.org/p/chromium/issues/detail?id=465666
  324. /******/ Promise.resolve()
  325. /******/ .then(function() {
  326. /******/ return hotApply(hotApplyOnUpdate);
  327. /******/ })
  328. /******/ .then(
  329. /******/ function(result) {
  330. /******/ deferred.resolve(result);
  331. /******/ },
  332. /******/ function(err) {
  333. /******/ deferred.reject(err);
  334. /******/ }
  335. /******/ );
  336. /******/ } else {
  337. /******/ var outdatedModules = [];
  338. /******/ for (var id in hotUpdate) {
  339. /******/ if (Object.prototype.hasOwnProperty.call(hotUpdate, id)) {
  340. /******/ outdatedModules.push(toModuleId(id));
  341. /******/ }
  342. /******/ }
  343. /******/ deferred.resolve(outdatedModules);
  344. /******/ }
  345. /******/ }
  346. /******/
  347. /******/ function hotApply(options) {
  348. /******/ if (hotStatus !== "ready")
  349. /******/ throw new Error("apply() is only allowed in ready status");
  350. /******/ options = options || {};
  351. /******/
  352. /******/ var cb;
  353. /******/ var i;
  354. /******/ var j;
  355. /******/ var module;
  356. /******/ var moduleId;
  357. /******/
  358. /******/ function getAffectedStuff(updateModuleId) {
  359. /******/ var outdatedModules = [updateModuleId];
  360. /******/ var outdatedDependencies = {};
  361. /******/
  362. /******/ var queue = outdatedModules.slice().map(function(id) {
  363. /******/ return {
  364. /******/ chain: [id],
  365. /******/ id: id
  366. /******/ };
  367. /******/ });
  368. /******/ while (queue.length > 0) {
  369. /******/ var queueItem = queue.pop();
  370. /******/ var moduleId = queueItem.id;
  371. /******/ var chain = queueItem.chain;
  372. /******/ module = installedModules[moduleId];
  373. /******/ if (!module || module.hot._selfAccepted) continue;
  374. /******/ if (module.hot._selfDeclined) {
  375. /******/ return {
  376. /******/ type: "self-declined",
  377. /******/ chain: chain,
  378. /******/ moduleId: moduleId
  379. /******/ };
  380. /******/ }
  381. /******/ if (module.hot._main) {
  382. /******/ return {
  383. /******/ type: "unaccepted",
  384. /******/ chain: chain,
  385. /******/ moduleId: moduleId
  386. /******/ };
  387. /******/ }
  388. /******/ for (var i = 0; i < module.parents.length; i++) {
  389. /******/ var parentId = module.parents[i];
  390. /******/ var parent = installedModules[parentId];
  391. /******/ if (!parent) continue;
  392. /******/ if (parent.hot._declinedDependencies[moduleId]) {
  393. /******/ return {
  394. /******/ type: "declined",
  395. /******/ chain: chain.concat([parentId]),
  396. /******/ moduleId: moduleId,
  397. /******/ parentId: parentId
  398. /******/ };
  399. /******/ }
  400. /******/ if (outdatedModules.indexOf(parentId) !== -1) continue;
  401. /******/ if (parent.hot._acceptedDependencies[moduleId]) {
  402. /******/ if (!outdatedDependencies[parentId])
  403. /******/ outdatedDependencies[parentId] = [];
  404. /******/ addAllToSet(outdatedDependencies[parentId], [moduleId]);
  405. /******/ continue;
  406. /******/ }
  407. /******/ delete outdatedDependencies[parentId];
  408. /******/ outdatedModules.push(parentId);
  409. /******/ queue.push({
  410. /******/ chain: chain.concat([parentId]),
  411. /******/ id: parentId
  412. /******/ });
  413. /******/ }
  414. /******/ }
  415. /******/
  416. /******/ return {
  417. /******/ type: "accepted",
  418. /******/ moduleId: updateModuleId,
  419. /******/ outdatedModules: outdatedModules,
  420. /******/ outdatedDependencies: outdatedDependencies
  421. /******/ };
  422. /******/ }
  423. /******/
  424. /******/ function addAllToSet(a, b) {
  425. /******/ for (var i = 0; i < b.length; i++) {
  426. /******/ var item = b[i];
  427. /******/ if (a.indexOf(item) === -1) a.push(item);
  428. /******/ }
  429. /******/ }
  430. /******/
  431. /******/ // at begin all updates modules are outdated
  432. /******/ // the "outdated" status can propagate to parents if they don't accept the children
  433. /******/ var outdatedDependencies = {};
  434. /******/ var outdatedModules = [];
  435. /******/ var appliedUpdate = {};
  436. /******/
  437. /******/ var warnUnexpectedRequire = function warnUnexpectedRequire() {
  438. /******/ console.warn(
  439. /******/ "[HMR] unexpected require(" + result.moduleId + ") to disposed module"
  440. /******/ );
  441. /******/ };
  442. /******/
  443. /******/ for (var id in hotUpdate) {
  444. /******/ if (Object.prototype.hasOwnProperty.call(hotUpdate, id)) {
  445. /******/ moduleId = toModuleId(id);
  446. /******/ /** @type {TODO} */
  447. /******/ var result;
  448. /******/ if (hotUpdate[id]) {
  449. /******/ result = getAffectedStuff(moduleId);
  450. /******/ } else {
  451. /******/ result = {
  452. /******/ type: "disposed",
  453. /******/ moduleId: id
  454. /******/ };
  455. /******/ }
  456. /******/ /** @type {Error|false} */
  457. /******/ var abortError = false;
  458. /******/ var doApply = false;
  459. /******/ var doDispose = false;
  460. /******/ var chainInfo = "";
  461. /******/ if (result.chain) {
  462. /******/ chainInfo = "\nUpdate propagation: " + result.chain.join(" -> ");
  463. /******/ }
  464. /******/ switch (result.type) {
  465. /******/ case "self-declined":
  466. /******/ if (options.onDeclined) options.onDeclined(result);
  467. /******/ if (!options.ignoreDeclined)
  468. /******/ abortError = new Error(
  469. /******/ "Aborted because of self decline: " +
  470. /******/ result.moduleId +
  471. /******/ chainInfo
  472. /******/ );
  473. /******/ break;
  474. /******/ case "declined":
  475. /******/ if (options.onDeclined) options.onDeclined(result);
  476. /******/ if (!options.ignoreDeclined)
  477. /******/ abortError = new Error(
  478. /******/ "Aborted because of declined dependency: " +
  479. /******/ result.moduleId +
  480. /******/ " in " +
  481. /******/ result.parentId +
  482. /******/ chainInfo
  483. /******/ );
  484. /******/ break;
  485. /******/ case "unaccepted":
  486. /******/ if (options.onUnaccepted) options.onUnaccepted(result);
  487. /******/ if (!options.ignoreUnaccepted)
  488. /******/ abortError = new Error(
  489. /******/ "Aborted because " + moduleId + " is not accepted" + chainInfo
  490. /******/ );
  491. /******/ break;
  492. /******/ case "accepted":
  493. /******/ if (options.onAccepted) options.onAccepted(result);
  494. /******/ doApply = true;
  495. /******/ break;
  496. /******/ case "disposed":
  497. /******/ if (options.onDisposed) options.onDisposed(result);
  498. /******/ doDispose = true;
  499. /******/ break;
  500. /******/ default:
  501. /******/ throw new Error("Unexception type " + result.type);
  502. /******/ }
  503. /******/ if (abortError) {
  504. /******/ hotSetStatus("abort");
  505. /******/ return Promise.reject(abortError);
  506. /******/ }
  507. /******/ if (doApply) {
  508. /******/ appliedUpdate[moduleId] = hotUpdate[moduleId];
  509. /******/ addAllToSet(outdatedModules, result.outdatedModules);
  510. /******/ for (moduleId in result.outdatedDependencies) {
  511. /******/ if (
  512. /******/ Object.prototype.hasOwnProperty.call(
  513. /******/ result.outdatedDependencies,
  514. /******/ moduleId
  515. /******/ )
  516. /******/ ) {
  517. /******/ if (!outdatedDependencies[moduleId])
  518. /******/ outdatedDependencies[moduleId] = [];
  519. /******/ addAllToSet(
  520. /******/ outdatedDependencies[moduleId],
  521. /******/ result.outdatedDependencies[moduleId]
  522. /******/ );
  523. /******/ }
  524. /******/ }
  525. /******/ }
  526. /******/ if (doDispose) {
  527. /******/ addAllToSet(outdatedModules, [result.moduleId]);
  528. /******/ appliedUpdate[moduleId] = warnUnexpectedRequire;
  529. /******/ }
  530. /******/ }
  531. /******/ }
  532. /******/
  533. /******/ // Store self accepted outdated modules to require them later by the module system
  534. /******/ var outdatedSelfAcceptedModules = [];
  535. /******/ for (i = 0; i < outdatedModules.length; i++) {
  536. /******/ moduleId = outdatedModules[i];
  537. /******/ if (
  538. /******/ installedModules[moduleId] &&
  539. /******/ installedModules[moduleId].hot._selfAccepted
  540. /******/ )
  541. /******/ outdatedSelfAcceptedModules.push({
  542. /******/ module: moduleId,
  543. /******/ errorHandler: installedModules[moduleId].hot._selfAccepted
  544. /******/ });
  545. /******/ }
  546. /******/
  547. /******/ // Now in "dispose" phase
  548. /******/ hotSetStatus("dispose");
  549. /******/ Object.keys(hotAvailableFilesMap).forEach(function(chunkId) {
  550. /******/ if (hotAvailableFilesMap[chunkId] === false) {
  551. /******/ hotDisposeChunk(chunkId);
  552. /******/ }
  553. /******/ });
  554. /******/
  555. /******/ var idx;
  556. /******/ var queue = outdatedModules.slice();
  557. /******/ while (queue.length > 0) {
  558. /******/ moduleId = queue.pop();
  559. /******/ module = installedModules[moduleId];
  560. /******/ if (!module) continue;
  561. /******/
  562. /******/ var data = {};
  563. /******/
  564. /******/ // Call dispose handlers
  565. /******/ var disposeHandlers = module.hot._disposeHandlers;
  566. /******/ for (j = 0; j < disposeHandlers.length; j++) {
  567. /******/ cb = disposeHandlers[j];
  568. /******/ cb(data);
  569. /******/ }
  570. /******/ hotCurrentModuleData[moduleId] = data;
  571. /******/
  572. /******/ // disable module (this disables requires from this module)
  573. /******/ module.hot.active = false;
  574. /******/
  575. /******/ // remove module from cache
  576. /******/ delete installedModules[moduleId];
  577. /******/
  578. /******/ // when disposing there is no need to call dispose handler
  579. /******/ delete outdatedDependencies[moduleId];
  580. /******/
  581. /******/ // remove "parents" references from all children
  582. /******/ for (j = 0; j < module.children.length; j++) {
  583. /******/ var child = installedModules[module.children[j]];
  584. /******/ if (!child) continue;
  585. /******/ idx = child.parents.indexOf(moduleId);
  586. /******/ if (idx >= 0) {
  587. /******/ child.parents.splice(idx, 1);
  588. /******/ }
  589. /******/ }
  590. /******/ }
  591. /******/
  592. /******/ // remove outdated dependency from module children
  593. /******/ var dependency;
  594. /******/ var moduleOutdatedDependencies;
  595. /******/ for (moduleId in outdatedDependencies) {
  596. /******/ if (
  597. /******/ Object.prototype.hasOwnProperty.call(outdatedDependencies, moduleId)
  598. /******/ ) {
  599. /******/ module = installedModules[moduleId];
  600. /******/ if (module) {
  601. /******/ moduleOutdatedDependencies = outdatedDependencies[moduleId];
  602. /******/ for (j = 0; j < moduleOutdatedDependencies.length; j++) {
  603. /******/ dependency = moduleOutdatedDependencies[j];
  604. /******/ idx = module.children.indexOf(dependency);
  605. /******/ if (idx >= 0) module.children.splice(idx, 1);
  606. /******/ }
  607. /******/ }
  608. /******/ }
  609. /******/ }
  610. /******/
  611. /******/ // Not in "apply" phase
  612. /******/ hotSetStatus("apply");
  613. /******/
  614. /******/ hotCurrentHash = hotUpdateNewHash;
  615. /******/
  616. /******/ // insert new code
  617. /******/ for (moduleId in appliedUpdate) {
  618. /******/ if (Object.prototype.hasOwnProperty.call(appliedUpdate, moduleId)) {
  619. /******/ modules[moduleId] = appliedUpdate[moduleId];
  620. /******/ }
  621. /******/ }
  622. /******/
  623. /******/ // call accept handlers
  624. /******/ var error = null;
  625. /******/ for (moduleId in outdatedDependencies) {
  626. /******/ if (
  627. /******/ Object.prototype.hasOwnProperty.call(outdatedDependencies, moduleId)
  628. /******/ ) {
  629. /******/ module = installedModules[moduleId];
  630. /******/ if (module) {
  631. /******/ moduleOutdatedDependencies = outdatedDependencies[moduleId];
  632. /******/ var callbacks = [];
  633. /******/ for (i = 0; i < moduleOutdatedDependencies.length; i++) {
  634. /******/ dependency = moduleOutdatedDependencies[i];
  635. /******/ cb = module.hot._acceptedDependencies[dependency];
  636. /******/ if (cb) {
  637. /******/ if (callbacks.indexOf(cb) !== -1) continue;
  638. /******/ callbacks.push(cb);
  639. /******/ }
  640. /******/ }
  641. /******/ for (i = 0; i < callbacks.length; i++) {
  642. /******/ cb = callbacks[i];
  643. /******/ try {
  644. /******/ cb(moduleOutdatedDependencies);
  645. /******/ } catch (err) {
  646. /******/ if (options.onErrored) {
  647. /******/ options.onErrored({
  648. /******/ type: "accept-errored",
  649. /******/ moduleId: moduleId,
  650. /******/ dependencyId: moduleOutdatedDependencies[i],
  651. /******/ error: err
  652. /******/ });
  653. /******/ }
  654. /******/ if (!options.ignoreErrored) {
  655. /******/ if (!error) error = err;
  656. /******/ }
  657. /******/ }
  658. /******/ }
  659. /******/ }
  660. /******/ }
  661. /******/ }
  662. /******/
  663. /******/ // Load self accepted modules
  664. /******/ for (i = 0; i < outdatedSelfAcceptedModules.length; i++) {
  665. /******/ var item = outdatedSelfAcceptedModules[i];
  666. /******/ moduleId = item.module;
  667. /******/ hotCurrentParents = [moduleId];
  668. /******/ try {
  669. /******/ __webpack_require__(moduleId);
  670. /******/ } catch (err) {
  671. /******/ if (typeof item.errorHandler === "function") {
  672. /******/ try {
  673. /******/ item.errorHandler(err);
  674. /******/ } catch (err2) {
  675. /******/ if (options.onErrored) {
  676. /******/ options.onErrored({
  677. /******/ type: "self-accept-error-handler-errored",
  678. /******/ moduleId: moduleId,
  679. /******/ error: err2,
  680. /******/ originalError: err
  681. /******/ });
  682. /******/ }
  683. /******/ if (!options.ignoreErrored) {
  684. /******/ if (!error) error = err2;
  685. /******/ }
  686. /******/ if (!error) error = err;
  687. /******/ }
  688. /******/ } else {
  689. /******/ if (options.onErrored) {
  690. /******/ options.onErrored({
  691. /******/ type: "self-accept-errored",
  692. /******/ moduleId: moduleId,
  693. /******/ error: err
  694. /******/ });
  695. /******/ }
  696. /******/ if (!options.ignoreErrored) {
  697. /******/ if (!error) error = err;
  698. /******/ }
  699. /******/ }
  700. /******/ }
  701. /******/ }
  702. /******/
  703. /******/ // handle errors in accept handlers and self accepted module load
  704. /******/ if (error) {
  705. /******/ hotSetStatus("fail");
  706. /******/ return Promise.reject(error);
  707. /******/ }
  708. /******/
  709. /******/ hotSetStatus("idle");
  710. /******/ return new Promise(function(resolve) {
  711. /******/ resolve(outdatedModules);
  712. /******/ });
  713. /******/ }
  714. /******/
  715. /******/ // The module cache
  716. /******/ var installedModules = {};
  717. /******/
  718. /******/ // The require function
  719. /******/ function __webpack_require__(moduleId) {
  720. /******/
  721. /******/ // Check if module is in cache
  722. /******/ if(installedModules[moduleId]) {
  723. /******/ return installedModules[moduleId].exports;
  724. /******/ }
  725. /******/ // Create a new module (and put it into the cache)
  726. /******/ var module = installedModules[moduleId] = {
  727. /******/ i: moduleId,
  728. /******/ l: false,
  729. /******/ exports: {},
  730. /******/ hot: hotCreateModule(moduleId),
  731. /******/ parents: (hotCurrentParentsTemp = hotCurrentParents, hotCurrentParents = [], hotCurrentParentsTemp),
  732. /******/ children: []
  733. /******/ };
  734. /******/
  735. /******/ // Execute the module function
  736. /******/ modules[moduleId].call(module.exports, module, module.exports, hotCreateRequire(moduleId));
  737. /******/
  738. /******/ // Flag the module as loaded
  739. /******/ module.l = true;
  740. /******/
  741. /******/ // Return the exports of the module
  742. /******/ return module.exports;
  743. /******/ }
  744. /******/
  745. /******/
  746. /******/ // expose the modules object (__webpack_modules__)
  747. /******/ __webpack_require__.m = modules;
  748. /******/
  749. /******/ // expose the module cache
  750. /******/ __webpack_require__.c = installedModules;
  751. /******/
  752. /******/ // define getter function for harmony exports
  753. /******/ __webpack_require__.d = function(exports, name, getter) {
  754. /******/ if(!__webpack_require__.o(exports, name)) {
  755. /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
  756. /******/ }
  757. /******/ };
  758. /******/
  759. /******/ // define __esModule on exports
  760. /******/ __webpack_require__.r = function(exports) {
  761. /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
  762. /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
  763. /******/ }
  764. /******/ Object.defineProperty(exports, '__esModule', { value: true });
  765. /******/ };
  766. /******/
  767. /******/ // create a fake namespace object
  768. /******/ // mode & 1: value is a module id, require it
  769. /******/ // mode & 2: merge all properties of value into the ns
  770. /******/ // mode & 4: return value when already ns object
  771. /******/ // mode & 8|1: behave like require
  772. /******/ __webpack_require__.t = function(value, mode) {
  773. /******/ if(mode & 1) value = __webpack_require__(value);
  774. /******/ if(mode & 8) return value;
  775. /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
  776. /******/ var ns = Object.create(null);
  777. /******/ __webpack_require__.r(ns);
  778. /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
  779. /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
  780. /******/ return ns;
  781. /******/ };
  782. /******/
  783. /******/ // getDefaultExport function for compatibility with non-harmony modules
  784. /******/ __webpack_require__.n = function(module) {
  785. /******/ var getter = module && module.__esModule ?
  786. /******/ function getDefault() { return module['default']; } :
  787. /******/ function getModuleExports() { return module; };
  788. /******/ __webpack_require__.d(getter, 'a', getter);
  789. /******/ return getter;
  790. /******/ };
  791. /******/
  792. /******/ // Object.prototype.hasOwnProperty.call
  793. /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
  794. /******/
  795. /******/ // __webpack_public_path__
  796. /******/ __webpack_require__.p = "";
  797. /******/
  798. /******/ // __webpack_hash__
  799. /******/ __webpack_require__.h = function() { return hotCurrentHash; };
  800. /******/
  801. /******/
  802. /******/ // Load entry module and return exports
  803. /******/ return hotCreateRequire("./index.js")(__webpack_require__.s = "./index.js");
  804. /******/ })
  805. /************************************************************************/
  806. /******/ ({
  807. /***/ "./canvasToPixel.js":
  808. /*!**************************!*\
  809. !*** ./canvasToPixel.js ***!
  810. \**************************/
  811. /*! exports provided: default */
  812. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  813. "use strict";
  814. __webpack_require__.r(__webpack_exports__);
  815. /* harmony import */ var _enabledElements_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./enabledElements.js */ "./enabledElements.js");
  816. /* harmony import */ var _internal_getTransform_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/getTransform.js */ "./internal/getTransform.js");
  817. /**
  818. * Converts a point in the canvas coordinate system to the pixel coordinate system
  819. * system. This can be used to reset tools' image coordinates after modifications
  820. * have been made in canvas space (e.g. moving a tool by a few cm, independent of
  821. * image resolution).
  822. *
  823. * @param {HTMLElement} element The Cornerstone element within which the input point lies
  824. * @param {{x: Number, y: Number}} pt The input point in the canvas coordinate system
  825. *
  826. * @returns {{x: Number, y: Number}} The transformed point in the pixel coordinate system
  827. * @memberof PixelCoordinateSystem
  828. */
  829. /* harmony default export */ __webpack_exports__["default"] = (function (element, pt) {
  830. var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_0__["getEnabledElement"])(element);
  831. var transform = Object(_internal_getTransform_js__WEBPACK_IMPORTED_MODULE_1__["default"])(enabledElement);
  832. transform.invert();
  833. return transform.transformPoint(pt.x, pt.y);
  834. });
  835. /***/ }),
  836. /***/ "./colors/colormap.js":
  837. /*!****************************!*\
  838. !*** ./colors/colormap.js ***!
  839. \****************************/
  840. /*! exports provided: getColormapsList, getColormap */
  841. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  842. "use strict";
  843. __webpack_require__.r(__webpack_exports__);
  844. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getColormapsList", function() { return getColormapsList; });
  845. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getColormap", function() { return getColormap; });
  846. /* harmony import */ var _lookupTable_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./lookupTable.js */ "./colors/lookupTable.js");
  847. var COLOR_TRANSPARENT = [0, 0, 0, 0]; // Colormaps
  848. //
  849. // Hot Iron, PET, Hot Metal Blue and PET 20 Step are color palettes
  850. // Defined by the DICOM standard
  851. // http://dicom.nema.org/dicom/2013/output/chtml/part06/chapter_B.html
  852. //
  853. // All Linear Segmented Colormaps were copied from matplotlib
  854. // https://github.com/stefanv/matplotlib/blob/master/lib/matplotlib/_cm.py
  855. var colormapsData = {
  856. hotIron: {
  857. name: 'Hot Iron',
  858. numOfColors: 256,
  859. colors: [[0, 0, 0, 255], [2, 0, 0, 255], [4, 0, 0, 255], [6, 0, 0, 255], [8, 0, 0, 255], [10, 0, 0, 255], [12, 0, 0, 255], [14, 0, 0, 255], [16, 0, 0, 255], [18, 0, 0, 255], [20, 0, 0, 255], [22, 0, 0, 255], [24, 0, 0, 255], [26, 0, 0, 255], [28, 0, 0, 255], [30, 0, 0, 255], [32, 0, 0, 255], [34, 0, 0, 255], [36, 0, 0, 255], [38, 0, 0, 255], [40, 0, 0, 255], [42, 0, 0, 255], [44, 0, 0, 255], [46, 0, 0, 255], [48, 0, 0, 255], [50, 0, 0, 255], [52, 0, 0, 255], [54, 0, 0, 255], [56, 0, 0, 255], [58, 0, 0, 255], [60, 0, 0, 255], [62, 0, 0, 255], [64, 0, 0, 255], [66, 0, 0, 255], [68, 0, 0, 255], [70, 0, 0, 255], [72, 0, 0, 255], [74, 0, 0, 255], [76, 0, 0, 255], [78, 0, 0, 255], [80, 0, 0, 255], [82, 0, 0, 255], [84, 0, 0, 255], [86, 0, 0, 255], [88, 0, 0, 255], [90, 0, 0, 255], [92, 0, 0, 255], [94, 0, 0, 255], [96, 0, 0, 255], [98, 0, 0, 255], [100, 0, 0, 255], [102, 0, 0, 255], [104, 0, 0, 255], [106, 0, 0, 255], [108, 0, 0, 255], [110, 0, 0, 255], [112, 0, 0, 255], [114, 0, 0, 255], [116, 0, 0, 255], [118, 0, 0, 255], [120, 0, 0, 255], [122, 0, 0, 255], [124, 0, 0, 255], [126, 0, 0, 255], [128, 0, 0, 255], [130, 0, 0, 255], [132, 0, 0, 255], [134, 0, 0, 255], [136, 0, 0, 255], [138, 0, 0, 255], [140, 0, 0, 255], [142, 0, 0, 255], [144, 0, 0, 255], [146, 0, 0, 255], [148, 0, 0, 255], [150, 0, 0, 255], [152, 0, 0, 255], [154, 0, 0, 255], [156, 0, 0, 255], [158, 0, 0, 255], [160, 0, 0, 255], [162, 0, 0, 255], [164, 0, 0, 255], [166, 0, 0, 255], [168, 0, 0, 255], [170, 0, 0, 255], [172, 0, 0, 255], [174, 0, 0, 255], [176, 0, 0, 255], [178, 0, 0, 255], [180, 0, 0, 255], [182, 0, 0, 255], [184, 0, 0, 255], [186, 0, 0, 255], [188, 0, 0, 255], [190, 0, 0, 255], [192, 0, 0, 255], [194, 0, 0, 255], [196, 0, 0, 255], [198, 0, 0, 255], [200, 0, 0, 255], [202, 0, 0, 255], [204, 0, 0, 255], [206, 0, 0, 255], [208, 0, 0, 255], [210, 0, 0, 255], [212, 0, 0, 255], [214, 0, 0, 255], [216, 0, 0, 255], [218, 0, 0, 255], [220, 0, 0, 255], [222, 0, 0, 255], [224, 0, 0, 255], [226, 0, 0, 255], [228, 0, 0, 255], [230, 0, 0, 255], [232, 0, 0, 255], [234, 0, 0, 255], [236, 0, 0, 255], [238, 0, 0, 255], [240, 0, 0, 255], [242, 0, 0, 255], [244, 0, 0, 255], [246, 0, 0, 255], [248, 0, 0, 255], [250, 0, 0, 255], [252, 0, 0, 255], [254, 0, 0, 255], [255, 0, 0, 255], [255, 2, 0, 255], [255, 4, 0, 255], [255, 6, 0, 255], [255, 8, 0, 255], [255, 10, 0, 255], [255, 12, 0, 255], [255, 14, 0, 255], [255, 16, 0, 255], [255, 18, 0, 255], [255, 20, 0, 255], [255, 22, 0, 255], [255, 24, 0, 255], [255, 26, 0, 255], [255, 28, 0, 255], [255, 30, 0, 255], [255, 32, 0, 255], [255, 34, 0, 255], [255, 36, 0, 255], [255, 38, 0, 255], [255, 40, 0, 255], [255, 42, 0, 255], [255, 44, 0, 255], [255, 46, 0, 255], [255, 48, 0, 255], [255, 50, 0, 255], [255, 52, 0, 255], [255, 54, 0, 255], [255, 56, 0, 255], [255, 58, 0, 255], [255, 60, 0, 255], [255, 62, 0, 255], [255, 64, 0, 255], [255, 66, 0, 255], [255, 68, 0, 255], [255, 70, 0, 255], [255, 72, 0, 255], [255, 74, 0, 255], [255, 76, 0, 255], [255, 78, 0, 255], [255, 80, 0, 255], [255, 82, 0, 255], [255, 84, 0, 255], [255, 86, 0, 255], [255, 88, 0, 255], [255, 90, 0, 255], [255, 92, 0, 255], [255, 94, 0, 255], [255, 96, 0, 255], [255, 98, 0, 255], [255, 100, 0, 255], [255, 102, 0, 255], [255, 104, 0, 255], [255, 106, 0, 255], [255, 108, 0, 255], [255, 110, 0, 255], [255, 112, 0, 255], [255, 114, 0, 255], [255, 116, 0, 255], [255, 118, 0, 255], [255, 120, 0, 255], [255, 122, 0, 255], [255, 124, 0, 255], [255, 126, 0, 255], [255, 128, 4, 255], [255, 130, 8, 255], [255, 132, 12, 255], [255, 134, 16, 255], [255, 136, 20, 255], [255, 138, 24, 255], [255, 140, 28, 255], [255, 142, 32, 255], [255, 144, 36, 255], [255, 146, 40, 255], [255, 148, 44, 255], [255, 150, 48, 255], [255, 152, 52, 255], [255, 154, 56, 255], [255, 156, 60, 255], [255, 158, 64, 255], [255, 160, 68, 255], [255, 162, 72, 255], [255, 164, 76, 255], [255, 166, 80, 255], [255, 168, 84, 255], [255, 170, 88, 255], [255, 172, 92, 255], [255, 174, 96, 255], [255, 176, 100, 255], [255, 178, 104, 255], [255, 180, 108, 255], [255, 182, 112, 255], [255, 184, 116, 255], [255, 186, 120, 255], [255, 188, 124, 255], [255, 190, 128, 255], [255, 192, 132, 255], [255, 194, 136, 255], [255, 196, 140, 255], [255, 198, 144, 255], [255, 200, 148, 255], [255, 202, 152, 255], [255, 204, 156, 255], [255, 206, 160, 255], [255, 208, 164, 255], [255, 210, 168, 255], [255, 212, 172, 255], [255, 214, 176, 255], [255, 216, 180, 255], [255, 218, 184, 255], [255, 220, 188, 255], [255, 222, 192, 255], [255, 224, 196, 255], [255, 226, 200, 255], [255, 228, 204, 255], [255, 230, 208, 255], [255, 232, 212, 255], [255, 234, 216, 255], [255, 236, 220, 255], [255, 238, 224, 255], [255, 240, 228, 255], [255, 242, 232, 255], [255, 244, 236, 255], [255, 246, 240, 255], [255, 248, 244, 255], [255, 250, 248, 255], [255, 252, 252, 255], [255, 255, 255, 255]]
  860. },
  861. pet: {
  862. name: 'PET',
  863. numColors: 256,
  864. colors: [[0, 0, 0, 255], [0, 2, 1, 255], [0, 4, 3, 255], [0, 6, 5, 255], [0, 8, 7, 255], [0, 10, 9, 255], [0, 12, 11, 255], [0, 14, 13, 255], [0, 16, 15, 255], [0, 18, 17, 255], [0, 20, 19, 255], [0, 22, 21, 255], [0, 24, 23, 255], [0, 26, 25, 255], [0, 28, 27, 255], [0, 30, 29, 255], [0, 32, 31, 255], [0, 34, 33, 255], [0, 36, 35, 255], [0, 38, 37, 255], [0, 40, 39, 255], [0, 42, 41, 255], [0, 44, 43, 255], [0, 46, 45, 255], [0, 48, 47, 255], [0, 50, 49, 255], [0, 52, 51, 255], [0, 54, 53, 255], [0, 56, 55, 255], [0, 58, 57, 255], [0, 60, 59, 255], [0, 62, 61, 255], [0, 65, 63, 255], [0, 67, 65, 255], [0, 69, 67, 255], [0, 71, 69, 255], [0, 73, 71, 255], [0, 75, 73, 255], [0, 77, 75, 255], [0, 79, 77, 255], [0, 81, 79, 255], [0, 83, 81, 255], [0, 85, 83, 255], [0, 87, 85, 255], [0, 89, 87, 255], [0, 91, 89, 255], [0, 93, 91, 255], [0, 95, 93, 255], [0, 97, 95, 255], [0, 99, 97, 255], [0, 101, 99, 255], [0, 103, 101, 255], [0, 105, 103, 255], [0, 107, 105, 255], [0, 109, 107, 255], [0, 111, 109, 255], [0, 113, 111, 255], [0, 115, 113, 255], [0, 117, 115, 255], [0, 119, 117, 255], [0, 121, 119, 255], [0, 123, 121, 255], [0, 125, 123, 255], [0, 128, 125, 255], [1, 126, 127, 255], [3, 124, 129, 255], [5, 122, 131, 255], [7, 120, 133, 255], [9, 118, 135, 255], [11, 116, 137, 255], [13, 114, 139, 255], [15, 112, 141, 255], [17, 110, 143, 255], [19, 108, 145, 255], [21, 106, 147, 255], [23, 104, 149, 255], [25, 102, 151, 255], [27, 100, 153, 255], [29, 98, 155, 255], [31, 96, 157, 255], [33, 94, 159, 255], [35, 92, 161, 255], [37, 90, 163, 255], [39, 88, 165, 255], [41, 86, 167, 255], [43, 84, 169, 255], [45, 82, 171, 255], [47, 80, 173, 255], [49, 78, 175, 255], [51, 76, 177, 255], [53, 74, 179, 255], [55, 72, 181, 255], [57, 70, 183, 255], [59, 68, 185, 255], [61, 66, 187, 255], [63, 64, 189, 255], [65, 63, 191, 255], [67, 61, 193, 255], [69, 59, 195, 255], [71, 57, 197, 255], [73, 55, 199, 255], [75, 53, 201, 255], [77, 51, 203, 255], [79, 49, 205, 255], [81, 47, 207, 255], [83, 45, 209, 255], [85, 43, 211, 255], [86, 41, 213, 255], [88, 39, 215, 255], [90, 37, 217, 255], [92, 35, 219, 255], [94, 33, 221, 255], [96, 31, 223, 255], [98, 29, 225, 255], [100, 27, 227, 255], [102, 25, 229, 255], [104, 23, 231, 255], [106, 21, 233, 255], [108, 19, 235, 255], [110, 17, 237, 255], [112, 15, 239, 255], [114, 13, 241, 255], [116, 11, 243, 255], [118, 9, 245, 255], [120, 7, 247, 255], [122, 5, 249, 255], [124, 3, 251, 255], [126, 1, 253, 255], [128, 0, 255, 255], [130, 2, 252, 255], [132, 4, 248, 255], [134, 6, 244, 255], [136, 8, 240, 255], [138, 10, 236, 255], [140, 12, 232, 255], [142, 14, 228, 255], [144, 16, 224, 255], [146, 18, 220, 255], [148, 20, 216, 255], [150, 22, 212, 255], [152, 24, 208, 255], [154, 26, 204, 255], [156, 28, 200, 255], [158, 30, 196, 255], [160, 32, 192, 255], [162, 34, 188, 255], [164, 36, 184, 255], [166, 38, 180, 255], [168, 40, 176, 255], [170, 42, 172, 255], [171, 44, 168, 255], [173, 46, 164, 255], [175, 48, 160, 255], [177, 50, 156, 255], [179, 52, 152, 255], [181, 54, 148, 255], [183, 56, 144, 255], [185, 58, 140, 255], [187, 60, 136, 255], [189, 62, 132, 255], [191, 64, 128, 255], [193, 66, 124, 255], [195, 68, 120, 255], [197, 70, 116, 255], [199, 72, 112, 255], [201, 74, 108, 255], [203, 76, 104, 255], [205, 78, 100, 255], [207, 80, 96, 255], [209, 82, 92, 255], [211, 84, 88, 255], [213, 86, 84, 255], [215, 88, 80, 255], [217, 90, 76, 255], [219, 92, 72, 255], [221, 94, 68, 255], [223, 96, 64, 255], [225, 98, 60, 255], [227, 100, 56, 255], [229, 102, 52, 255], [231, 104, 48, 255], [233, 106, 44, 255], [235, 108, 40, 255], [237, 110, 36, 255], [239, 112, 32, 255], [241, 114, 28, 255], [243, 116, 24, 255], [245, 118, 20, 255], [247, 120, 16, 255], [249, 122, 12, 255], [251, 124, 8, 255], [253, 126, 4, 255], [255, 128, 0, 255], [255, 130, 4, 255], [255, 132, 8, 255], [255, 134, 12, 255], [255, 136, 16, 255], [255, 138, 20, 255], [255, 140, 24, 255], [255, 142, 28, 255], [255, 144, 32, 255], [255, 146, 36, 255], [255, 148, 40, 255], [255, 150, 44, 255], [255, 152, 48, 255], [255, 154, 52, 255], [255, 156, 56, 255], [255, 158, 60, 255], [255, 160, 64, 255], [255, 162, 68, 255], [255, 164, 72, 255], [255, 166, 76, 255], [255, 168, 80, 255], [255, 170, 85, 255], [255, 172, 89, 255], [255, 174, 93, 255], [255, 176, 97, 255], [255, 178, 101, 255], [255, 180, 105, 255], [255, 182, 109, 255], [255, 184, 113, 255], [255, 186, 117, 255], [255, 188, 121, 255], [255, 190, 125, 255], [255, 192, 129, 255], [255, 194, 133, 255], [255, 196, 137, 255], [255, 198, 141, 255], [255, 200, 145, 255], [255, 202, 149, 255], [255, 204, 153, 255], [255, 206, 157, 255], [255, 208, 161, 255], [255, 210, 165, 255], [255, 212, 170, 255], [255, 214, 174, 255], [255, 216, 178, 255], [255, 218, 182, 255], [255, 220, 186, 255], [255, 222, 190, 255], [255, 224, 194, 255], [255, 226, 198, 255], [255, 228, 202, 255], [255, 230, 206, 255], [255, 232, 210, 255], [255, 234, 214, 255], [255, 236, 218, 255], [255, 238, 222, 255], [255, 240, 226, 255], [255, 242, 230, 255], [255, 244, 234, 255], [255, 246, 238, 255], [255, 248, 242, 255], [255, 250, 246, 255], [255, 252, 250, 255], [255, 255, 255, 255]]
  865. },
  866. hotMetalBlue: {
  867. name: 'Hot Metal Blue',
  868. numColors: 256,
  869. colors: [[0, 0, 0, 255], [0, 0, 2, 255], [0, 0, 4, 255], [0, 0, 6, 255], [0, 0, 8, 255], [0, 0, 10, 255], [0, 0, 12, 255], [0, 0, 14, 255], [0, 0, 16, 255], [0, 0, 17, 255], [0, 0, 19, 255], [0, 0, 21, 255], [0, 0, 23, 255], [0, 0, 25, 255], [0, 0, 27, 255], [0, 0, 29, 255], [0, 0, 31, 255], [0, 0, 33, 255], [0, 0, 35, 255], [0, 0, 37, 255], [0, 0, 39, 255], [0, 0, 41, 255], [0, 0, 43, 255], [0, 0, 45, 255], [0, 0, 47, 255], [0, 0, 49, 255], [0, 0, 51, 255], [0, 0, 53, 255], [0, 0, 55, 255], [0, 0, 57, 255], [0, 0, 59, 255], [0, 0, 61, 255], [0, 0, 63, 255], [0, 0, 65, 255], [0, 0, 67, 255], [0, 0, 69, 255], [0, 0, 71, 255], [0, 0, 73, 255], [0, 0, 75, 255], [0, 0, 77, 255], [0, 0, 79, 255], [0, 0, 81, 255], [0, 0, 83, 255], [0, 0, 84, 255], [0, 0, 86, 255], [0, 0, 88, 255], [0, 0, 90, 255], [0, 0, 92, 255], [0, 0, 94, 255], [0, 0, 96, 255], [0, 0, 98, 255], [0, 0, 100, 255], [0, 0, 102, 255], [0, 0, 104, 255], [0, 0, 106, 255], [0, 0, 108, 255], [0, 0, 110, 255], [0, 0, 112, 255], [0, 0, 114, 255], [0, 0, 116, 255], [0, 0, 117, 255], [0, 0, 119, 255], [0, 0, 121, 255], [0, 0, 123, 255], [0, 0, 125, 255], [0, 0, 127, 255], [0, 0, 129, 255], [0, 0, 131, 255], [0, 0, 133, 255], [0, 0, 135, 255], [0, 0, 137, 255], [0, 0, 139, 255], [0, 0, 141, 255], [0, 0, 143, 255], [0, 0, 145, 255], [0, 0, 147, 255], [0, 0, 149, 255], [0, 0, 151, 255], [0, 0, 153, 255], [0, 0, 155, 255], [0, 0, 157, 255], [0, 0, 159, 255], [0, 0, 161, 255], [0, 0, 163, 255], [0, 0, 165, 255], [0, 0, 167, 255], [3, 0, 169, 255], [6, 0, 171, 255], [9, 0, 173, 255], [12, 0, 175, 255], [15, 0, 177, 255], [18, 0, 179, 255], [21, 0, 181, 255], [24, 0, 183, 255], [26, 0, 184, 255], [29, 0, 186, 255], [32, 0, 188, 255], [35, 0, 190, 255], [38, 0, 192, 255], [41, 0, 194, 255], [44, 0, 196, 255], [47, 0, 198, 255], [50, 0, 200, 255], [52, 0, 197, 255], [55, 0, 194, 255], [57, 0, 191, 255], [59, 0, 188, 255], [62, 0, 185, 255], [64, 0, 182, 255], [66, 0, 179, 255], [69, 0, 176, 255], [71, 0, 174, 255], [74, 0, 171, 255], [76, 0, 168, 255], [78, 0, 165, 255], [81, 0, 162, 255], [83, 0, 159, 255], [85, 0, 156, 255], [88, 0, 153, 255], [90, 0, 150, 255], [93, 2, 144, 255], [96, 4, 138, 255], [99, 6, 132, 255], [102, 8, 126, 255], [105, 9, 121, 255], [108, 11, 115, 255], [111, 13, 109, 255], [114, 15, 103, 255], [116, 17, 97, 255], [119, 19, 91, 255], [122, 21, 85, 255], [125, 23, 79, 255], [128, 24, 74, 255], [131, 26, 68, 255], [134, 28, 62, 255], [137, 30, 56, 255], [140, 32, 50, 255], [143, 34, 47, 255], [146, 36, 44, 255], [149, 38, 41, 255], [152, 40, 38, 255], [155, 41, 35, 255], [158, 43, 32, 255], [161, 45, 29, 255], [164, 47, 26, 255], [166, 49, 24, 255], [169, 51, 21, 255], [172, 53, 18, 255], [175, 55, 15, 255], [178, 56, 12, 255], [181, 58, 9, 255], [184, 60, 6, 255], [187, 62, 3, 255], [190, 64, 0, 255], [194, 66, 0, 255], [198, 68, 0, 255], [201, 70, 0, 255], [205, 72, 0, 255], [209, 73, 0, 255], [213, 75, 0, 255], [217, 77, 0, 255], [221, 79, 0, 255], [224, 81, 0, 255], [228, 83, 0, 255], [232, 85, 0, 255], [236, 87, 0, 255], [240, 88, 0, 255], [244, 90, 0, 255], [247, 92, 0, 255], [251, 94, 0, 255], [255, 96, 0, 255], [255, 98, 3, 255], [255, 100, 6, 255], [255, 102, 9, 255], [255, 104, 12, 255], [255, 105, 15, 255], [255, 107, 18, 255], [255, 109, 21, 255], [255, 111, 24, 255], [255, 113, 26, 255], [255, 115, 29, 255], [255, 117, 32, 255], [255, 119, 35, 255], [255, 120, 38, 255], [255, 122, 41, 255], [255, 124, 44, 255], [255, 126, 47, 255], [255, 128, 50, 255], [255, 130, 53, 255], [255, 132, 56, 255], [255, 134, 59, 255], [255, 136, 62, 255], [255, 137, 65, 255], [255, 139, 68, 255], [255, 141, 71, 255], [255, 143, 74, 255], [255, 145, 76, 255], [255, 147, 79, 255], [255, 149, 82, 255], [255, 151, 85, 255], [255, 152, 88, 255], [255, 154, 91, 255], [255, 156, 94, 255], [255, 158, 97, 255], [255, 160, 100, 255], [255, 162, 103, 255], [255, 164, 106, 255], [255, 166, 109, 255], [255, 168, 112, 255], [255, 169, 115, 255], [255, 171, 118, 255], [255, 173, 121, 255], [255, 175, 124, 255], [255, 177, 126, 255], [255, 179, 129, 255], [255, 181, 132, 255], [255, 183, 135, 255], [255, 184, 138, 255], [255, 186, 141, 255], [255, 188, 144, 255], [255, 190, 147, 255], [255, 192, 150, 255], [255, 194, 153, 255], [255, 196, 156, 255], [255, 198, 159, 255], [255, 200, 162, 255], [255, 201, 165, 255], [255, 203, 168, 255], [255, 205, 171, 255], [255, 207, 174, 255], [255, 209, 176, 255], [255, 211, 179, 255], [255, 213, 182, 255], [255, 215, 185, 255], [255, 216, 188, 255], [255, 218, 191, 255], [255, 220, 194, 255], [255, 222, 197, 255], [255, 224, 200, 255], [255, 226, 203, 255], [255, 228, 206, 255], [255, 229, 210, 255], [255, 231, 213, 255], [255, 233, 216, 255], [255, 235, 219, 255], [255, 237, 223, 255], [255, 239, 226, 255], [255, 240, 229, 255], [255, 242, 232, 255], [255, 244, 236, 255], [255, 246, 239, 255], [255, 248, 242, 255], [255, 250, 245, 255], [255, 251, 249, 255], [255, 253, 252, 255], [255, 255, 255, 255]]
  870. },
  871. pet20Step: {
  872. name: 'PET 20 Step',
  873. numColors: 256,
  874. colors: [[0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [0, 0, 0, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [96, 0, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 80, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [48, 48, 112, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [80, 80, 128, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [96, 96, 176, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [112, 112, 192, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [128, 128, 224, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 96, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [48, 144, 48, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [80, 192, 80, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [64, 224, 64, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [224, 224, 80, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 208, 96, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 176, 64, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [208, 144, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [192, 96, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [176, 48, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 0, 0, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255], [255, 255, 255, 255]]
  875. },
  876. gray: {
  877. name: 'Gray',
  878. numColors: 256,
  879. gamma: 1,
  880. segmentedData: {
  881. red: [[0, 0, 0], [1, 1, 1]],
  882. green: [[0, 0, 0], [1, 1, 1]],
  883. blue: [[0, 0, 0], [1, 1, 1]]
  884. }
  885. },
  886. jet: {
  887. name: 'Jet',
  888. numColors: 256,
  889. gamma: 1,
  890. segmentedData: {
  891. red: [[0, 0, 0], [0.35, 0, 0], [0.66, 1, 1], [0.89, 1, 1], [1, 0.5, 0.5]],
  892. green: [[0, 0, 0], [0.125, 0, 0], [0.375, 1, 1], [0.64, 1, 1], [0.91, 0, 0], [1, 0, 0]],
  893. blue: [[0, 0.5, 0.5], [0.11, 1, 1], [0.34, 1, 1], [0.65, 0, 0], [1, 0, 0]]
  894. }
  895. },
  896. hsv: {
  897. name: 'HSV',
  898. numColors: 256,
  899. gamma: 1,
  900. segmentedData: {
  901. red: [[0, 1, 1], [0.158730, 1, 1], [0.174603, 0.968750, 0.968750], [0.333333, 0.031250, 0.031250], [0.349206, 0, 0], [0.666667, 0, 0], [0.682540, 0.031250, 0.031250], [0.841270, 0.968750, 0.968750], [0.857143, 1, 1], [1, 1, 1]],
  902. green: [[0, 0, 0], [0.158730, 0.937500, 0.937500], [0.174603, 1, 1], [0.507937, 1, 1], [0.666667, 0.062500, 0.062500], [0.682540, 0, 0], [1, 0, 0]],
  903. blue: [[0, 0, 0], [0.333333, 0, 0], [0.349206, 0.062500, 0.062500], [0.507937, 1, 1], [0.841270, 1, 1], [0.857143, 0.937500, 0.937500], [1, 0.09375, 0.09375]]
  904. }
  905. },
  906. hot: {
  907. name: 'Hot',
  908. numColors: 256,
  909. gamma: 1,
  910. segmentedData: {
  911. red: [[0, 0.0416, 0.0416], [0.365079, 1, 1], [1, 1, 1]],
  912. green: [[0, 0, 0], [0.365079, 0, 0], [0.746032, 1, 1], [1, 1, 1]],
  913. blue: [[0, 0, 0], [0.746032, 0, 0], [1, 1, 1]]
  914. }
  915. },
  916. cool: {
  917. name: 'Cool',
  918. numColors: 256,
  919. gamma: 1,
  920. segmentedData: {
  921. red: [[0, 0, 0], [1, 1, 1]],
  922. green: [[0, 1, 1], [1, 0, 0]],
  923. blue: [[0, 1, 1], [1, 1, 1]]
  924. }
  925. },
  926. spring: {
  927. name: 'Spring',
  928. numColors: 256,
  929. gamma: 1,
  930. segmentedData: {
  931. red: [[0, 1, 1], [1, 1, 1]],
  932. green: [[0, 0, 0], [1, 1, 1]],
  933. blue: [[0, 1, 1], [1, 0, 0]]
  934. }
  935. },
  936. summer: {
  937. name: 'Summer',
  938. numColors: 256,
  939. gamma: 1,
  940. segmentedData: {
  941. red: [[0, 0, 0], [1, 1, 1]],
  942. green: [[0, 0.5, 0.5], [1, 1, 1]],
  943. blue: [[0, 0.4, 0.4], [1, 0.4, 0.4]]
  944. }
  945. },
  946. autumn: {
  947. name: 'Autumn',
  948. numColors: 256,
  949. gamma: 1,
  950. segmentedData: {
  951. red: [[0, 1, 1], [1, 1, 1]],
  952. green: [[0, 0, 0], [1, 1, 1]],
  953. blue: [[0, 0, 0], [1, 0, 0]]
  954. }
  955. },
  956. winter: {
  957. name: 'Winter',
  958. numColors: 256,
  959. gamma: 1,
  960. segmentedData: {
  961. red: [[0, 0, 0], [1, 0, 0]],
  962. green: [[0, 0, 0], [1, 1, 1]],
  963. blue: [[0, 1, 1], [1, 0.5, 0.5]]
  964. }
  965. },
  966. bone: {
  967. name: 'Bone',
  968. numColors: 256,
  969. gamma: 1,
  970. segmentedData: {
  971. red: [[0, 0, 0], [0.746032, 0.652778, 0.652778], [1, 1, 1]],
  972. green: [[0, 0, 0], [0.365079, 0.319444, 0.319444], [0.746032, 0.777778, 0.777778], [1, 1, 1]],
  973. blue: [[0, 0, 0], [0.365079, 0.444444, 0.444444], [1, 1, 1]]
  974. }
  975. },
  976. copper: {
  977. name: 'Copper',
  978. numColors: 256,
  979. gamma: 1,
  980. segmentedData: {
  981. red: [[0, 0, 0], [0.809524, 1, 1], [1, 1, 1]],
  982. green: [[0, 0, 0], [1, 0.7812, 0.7812]],
  983. blue: [[0, 0, 0], [1, 0.4975, 0.4975]]
  984. }
  985. },
  986. spectral: {
  987. name: 'Spectral',
  988. numColors: 256,
  989. gamma: 1,
  990. segmentedData: {
  991. red: [[0, 0, 0], [0.05, 0.4667, 0.4667], [0.10, 0.5333, 0.5333], [0.15, 0, 0], [0.20, 0, 0], [0.25, 0, 0], [0.30, 0, 0], [0.35, 0, 0], [0.40, 0, 0], [0.45, 0, 0], [0.50, 0, 0], [0.55, 0, 0], [0.60, 0, 0], [0.65, 0.7333, 0.7333], [0.70, 0.9333, 0.9333], [0.75, 1, 1], [0.80, 1, 1], [0.85, 1, 1], [0.90, 0.8667, 0.8667], [0.95, 0.80, 0.80], [1, 0.80, 0.80]],
  992. green: [[0, 0, 0], [0.05, 0, 0], [0.10, 0, 0], [0.15, 0, 0], [0.20, 0, 0], [0.25, 0.4667, 0.4667], [0.30, 0.6000, 0.6000], [0.35, 0.6667, 0.6667], [0.40, 0.6667, 0.6667], [0.45, 0.6000, 0.6000], [0.50, 0.7333, 0.7333], [0.55, 0.8667, 0.8667], [0.60, 1, 1], [0.65, 1, 1], [0.70, 0.9333, 0.9333], [0.75, 0.8000, 0.8000], [0.80, 0.6000, 0.6000], [0.85, 0, 0], [0.90, 0, 0], [0.95, 0, 0], [1, 0.80, 0.80]],
  993. blue: [[0, 0, 0], [0.05, 0.5333, 0.5333], [0.10, 0.6000, 0.6000], [0.15, 0.6667, 0.6667], [0.20, 0.8667, 0.8667], [0.25, 0.8667, 0.8667], [0.30, 0.8667, 0.8667], [0.35, 0.6667, 0.6667], [0.40, 0.5333, 0.5333], [0.45, 0, 0], [0.5, 0, 0], [0.55, 0, 0], [0.60, 0, 0], [0.65, 0, 0], [0.70, 0, 0], [0.75, 0, 0], [0.80, 0, 0], [0.85, 0, 0], [0.90, 0, 0], [0.95, 0, 0], [1, 0.80, 0.80]]
  994. }
  995. },
  996. coolwarm: {
  997. name: 'CoolWarm',
  998. numColors: 256,
  999. gamma: 1,
  1000. segmentedData: {
  1001. red: [[0, 0.2298057, 0.2298057], [0.03125, 0.26623388, 0.26623388], [0.0625, 0.30386891, 0.30386891], [0.09375, 0.342804478, 0.342804478], [0.125, 0.38301334, 0.38301334], [0.15625, 0.424369608, 0.424369608], [0.1875, 0.46666708, 0.46666708], [0.21875, 0.509635204, 0.509635204], [0.25, 0.552953156, 0.552953156], [0.28125, 0.596262162, 0.596262162], [0.3125, 0.639176211, 0.639176211], [0.34375, 0.681291281, 0.681291281], [0.375, 0.722193294, 0.722193294], [0.40625, 0.761464949, 0.761464949], [0.4375, 0.798691636, 0.798691636], [0.46875, 0.833466556, 0.833466556], [0.5, 0.865395197, 0.865395197], [0.53125, 0.897787179, 0.897787179], [0.5625, 0.924127593, 0.924127593], [0.59375, 0.944468518, 0.944468518], [0.625, 0.958852946, 0.958852946], [0.65625, 0.96732803, 0.96732803], [0.6875, 0.969954137, 0.969954137], [0.71875, 0.966811177, 0.966811177], [0.75, 0.958003065, 0.958003065], [0.78125, 0.943660866, 0.943660866], [0.8125, 0.923944917, 0.923944917], [0.84375, 0.89904617, 0.89904617], [0.875, 0.869186849, 0.869186849], [0.90625, 0.834620542, 0.834620542], [0.9375, 0.795631745, 0.795631745], [0.96875, 0.752534934, 0.752534934], [1, 0.705673158, 0.705673158]],
  1002. green: [[0, 0.298717966, 0.298717966], [0.03125, 0.353094838, 0.353094838], [0.0625, 0.406535296, 0.406535296], [0.09375, 0.458757618, 0.458757618], [0.125, 0.50941904, 0.50941904], [0.15625, 0.558148092, 0.558148092], [0.1875, 0.604562568, 0.604562568], [0.21875, 0.648280772, 0.648280772], [0.25, 0.688929332, 0.688929332], [0.28125, 0.726149107, 0.726149107], [0.3125, 0.759599947, 0.759599947], [0.34375, 0.788964712, 0.788964712], [0.375, 0.813952739, 0.813952739], [0.40625, 0.834302879, 0.834302879], [0.4375, 0.849786142, 0.849786142], [0.46875, 0.860207984, 0.860207984], [0.5, 0.86541021, 0.86541021], [0.53125, 0.848937047, 0.848937047], [0.5625, 0.827384882, 0.827384882], [0.59375, 0.800927443, 0.800927443], [0.625, 0.769767752, 0.769767752], [0.65625, 0.734132809, 0.734132809], [0.6875, 0.694266682, 0.694266682], [0.71875, 0.650421156, 0.650421156], [0.75, 0.602842431, 0.602842431], [0.78125, 0.551750968, 0.551750968], [0.8125, 0.49730856, 0.49730856], [0.84375, 0.439559467, 0.439559467], [0.875, 0.378313092, 0.378313092], [0.90625, 0.312874446, 0.312874446], [0.9375, 0.24128379, 0.24128379], [0.96875, 0.157246067, 0.157246067], [1, 0.01555616, 0.01555616]],
  1003. blue: [[0, 0.753683153, 0.753683153], [0.03125, 0.801466763, 0.801466763], [0.0625, 0.84495867, 0.84495867], [0.09375, 0.883725899, 0.883725899], [0.125, 0.917387822, 0.917387822], [0.15625, 0.945619588, 0.945619588], [0.1875, 0.968154911, 0.968154911], [0.21875, 0.98478814, 0.98478814], [0.25, 0.995375608, 0.995375608], [0.28125, 0.999836203, 0.999836203], [0.3125, 0.998151185, 0.998151185], [0.34375, 0.990363227, 0.990363227], [0.375, 0.976574709, 0.976574709], [0.40625, 0.956945269, 0.956945269], [0.4375, 0.931688648, 0.931688648], [0.46875, 0.901068838, 0.901068838], [0.5, 0.865395561, 0.865395561], [0.53125, 0.820880546, 0.820880546], [0.5625, 0.774508472, 0.774508472], [0.59375, 0.726736146, 0.726736146], [0.625, 0.678007945, 0.678007945], [0.65625, 0.628751763, 0.628751763], [0.6875, 0.579375448, 0.579375448], [0.71875, 0.530263762, 0.530263762], [0.75, 0.481775914, 0.481775914], [0.78125, 0.434243684, 0.434243684], [0.8125, 0.387970225, 0.387970225], [0.84375, 0.343229596, 0.343229596], [0.875, 0.300267182, 0.300267182], [0.90625, 0.259301199, 0.259301199], [0.9375, 0.220525627, 0.220525627], [0.96875, 0.184115123, 0.184115123], [1, 0.150232812, 0.150232812]]
  1004. }
  1005. },
  1006. blues: {
  1007. name: 'Blues',
  1008. numColors: 256,
  1009. gamma: 1,
  1010. segmentedData: {
  1011. red: [[0, 0.9686274528503418, 0.9686274528503418], [0.125, 0.87058824300765991, 0.87058824300765991], [0.25, 0.7764706015586853, 0.7764706015586853], [0.375, 0.61960786581039429, 0.61960786581039429], [0.5, 0.41960784792900085, 0.41960784792900085], [0.625, 0.25882354378700256, 0.25882354378700256], [0.75, 0.12941177189350128, 0.12941177189350128], [0.875, 0.031372550874948502, 0.031372550874948502], [1, 0.031372550874948502, 0.031372550874948502]],
  1012. green: [[0, 0.9843137264251709, 0.9843137264251709], [0.125, 0.92156863212585449, 0.92156863212585449], [0.25, 0.85882353782653809, 0.85882353782653809], [0.375, 0.7921568751335144, 0.7921568751335144], [0.5, 0.68235296010971069, 0.68235296010971069], [0.625, 0.57254904508590698, 0.57254904508590698], [0.75, 0.44313725829124451, 0.44313725829124451], [0.875, 0.31764706969261169, 0.31764706969261169], [1, 0.18823529779911041, 0.18823529779911041]],
  1013. blue: [[0, 1, 1], [0.125, 0.9686274528503418, 0.9686274528503418], [0.25, 0.93725490570068359, 0.93725490570068359], [0.375, 0.88235294818878174, 0.88235294818878174], [0.5, 0.83921569585800171, 0.83921569585800171], [0.625, 0.7764706015586853, 0.7764706015586853], [0.75, 0.70980393886566162, 0.70980393886566162], [0.875, 0.61176472902297974, 0.61176472902297974], [1, 0.41960784792900085, 0.41960784792900085]]
  1014. }
  1015. }
  1016. };
  1017. /**
  1018. * Generate linearly spaced vectors
  1019. * http://cens.ioc.ee/local/man/matlab/techdoc/ref/linspace.html
  1020. * @param {Number} a A number representing the first vector
  1021. * @param {Number} b A number representing the second vector
  1022. * @param {Number} n The number of linear spaced vectors to generate
  1023. * @returns {Array} An array of points representing linear spaced vectors.
  1024. * @memberof Colors
  1025. */
  1026. function linspace(a, b, n) {
  1027. n = n === null ? 100 : n;
  1028. var increment = (b - a) / (n - 1);
  1029. var vector = [];
  1030. while (n-- > 0) {
  1031. vector.push(a);
  1032. a += increment;
  1033. } // Make sure the last item will always be "b" because most of the
  1034. // Time we'll get numbers like 1.0000000000000002 instead of 1.
  1035. vector[vector.length - 1] = b;
  1036. return vector;
  1037. }
  1038. /**
  1039. * Returns the "rank/index" of the element in a sorted array if found or the highest index if not. Uses (binary search)
  1040. * @param {Array} array A sorted array to search in
  1041. * @param {any} elem the element in the array to search for
  1042. * @returns {number} The rank/index of the element in the given array
  1043. * @memberof Colors
  1044. */
  1045. function getRank(array, elem) {
  1046. var left = 0;
  1047. var right = array.length - 1;
  1048. while (left <= right) {
  1049. var mid = left + Math.floor((right - left) / 2);
  1050. var midElem = array[mid];
  1051. if (midElem === elem) {
  1052. return mid;
  1053. } else if (elem < midElem) {
  1054. right = mid - 1;
  1055. } else {
  1056. left = mid + 1;
  1057. }
  1058. }
  1059. return left;
  1060. }
  1061. /**
  1062. * Find the indices into a sorted array a such that, if the corresponding elements
  1063. * In v were inserted before the indices, the order of a would be preserved.
  1064. * http://lagrange.univ-lyon1.fr/docs/numpy/1.11.0/reference/generated/numpy.searchsorted.html
  1065. * @param {Array} inputArray The array where the values will be inserted
  1066. * @param {Array} values An array of the values to be inserted into the inputArray
  1067. * @returns {Array} The indices where elements should be inserted to maintain order.
  1068. * @memberof Colors
  1069. */
  1070. function searchSorted(inputArray, values) {
  1071. var i;
  1072. var indexes = [];
  1073. var len = values.length;
  1074. inputArray.sort(function (a, b) {
  1075. return a - b;
  1076. });
  1077. for (i = 0; i < len; i++) {
  1078. indexes[i] = getRank(inputArray, values[i]);
  1079. }
  1080. return indexes;
  1081. }
  1082. /**
  1083. * Creates an *N* -element 1-d lookup table
  1084. * @param {Number} N The number of elements in the result lookup table
  1085. * @param {Array} data represented by a list of x,y0,y1 mapping correspondences. Each element in this
  1086. * List represents how a value between 0 and 1 (inclusive) represented by x is mapped to
  1087. * A corresponding value between 0 and 1 (inclusive). The two values of y are to allow for
  1088. * Discontinuous mapping functions (say as might be found in a sawtooth) where y0 represents
  1089. * The value of y for values of x <= to that given, and y1 is the value to be used for x >
  1090. * Than that given). The list must start with x=0, end with x=1, and all values of x must be
  1091. * In increasing order. Values between the given mapping points are determined by simple linear
  1092. * Interpolation.
  1093. * @param {any} gamma value denotes a "gamma curve" value which adjusts the brightness
  1094. * at the bottom and top of the map.
  1095. * @returns {any[]} an array "result" where result[x*(N-1)] gives the closest value for
  1096. * Values of x between 0 and 1.
  1097. * @memberof Colors
  1098. */
  1099. function makeMappingArray(N, data, gamma) {
  1100. var i;
  1101. var x = [];
  1102. var y0 = [];
  1103. var y1 = [];
  1104. var lut = [];
  1105. gamma = gamma === null ? 1 : gamma;
  1106. for (i = 0; i < data.length; i++) {
  1107. var element = data[i];
  1108. x.push((N - 1) * element[0]);
  1109. y0.push(element[1]);
  1110. y1.push(element[1]);
  1111. }
  1112. var xLinSpace = linspace(0, 1, N);
  1113. for (i = 0; i < N; i++) {
  1114. xLinSpace[i] = (N - 1) * Math.pow(xLinSpace[i], gamma);
  1115. }
  1116. var xLinSpaceIndexes = searchSorted(x, xLinSpace);
  1117. for (i = 1; i < N - 1; i++) {
  1118. var index = xLinSpaceIndexes[i];
  1119. var colorPercent = (xLinSpace[i] - x[index - 1]) / (x[index] - x[index - 1]);
  1120. var colorDelta = y0[index] - y1[index - 1];
  1121. lut[i] = colorPercent * colorDelta + y1[index - 1];
  1122. }
  1123. lut[0] = y1[0];
  1124. lut[N - 1] = y0[data.length - 1];
  1125. return lut;
  1126. }
  1127. /**
  1128. * Creates a Colormap based on lookup tables using linear segments.
  1129. * @param {{red:Array, green:Array, blue:Array}} segmentedData An object with a red, green and blue entries.
  1130. * Each entry should be a list of x, y0, y1 tuples, forming rows in a table.
  1131. * @param {Number} N The number of elements in the result Colormap
  1132. * @param {any} gamma value denotes a "gamma curve" value which adjusts the brightness
  1133. * at the bottom and top of the Colormap.
  1134. * @returns {Array} The created Colormap object
  1135. * @description The lookup table is generated using linear interpolation for each
  1136. * Primary color, with the 0-1 domain divided into any number of
  1137. * Segments.
  1138. * https://github.com/stefanv/matplotlib/blob/3f1a23755e86fef97d51e30e106195f34425c9e3/lib/matplotlib/colors.py#L663
  1139. * @memberof Colors
  1140. */
  1141. function createLinearSegmentedColormap(segmentedData, N, gamma) {
  1142. var i;
  1143. var lut = [];
  1144. N = N === null ? 256 : N;
  1145. gamma = gamma === null ? 1 : gamma;
  1146. var redLut = makeMappingArray(N, segmentedData.red, gamma);
  1147. var greenLut = makeMappingArray(N, segmentedData.green, gamma);
  1148. var blueLut = makeMappingArray(N, segmentedData.blue, gamma);
  1149. for (i = 0; i < N; i++) {
  1150. var red = Math.round(redLut[i] * 255);
  1151. var green = Math.round(greenLut[i] * 255);
  1152. var blue = Math.round(blueLut[i] * 255);
  1153. var rgba = [red, green, blue, 255];
  1154. lut.push(rgba);
  1155. }
  1156. return lut;
  1157. }
  1158. /**
  1159. * Return all available colormaps (id and name)
  1160. * @returns {Array<{id,key}>} An array of colormaps with an object containing the "id" and display "name"
  1161. * @memberof Colors
  1162. */
  1163. function getColormapsList() {
  1164. var colormaps = [];
  1165. var keys = Object.keys(colormapsData);
  1166. keys.forEach(function (key) {
  1167. if (colormapsData.hasOwnProperty(key)) {
  1168. var colormap = colormapsData[key];
  1169. colormaps.push({
  1170. id: key,
  1171. name: colormap.name
  1172. });
  1173. }
  1174. });
  1175. colormaps.sort(function (a, b) {
  1176. var aName = a.name.toLowerCase();
  1177. var bName = b.name.toLowerCase();
  1178. if (aName === bName) {
  1179. return 0;
  1180. }
  1181. return aName < bName ? -1 : 1;
  1182. });
  1183. return colormaps;
  1184. }
  1185. /**
  1186. * Return a colorMap object with the provided id and colormapData
  1187. * if the Id matches existent colorMap objects (check colormapsData) the colormapData is ignored.
  1188. * if the colormapData is not empty, the colorMap will be added to the colormapsData list. Otherwise, an empty colorMap object is returned.
  1189. * @param {string} id The ID of the colormap
  1190. * @param {Object} colormapData - An object that can contain a name, numColors, gama, segmentedData and/or colors
  1191. * @returns {*} The Colormap Object
  1192. * @memberof Colors
  1193. */
  1194. function getColormap(id, colormapData) {
  1195. var colormap = colormapsData[id];
  1196. if (!colormap) {
  1197. colormap = colormapsData[id] = colormapData || {
  1198. name: '',
  1199. colors: []
  1200. };
  1201. }
  1202. if (!colormap.colors && colormap.segmentedData) {
  1203. colormap.colors = createLinearSegmentedColormap(colormap.segmentedData, colormap.numColors, colormap.gamma);
  1204. }
  1205. return {
  1206. getId: function getId() {
  1207. return id;
  1208. },
  1209. getColorSchemeName: function getColorSchemeName() {
  1210. return colormap.name;
  1211. },
  1212. setColorSchemeName: function setColorSchemeName(name) {
  1213. colormap.name = name;
  1214. },
  1215. getNumberOfColors: function getNumberOfColors() {
  1216. return colormap.colors.length;
  1217. },
  1218. setNumberOfColors: function setNumberOfColors(numColors) {
  1219. while (colormap.colors.length < numColors) {
  1220. colormap.colors.push(COLOR_TRANSPARENT);
  1221. }
  1222. colormap.colors.length = numColors;
  1223. },
  1224. getColor: function getColor(index) {
  1225. if (this.isValidIndex(index)) {
  1226. return colormap.colors[index];
  1227. }
  1228. return COLOR_TRANSPARENT;
  1229. },
  1230. getColorRepeating: function getColorRepeating(index) {
  1231. var numColors = colormap.colors.length;
  1232. index = numColors ? index % numColors : 0;
  1233. return this.getColor(index);
  1234. },
  1235. setColor: function setColor(index, rgba) {
  1236. if (this.isValidIndex(index)) {
  1237. colormap.colors[index] = rgba;
  1238. }
  1239. },
  1240. addColor: function addColor(rgba) {
  1241. colormap.colors.push(rgba);
  1242. },
  1243. insertColor: function insertColor(index, rgba) {
  1244. if (this.isValidIndex(index)) {
  1245. colormap.colors.splice(index, 1, rgba);
  1246. }
  1247. },
  1248. removeColor: function removeColor(index) {
  1249. if (this.isValidIndex(index)) {
  1250. colormap.colors.splice(index, 1);
  1251. }
  1252. },
  1253. clearColors: function clearColors() {
  1254. colormap.colors = [];
  1255. },
  1256. buildLookupTable: function buildLookupTable(lut) {
  1257. if (!lut) {
  1258. return;
  1259. }
  1260. var numColors = colormap.colors.length;
  1261. lut.setNumberOfTableValues(numColors);
  1262. for (var i = 0; i < numColors; i++) {
  1263. lut.setTableValue(i, colormap.colors[i]);
  1264. }
  1265. },
  1266. createLookupTable: function createLookupTable() {
  1267. var lut = new _lookupTable_js__WEBPACK_IMPORTED_MODULE_0__["default"]();
  1268. this.buildLookupTable(lut);
  1269. return lut;
  1270. },
  1271. isValidIndex: function isValidIndex(index) {
  1272. return index >= 0 && index < colormap.colors.length;
  1273. }
  1274. };
  1275. }
  1276. /***/ }),
  1277. /***/ "./colors/index.js":
  1278. /*!*************************!*\
  1279. !*** ./colors/index.js ***!
  1280. \*************************/
  1281. /*! exports provided: default */
  1282. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  1283. "use strict";
  1284. __webpack_require__.r(__webpack_exports__);
  1285. /* harmony import */ var _colormap_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./colormap.js */ "./colors/colormap.js");
  1286. /* harmony import */ var _lookupTable_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./lookupTable.js */ "./colors/lookupTable.js");
  1287. /* harmony default export */ __webpack_exports__["default"] = ({
  1288. getColormap: _colormap_js__WEBPACK_IMPORTED_MODULE_0__["getColormap"],
  1289. getColormapsList: _colormap_js__WEBPACK_IMPORTED_MODULE_0__["getColormapsList"],
  1290. LookupTable: _lookupTable_js__WEBPACK_IMPORTED_MODULE_1__["default"]
  1291. });
  1292. /***/ }),
  1293. /***/ "./colors/lookupTable.js":
  1294. /*!*******************************!*\
  1295. !*** ./colors/lookupTable.js ***!
  1296. \*******************************/
  1297. /*! exports provided: default */
  1298. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  1299. "use strict";
  1300. __webpack_require__.r(__webpack_exports__);
  1301. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  1302. function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
  1303. function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
  1304. // This code was created based on vtkLookupTable
  1305. // http://www.vtk.org/doc/release/5.0/html/a01697.html
  1306. // https://github.com/Kitware/VTK/blob/master/Common/Core/vtkLookupTable.cxx
  1307. var BELOW_RANGE_COLOR_INDEX = 0;
  1308. var ABOVE_RANGE_COLOR_INDEX = 1;
  1309. var NAN_COLOR_INDEX = 2;
  1310. /**
  1311. * Converts an HSV (Hue, Saturation, Value) color to RGB (Red, Green, Blue) color value
  1312. * @param {Number} hue A number representing the hue color value
  1313. * @param {any} sat A number representing the saturation color value
  1314. * @param {any} val A number representing the value color value
  1315. * @returns {Numberp[]} An RGB color array
  1316. */
  1317. function HSVToRGB(hue, sat, val) {
  1318. if (hue > 1) {
  1319. throw new Error('HSVToRGB expects hue < 1');
  1320. }
  1321. var rgb = [];
  1322. if (sat === 0) {
  1323. rgb[0] = val;
  1324. rgb[1] = val;
  1325. rgb[2] = val;
  1326. return rgb;
  1327. }
  1328. var hueCase = Math.floor(hue * 6);
  1329. var frac = 6 * hue - hueCase;
  1330. var lx = val * (1 - sat);
  1331. var ly = val * (1 - sat * frac);
  1332. var lz = val * (1 - sat * (1 - frac));
  1333. switch (hueCase) {
  1334. /* 0<hue<1/6 */
  1335. case 0:
  1336. case 6:
  1337. rgb[0] = val;
  1338. rgb[1] = lz;
  1339. rgb[2] = lx;
  1340. break;
  1341. /* 1/6<hue<2/6 */
  1342. case 1:
  1343. rgb[0] = ly;
  1344. rgb[1] = val;
  1345. rgb[2] = lx;
  1346. break;
  1347. /* 2/6<hue<3/6 */
  1348. case 2:
  1349. rgb[0] = lx;
  1350. rgb[1] = val;
  1351. rgb[2] = lz;
  1352. break;
  1353. /* 3/6<hue/4/6 */
  1354. case 3:
  1355. rgb[0] = lx;
  1356. rgb[1] = ly;
  1357. rgb[2] = val;
  1358. break;
  1359. /* 4/6<hue<5/6 */
  1360. case 4:
  1361. rgb[0] = lz;
  1362. rgb[1] = lx;
  1363. rgb[2] = val;
  1364. break;
  1365. /* 5/6<hue<1 */
  1366. case 5:
  1367. rgb[0] = val;
  1368. rgb[1] = lx;
  1369. rgb[2] = ly;
  1370. break;
  1371. }
  1372. return rgb;
  1373. }
  1374. /**
  1375. * Maps a value to an index in the table
  1376. * @param {Number} v A double value which table index will be returned.
  1377. * @param {any} p An object that contains the Table "Range", the table "MaxIndex",
  1378. * A "Shift" from first value in the table and the table "Scale" value
  1379. * @returns {Number} The mapped index in the table
  1380. * @memberof Colors
  1381. */
  1382. function linearIndexLookupMain(v, p) {
  1383. var dIndex; // NOTE: Added Math.floor since values were not integers? Check VTK source
  1384. if (v < p.Range[0]) {
  1385. dIndex = p.MaxIndex + BELOW_RANGE_COLOR_INDEX + 1.5;
  1386. } else if (v > p.Range[1]) {
  1387. dIndex = p.MaxIndex + ABOVE_RANGE_COLOR_INDEX + 1.5;
  1388. } else {
  1389. dIndex = (v + p.Shift) * p.Scale;
  1390. }
  1391. return Math.floor(dIndex);
  1392. }
  1393. /**
  1394. * Maps scalar values into colors via a lookup table
  1395. * LookupTable is an object that is used by mapper objects to map scalar values into rgba (red-green-blue-alpha transparency) color specification,
  1396. * or rgba into scalar values. The color table can be created by direct insertion of color values, or by specifying hue, saturation, value, and alpha range and generating a table
  1397. */
  1398. var LookupTable = /*#__PURE__*/function () {
  1399. /**
  1400. * Creates a default linear LookupTable object with 256 colors.
  1401. */
  1402. function LookupTable() {
  1403. _classCallCheck(this, LookupTable);
  1404. this.NumberOfColors = 256;
  1405. this.Ramp = 'linear';
  1406. this.TableRange = [0, 255];
  1407. this.HueRange = [0, 0.66667];
  1408. this.SaturationRange = [1, 1];
  1409. this.ValueRange = [1, 1];
  1410. this.AlphaRange = [1, 1];
  1411. this.NaNColor = [128, 0, 0, 255];
  1412. this.BelowRangeColor = [0, 0, 0, 255];
  1413. this.UseBelowRangeColor = true;
  1414. this.AboveRangeColor = [255, 255, 255, 255];
  1415. this.UseAboveRangeColor = true;
  1416. this.InputRange = [0, 255];
  1417. this.Table = [];
  1418. }
  1419. /**
  1420. * Specify the number of values (i.e., colors) in the lookup table.
  1421. * @param {Number} number The number of colors in he LookupTable
  1422. * @returns {void}
  1423. * @memberof Colors
  1424. */
  1425. _createClass(LookupTable, [{
  1426. key: "setNumberOfTableValues",
  1427. value: function setNumberOfTableValues(number) {
  1428. this.NumberOfColors = number;
  1429. }
  1430. /**
  1431. * Set the shape of the table ramp to either 'linear', 'scurve' or 'sqrt'
  1432. * @param {String} ramp A string value representing the shape of the table. Allowed values are 'linear', 'scurve' or 'sqrt'
  1433. * @returns {void}
  1434. * @memberof Colors
  1435. */
  1436. }, {
  1437. key: "setRamp",
  1438. value: function setRamp(ramp) {
  1439. this.Ramp = ramp;
  1440. }
  1441. /**
  1442. * Sets the minimum/maximum scalar values for scalar mapping.
  1443. * Scalar values less than minimum range value are clamped to minimum range value.
  1444. * Scalar values greater than maximum range value are clamped to maximum range value.
  1445. * @param {Number} start A double representing the minimum scaler value of the LookupTable
  1446. * @param {any} end A double representing the maximum scaler value of the LookupTable
  1447. * @returns {void}
  1448. * @memberof Colors
  1449. */
  1450. }, {
  1451. key: "setTableRange",
  1452. value: function setTableRange(start, end) {
  1453. this.TableRange[0] = start;
  1454. this.TableRange[1] = end;
  1455. }
  1456. /**
  1457. * Set the range in hue (using automatic generation). Hue ranges between [0,1].
  1458. * @param {Number} start A double representing the minimum hue value in a range. Min. is 0
  1459. * @param {Number} end A double representing the maximum hue value in a range. Max. is 1
  1460. * @returns {void}
  1461. * @memberof Colors
  1462. */
  1463. }, {
  1464. key: "setHueRange",
  1465. value: function setHueRange(start, end) {
  1466. this.HueRange[0] = start;
  1467. this.HueRange[1] = end;
  1468. }
  1469. /**
  1470. * Set the range in saturation (using automatic generation). Saturation ranges between [0,1].
  1471. * @param {Number} start A double representing the minimum Saturation value in a range. Min. is 0
  1472. * @param {Number} end A double representing the maximum Saturation value in a range. Max. is 1
  1473. * @returns {void}
  1474. * @memberof Colors
  1475. */
  1476. }, {
  1477. key: "setSaturationRange",
  1478. value: function setSaturationRange(start, end) {
  1479. this.SaturationRange[0] = start;
  1480. this.SaturationRange[1] = end;
  1481. }
  1482. /**
  1483. * Set the range in value (using automatic generation). Value ranges between [0,1].
  1484. * @param {Numeber } start A double representing the minimum value in a range. Min. is 0
  1485. * @param {Numeber} end A double representing the maximum value in a range. Max. is 1
  1486. * @returns {void}
  1487. * @memberof Colors
  1488. */
  1489. }, {
  1490. key: "setValueRange",
  1491. value: function setValueRange(start, end) {
  1492. // Set the range in value (using automatic generation). Value ranges between [0,1].
  1493. this.ValueRange[0] = start;
  1494. this.ValueRange[1] = end;
  1495. }
  1496. /**
  1497. * (Not Used) Sets the range of scalars which will be mapped.
  1498. * @param {Number} start the minimum scalar value in the range
  1499. * @param {Number} end the maximum scalar value in the range
  1500. * @returns {void}
  1501. * @memberof Colors
  1502. */
  1503. }, {
  1504. key: "setRange",
  1505. value: function setRange(start, end) {
  1506. this.InputRange[0] = start;
  1507. this.InputRange[1] = end;
  1508. }
  1509. /**
  1510. * Set the range in alpha (using automatic generation). Alpha ranges from [0,1].
  1511. * @param {Number} start A double representing the minimum alpha value
  1512. * @param {Number} end A double representing the maximum alpha value
  1513. * @returns {void}
  1514. * @memberof Colors
  1515. */
  1516. }, {
  1517. key: "setAlphaRange",
  1518. value: function setAlphaRange(start, end) {
  1519. // Set the range in alpha (using automatic generation). Alpha ranges from [0,1].
  1520. this.AlphaRange[0] = start;
  1521. this.AlphaRange[1] = end;
  1522. }
  1523. /**
  1524. * Map one value through the lookup table and return the color as an
  1525. * RGBA array of doubles between 0 and 1.
  1526. * @param {Number} scalar A double scalar value which will be mapped to a color in the LookupTable
  1527. * @returns {Number[]} An RGBA array of doubles between 0 and 1
  1528. * @memberof Colors
  1529. */
  1530. }, {
  1531. key: "getColor",
  1532. value: function getColor(scalar) {
  1533. return this.mapValue(scalar);
  1534. }
  1535. /**
  1536. * Generate lookup table from hue, saturation, value, alpha min/max values. Table is built from linear ramp of each value.
  1537. * @param {Boolean} force true to force the build of the LookupTable. Otherwie, false. This is useful if a lookup table has been defined manually
  1538. * (using SetTableValue) and then an application decides to rebuild the lookup table using the implicit process.
  1539. * @returns {void}
  1540. * @memberof Colors
  1541. */
  1542. }, {
  1543. key: "build",
  1544. value: function build(force) {
  1545. if (this.Table.length > 1 && !force) {
  1546. return;
  1547. } // Clear the table
  1548. this.Table = [];
  1549. var maxIndex = this.NumberOfColors - 1;
  1550. var hinc, sinc, vinc, ainc;
  1551. if (maxIndex) {
  1552. hinc = (this.HueRange[1] - this.HueRange[0]) / maxIndex;
  1553. sinc = (this.SaturationRange[1] - this.SaturationRange[0]) / maxIndex;
  1554. vinc = (this.ValueRange[1] - this.ValueRange[0]) / maxIndex;
  1555. ainc = (this.AlphaRange[1] - this.AlphaRange[0]) / maxIndex;
  1556. } else {
  1557. hinc = sinc = vinc = ainc = 0.0;
  1558. }
  1559. for (var i = 0; i <= maxIndex; i++) {
  1560. var hue = this.HueRange[0] + i * hinc;
  1561. var sat = this.SaturationRange[0] + i * sinc;
  1562. var val = this.ValueRange[0] + i * vinc;
  1563. var alpha = this.AlphaRange[0] + i * ainc;
  1564. var rgb = HSVToRGB(hue, sat, val);
  1565. var c_rgba = [];
  1566. switch (this.Ramp) {
  1567. case 'scurve':
  1568. c_rgba[0] = Math.floor(127.5 * (1.0 + Math.cos((1.0 - rgb[0]) * Math.PI)));
  1569. c_rgba[1] = Math.floor(127.5 * (1.0 + Math.cos((1.0 - rgb[1]) * Math.PI)));
  1570. c_rgba[2] = Math.floor(127.5 * (1.0 + Math.cos((1.0 - rgb[2]) * Math.PI)));
  1571. c_rgba[3] = Math.floor(alpha * 255);
  1572. break;
  1573. case 'linear':
  1574. c_rgba[0] = Math.floor(rgb[0] * 255 + 0.5);
  1575. c_rgba[1] = Math.floor(rgb[1] * 255 + 0.5);
  1576. c_rgba[2] = Math.floor(rgb[2] * 255 + 0.5);
  1577. c_rgba[3] = Math.floor(alpha * 255 + 0.5);
  1578. break;
  1579. case 'sqrt':
  1580. c_rgba[0] = Math.floor(Math.sqrt(rgb[0]) * 255 + 0.5);
  1581. c_rgba[1] = Math.floor(Math.sqrt(rgb[1]) * 255 + 0.5);
  1582. c_rgba[2] = Math.floor(Math.sqrt(rgb[2]) * 255 + 0.5);
  1583. c_rgba[3] = Math.floor(Math.sqrt(alpha) * 255 + 0.5);
  1584. break;
  1585. default:
  1586. throw new Error("Invalid Ramp value (".concat(this.Ramp, ")"));
  1587. }
  1588. this.Table.push(c_rgba);
  1589. }
  1590. this.buildSpecialColors();
  1591. }
  1592. /**
  1593. * Ensures the out-of-range colors (Below range and Above range) are set correctly.
  1594. * @returns {void}
  1595. * @memberof Colors
  1596. */
  1597. }, {
  1598. key: "buildSpecialColors",
  1599. value: function buildSpecialColors() {
  1600. var numberOfColors = this.NumberOfColors;
  1601. var belowRangeColorIndex = numberOfColors + BELOW_RANGE_COLOR_INDEX;
  1602. var aboveRangeColorIndex = numberOfColors + ABOVE_RANGE_COLOR_INDEX;
  1603. var nanColorIndex = numberOfColors + NAN_COLOR_INDEX; // Below range color
  1604. if (this.UseBelowRangeColor || numberOfColors === 0) {
  1605. this.Table[belowRangeColorIndex] = this.BelowRangeColor;
  1606. } else {
  1607. // Duplicate the first color in the table.
  1608. this.Table[belowRangeColorIndex] = this.Table[0];
  1609. } // Above range color
  1610. if (this.UseAboveRangeColor || numberOfColors === 0) {
  1611. this.Table[aboveRangeColorIndex] = this.AboveRangeColor;
  1612. } else {
  1613. // Duplicate the last color in the table.
  1614. this.Table[aboveRangeColorIndex] = this.Table[numberOfColors - 1];
  1615. } // Always use NanColor
  1616. this.Table[nanColorIndex] = this.NaNColor;
  1617. }
  1618. /**
  1619. * Similar to GetColor - Map one value through the lookup table and return the color as an
  1620. * RGBA array of doubles between 0 and 1.
  1621. * @param {Numeber} v A double scalar value which will be mapped to a color in the LookupTable
  1622. * @returns {Number[]} An RGBA array of doubles between 0 and 1
  1623. * @memberof Colors
  1624. */
  1625. }, {
  1626. key: "mapValue",
  1627. value: function mapValue(v) {
  1628. var index = this.getIndex(v);
  1629. if (index < 0) {
  1630. return this.NaNColor;
  1631. } else if (index === 0) {
  1632. if (this.UseBelowRangeColor && v < this.TableRange[0]) {
  1633. return this.BelowRangeColor;
  1634. }
  1635. } else if (index === this.NumberOfColors - 1) {
  1636. if (this.UseAboveRangeColor && v > this.TableRange[1]) {
  1637. return this.AboveRangeColor;
  1638. }
  1639. }
  1640. return this.Table[index];
  1641. }
  1642. /**
  1643. * Return the table index associated with a particular value.
  1644. * @param {Number} v A double value which table index will be returned.
  1645. * @returns {Number} The index in the LookupTable
  1646. * @memberof Colors
  1647. */
  1648. }, {
  1649. key: "getIndex",
  1650. value: function getIndex(v) {
  1651. var p = {};
  1652. p.Range = [];
  1653. p.MaxIndex = this.NumberOfColors - 1; // This was LookupShiftAndScale
  1654. p.Shift = -this.TableRange[0];
  1655. if (this.TableRange[1] <= this.TableRange[0]) {
  1656. p.Scale = Number.MAX_VALUE;
  1657. } else {
  1658. p.Scale = p.MaxIndex / (this.TableRange[1] - this.TableRange[0]);
  1659. }
  1660. p.Range[0] = this.TableRange[0];
  1661. p.Range[1] = this.TableRange[1]; // First, check whether we have a number...
  1662. if (isNaN(v)) {
  1663. // For backwards compatibility
  1664. return -1;
  1665. } // Map to an index:
  1666. var index = linearIndexLookupMain(v, p); // For backwards compatibility, if the index indicates an
  1667. // Out-of-range value, truncate to index range for in-range colors.
  1668. if (index === this.NumberOfColors + BELOW_RANGE_COLOR_INDEX) {
  1669. index = 0;
  1670. } else if (index === this.NumberOfColors + ABOVE_RANGE_COLOR_INDEX) {
  1671. index = this.NumberOfColors - 1;
  1672. }
  1673. return index;
  1674. }
  1675. /**
  1676. * Directly load color into lookup table. Use [0,1] double values for color component specification.
  1677. * Make sure that you've either used the Build() method or used SetNumberOfTableValues() prior to using this method.
  1678. * @param {Number} index The index in the LookupTable of where to insert the color value
  1679. * @param {Number[]} rgba An array of [0,1] double values for an RGBA color component
  1680. * @returns {void}
  1681. * @memberof Colors
  1682. */
  1683. }, {
  1684. key: "setTableValue",
  1685. value: function setTableValue(index, rgba) {
  1686. // Check if it index, red, green, blue and alpha were passed as parameter
  1687. if (arguments.length === 5) {
  1688. rgba = Array.prototype.slice.call(arguments, 1);
  1689. } // Check the index to make sure it is valid
  1690. if (index < 0) {
  1691. throw new Error("Can't set the table value for negative index (".concat(index, ")"));
  1692. }
  1693. if (index >= this.NumberOfColors) {
  1694. new Error("Index ".concat(index, " is greater than the number of colors ").concat(this.NumberOfColors));
  1695. }
  1696. this.Table[index] = rgba;
  1697. if (index === 0 || index === this.NumberOfColors - 1) {
  1698. // This is needed due to the way the special colors are stored in
  1699. // The internal table. If Above/BelowRangeColors are not used and
  1700. // The min/max colors are changed in the table with this member
  1701. // Function, then the colors used for values outside the range may
  1702. // Be incorrect. Calling this here ensures the out-of-range colors
  1703. // Are set correctly.
  1704. this.buildSpecialColors();
  1705. }
  1706. }
  1707. }]);
  1708. return LookupTable;
  1709. }();
  1710. /* harmony default export */ __webpack_exports__["default"] = (LookupTable);
  1711. /***/ }),
  1712. /***/ "./disable.js":
  1713. /*!********************!*\
  1714. !*** ./disable.js ***!
  1715. \********************/
  1716. /*! exports provided: default */
  1717. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  1718. "use strict";
  1719. __webpack_require__.r(__webpack_exports__);
  1720. /* harmony import */ var _enabledElements_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./enabledElements.js */ "./enabledElements.js");
  1721. /* harmony import */ var _triggerEvent_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./triggerEvent.js */ "./triggerEvent.js");
  1722. /* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./events.js */ "./events.js");
  1723. /**
  1724. * Disable an HTML element for further use in Cornerstone
  1725. *
  1726. * @param {HTMLElement} element An HTML Element enabled for Cornerstone
  1727. * @returns {void}
  1728. * @memberof Enable
  1729. */
  1730. /* harmony default export */ __webpack_exports__["default"] = (function (element) {
  1731. if (element === undefined) {
  1732. throw new Error('disable: element must not be undefined');
  1733. } // Search for this element in this list of enabled elements
  1734. var enabledElements = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_0__["getEnabledElements"])();
  1735. for (var i = 0; i < enabledElements.length; i++) {
  1736. if (enabledElements[i].element === element) {
  1737. // We found it!
  1738. // Fire an event so dependencies can cleanup
  1739. var eventData = {
  1740. element: element
  1741. };
  1742. Object(_triggerEvent_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element, _events_js__WEBPACK_IMPORTED_MODULE_2__["default"].ELEMENT_DISABLED, eventData);
  1743. Object(_triggerEvent_js__WEBPACK_IMPORTED_MODULE_1__["default"])(_events_js__WEBPACK_IMPORTED_MODULE_2__["events"], _events_js__WEBPACK_IMPORTED_MODULE_2__["default"].ELEMENT_DISABLED, eventData); // Remove the child DOM elements that we created (e.g.canvas)
  1744. enabledElements[i].element.removeChild(enabledElements[i].canvas);
  1745. enabledElements[i].canvas = undefined; // Remove this element from the list of enabled elements
  1746. enabledElements.splice(i, 1);
  1747. break;
  1748. }
  1749. }
  1750. });
  1751. /***/ }),
  1752. /***/ "./displayImage.js":
  1753. /*!*************************!*\
  1754. !*** ./displayImage.js ***!
  1755. \*************************/
  1756. /*! exports provided: default */
  1757. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  1758. "use strict";
  1759. __webpack_require__.r(__webpack_exports__);
  1760. /* harmony import */ var _enabledElements_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./enabledElements.js */ "./enabledElements.js");
  1761. /* harmony import */ var _internal_getDefaultViewport_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/getDefaultViewport.js */ "./internal/getDefaultViewport.js");
  1762. /* harmony import */ var _updateImage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./updateImage.js */ "./updateImage.js");
  1763. /* harmony import */ var _internal_now_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./internal/now.js */ "./internal/now.js");
  1764. /* harmony import */ var _layers_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./layers.js */ "./layers.js");
  1765. /* harmony import */ var _triggerEvent_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./triggerEvent.js */ "./triggerEvent.js");
  1766. /* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./events.js */ "./events.js");
  1767. /**
  1768. * Sets a new image object for a given element.
  1769. *
  1770. * Will also apply an optional viewport setting.
  1771. *
  1772. * @param {HTMLElement} element An HTML Element enabled for Cornerstone
  1773. * @param {Object} image An Image loaded by a Cornerstone Image Loader
  1774. * @param {Object} [viewport] A set of Cornerstone viewport parameters
  1775. * @returns {void}
  1776. * @memberof Drawing
  1777. */
  1778. /* harmony default export */ __webpack_exports__["default"] = (function (element, image, viewport) {
  1779. if (element === undefined) {
  1780. throw new Error('displayImage: parameter element must not be undefined');
  1781. }
  1782. if (image === undefined) {
  1783. throw new Error('displayImage: parameter image must not be undefined');
  1784. }
  1785. var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_0__["getEnabledElement"])(element);
  1786. var oldImage = enabledElement.image;
  1787. enabledElement.image = image;
  1788. if (enabledElement.layers && enabledElement.layers.length) {
  1789. Object(_layers_js__WEBPACK_IMPORTED_MODULE_4__["setLayerImage"])(element, image);
  1790. }
  1791. if (enabledElement.viewport === undefined) {
  1792. enabledElement.viewport = Object(_internal_getDefaultViewport_js__WEBPACK_IMPORTED_MODULE_1__["default"])(enabledElement.canvas, image);
  1793. } // Merge viewport
  1794. if (viewport) {
  1795. for (var attrname in viewport) {
  1796. if (viewport[attrname] !== null) {
  1797. enabledElement.viewport[attrname] = viewport[attrname];
  1798. }
  1799. }
  1800. }
  1801. var frameRate;
  1802. if (enabledElement.lastImageTimeStamp !== undefined) {
  1803. var timeSinceLastImage = Object(_internal_now_js__WEBPACK_IMPORTED_MODULE_3__["default"])() - enabledElement.lastImageTimeStamp;
  1804. frameRate = (1000 / timeSinceLastImage).toFixed();
  1805. }
  1806. enabledElement.lastImageTimeStamp = Object(_internal_now_js__WEBPACK_IMPORTED_MODULE_3__["default"])();
  1807. var newImageEventData = {
  1808. viewport: enabledElement.viewport,
  1809. element: enabledElement.element,
  1810. image: enabledElement.image,
  1811. oldImage: oldImage,
  1812. enabledElement: enabledElement,
  1813. frameRate: frameRate
  1814. };
  1815. Object(_triggerEvent_js__WEBPACK_IMPORTED_MODULE_5__["default"])(enabledElement.element, _events_js__WEBPACK_IMPORTED_MODULE_6__["default"].NEW_IMAGE, newImageEventData);
  1816. Object(_updateImage_js__WEBPACK_IMPORTED_MODULE_2__["default"])(element);
  1817. });
  1818. /***/ }),
  1819. /***/ "./draw.js":
  1820. /*!*****************!*\
  1821. !*** ./draw.js ***!
  1822. \*****************/
  1823. /*! exports provided: default */
  1824. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  1825. "use strict";
  1826. __webpack_require__.r(__webpack_exports__);
  1827. /* harmony import */ var _enabledElements_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./enabledElements.js */ "./enabledElements.js");
  1828. /* harmony import */ var _internal_drawImage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/drawImage.js */ "./internal/drawImage.js");
  1829. /**
  1830. * Immediately draws the enabled element
  1831. *
  1832. * @param {HTMLElement} element An HTML Element enabled for Cornerstone
  1833. * @returns {void}
  1834. * @memberof Drawing
  1835. */
  1836. /* harmony default export */ __webpack_exports__["default"] = (function (element) {
  1837. var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_0__["getEnabledElement"])(element);
  1838. Object(_internal_drawImage_js__WEBPACK_IMPORTED_MODULE_1__["default"])(enabledElement);
  1839. });
  1840. /***/ }),
  1841. /***/ "./drawInvalidated.js":
  1842. /*!****************************!*\
  1843. !*** ./drawInvalidated.js ***!
  1844. \****************************/
  1845. /*! exports provided: default */
  1846. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  1847. "use strict";
  1848. __webpack_require__.r(__webpack_exports__);
  1849. /* harmony import */ var _enabledElements_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./enabledElements.js */ "./enabledElements.js");
  1850. /* harmony import */ var _internal_drawImage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/drawImage.js */ "./internal/drawImage.js");
  1851. /**
  1852. * This module is responsible for drawing invalidated enabled elements
  1853. */
  1854. /**
  1855. * Draws all invalidated enabled elements and clears the invalid flag after drawing it
  1856. *
  1857. * @returns {void}
  1858. * @memberof Drawing
  1859. */
  1860. /* harmony default export */ __webpack_exports__["default"] = (function () {
  1861. var enabledElements = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_0__["getEnabledElements"])();
  1862. for (var i = 0; i < enabledElements.length; i++) {
  1863. var ee = enabledElements[i];
  1864. if (ee.invalid === true) {
  1865. Object(_internal_drawImage_js__WEBPACK_IMPORTED_MODULE_1__["default"])(ee, true);
  1866. }
  1867. }
  1868. });
  1869. /***/ }),
  1870. /***/ "./enable.js":
  1871. /*!*******************!*\
  1872. !*** ./enable.js ***!
  1873. \*******************/
  1874. /*! exports provided: default */
  1875. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  1876. "use strict";
  1877. __webpack_require__.r(__webpack_exports__);
  1878. /* harmony import */ var _enabledElements_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./enabledElements.js */ "./enabledElements.js");
  1879. /* harmony import */ var _resize_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./resize.js */ "./resize.js");
  1880. /* harmony import */ var _internal_drawImageSync_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/drawImageSync.js */ "./internal/drawImageSync.js");
  1881. /* harmony import */ var _internal_requestAnimationFrame_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./internal/requestAnimationFrame.js */ "./internal/requestAnimationFrame.js");
  1882. /* harmony import */ var _internal_tryEnableWebgl_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./internal/tryEnableWebgl.js */ "./internal/tryEnableWebgl.js");
  1883. /* harmony import */ var _triggerEvent_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./triggerEvent.js */ "./triggerEvent.js");
  1884. /* harmony import */ var _generateUUID_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./generateUUID.js */ "./generateUUID.js");
  1885. /* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./events.js */ "./events.js");
  1886. /* harmony import */ var _internal_getCanvas_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./internal/getCanvas.js */ "./internal/getCanvas.js");
  1887. /**
  1888. * @module Enable
  1889. * This module is responsible for enabling an element to display images with cornerstone
  1890. */
  1891. /**
  1892. * Returns whether or not an Enabled Element has either a currently active image or
  1893. * a non-empty Array of Enabled Element Layers.
  1894. *
  1895. * @param {EnabledElement} enabledElement An Enabled Element
  1896. * @return {Boolean} Whether or not the Enabled Element has an active image or valid set of layers
  1897. * @memberof Enable
  1898. */
  1899. function hasImageOrLayers(enabledElement) {
  1900. return enabledElement.image !== undefined || enabledElement.layers.length > 0;
  1901. }
  1902. /**
  1903. * Enable an HTML Element for use in Cornerstone
  1904. *
  1905. * - If there is a Canvas already present within the HTMLElement, and it has the class
  1906. * 'cornerstone-canvas', this function will use this existing Canvas instead of creating
  1907. * a new one. This may be helpful when using libraries (e.g. React, Vue) which don't
  1908. * want third parties to change the DOM.
  1909. *
  1910. * @param {HTMLElement} element An HTML Element enabled for Cornerstone
  1911. * @param {Object} options Options for the enabledElement
  1912. *
  1913. * @return {void}
  1914. * @memberof Enable
  1915. */
  1916. /* harmony default export */ __webpack_exports__["default"] = (function (element, options) {
  1917. if (element === undefined) {
  1918. throw new Error('enable: parameter element cannot be undefined');
  1919. } // If this enabled element has the option set for WebGL, we should
  1920. // Check if this device actually supports it
  1921. if (options && options.renderer && options.renderer.toLowerCase() === 'webgl') {
  1922. Object(_internal_tryEnableWebgl_js__WEBPACK_IMPORTED_MODULE_4__["default"])(options);
  1923. }
  1924. var canvas = Object(_internal_getCanvas_js__WEBPACK_IMPORTED_MODULE_8__["default"])(element);
  1925. var enabledElement = {
  1926. element: element,
  1927. canvas: canvas,
  1928. image: undefined,
  1929. // Will be set once image is loaded
  1930. invalid: false,
  1931. // True if image needs to be drawn, false if not
  1932. needsRedraw: true,
  1933. options: Object.assign({}, options),
  1934. layers: [],
  1935. data: {},
  1936. renderingTools: {},
  1937. uuid: Object(_generateUUID_js__WEBPACK_IMPORTED_MODULE_6__["default"])()
  1938. };
  1939. Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_0__["addEnabledElement"])(enabledElement);
  1940. Object(_triggerEvent_js__WEBPACK_IMPORTED_MODULE_5__["default"])(_events_js__WEBPACK_IMPORTED_MODULE_7__["events"], _events_js__WEBPACK_IMPORTED_MODULE_7__["default"].ELEMENT_ENABLED, enabledElement);
  1941. Object(_resize_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element, true);
  1942. /**
  1943. * Draw the image immediately
  1944. *
  1945. * @param {DOMHighResTimeStamp} timestamp The current time for when requestAnimationFrame starts to fire callbacks
  1946. * @returns {void}
  1947. * @memberof Drawing
  1948. */
  1949. function draw(timestamp) {
  1950. if (enabledElement.canvas === undefined) {
  1951. return;
  1952. }
  1953. var eventDetails = {
  1954. enabledElement: enabledElement,
  1955. timestamp: timestamp
  1956. };
  1957. Object(_triggerEvent_js__WEBPACK_IMPORTED_MODULE_5__["default"])(enabledElement.element, _events_js__WEBPACK_IMPORTED_MODULE_7__["default"].PRE_RENDER, eventDetails);
  1958. if (enabledElement.needsRedraw && hasImageOrLayers(enabledElement)) {
  1959. Object(_internal_drawImageSync_js__WEBPACK_IMPORTED_MODULE_2__["default"])(enabledElement, enabledElement.invalid);
  1960. }
  1961. Object(_internal_requestAnimationFrame_js__WEBPACK_IMPORTED_MODULE_3__["default"])(draw);
  1962. }
  1963. draw();
  1964. });
  1965. /***/ }),
  1966. /***/ "./enabledElementData.js":
  1967. /*!*******************************!*\
  1968. !*** ./enabledElementData.js ***!
  1969. \*******************************/
  1970. /*! exports provided: getElementData, removeElementData */
  1971. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  1972. "use strict";
  1973. __webpack_require__.r(__webpack_exports__);
  1974. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getElementData", function() { return getElementData; });
  1975. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeElementData", function() { return removeElementData; });
  1976. /* harmony import */ var _enabledElements_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./enabledElements.js */ "./enabledElements.js");
  1977. /**
  1978. * Retrieves any data for a Cornerstone enabledElement for a specific string
  1979. * dataType
  1980. *
  1981. * @param {HTMLElement} element An HTML Element enabled for Cornerstone
  1982. * @param {string} dataType A string name for an arbitrary set of data
  1983. * @returns {*} Whatever data is stored for this enabled element
  1984. */
  1985. function getElementData(element, dataType) {
  1986. var ee = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_0__["getEnabledElement"])(element);
  1987. if (ee.data.hasOwnProperty(dataType) === false) {
  1988. ee.data[dataType] = {};
  1989. }
  1990. return ee.data[dataType];
  1991. }
  1992. /**
  1993. * Clears any data for a Cornerstone enabledElement for a specific string
  1994. * dataType
  1995. *
  1996. * @param {HTMLElement} element An HTML Element enabled for Cornerstone
  1997. * @param {string} dataType A string name for an arbitrary set of data
  1998. *
  1999. * @returns {void}
  2000. */
  2001. function removeElementData(element, dataType) {
  2002. var ee = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_0__["getEnabledElement"])(element);
  2003. delete ee.data[dataType];
  2004. }
  2005. /***/ }),
  2006. /***/ "./enabledElements.js":
  2007. /*!****************************!*\
  2008. !*** ./enabledElements.js ***!
  2009. \****************************/
  2010. /*! exports provided: getEnabledElement, addEnabledElement, getEnabledElementsByImageId, getEnabledElements */
  2011. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  2012. "use strict";
  2013. __webpack_require__.r(__webpack_exports__);
  2014. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getEnabledElement", function() { return getEnabledElement; });
  2015. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addEnabledElement", function() { return addEnabledElement; });
  2016. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getEnabledElementsByImageId", function() { return getEnabledElementsByImageId; });
  2017. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getEnabledElements", function() { return getEnabledElements; });
  2018. var enabledElements = [];
  2019. /**
  2020. * @module EnabledElements
  2021. */
  2022. /**
  2023. * @module Objects
  2024. */
  2025. /**
  2026. * A two-dimensional vector
  2027. *
  2028. * @typedef {Object} vec2
  2029. * @memberof Objects
  2030. * @param {Number} x - The x distance
  2031. * @param {Number} y - The y distance
  2032. */
  2033. /**
  2034. * VOI
  2035. *
  2036. * @typedef {Object} VOI
  2037. * @memberof Objects
  2038. * @param {Number} windowWidth - Window Width for display
  2039. * @param {Number} windowCenter - Window Center for display
  2040. */
  2041. /**
  2042. * Lookup Table Array
  2043. *
  2044. * @typedef {Object} LUT
  2045. * @memberof Objects
  2046. * @property {Number} firstValueMapped
  2047. * @property {Number} numBitsPerEntry
  2048. * @property {Array} lut
  2049. */
  2050. /**
  2051. * Image Statistics Object
  2052. *
  2053. * @typedef {Object} ImageStats
  2054. * @memberof Objects
  2055. * @property {Number} [lastGetPixelDataTime] The time in ms taken to retrieve stored pixels required to draw the image
  2056. * @property {Number} [lastStoredPixelDataToCanvasImageDataTime] The time in ms taken to map from stored pixel array to canvas pixel array
  2057. * @property {Number} [lastPutImageDataTime] The time in ms taken for putImageData to put the canvas pixel data into the canvas context
  2058. * @property {Number} [lastRenderTime] The total time in ms taken for the entire rendering function to run
  2059. * @property {Number} [lastLutGenerateTime] The time in ms taken to generate the lookup table for the image
  2060. */
  2061. /**
  2062. * An Image Object in Cornerstone
  2063. *
  2064. * @typedef {Object} Image
  2065. * @memberof Objects
  2066. * @property {string} imageId - The imageId associated with this image object
  2067. * @property {Number} minPixelValue - the minimum stored pixel value in the image
  2068. * @property {Number} maxPixelValue - the maximum stored pixel value in the image
  2069. * @property {Number} slope - the rescale slope to convert stored pixel values to modality pixel values or 1 if not specified
  2070. * @property {Number} intercept - the rescale intercept used to convert stored pixel values to modality values or 0 if not specified
  2071. * @property {Number} windowCenter - the default windowCenter to apply to the image
  2072. * @property {Number} windowWidth - the default windowWidth to apply to the image
  2073. * @property {function} getPixelData - a function that returns the underlying pixel data. An array of integers for grayscale and an array of RGBA for color
  2074. * @property {function} getImageData - a function that returns a canvas imageData object for the image. This is only needed for color images
  2075. * @property {function} getCanvas - a function that returns a canvas element with the image loaded into it. This is only needed for color images.
  2076. * @property {function} getImage - a function that returns a JavaScript Image object with the image data. This is optional and typically used for images encoded in standard web JPEG and PNG formats
  2077. * @property {Number} rows - number of rows in the image. This is the same as height but duplicated for convenience
  2078. * @property {Number} columns - number of columns in the image. This is the same as width but duplicated for convenience
  2079. * @property {Number} height - the height of the image. This is the same as rows but duplicated for convenience
  2080. * @property {Number} width - the width of the image. This is the same as columns but duplicated for convenience
  2081. * @property {Boolean} color - true if pixel data is RGB, false if grayscale
  2082. * @property {Object} lut - The Lookup Table
  2083. * @property {Boolean} rgba - Is the color pixel data stored in RGBA?
  2084. * @property {Number} columnPixelSpacing - horizontal distance between the middle of each pixel (or width of each pixel) in mm or undefined if not known
  2085. * @property {Number} rowPixelSpacing - vertical distance between the middle of each pixel (or height of each pixel) in mm or undefined if not known
  2086. * @property {Boolean} invert - true if the the image should initially be displayed be inverted, false if not. This is here mainly to support DICOM images with a photometric interpretation of MONOCHROME1
  2087. * @property {Number} sizeInBytes - the number of bytes used to store the pixels for this image.
  2088. * @property {Boolean} [falseColor=false] - Whether or not the image has undergone false color mapping
  2089. * @property {Array} [origPixelData] - Original pixel data for an image after it has undergone false color mapping
  2090. * @property {ImageStats} [stats] - Statistics for the last redraw of the image
  2091. * @property {Object} cachedLut - Cached Lookup Table for this image.
  2092. * @property {String|Colormap} [colormap] - Depreacted. Use viewport.colormap instead. an optional colormap ID or colormap object (from colors/colormap.js). This will be applied during rendering to convert the image to pseudocolor
  2093. * @property {Boolean} [labelmap=false] - whether or not to render this image as a label map (i.e. skip modality and VOI LUT pipelines and use only a color lookup table)
  2094. */
  2095. /**
  2096. * A Viewport Settings Object Cornerstone
  2097. *
  2098. * @typedef {Object} Viewport
  2099. * @memberof Objects
  2100. * @property {Number} [scale=1.0] - The scale applied to the image. A scale of 1.0 will display no zoom (one image pixel takes up one screen pixel). A scale of 2.0 will be double zoom and a scale of .5 will be zoomed out by 2x
  2101. * @property {vec2} [translation] - An object with properties x and y which describe the translation to apply in the pixel coordinate system. Note that the image is initially displayed centered in the enabled element with a x and y translation of 0 and 0 respectively.
  2102. * @property {VOI} [voi] - an object with properties windowWidth and windowCenter.
  2103. * @property {boolean} [invert=false] - Whether or not the image is inverted.
  2104. * @property {boolean} [pixelReplication=false] - true if the image smooth / interpolation should be used when zoomed in on the image or false if pixel replication should be used.
  2105. * @property {boolean} [hflip=false] - true if the image is flipped horizontally. Default is false
  2106. * @property {boolean} [vflip=false] - true if the image is flipped vertically. Default is false
  2107. * @property {Number} [rotation=0] - the rotation of the image (90 degree increments). Default is 0
  2108. * @property {LUT} [modalityLUT] - the modality LUT to apply or undefined if none
  2109. * @property {LUT} [voiLUT] - the modality LUT to apply or undefined if none
  2110. * @property {String|Colormap} [colormap] - an optional colormap ID or colormap object (from colors/colormap.js). This will be applied during rendering to convert the image to pseudocolor
  2111. * @property {Boolean} [labelmap=false] - whether or not to render this image as a label map (i.e. skip modality and VOI LUT pipelines and use only a color lookup table)
  2112. */
  2113. /**
  2114. * An Enabled Element in Cornerstone
  2115. *
  2116. * @typedef {Object} EnabledElement
  2117. * @memberof Objects
  2118. * @property {HTMLElement} element - The DOM element which has been enabled for use by Cornerstone
  2119. * @property {Image} [image] - The image currently displayed in the enabledElement
  2120. * @property {Viewport} [viewport] - The current viewport settings of the enabledElement
  2121. * @property {HTMLCanvasElement} [canvas] - The current canvas for this enabledElement
  2122. * @property {Boolean} invalid - Whether or not the image pixel data underlying the enabledElement has been changed, necessitating a redraw
  2123. * @property {Boolean} needsRedraw - A flag for triggering a redraw of the canvas without re-retrieving the pixel data, since it remains valid
  2124. * @property {EnabledElementLayer[]} [layers] - The layers that have been added to the enabledElement
  2125. * @property {Boolean} [syncViewports] - Whether or not to synchronize the viewport parameters
  2126. * for each of the enabled element's layers
  2127. * @property {Boolean} [lastSyncViewportsState] - The previous state for the sync viewport boolean
  2128. */
  2129. /**
  2130. * An Enabled Element Layer in Cornerstone
  2131. *
  2132. * @typedef {Object} EnabledElementLayer
  2133. * @memberof Objects
  2134. * @property {HTMLElement} element - The DOM element which has been enabled for use by Cornerstone
  2135. * @property {Image} [image] - The image currently displayed in the enabledElement
  2136. * @property {Viewport} [viewport] - The current viewport settings of the enabledElement
  2137. * @property {HTMLCanvasElement} [canvas] - The current canvas for this enabledElement
  2138. * @property {Object} [options] - Layer drawing options
  2139. * @property {Boolean} invalid - Whether or not the image pixel data underlying the enabledElement has been changed, necessitating a redraw
  2140. * @property {Boolean} needsRedraw - A flag for triggering a redraw of the canvas without re-retrieving the pixel data, since it remains valid
  2141. */
  2142. /**
  2143. * An Image Load Object
  2144. *
  2145. * @typedef {Object} ImageLoadObject
  2146. * @memberof Objects
  2147. * @property {Promise} promise - The Promise tracking the loading of this image
  2148. * @property {Function|undefined} cancelFn - A function to cancel the image load request
  2149. */
  2150. /**
  2151. * Retrieves a Cornerstone Enabled Element object
  2152. *
  2153. * @param {HTMLElement} element An HTML Element enabled for Cornerstone
  2154. *
  2155. * @returns {EnabledElement} A Cornerstone Enabled Element
  2156. * @memberof EnabledElements
  2157. */
  2158. function getEnabledElement(element) {
  2159. if (element === undefined) {
  2160. throw new Error('getEnabledElement: parameter element must not be undefined');
  2161. }
  2162. for (var i = 0; i < enabledElements.length; i++) {
  2163. if (enabledElements[i].element === element) {
  2164. return enabledElements[i];
  2165. }
  2166. }
  2167. throw new Error('element not enabled');
  2168. }
  2169. /**
  2170. * Adds a Cornerstone Enabled Element object to the central store of enabledElements
  2171. *
  2172. * @param {EnabledElement} enabledElement A Cornerstone enabledElement Object
  2173. * @returns {void}
  2174. * @memberof EnabledElements
  2175. */
  2176. function addEnabledElement(enabledElement) {
  2177. if (enabledElement === undefined) {
  2178. throw new Error('getEnabledElement: enabledElement element must not be undefined');
  2179. }
  2180. enabledElements.push(enabledElement);
  2181. }
  2182. /**
  2183. * Adds a Cornerstone Enabled Element object to the central store of enabledElements
  2184. *
  2185. * @param {string} imageId A Cornerstone Image ID
  2186. * @returns {EnabledElement[]} An Array of Cornerstone enabledElement Objects
  2187. * @memberof EnabledElements
  2188. */
  2189. function getEnabledElementsByImageId(imageId) {
  2190. var ees = [];
  2191. enabledElements.forEach(function (enabledElement) {
  2192. if (enabledElement.image && enabledElement.image.imageId === imageId) {
  2193. ees.push(enabledElement);
  2194. }
  2195. });
  2196. return ees;
  2197. }
  2198. /**
  2199. * Retrieve all of the currently enabled Cornerstone elements
  2200. *
  2201. * @return {EnabledElement[]} An Array of Cornerstone enabledElement Objects
  2202. * @memberof EnabledElements
  2203. */
  2204. function getEnabledElements() {
  2205. return enabledElements;
  2206. }
  2207. /***/ }),
  2208. /***/ "./events.js":
  2209. /*!*******************!*\
  2210. !*** ./events.js ***!
  2211. \*******************/
  2212. /*! exports provided: default, events */
  2213. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  2214. "use strict";
  2215. __webpack_require__.r(__webpack_exports__);
  2216. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "events", function() { return events; });
  2217. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  2218. function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
  2219. function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
  2220. var EVENTS = {
  2221. NEW_IMAGE: 'cornerstonenewimage',
  2222. INVALIDATED: 'cornerstoneinvalidated',
  2223. PRE_RENDER: 'cornerstoneprerender',
  2224. IMAGE_CACHE_MAXIMUM_SIZE_CHANGED: 'cornerstoneimagecachemaximumsizechanged',
  2225. IMAGE_CACHE_PROMISE_REMOVED: 'cornerstoneimagecachepromiseremoved',
  2226. IMAGE_CACHE_FULL: 'cornerstoneimagecachefull',
  2227. IMAGE_CACHE_CHANGED: 'cornerstoneimagecachechanged',
  2228. WEBGL_TEXTURE_REMOVED: 'cornerstonewebgltextureremoved',
  2229. WEBGL_TEXTURE_CACHE_FULL: 'cornerstonewebgltexturecachefull',
  2230. IMAGE_LOADED: 'cornerstoneimageloaded',
  2231. IMAGE_LOAD_PROGRESS: 'cornerstoneimageloadprogress',
  2232. IMAGE_LOAD_FAILED: 'cornerstoneimageloadfailed',
  2233. ELEMENT_RESIZED: 'cornerstoneelementresized',
  2234. IMAGE_RENDERED: 'cornerstoneimagerendered',
  2235. LAYER_ADDED: 'cornerstonelayeradded',
  2236. LAYER_REMOVED: 'cornerstonelayerremoved',
  2237. ACTIVE_LAYER_CHANGED: 'cornerstoneactivelayerchanged',
  2238. ELEMENT_DISABLED: 'cornerstoneelementdisabled',
  2239. ELEMENT_ENABLED: 'cornerstoneelementenabled'
  2240. };
  2241. /* harmony default export */ __webpack_exports__["default"] = (EVENTS);
  2242. /**
  2243. * EventTarget - Provides the [EventTarget](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget) interface
  2244. *
  2245. * @class
  2246. * @memberof Polyfills
  2247. */
  2248. var EventTarget = /*#__PURE__*/function () {
  2249. function EventTarget() {
  2250. _classCallCheck(this, EventTarget);
  2251. this.listeners = {};
  2252. this.namespaces = {};
  2253. }
  2254. _createClass(EventTarget, [{
  2255. key: "addEventNamespaceListener",
  2256. value: function addEventNamespaceListener(type, callback) {
  2257. if (type.indexOf('.') <= 0) {
  2258. return;
  2259. }
  2260. this.namespaces[type] = callback;
  2261. this.addEventListener(type.split('.')[0], callback);
  2262. }
  2263. }, {
  2264. key: "removeEventNamespaceListener",
  2265. value: function removeEventNamespaceListener(type) {
  2266. if (type.indexOf('.') <= 0 || !this.namespaces[type]) {
  2267. return;
  2268. }
  2269. this.removeEventListener(type.split('.')[0], this.namespaces[type]);
  2270. delete this.namespaces[type];
  2271. }
  2272. }, {
  2273. key: "addEventListener",
  2274. value: function addEventListener(type, callback) {
  2275. // Check if it is an event namespace
  2276. if (type.indexOf('.') > 0) {
  2277. this.addEventNamespaceListener(type, callback);
  2278. return;
  2279. }
  2280. if (!(type in this.listeners)) {
  2281. this.listeners[type] = [];
  2282. }
  2283. this.listeners[type].push(callback);
  2284. }
  2285. }, {
  2286. key: "removeEventListener",
  2287. value: function removeEventListener(type, callback) {
  2288. // Check if it is an event namespace
  2289. if (type.indexOf('.') > 0) {
  2290. this.removeEventNamespaceListener(type);
  2291. return;
  2292. }
  2293. if (!(type in this.listeners)) {
  2294. return;
  2295. }
  2296. var stack = this.listeners[type];
  2297. for (var i = 0, l = stack.length; i < l; i++) {
  2298. if (stack[i] === callback) {
  2299. stack.splice(i, 1);
  2300. return;
  2301. }
  2302. }
  2303. }
  2304. }, {
  2305. key: "dispatchEvent",
  2306. value: function dispatchEvent(event) {
  2307. if (!(event.type in this.listeners)) {
  2308. return true;
  2309. }
  2310. var stack = this.listeners[event.type].slice();
  2311. for (var i = 0, l = stack.length; i < l; i++) {
  2312. stack[i].call(this, event);
  2313. }
  2314. return !event.defaultPrevented;
  2315. }
  2316. }]);
  2317. return EventTarget;
  2318. }();
  2319. var events = new EventTarget();
  2320. /***/ }),
  2321. /***/ "./falseColorMapping.js":
  2322. /*!******************************!*\
  2323. !*** ./falseColorMapping.js ***!
  2324. \******************************/
  2325. /*! exports provided: convertImageToFalseColorImage, convertToFalseColorImage, restoreImage */
  2326. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  2327. "use strict";
  2328. __webpack_require__.r(__webpack_exports__);
  2329. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "convertImageToFalseColorImage", function() { return convertImageToFalseColorImage; });
  2330. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "convertToFalseColorImage", function() { return convertToFalseColorImage; });
  2331. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "restoreImage", function() { return restoreImage; });
  2332. /* harmony import */ var _enabledElements_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./enabledElements.js */ "./enabledElements.js");
  2333. /* harmony import */ var _pixelDataToFalseColorData_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./pixelDataToFalseColorData.js */ "./pixelDataToFalseColorData.js");
  2334. /* harmony import */ var _colors_colormap_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./colors/colormap.js */ "./colors/colormap.js");
  2335. /**
  2336. * Retrieves the minimum and maximum pixel values from an Array of pixel data
  2337. *
  2338. * @param {Array} pixelData The input pixel data array
  2339. *
  2340. * @returns {{minPixelValue: Number, maxPixelValue: Number}} The minimum and maximum pixel values in the input Array
  2341. */
  2342. function getPixelValues(pixelData) {
  2343. var minPixelValue = Number.MAX_VALUE;
  2344. var maxPixelValue = Number.MIN_VALUE;
  2345. var len = pixelData.length;
  2346. var pixel;
  2347. for (var i = 0; i < len; i++) {
  2348. pixel = pixelData[i];
  2349. minPixelValue = minPixelValue < pixel ? minPixelValue : pixel;
  2350. maxPixelValue = maxPixelValue > pixel ? maxPixelValue : pixel;
  2351. }
  2352. return {
  2353. minPixelValue: minPixelValue,
  2354. maxPixelValue: maxPixelValue
  2355. };
  2356. }
  2357. /**
  2358. * Retrieve a function that will allow an image object to be reset to its original form
  2359. * after a false color mapping transformation
  2360. *
  2361. * @param {Image} image A Cornerstone Image Object
  2362. *
  2363. * @return {Function} A function for resetting an Image Object to its original form
  2364. */
  2365. function getRestoreImageMethod(image) {
  2366. if (image.restore) {
  2367. return image.restore;
  2368. }
  2369. var color = image.color;
  2370. var rgba = image.rgba;
  2371. var cachedLut = image.cachedLut;
  2372. var slope = image.slope;
  2373. var windowWidth = image.windowWidth;
  2374. var windowCenter = image.windowCenter;
  2375. var minPixelValue = image.minPixelValue;
  2376. var maxPixelValue = image.maxPixelValue;
  2377. return function () {
  2378. image.color = color;
  2379. image.rgba = rgba;
  2380. image.cachedLut = cachedLut;
  2381. image.slope = slope;
  2382. image.windowWidth = windowWidth;
  2383. image.windowCenter = windowCenter;
  2384. image.minPixelValue = minPixelValue;
  2385. image.maxPixelValue = maxPixelValue;
  2386. if (image.origPixelData) {
  2387. var pixelData = image.origPixelData;
  2388. image.getPixelData = function () {
  2389. return pixelData;
  2390. };
  2391. } // Remove some attributes added by false color mapping
  2392. image.origPixelData = undefined;
  2393. image.colormapId = undefined;
  2394. image.falseColor = undefined;
  2395. };
  2396. } //
  2397. // Then we need to make sure it will be converted into a colormap object if it's as string.
  2398. /**
  2399. * User can pass a colormap or its id as string to some of these public functions.
  2400. * Then we need to make sure it will be converted into a colormap object if it's a string.
  2401. *
  2402. * @param {*} colormap A colormap ID or Object
  2403. * @return {*} The colormap
  2404. */
  2405. function ensuresColormap(colormap) {
  2406. if (colormap && typeof colormap === 'string') {
  2407. colormap = Object(_colors_colormap_js__WEBPACK_IMPORTED_MODULE_2__["getColormap"])(colormap);
  2408. }
  2409. return colormap;
  2410. }
  2411. /**
  2412. * Restores a false color image to its original version
  2413. *
  2414. * @param {Image} image A Cornerstone Image Object
  2415. * @returns {Boolean} True if the image object had a valid restore function, which was run. Otherwise, false.
  2416. */
  2417. function restoreImage(image) {
  2418. if (image.restore && typeof image.restore === 'function') {
  2419. image.restore();
  2420. return true;
  2421. }
  2422. return false;
  2423. }
  2424. /**
  2425. * Convert an image to a false color image
  2426. *
  2427. * @param {Image} image A Cornerstone Image Object
  2428. * @param {String|Object} colormap - it can be a colormap object or a colormap id (string)
  2429. *
  2430. * @returns {Boolean} - Whether or not the image has been converted to a false color image
  2431. */
  2432. function convertImageToFalseColorImage(image, colormap) {
  2433. if (image.color && !image.falseColor) {
  2434. throw new Error('Color transforms are not implemented yet');
  2435. } // User can pass a colormap id or a colormap object
  2436. colormap = ensuresColormap(colormap);
  2437. var colormapId = colormap.getId(); // Doesn't do anything if colormapId hasn't changed
  2438. if (image.colormapId === colormapId) {
  2439. // It has already being converted into a false color image
  2440. // Using the colormapId passed as parameter
  2441. return false;
  2442. } // Restore the image attributes updated when converting to a false color image
  2443. restoreImage(image); // Convert the image to a false color image
  2444. if (colormapId) {
  2445. var minPixelValue = image.minPixelValue || 0;
  2446. var maxPixelValue = image.maxPixelValue || 255;
  2447. image.restore = getRestoreImageMethod(image);
  2448. var lookupTable = colormap.createLookupTable();
  2449. lookupTable.setTableRange(minPixelValue, maxPixelValue); // Update the pixel data and render the new image
  2450. Object(_pixelDataToFalseColorData_js__WEBPACK_IMPORTED_MODULE_1__["default"])(image, lookupTable); // Update min and max pixel values
  2451. var pixelValues = getPixelValues(image.getPixelData());
  2452. image.minPixelValue = pixelValues.minPixelValue;
  2453. image.maxPixelValue = pixelValues.maxPixelValue;
  2454. image.windowWidth = 255;
  2455. image.windowCenter = 128; // Cache the last colormapId used for performance
  2456. // Then it doesn't need to be re-rendered on next
  2457. // Time if the user hasn't updated it
  2458. image.colormapId = colormapId;
  2459. } // Return `true` to tell the caller that the image has got updated
  2460. return true;
  2461. }
  2462. /**
  2463. * Convert the image of a element to a false color image
  2464. *
  2465. * @param {HTMLElement} element The Cornerstone element
  2466. * @param {*} colormap - it can be a colormap object or a colormap id (string)
  2467. *
  2468. * @returns {void}
  2469. */
  2470. function convertToFalseColorImage(element, colormap) {
  2471. var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_0__["getEnabledElement"])(element);
  2472. return convertImageToFalseColorImage(enabledElement.image, colormap);
  2473. }
  2474. /***/ }),
  2475. /***/ "./fitToWindow.js":
  2476. /*!************************!*\
  2477. !*** ./fitToWindow.js ***!
  2478. \************************/
  2479. /*! exports provided: default */
  2480. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  2481. "use strict";
  2482. __webpack_require__.r(__webpack_exports__);
  2483. /* harmony import */ var _enabledElements_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./enabledElements.js */ "./enabledElements.js");
  2484. /* harmony import */ var _updateImage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./updateImage.js */ "./updateImage.js");
  2485. /* harmony import */ var _internal_getImageFitScale_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/getImageFitScale.js */ "./internal/getImageFitScale.js");
  2486. /**
  2487. * Adjusts an image's scale and translation so the image is centered and all pixels
  2488. * in the image are viewable.
  2489. *
  2490. * @param {HTMLElement} element The Cornerstone element to update
  2491. * @returns {void}
  2492. */
  2493. /* harmony default export */ __webpack_exports__["default"] = (function (element) {
  2494. var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_0__["getEnabledElement"])(element);
  2495. var image = enabledElement.image; // The new scale is the minimum of the horizontal and vertical scale values
  2496. enabledElement.viewport.scale = Object(_internal_getImageFitScale_js__WEBPACK_IMPORTED_MODULE_2__["default"])(enabledElement.canvas, image, enabledElement.viewport.rotation).scaleFactor;
  2497. enabledElement.viewport.translation.x = 0;
  2498. enabledElement.viewport.translation.y = 0;
  2499. Object(_updateImage_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element);
  2500. });
  2501. /***/ }),
  2502. /***/ "./generateUUID.js":
  2503. /*!*************************!*\
  2504. !*** ./generateUUID.js ***!
  2505. \*************************/
  2506. /*! exports provided: default */
  2507. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  2508. "use strict";
  2509. __webpack_require__.r(__webpack_exports__);
  2510. /**
  2511. * Generates a UUID for the enabledElement.
  2512. *
  2513. * @return {String} the UUID.
  2514. */
  2515. /* harmony default export */ __webpack_exports__["default"] = (function () {
  2516. // https://stackoverflow.com/a/8809472/9208320 Public Domain/MIT
  2517. /* eslint no-bitwise: ["error", { "allow": ["&","|"] }] */
  2518. var d = new Date().getTime();
  2519. if (typeof performance !== 'undefined' && typeof performance.now === 'function') {
  2520. d += performance.now(); // Use high-precision timer if available
  2521. }
  2522. return 'x.x.x.x.x.x.xxxx.xxx.x.x.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
  2523. var r = (d + Math.random() * 16) % 16 | 0;
  2524. d = Math.floor(d / 16);
  2525. return (c === 'x' ? r : r & 0x3 | 0x8).toString(16);
  2526. });
  2527. });
  2528. /***/ }),
  2529. /***/ "./getDefaultViewportForImage.js":
  2530. /*!***************************************!*\
  2531. !*** ./getDefaultViewportForImage.js ***!
  2532. \***************************************/
  2533. /*! exports provided: default */
  2534. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  2535. "use strict";
  2536. __webpack_require__.r(__webpack_exports__);
  2537. /* harmony import */ var _enabledElements_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./enabledElements.js */ "./enabledElements.js");
  2538. /* harmony import */ var _internal_getDefaultViewport_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/getDefaultViewport.js */ "./internal/getDefaultViewport.js");
  2539. /**
  2540. * Returns a default viewport for display the specified image on the specified
  2541. * enabled element. The default viewport is fit to window
  2542. *
  2543. * @param {HTMLElement} element The DOM element enabled for Cornerstone
  2544. * @param {Image} image A Cornerstone Image Object
  2545. *
  2546. * @returns {Viewport} The default viewport for the image
  2547. */
  2548. /* harmony default export */ __webpack_exports__["default"] = (function (element, image) {
  2549. var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_0__["getEnabledElement"])(element);
  2550. return Object(_internal_getDefaultViewport_js__WEBPACK_IMPORTED_MODULE_1__["default"])(enabledElement.canvas, image);
  2551. });
  2552. /***/ }),
  2553. /***/ "./getImage.js":
  2554. /*!*********************!*\
  2555. !*** ./getImage.js ***!
  2556. \*********************/
  2557. /*! exports provided: default */
  2558. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  2559. "use strict";
  2560. __webpack_require__.r(__webpack_exports__);
  2561. /* harmony import */ var _enabledElements_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./enabledElements.js */ "./enabledElements.js");
  2562. /**
  2563. * Returns the currently displayed image for an element or undefined if no image has
  2564. * been displayed yet
  2565. *
  2566. * @param {HTMLElement} element The DOM element enabled for Cornerstone
  2567. * @returns {Image} The Cornerstone Image Object displayed in this element
  2568. */
  2569. /* harmony default export */ __webpack_exports__["default"] = (function (element) {
  2570. var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_0__["getEnabledElement"])(element);
  2571. return enabledElement.image;
  2572. });
  2573. /***/ }),
  2574. /***/ "./getPixels.js":
  2575. /*!**********************!*\
  2576. !*** ./getPixels.js ***!
  2577. \**********************/
  2578. /*! exports provided: default */
  2579. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  2580. "use strict";
  2581. __webpack_require__.r(__webpack_exports__);
  2582. /* harmony import */ var _enabledElements_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./enabledElements.js */ "./enabledElements.js");
  2583. /* harmony import */ var _getStoredPixels_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getStoredPixels.js */ "./getStoredPixels.js");
  2584. /* harmony import */ var _internal_getModalityLUT_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/getModalityLUT.js */ "./internal/getModalityLUT.js");
  2585. /**
  2586. * Retrieves an array of pixels from a rectangular region with modality LUT transformation applied
  2587. *
  2588. * @param {HTMLElement} element The DOM element enabled for Cornerstone
  2589. * @param {Number} x The x coordinate of the top left corner of the sampling rectangle in image coordinates
  2590. * @param {Number} y The y coordinate of the top left corner of the sampling rectangle in image coordinates
  2591. * @param {Number} width The width of the of the sampling rectangle in image coordinates
  2592. * @param {Number} height The height of the of the sampling rectangle in image coordinates
  2593. * @returns {Array} The modality pixel value of the pixels in the sampling rectangle
  2594. */
  2595. /* harmony default export */ __webpack_exports__["default"] = (function (element, x, y, width, height) {
  2596. var storedPixels = Object(_getStoredPixels_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element, x, y, width, height);
  2597. var ee = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_0__["getEnabledElement"])(element);
  2598. var mlutfn = Object(_internal_getModalityLUT_js__WEBPACK_IMPORTED_MODULE_2__["default"])(ee.image.slope, ee.image.intercept, ee.viewport.modalityLUT);
  2599. return storedPixels.map(mlutfn);
  2600. });
  2601. /***/ }),
  2602. /***/ "./getStoredPixels.js":
  2603. /*!****************************!*\
  2604. !*** ./getStoredPixels.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 _enabledElements_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./enabledElements.js */ "./enabledElements.js");
  2611. /**
  2612. * Retrieves an array of stored pixel values from a rectangular region of an image
  2613. *
  2614. * @param {HTMLElement} element The DOM element enabled for Cornerstone
  2615. * @param {Number} x The x coordinate of the top left corner of the sampling rectangle in image coordinates
  2616. * @param {Number} y The y coordinate of the top left corner of the sampling rectangle in image coordinates
  2617. * @param {Number} width The width of the of the sampling rectangle in image coordinates
  2618. * @param {Number} height The height of the of the sampling rectangle in image coordinates
  2619. * @returns {Array} The stored pixel value of the pixels in the sampling rectangle
  2620. */
  2621. /* harmony default export */ __webpack_exports__["default"] = (function (element, x, y, width, height) {
  2622. if (element === undefined) {
  2623. throw new Error('getStoredPixels: parameter element must not be undefined');
  2624. }
  2625. x = Math.round(x);
  2626. y = Math.round(y);
  2627. var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_0__["getEnabledElement"])(element);
  2628. var storedPixels = [];
  2629. var index = 0;
  2630. var pixelData = enabledElement.image.getPixelData();
  2631. for (var row = 0; row < height; row++) {
  2632. for (var column = 0; column < width; column++) {
  2633. var spIndex = (row + y) * enabledElement.image.columns + (column + x);
  2634. storedPixels[index++] = pixelData[spIndex];
  2635. }
  2636. }
  2637. return storedPixels;
  2638. });
  2639. /***/ }),
  2640. /***/ "./getViewport.js":
  2641. /*!************************!*\
  2642. !*** ./getViewport.js ***!
  2643. \************************/
  2644. /*! exports provided: default */
  2645. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  2646. "use strict";
  2647. __webpack_require__.r(__webpack_exports__);
  2648. /* harmony import */ var _enabledElements_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./enabledElements.js */ "./enabledElements.js");
  2649. /**
  2650. * Retrieves the viewport for the specified enabled element
  2651. *
  2652. * @param {HTMLElement} element The DOM element enabled for Cornerstone
  2653. * @returns {Viewport|undefined} The Cornerstone Viewport settings for this element, if they exist. Otherwise, undefined
  2654. * @memberof ViewportSettings
  2655. */
  2656. /* harmony default export */ __webpack_exports__["default"] = (function (element) {
  2657. var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_0__["getEnabledElement"])(element);
  2658. var viewport = enabledElement.viewport;
  2659. if (viewport === undefined) {
  2660. return;
  2661. } // Return a copy of the viewport
  2662. return Object.assign({}, viewport);
  2663. });
  2664. /***/ }),
  2665. /***/ "./imageCache.js":
  2666. /*!***********************!*\
  2667. !*** ./imageCache.js ***!
  2668. \***********************/
  2669. /*! exports provided: cachedImages, setMaximumSizeBytes, putImageLoadObject, getImageLoadObject, removeImageLoadObject, getCacheInfo, purgeCache, changeImageIdCacheSize, default */
  2670. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  2671. "use strict";
  2672. __webpack_require__.r(__webpack_exports__);
  2673. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cachedImages", function() { return cachedImages; });
  2674. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setMaximumSizeBytes", function() { return setMaximumSizeBytes; });
  2675. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "putImageLoadObject", function() { return putImageLoadObject; });
  2676. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getImageLoadObject", function() { return getImageLoadObject; });
  2677. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeImageLoadObject", function() { return removeImageLoadObject; });
  2678. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getCacheInfo", function() { return getCacheInfo; });
  2679. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "purgeCache", function() { return purgeCache; });
  2680. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "changeImageIdCacheSize", function() { return changeImageIdCacheSize; });
  2681. /* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./events.js */ "./events.js");
  2682. /* harmony import */ var _triggerEvent_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./triggerEvent.js */ "./triggerEvent.js");
  2683. /**
  2684. * This module deals with caching images
  2685. * @module ImageCache
  2686. */
  2687. var maximumSizeInBytes = 1024 * 1024 * 1024; // 1 GB
  2688. var cacheSizeInBytes = 0; // Dictionary of imageId to cachedImage objects
  2689. var imageCacheDict = {}; // Array of cachedImage objects
  2690. var cachedImages = [];
  2691. /** Sets the maximum size of cache and purges cache contents if necessary.
  2692. *
  2693. * @param {number} numBytes The maximun size that the cache should occupy.
  2694. * @returns {void}
  2695. */
  2696. function setMaximumSizeBytes(numBytes) {
  2697. if (numBytes === undefined) {
  2698. throw new Error('setMaximumSizeBytes: parameter numBytes must not be undefined');
  2699. }
  2700. if (numBytes.toFixed === undefined) {
  2701. throw new Error('setMaximumSizeBytes: parameter numBytes must be a number');
  2702. }
  2703. maximumSizeInBytes = numBytes;
  2704. Object(_triggerEvent_js__WEBPACK_IMPORTED_MODULE_1__["default"])(_events_js__WEBPACK_IMPORTED_MODULE_0__["events"], _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].IMAGE_CACHE_MAXIMUM_SIZE_CHANGED);
  2705. purgeCacheIfNecessary();
  2706. }
  2707. /**
  2708. * Purges the cache if size exceeds maximum
  2709. * @returns {void}
  2710. */
  2711. function purgeCacheIfNecessary() {
  2712. // If max cache size has not been exceeded, do nothing
  2713. if (cacheSizeInBytes <= maximumSizeInBytes) {
  2714. return;
  2715. } // Cache size has been exceeded, create list of images sorted by timeStamp
  2716. // So we can purge the least recently used image
  2717. function compare(a, b) {
  2718. if (a.timeStamp > b.timeStamp) {
  2719. return -1;
  2720. }
  2721. if (a.timeStamp < b.timeStamp) {
  2722. return 1;
  2723. }
  2724. return 0;
  2725. }
  2726. cachedImages.sort(compare); // Remove images as necessary)
  2727. while (cacheSizeInBytes > maximumSizeInBytes) {
  2728. var lastCachedImage = cachedImages[cachedImages.length - 1];
  2729. var imageId = lastCachedImage.imageId;
  2730. removeImageLoadObject(imageId);
  2731. Object(_triggerEvent_js__WEBPACK_IMPORTED_MODULE_1__["default"])(_events_js__WEBPACK_IMPORTED_MODULE_0__["events"], _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].IMAGE_CACHE_PROMISE_REMOVED, {
  2732. imageId: imageId
  2733. });
  2734. }
  2735. var cacheInfo = getCacheInfo();
  2736. Object(_triggerEvent_js__WEBPACK_IMPORTED_MODULE_1__["default"])(_events_js__WEBPACK_IMPORTED_MODULE_0__["events"], _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].IMAGE_CACHE_FULL, cacheInfo);
  2737. }
  2738. /**
  2739. * Puts a new image loader into the cache
  2740. *
  2741. * @param {string} imageId ImageId of the image loader
  2742. * @param {Object} imageLoadObject The object that is loading or loaded the image
  2743. * @returns {void}
  2744. */
  2745. function putImageLoadObject(imageId, imageLoadObject) {
  2746. if (imageId === undefined) {
  2747. throw new Error('putImageLoadObject: imageId must not be undefined');
  2748. }
  2749. if (imageLoadObject.promise === undefined) {
  2750. throw new Error('putImageLoadObject: imageLoadObject.promise must not be undefined');
  2751. }
  2752. if (imageCacheDict.hasOwnProperty(imageId) === true) {
  2753. throw new Error('putImageLoadObject: imageId already in cache');
  2754. }
  2755. if (imageLoadObject.cancelFn && typeof imageLoadObject.cancelFn !== 'function') {
  2756. throw new Error('putImageLoadObject: imageLoadObject.cancelFn must be a function');
  2757. }
  2758. var cachedImage = {
  2759. loaded: false,
  2760. imageId: imageId,
  2761. sharedCacheKey: undefined,
  2762. // The sharedCacheKey for this imageId. undefined by default
  2763. imageLoadObject: imageLoadObject,
  2764. timeStamp: Date.now(),
  2765. sizeInBytes: 0
  2766. };
  2767. imageCacheDict[imageId] = cachedImage;
  2768. cachedImages.push(cachedImage);
  2769. imageLoadObject.promise.then(function (image) {
  2770. if (cachedImages.indexOf(cachedImage) === -1) {
  2771. // If the image has been purged before being loaded, we stop here.
  2772. return;
  2773. }
  2774. cachedImage.loaded = true;
  2775. cachedImage.image = image;
  2776. if (image.sizeInBytes === undefined) {
  2777. throw new Error('putImageLoadObject: image.sizeInBytes must not be undefined');
  2778. }
  2779. if (image.sizeInBytes.toFixed === undefined) {
  2780. throw new Error('putImageLoadObject: image.sizeInBytes is not a number');
  2781. }
  2782. cachedImage.sizeInBytes = image.sizeInBytes;
  2783. cacheSizeInBytes += cachedImage.sizeInBytes;
  2784. var eventDetails = {
  2785. action: 'addImage',
  2786. image: cachedImage
  2787. };
  2788. Object(_triggerEvent_js__WEBPACK_IMPORTED_MODULE_1__["default"])(_events_js__WEBPACK_IMPORTED_MODULE_0__["events"], _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].IMAGE_CACHE_CHANGED, eventDetails);
  2789. cachedImage.sharedCacheKey = image.sharedCacheKey;
  2790. purgeCacheIfNecessary();
  2791. }, function () {
  2792. var cachedImage = imageCacheDict[imageId];
  2793. cachedImages.splice(cachedImages.indexOf(cachedImage), 1);
  2794. delete imageCacheDict[imageId];
  2795. });
  2796. }
  2797. /**
  2798. * Retuns the object that is loading a given imageId
  2799. *
  2800. * @param {string} imageId Image ID
  2801. * @returns {void}
  2802. */
  2803. function getImageLoadObject(imageId) {
  2804. if (imageId === undefined) {
  2805. throw new Error('getImageLoadObject: imageId must not be undefined');
  2806. }
  2807. var cachedImage = imageCacheDict[imageId];
  2808. if (cachedImage === undefined) {
  2809. return;
  2810. } // Bump time stamp for cached image
  2811. cachedImage.timeStamp = Date.now();
  2812. return cachedImage.imageLoadObject;
  2813. }
  2814. /**
  2815. * Removes the image loader associated with a given Id from the cache
  2816. *
  2817. * @param {string} imageId Image ID
  2818. * @returns {void}
  2819. */
  2820. function removeImageLoadObject(imageId) {
  2821. if (imageId === undefined) {
  2822. throw new Error('removeImageLoadObject: imageId must not be undefined');
  2823. }
  2824. var cachedImage = imageCacheDict[imageId];
  2825. if (cachedImage === undefined) {
  2826. throw new Error('removeImageLoadObject: imageId was not present in imageCache');
  2827. }
  2828. cachedImages.splice(cachedImages.indexOf(cachedImage), 1);
  2829. cacheSizeInBytes -= cachedImage.sizeInBytes;
  2830. var eventDetails = {
  2831. action: 'deleteImage',
  2832. image: cachedImage
  2833. };
  2834. Object(_triggerEvent_js__WEBPACK_IMPORTED_MODULE_1__["default"])(_events_js__WEBPACK_IMPORTED_MODULE_0__["events"], _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].IMAGE_CACHE_CHANGED, eventDetails);
  2835. decache(cachedImage.imageLoadObject);
  2836. delete imageCacheDict[imageId];
  2837. }
  2838. /**
  2839. * @typedef {Object} CacheInformation
  2840. * @property {number} maximumSizeInBytes The maximum size of the cache in bytes
  2841. * @property {number} cacheSizeInBytes Currently occupied space in the cache in bytes
  2842. * @property {number} numberOfImagesCached Number of ImageLoaders in the cache
  2843. * @returns {void}
  2844. */
  2845. /**
  2846. * Gets the current state of the cache
  2847. * @returns {void}
  2848. */
  2849. function getCacheInfo() {
  2850. return {
  2851. maximumSizeInBytes: maximumSizeInBytes,
  2852. cacheSizeInBytes: cacheSizeInBytes,
  2853. numberOfImagesCached: cachedImages.length
  2854. };
  2855. } // This method should only be called by `removeImageLoadObject` because it's
  2856. // The one that knows how to deal with shared cache keys and cache size.
  2857. /**
  2858. * INTERNAL: Removes and ImageLoader from the cache
  2859. *
  2860. * @param {Object} imageLoadObject Image Loader Object to remove
  2861. * @returns {void}
  2862. */
  2863. function decache(imageLoadObject) {
  2864. imageLoadObject.promise.then(function () {
  2865. if (imageLoadObject.decache) {
  2866. imageLoadObject.decache();
  2867. }
  2868. }, function () {
  2869. if (imageLoadObject.decache) {
  2870. imageLoadObject.decache();
  2871. }
  2872. });
  2873. }
  2874. /**
  2875. * Removes all images from cache
  2876. * @returns {void}
  2877. */
  2878. function purgeCache() {
  2879. while (cachedImages.length > 0) {
  2880. var removedCachedImage = cachedImages[0];
  2881. removeImageLoadObject(removedCachedImage.imageId);
  2882. }
  2883. }
  2884. /**
  2885. * Updates the space than an image is using in the cache
  2886. *
  2887. * @param {string} imageId Image ID
  2888. * @param {number} newCacheSize New image size
  2889. * @returns {void}
  2890. */
  2891. function changeImageIdCacheSize(imageId, newCacheSize) {
  2892. var cacheEntry = imageCacheDict[imageId];
  2893. if (cacheEntry) {
  2894. cacheEntry.imageLoadObject.promise.then(function (image) {
  2895. var cacheSizeDifference = newCacheSize - image.sizeInBytes;
  2896. image.sizeInBytes = newCacheSize;
  2897. cacheEntry.sizeInBytes = newCacheSize;
  2898. cacheSizeInBytes += cacheSizeDifference;
  2899. var eventDetails = {
  2900. action: 'changeImageSize',
  2901. image: image
  2902. };
  2903. Object(_triggerEvent_js__WEBPACK_IMPORTED_MODULE_1__["default"])(_events_js__WEBPACK_IMPORTED_MODULE_0__["events"], _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].IMAGE_CACHE_CHANGED, eventDetails);
  2904. });
  2905. }
  2906. }
  2907. /* harmony default export */ __webpack_exports__["default"] = ({
  2908. imageCache: imageCacheDict,
  2909. cachedImages: cachedImages,
  2910. setMaximumSizeBytes: setMaximumSizeBytes,
  2911. putImageLoadObject: putImageLoadObject,
  2912. getImageLoadObject: getImageLoadObject,
  2913. removeImageLoadObject: removeImageLoadObject,
  2914. getCacheInfo: getCacheInfo,
  2915. purgeCache: purgeCache,
  2916. changeImageIdCacheSize: changeImageIdCacheSize
  2917. });
  2918. /***/ }),
  2919. /***/ "./imageLoader.js":
  2920. /*!************************!*\
  2921. !*** ./imageLoader.js ***!
  2922. \************************/
  2923. /*! exports provided: loadImage, loadAndCacheImage, registerImageLoader, registerUnknownImageLoader */
  2924. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  2925. "use strict";
  2926. __webpack_require__.r(__webpack_exports__);
  2927. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "loadImage", function() { return loadImage; });
  2928. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "loadAndCacheImage", function() { return loadAndCacheImage; });
  2929. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "registerImageLoader", function() { return registerImageLoader; });
  2930. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "registerUnknownImageLoader", function() { return registerUnknownImageLoader; });
  2931. /* harmony import */ var _imageCache_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./imageCache.js */ "./imageCache.js");
  2932. /* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./events.js */ "./events.js");
  2933. /* harmony import */ var _triggerEvent_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./triggerEvent.js */ "./triggerEvent.js");
  2934. /**
  2935. * This module deals with ImageLoaders, loading images and caching images
  2936. * @module ImageLoader
  2937. */
  2938. var imageLoaders = {};
  2939. var unknownImageLoader;
  2940. /**
  2941. * Load an image using a registered Cornerstone Image Loader.
  2942. *
  2943. * The image loader that is used will be
  2944. * determined by the image loader scheme matching against the imageId.
  2945. *
  2946. * @param {String} imageId A Cornerstone Image Object's imageId
  2947. * @param {Object} [options] Options to be passed to the Image Loader
  2948. *
  2949. * @returns {ImageLoadObject} An Object which can be used to act after an image is loaded or loading fails
  2950. * @memberof ImageLoader
  2951. */
  2952. function loadImageFromImageLoader(imageId, options) {
  2953. var colonIndex = imageId.indexOf(':');
  2954. var scheme = imageId.substring(0, colonIndex);
  2955. var loader = imageLoaders[scheme];
  2956. if (loader === undefined || loader === null) {
  2957. if (unknownImageLoader !== undefined) {
  2958. return unknownImageLoader(imageId);
  2959. }
  2960. throw new Error('loadImageFromImageLoader: no image loader for imageId');
  2961. }
  2962. var imageLoadObject = loader(imageId, options); // Broadcast an image loaded event once the image is loaded
  2963. imageLoadObject.promise.then(function (image) {
  2964. Object(_triggerEvent_js__WEBPACK_IMPORTED_MODULE_2__["default"])(_events_js__WEBPACK_IMPORTED_MODULE_1__["events"], _events_js__WEBPACK_IMPORTED_MODULE_1__["default"].IMAGE_LOADED, {
  2965. image: image
  2966. });
  2967. }, function (error) {
  2968. var errorObject = {
  2969. imageId: imageId,
  2970. error: error
  2971. };
  2972. Object(_triggerEvent_js__WEBPACK_IMPORTED_MODULE_2__["default"])(_events_js__WEBPACK_IMPORTED_MODULE_1__["events"], _events_js__WEBPACK_IMPORTED_MODULE_1__["default"].IMAGE_LOAD_FAILED, errorObject);
  2973. });
  2974. return imageLoadObject;
  2975. }
  2976. /**
  2977. * Loads an image given an imageId and optional priority and returns a promise which will resolve to
  2978. * the loaded image object or fail if an error occurred. The loaded image is not stored in the cache.
  2979. *
  2980. * @param {String} imageId A Cornerstone Image Object's imageId
  2981. * @param {Object} [options] Options to be passed to the Image Loader
  2982. *
  2983. * @returns {ImageLoadObject} An Object which can be used to act after an image is loaded or loading fails
  2984. * @memberof ImageLoader
  2985. */
  2986. function loadImage(imageId, options) {
  2987. if (imageId === undefined) {
  2988. throw new Error('loadImage: parameter imageId must not be undefined');
  2989. }
  2990. var imageLoadObject = Object(_imageCache_js__WEBPACK_IMPORTED_MODULE_0__["getImageLoadObject"])(imageId);
  2991. if (imageLoadObject !== undefined) {
  2992. return imageLoadObject.promise;
  2993. }
  2994. return loadImageFromImageLoader(imageId, options).promise;
  2995. } //
  2996. /**
  2997. * Loads an image given an imageId and optional priority and returns a promise which will resolve to
  2998. * the loaded image object or fail if an error occurred. The image is stored in the cache.
  2999. *
  3000. * @param {String} imageId A Cornerstone Image Object's imageId
  3001. * @param {Object} [options] Options to be passed to the Image Loader
  3002. *
  3003. * @returns {ImageLoadObject} Image Loader Object
  3004. * @memberof ImageLoader
  3005. */
  3006. function loadAndCacheImage(imageId, options) {
  3007. if (imageId === undefined) {
  3008. throw new Error('loadAndCacheImage: parameter imageId must not be undefined');
  3009. }
  3010. var imageLoadObject = Object(_imageCache_js__WEBPACK_IMPORTED_MODULE_0__["getImageLoadObject"])(imageId);
  3011. if (imageLoadObject !== undefined) {
  3012. return imageLoadObject.promise;
  3013. }
  3014. imageLoadObject = loadImageFromImageLoader(imageId, options);
  3015. Object(_imageCache_js__WEBPACK_IMPORTED_MODULE_0__["putImageLoadObject"])(imageId, imageLoadObject);
  3016. return imageLoadObject.promise;
  3017. }
  3018. /**
  3019. * Registers an imageLoader plugin with cornerstone for the specified scheme
  3020. *
  3021. * @param {String} scheme The scheme to use for this image loader (e.g. 'dicomweb', 'wadouri', 'http')
  3022. * @param {Function} imageLoader A Cornerstone Image Loader function
  3023. * @returns {void}
  3024. * @memberof ImageLoader
  3025. */
  3026. function registerImageLoader(scheme, imageLoader) {
  3027. imageLoaders[scheme] = imageLoader;
  3028. }
  3029. /**
  3030. * Registers a new unknownImageLoader and returns the previous one
  3031. *
  3032. * @param {Function} imageLoader A Cornerstone Image Loader
  3033. *
  3034. * @returns {Function|Undefined} The previous Unknown Image Loader
  3035. * @memberof ImageLoader
  3036. */
  3037. function registerUnknownImageLoader(imageLoader) {
  3038. var oldImageLoader = unknownImageLoader;
  3039. unknownImageLoader = imageLoader;
  3040. return oldImageLoader;
  3041. }
  3042. /***/ }),
  3043. /***/ "./index.js":
  3044. /*!******************!*\
  3045. !*** ./index.js ***!
  3046. \******************/
  3047. /*! exports provided: drawImage, generateLut, getDefaultViewport, setDefaultViewport, requestAnimationFrame, storedPixelDataToCanvasImageData, storedColorPixelDataToCanvasImageData, storedPixelDataToCanvasImageDataColorLUT, storedPixelDataToCanvasImageDataPseudocolorLUT, internal, renderLabelMapImage, renderPseudoColorImage, renderColorImage, renderGrayscaleImage, renderWebImage, renderToCanvas, canvasToPixel, disable, displayImage, draw, drawInvalidated, enable, getElementData, removeElementData, getEnabledElement, addEnabledElement, getEnabledElementsByImageId, getEnabledElements, addLayer, removeLayer, getLayer, getLayers, getVisibleLayers, setActiveLayer, getActiveLayer, purgeLayers, setLayerImage, fitToWindow, getDefaultViewportForImage, getDisplayedArea, getImage, getPixels, getStoredPixels, getViewport, loadImage, loadAndCacheImage, registerImageLoader, registerUnknownImageLoader, invalidate, invalidateImageId, pageToPixel, pixelToCanvas, reset, resize, setToPixelCoordinateSystem, setViewport, updateImage, pixelDataToFalseColorData, rendering, imageCache, metaData, webGL, colors, convertImageToFalseColorImage, convertToFalseColorImage, restoreImage, EVENTS, events, triggerEvent, imageLoadPoolManager, imageRetrievalPoolManager, RequestPoolManager, default */
  3048. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  3049. "use strict";
  3050. __webpack_require__.r(__webpack_exports__);
  3051. /* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./events.js */ "./events.js");
  3052. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "EVENTS", function() { return _events_js__WEBPACK_IMPORTED_MODULE_0__["default"]; });
  3053. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "events", function() { return _events_js__WEBPACK_IMPORTED_MODULE_0__["events"]; });
  3054. /* harmony import */ var _enabledElements_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./enabledElements.js */ "./enabledElements.js");
  3055. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getEnabledElement", function() { return _enabledElements_js__WEBPACK_IMPORTED_MODULE_1__["getEnabledElement"]; });
  3056. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addEnabledElement", function() { return _enabledElements_js__WEBPACK_IMPORTED_MODULE_1__["addEnabledElement"]; });
  3057. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getEnabledElementsByImageId", function() { return _enabledElements_js__WEBPACK_IMPORTED_MODULE_1__["getEnabledElementsByImageId"]; });
  3058. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getEnabledElements", function() { return _enabledElements_js__WEBPACK_IMPORTED_MODULE_1__["getEnabledElements"]; });
  3059. /* harmony import */ var _layers_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./layers.js */ "./layers.js");
  3060. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addLayer", function() { return _layers_js__WEBPACK_IMPORTED_MODULE_2__["addLayer"]; });
  3061. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "removeLayer", function() { return _layers_js__WEBPACK_IMPORTED_MODULE_2__["removeLayer"]; });
  3062. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getLayer", function() { return _layers_js__WEBPACK_IMPORTED_MODULE_2__["getLayer"]; });
  3063. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getLayers", function() { return _layers_js__WEBPACK_IMPORTED_MODULE_2__["getLayers"]; });
  3064. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getVisibleLayers", function() { return _layers_js__WEBPACK_IMPORTED_MODULE_2__["getVisibleLayers"]; });
  3065. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setActiveLayer", function() { return _layers_js__WEBPACK_IMPORTED_MODULE_2__["setActiveLayer"]; });
  3066. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getActiveLayer", function() { return _layers_js__WEBPACK_IMPORTED_MODULE_2__["getActiveLayer"]; });
  3067. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "purgeLayers", function() { return _layers_js__WEBPACK_IMPORTED_MODULE_2__["purgeLayers"]; });
  3068. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setLayerImage", function() { return _layers_js__WEBPACK_IMPORTED_MODULE_2__["setLayerImage"]; });
  3069. /* harmony import */ var _falseColorMapping_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./falseColorMapping.js */ "./falseColorMapping.js");
  3070. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "convertImageToFalseColorImage", function() { return _falseColorMapping_js__WEBPACK_IMPORTED_MODULE_3__["convertImageToFalseColorImage"]; });
  3071. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "convertToFalseColorImage", function() { return _falseColorMapping_js__WEBPACK_IMPORTED_MODULE_3__["convertToFalseColorImage"]; });
  3072. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "restoreImage", function() { return _falseColorMapping_js__WEBPACK_IMPORTED_MODULE_3__["restoreImage"]; });
  3073. /* harmony import */ var _enabledElementData_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./enabledElementData.js */ "./enabledElementData.js");
  3074. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getElementData", function() { return _enabledElementData_js__WEBPACK_IMPORTED_MODULE_4__["getElementData"]; });
  3075. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "removeElementData", function() { return _enabledElementData_js__WEBPACK_IMPORTED_MODULE_4__["removeElementData"]; });
  3076. /* harmony import */ var _imageLoader_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./imageLoader.js */ "./imageLoader.js");
  3077. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "loadImage", function() { return _imageLoader_js__WEBPACK_IMPORTED_MODULE_5__["loadImage"]; });
  3078. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "loadAndCacheImage", function() { return _imageLoader_js__WEBPACK_IMPORTED_MODULE_5__["loadAndCacheImage"]; });
  3079. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "registerImageLoader", function() { return _imageLoader_js__WEBPACK_IMPORTED_MODULE_5__["registerImageLoader"]; });
  3080. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "registerUnknownImageLoader", function() { return _imageLoader_js__WEBPACK_IMPORTED_MODULE_5__["registerUnknownImageLoader"]; });
  3081. /* harmony import */ var _requestPool_imageLoadPoolManager_ts__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./requestPool/imageLoadPoolManager.ts */ "./requestPool/imageLoadPoolManager.ts");
  3082. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "imageLoadPoolManager", function() { return _requestPool_imageLoadPoolManager_ts__WEBPACK_IMPORTED_MODULE_6__["default"]; });
  3083. /* harmony import */ var _requestPool_imageRetrievalPoolManager_ts__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./requestPool/imageRetrievalPoolManager.ts */ "./requestPool/imageRetrievalPoolManager.ts");
  3084. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "imageRetrievalPoolManager", function() { return _requestPool_imageRetrievalPoolManager_ts__WEBPACK_IMPORTED_MODULE_7__["default"]; });
  3085. /* harmony import */ var _requestPool_RequestPoolManager_ts__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./requestPool/RequestPoolManager.ts */ "./requestPool/RequestPoolManager.ts");
  3086. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "RequestPoolManager", function() { return _requestPool_RequestPoolManager_ts__WEBPACK_IMPORTED_MODULE_8__["RequestPoolManager"]; });
  3087. /* harmony import */ var _canvasToPixel_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./canvasToPixel.js */ "./canvasToPixel.js");
  3088. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "canvasToPixel", function() { return _canvasToPixel_js__WEBPACK_IMPORTED_MODULE_9__["default"]; });
  3089. /* harmony import */ var _colors_index_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./colors/index.js */ "./colors/index.js");
  3090. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "colors", function() { return _colors_index_js__WEBPACK_IMPORTED_MODULE_10__["default"]; });
  3091. /* harmony import */ var _disable_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./disable.js */ "./disable.js");
  3092. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "disable", function() { return _disable_js__WEBPACK_IMPORTED_MODULE_11__["default"]; });
  3093. /* harmony import */ var _displayImage_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./displayImage.js */ "./displayImage.js");
  3094. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "displayImage", function() { return _displayImage_js__WEBPACK_IMPORTED_MODULE_12__["default"]; });
  3095. /* harmony import */ var _draw_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./draw.js */ "./draw.js");
  3096. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "draw", function() { return _draw_js__WEBPACK_IMPORTED_MODULE_13__["default"]; });
  3097. /* harmony import */ var _internal_drawImage_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./internal/drawImage.js */ "./internal/drawImage.js");
  3098. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "drawImage", function() { return _internal_drawImage_js__WEBPACK_IMPORTED_MODULE_14__["default"]; });
  3099. /* harmony import */ var _drawInvalidated_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./drawInvalidated.js */ "./drawInvalidated.js");
  3100. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "drawInvalidated", function() { return _drawInvalidated_js__WEBPACK_IMPORTED_MODULE_15__["default"]; });
  3101. /* harmony import */ var _enable_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./enable.js */ "./enable.js");
  3102. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "enable", function() { return _enable_js__WEBPACK_IMPORTED_MODULE_16__["default"]; });
  3103. /* harmony import */ var _fitToWindow_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./fitToWindow.js */ "./fitToWindow.js");
  3104. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "fitToWindow", function() { return _fitToWindow_js__WEBPACK_IMPORTED_MODULE_17__["default"]; });
  3105. /* harmony import */ var _internal_generateLut_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./internal/generateLut.js */ "./internal/generateLut.js");
  3106. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "generateLut", function() { return _internal_generateLut_js__WEBPACK_IMPORTED_MODULE_18__["default"]; });
  3107. /* harmony import */ var _internal_getDefaultViewport_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./internal/getDefaultViewport.js */ "./internal/getDefaultViewport.js");
  3108. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getDefaultViewport", function() { return _internal_getDefaultViewport_js__WEBPACK_IMPORTED_MODULE_19__["default"]; });
  3109. /* harmony import */ var _getDefaultViewportForImage_js__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./getDefaultViewportForImage.js */ "./getDefaultViewportForImage.js");
  3110. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getDefaultViewportForImage", function() { return _getDefaultViewportForImage_js__WEBPACK_IMPORTED_MODULE_20__["default"]; });
  3111. /* harmony import */ var _internal_getDisplayedArea_js__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./internal/getDisplayedArea.js */ "./internal/getDisplayedArea.js");
  3112. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getDisplayedArea", function() { return _internal_getDisplayedArea_js__WEBPACK_IMPORTED_MODULE_21__["default"]; });
  3113. /* harmony import */ var _getImage_js__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./getImage.js */ "./getImage.js");
  3114. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getImage", function() { return _getImage_js__WEBPACK_IMPORTED_MODULE_22__["default"]; });
  3115. /* harmony import */ var _getPixels_js__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./getPixels.js */ "./getPixels.js");
  3116. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getPixels", function() { return _getPixels_js__WEBPACK_IMPORTED_MODULE_23__["default"]; });
  3117. /* harmony import */ var _getStoredPixels_js__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./getStoredPixels.js */ "./getStoredPixels.js");
  3118. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getStoredPixels", function() { return _getStoredPixels_js__WEBPACK_IMPORTED_MODULE_24__["default"]; });
  3119. /* harmony import */ var _getViewport_js__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./getViewport.js */ "./getViewport.js");
  3120. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getViewport", function() { return _getViewport_js__WEBPACK_IMPORTED_MODULE_25__["default"]; });
  3121. /* harmony import */ var _imageCache_js__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./imageCache.js */ "./imageCache.js");
  3122. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "imageCache", function() { return _imageCache_js__WEBPACK_IMPORTED_MODULE_26__["default"]; });
  3123. /* harmony import */ var _internal_index_js__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./internal/index.js */ "./internal/index.js");
  3124. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "internal", function() { return _internal_index_js__WEBPACK_IMPORTED_MODULE_27__["default"]; });
  3125. /* harmony import */ var _invalidate_js__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./invalidate.js */ "./invalidate.js");
  3126. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "invalidate", function() { return _invalidate_js__WEBPACK_IMPORTED_MODULE_28__["default"]; });
  3127. /* harmony import */ var _invalidateImageId_js__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./invalidateImageId.js */ "./invalidateImageId.js");
  3128. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "invalidateImageId", function() { return _invalidateImageId_js__WEBPACK_IMPORTED_MODULE_29__["default"]; });
  3129. /* harmony import */ var _metaData_js__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./metaData.js */ "./metaData.js");
  3130. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "metaData", function() { return _metaData_js__WEBPACK_IMPORTED_MODULE_30__["default"]; });
  3131. /* harmony import */ var _pageToPixel_js__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./pageToPixel.js */ "./pageToPixel.js");
  3132. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pageToPixel", function() { return _pageToPixel_js__WEBPACK_IMPORTED_MODULE_31__["default"]; });
  3133. /* harmony import */ var _pixelDataToFalseColorData_js__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./pixelDataToFalseColorData.js */ "./pixelDataToFalseColorData.js");
  3134. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pixelDataToFalseColorData", function() { return _pixelDataToFalseColorData_js__WEBPACK_IMPORTED_MODULE_32__["default"]; });
  3135. /* harmony import */ var _pixelToCanvas_js__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./pixelToCanvas.js */ "./pixelToCanvas.js");
  3136. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pixelToCanvas", function() { return _pixelToCanvas_js__WEBPACK_IMPORTED_MODULE_33__["default"]; });
  3137. /* harmony import */ var _rendering_renderColorImage_js__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./rendering/renderColorImage.js */ "./rendering/renderColorImage.js");
  3138. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "renderColorImage", function() { return _rendering_renderColorImage_js__WEBPACK_IMPORTED_MODULE_34__["renderColorImage"]; });
  3139. /* harmony import */ var _rendering_renderGrayscaleImage_js__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./rendering/renderGrayscaleImage.js */ "./rendering/renderGrayscaleImage.js");
  3140. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "renderGrayscaleImage", function() { return _rendering_renderGrayscaleImage_js__WEBPACK_IMPORTED_MODULE_35__["renderGrayscaleImage"]; });
  3141. /* harmony import */ var _rendering_renderLabelMapImage_js__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./rendering/renderLabelMapImage.js */ "./rendering/renderLabelMapImage.js");
  3142. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "renderLabelMapImage", function() { return _rendering_renderLabelMapImage_js__WEBPACK_IMPORTED_MODULE_36__["renderLabelMapImage"]; });
  3143. /* harmony import */ var _rendering_renderPseudoColorImage_js__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./rendering/renderPseudoColorImage.js */ "./rendering/renderPseudoColorImage.js");
  3144. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "renderPseudoColorImage", function() { return _rendering_renderPseudoColorImage_js__WEBPACK_IMPORTED_MODULE_37__["renderPseudoColorImage"]; });
  3145. /* harmony import */ var _rendering_renderToCanvas_js__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./rendering/renderToCanvas.js */ "./rendering/renderToCanvas.js");
  3146. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "renderToCanvas", function() { return _rendering_renderToCanvas_js__WEBPACK_IMPORTED_MODULE_38__["default"]; });
  3147. /* harmony import */ var _rendering_renderWebImage_js__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./rendering/renderWebImage.js */ "./rendering/renderWebImage.js");
  3148. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "renderWebImage", function() { return _rendering_renderWebImage_js__WEBPACK_IMPORTED_MODULE_39__["renderWebImage"]; });
  3149. /* harmony import */ var _rendering_index_js__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./rendering/index.js */ "./rendering/index.js");
  3150. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "rendering", function() { return _rendering_index_js__WEBPACK_IMPORTED_MODULE_40__["default"]; });
  3151. /* harmony import */ var _internal_requestAnimationFrame_js__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ./internal/requestAnimationFrame.js */ "./internal/requestAnimationFrame.js");
  3152. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "requestAnimationFrame", function() { return _internal_requestAnimationFrame_js__WEBPACK_IMPORTED_MODULE_41__["default"]; });
  3153. /* harmony import */ var _reset_js__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ./reset.js */ "./reset.js");
  3154. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "reset", function() { return _reset_js__WEBPACK_IMPORTED_MODULE_42__["default"]; });
  3155. /* harmony import */ var _resize_js__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! ./resize.js */ "./resize.js");
  3156. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "resize", function() { return _resize_js__WEBPACK_IMPORTED_MODULE_43__["default"]; });
  3157. /* harmony import */ var _internal_setDefaultViewport_js__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! ./internal/setDefaultViewport.js */ "./internal/setDefaultViewport.js");
  3158. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setDefaultViewport", function() { return _internal_setDefaultViewport_js__WEBPACK_IMPORTED_MODULE_44__["default"]; });
  3159. /* harmony import */ var _setToPixelCoordinateSystem_js__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! ./setToPixelCoordinateSystem.js */ "./setToPixelCoordinateSystem.js");
  3160. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setToPixelCoordinateSystem", function() { return _setToPixelCoordinateSystem_js__WEBPACK_IMPORTED_MODULE_45__["default"]; });
  3161. /* harmony import */ var _setViewport_js__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! ./setViewport.js */ "./setViewport.js");
  3162. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setViewport", function() { return _setViewport_js__WEBPACK_IMPORTED_MODULE_46__["default"]; });
  3163. /* harmony import */ var _internal_storedColorPixelDataToCanvasImageData_js__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! ./internal/storedColorPixelDataToCanvasImageData.js */ "./internal/storedColorPixelDataToCanvasImageData.js");
  3164. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "storedColorPixelDataToCanvasImageData", function() { return _internal_storedColorPixelDataToCanvasImageData_js__WEBPACK_IMPORTED_MODULE_47__["default"]; });
  3165. /* harmony import */ var _internal_storedPixelDataToCanvasImageData_js__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(/*! ./internal/storedPixelDataToCanvasImageData.js */ "./internal/storedPixelDataToCanvasImageData.js");
  3166. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "storedPixelDataToCanvasImageData", function() { return _internal_storedPixelDataToCanvasImageData_js__WEBPACK_IMPORTED_MODULE_48__["default"]; });
  3167. /* harmony import */ var _internal_storedPixelDataToCanvasImageDataColorLUT_js__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(/*! ./internal/storedPixelDataToCanvasImageDataColorLUT.js */ "./internal/storedPixelDataToCanvasImageDataColorLUT.js");
  3168. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "storedPixelDataToCanvasImageDataColorLUT", function() { return _internal_storedPixelDataToCanvasImageDataColorLUT_js__WEBPACK_IMPORTED_MODULE_49__["default"]; });
  3169. /* harmony import */ var _internal_storedPixelDataToCanvasImageDataPseudocolorLUT_js__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(/*! ./internal/storedPixelDataToCanvasImageDataPseudocolorLUT.js */ "./internal/storedPixelDataToCanvasImageDataPseudocolorLUT.js");
  3170. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "storedPixelDataToCanvasImageDataPseudocolorLUT", function() { return _internal_storedPixelDataToCanvasImageDataPseudocolorLUT_js__WEBPACK_IMPORTED_MODULE_50__["default"]; });
  3171. /* harmony import */ var _triggerEvent_js__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(/*! ./triggerEvent.js */ "./triggerEvent.js");
  3172. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "triggerEvent", function() { return _triggerEvent_js__WEBPACK_IMPORTED_MODULE_51__["default"]; });
  3173. /* harmony import */ var _updateImage_js__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(/*! ./updateImage.js */ "./updateImage.js");
  3174. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "updateImage", function() { return _updateImage_js__WEBPACK_IMPORTED_MODULE_52__["default"]; });
  3175. /* harmony import */ var _webgl_index_js__WEBPACK_IMPORTED_MODULE_53__ = __webpack_require__(/*! ./webgl/index.js */ "./webgl/index.js");
  3176. /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "webGL", function() { return _webgl_index_js__WEBPACK_IMPORTED_MODULE_53__["default"]; });
  3177. // Internal (some of these are from old internal/legacy expose)
  3178. // Rendering
  3179. /**
  3180. * @module PixelCoordinateSystem
  3181. */
  3182. /**
  3183. * @module ViewportSettings
  3184. */
  3185. var cornerstone = {
  3186. drawImage: _internal_drawImage_js__WEBPACK_IMPORTED_MODULE_14__["default"],
  3187. generateLut: _internal_generateLut_js__WEBPACK_IMPORTED_MODULE_18__["default"],
  3188. getDefaultViewport: _internal_getDefaultViewport_js__WEBPACK_IMPORTED_MODULE_19__["default"],
  3189. requestAnimationFrame: _internal_requestAnimationFrame_js__WEBPACK_IMPORTED_MODULE_41__["default"],
  3190. storedPixelDataToCanvasImageData: _internal_storedPixelDataToCanvasImageData_js__WEBPACK_IMPORTED_MODULE_48__["default"],
  3191. storedColorPixelDataToCanvasImageData: _internal_storedColorPixelDataToCanvasImageData_js__WEBPACK_IMPORTED_MODULE_47__["default"],
  3192. storedPixelDataToCanvasImageDataColorLUT: _internal_storedPixelDataToCanvasImageDataColorLUT_js__WEBPACK_IMPORTED_MODULE_49__["default"],
  3193. storedPixelDataToCanvasImageDataPseudocolorLUT: _internal_storedPixelDataToCanvasImageDataPseudocolorLUT_js__WEBPACK_IMPORTED_MODULE_50__["default"],
  3194. internal: _internal_index_js__WEBPACK_IMPORTED_MODULE_27__["default"],
  3195. renderLabelMapImage: _rendering_renderLabelMapImage_js__WEBPACK_IMPORTED_MODULE_36__["renderLabelMapImage"],
  3196. renderPseudoColorImage: _rendering_renderPseudoColorImage_js__WEBPACK_IMPORTED_MODULE_37__["renderPseudoColorImage"],
  3197. renderColorImage: _rendering_renderColorImage_js__WEBPACK_IMPORTED_MODULE_34__["renderColorImage"],
  3198. renderGrayscaleImage: _rendering_renderGrayscaleImage_js__WEBPACK_IMPORTED_MODULE_35__["renderGrayscaleImage"],
  3199. renderWebImage: _rendering_renderWebImage_js__WEBPACK_IMPORTED_MODULE_39__["renderWebImage"],
  3200. renderToCanvas: _rendering_renderToCanvas_js__WEBPACK_IMPORTED_MODULE_38__["default"],
  3201. canvasToPixel: _canvasToPixel_js__WEBPACK_IMPORTED_MODULE_9__["default"],
  3202. disable: _disable_js__WEBPACK_IMPORTED_MODULE_11__["default"],
  3203. displayImage: _displayImage_js__WEBPACK_IMPORTED_MODULE_12__["default"],
  3204. draw: _draw_js__WEBPACK_IMPORTED_MODULE_13__["default"],
  3205. drawInvalidated: _drawInvalidated_js__WEBPACK_IMPORTED_MODULE_15__["default"],
  3206. enable: _enable_js__WEBPACK_IMPORTED_MODULE_16__["default"],
  3207. getElementData: _enabledElementData_js__WEBPACK_IMPORTED_MODULE_4__["getElementData"],
  3208. removeElementData: _enabledElementData_js__WEBPACK_IMPORTED_MODULE_4__["removeElementData"],
  3209. getEnabledElement: _enabledElements_js__WEBPACK_IMPORTED_MODULE_1__["getEnabledElement"],
  3210. addEnabledElement: _enabledElements_js__WEBPACK_IMPORTED_MODULE_1__["addEnabledElement"],
  3211. getEnabledElementsByImageId: _enabledElements_js__WEBPACK_IMPORTED_MODULE_1__["getEnabledElementsByImageId"],
  3212. getEnabledElements: _enabledElements_js__WEBPACK_IMPORTED_MODULE_1__["getEnabledElements"],
  3213. addLayer: _layers_js__WEBPACK_IMPORTED_MODULE_2__["addLayer"],
  3214. removeLayer: _layers_js__WEBPACK_IMPORTED_MODULE_2__["removeLayer"],
  3215. getLayer: _layers_js__WEBPACK_IMPORTED_MODULE_2__["getLayer"],
  3216. getLayers: _layers_js__WEBPACK_IMPORTED_MODULE_2__["getLayers"],
  3217. getVisibleLayers: _layers_js__WEBPACK_IMPORTED_MODULE_2__["getVisibleLayers"],
  3218. setActiveLayer: _layers_js__WEBPACK_IMPORTED_MODULE_2__["setActiveLayer"],
  3219. getActiveLayer: _layers_js__WEBPACK_IMPORTED_MODULE_2__["getActiveLayer"],
  3220. purgeLayers: _layers_js__WEBPACK_IMPORTED_MODULE_2__["purgeLayers"],
  3221. setLayerImage: _layers_js__WEBPACK_IMPORTED_MODULE_2__["setLayerImage"],
  3222. fitToWindow: _fitToWindow_js__WEBPACK_IMPORTED_MODULE_17__["default"],
  3223. getDefaultViewportForImage: _getDefaultViewportForImage_js__WEBPACK_IMPORTED_MODULE_20__["default"],
  3224. getDisplayedArea: _internal_getDisplayedArea_js__WEBPACK_IMPORTED_MODULE_21__["default"],
  3225. setDefaultViewport: _internal_setDefaultViewport_js__WEBPACK_IMPORTED_MODULE_44__["default"],
  3226. getImage: _getImage_js__WEBPACK_IMPORTED_MODULE_22__["default"],
  3227. getPixels: _getPixels_js__WEBPACK_IMPORTED_MODULE_23__["default"],
  3228. getStoredPixels: _getStoredPixels_js__WEBPACK_IMPORTED_MODULE_24__["default"],
  3229. getViewport: _getViewport_js__WEBPACK_IMPORTED_MODULE_25__["default"],
  3230. loadImage: _imageLoader_js__WEBPACK_IMPORTED_MODULE_5__["loadImage"],
  3231. loadAndCacheImage: _imageLoader_js__WEBPACK_IMPORTED_MODULE_5__["loadAndCacheImage"],
  3232. registerImageLoader: _imageLoader_js__WEBPACK_IMPORTED_MODULE_5__["registerImageLoader"],
  3233. registerUnknownImageLoader: _imageLoader_js__WEBPACK_IMPORTED_MODULE_5__["registerUnknownImageLoader"],
  3234. invalidate: _invalidate_js__WEBPACK_IMPORTED_MODULE_28__["default"],
  3235. invalidateImageId: _invalidateImageId_js__WEBPACK_IMPORTED_MODULE_29__["default"],
  3236. pageToPixel: _pageToPixel_js__WEBPACK_IMPORTED_MODULE_31__["default"],
  3237. pixelToCanvas: _pixelToCanvas_js__WEBPACK_IMPORTED_MODULE_33__["default"],
  3238. reset: _reset_js__WEBPACK_IMPORTED_MODULE_42__["default"],
  3239. resize: _resize_js__WEBPACK_IMPORTED_MODULE_43__["default"],
  3240. setToPixelCoordinateSystem: _setToPixelCoordinateSystem_js__WEBPACK_IMPORTED_MODULE_45__["default"],
  3241. setViewport: _setViewport_js__WEBPACK_IMPORTED_MODULE_46__["default"],
  3242. updateImage: _updateImage_js__WEBPACK_IMPORTED_MODULE_52__["default"],
  3243. pixelDataToFalseColorData: _pixelDataToFalseColorData_js__WEBPACK_IMPORTED_MODULE_32__["default"],
  3244. rendering: _rendering_index_js__WEBPACK_IMPORTED_MODULE_40__["default"],
  3245. imageCache: _imageCache_js__WEBPACK_IMPORTED_MODULE_26__["default"],
  3246. metaData: _metaData_js__WEBPACK_IMPORTED_MODULE_30__["default"],
  3247. webGL: _webgl_index_js__WEBPACK_IMPORTED_MODULE_53__["default"],
  3248. colors: _colors_index_js__WEBPACK_IMPORTED_MODULE_10__["default"],
  3249. convertImageToFalseColorImage: _falseColorMapping_js__WEBPACK_IMPORTED_MODULE_3__["convertImageToFalseColorImage"],
  3250. convertToFalseColorImage: _falseColorMapping_js__WEBPACK_IMPORTED_MODULE_3__["convertToFalseColorImage"],
  3251. restoreImage: _falseColorMapping_js__WEBPACK_IMPORTED_MODULE_3__["restoreImage"],
  3252. EVENTS: _events_js__WEBPACK_IMPORTED_MODULE_0__["default"],
  3253. events: _events_js__WEBPACK_IMPORTED_MODULE_0__["events"],
  3254. triggerEvent: _triggerEvent_js__WEBPACK_IMPORTED_MODULE_51__["default"],
  3255. imageLoadPoolManager: _requestPool_imageLoadPoolManager_ts__WEBPACK_IMPORTED_MODULE_6__["default"],
  3256. imageRetrievalPoolManager: _requestPool_imageRetrievalPoolManager_ts__WEBPACK_IMPORTED_MODULE_7__["default"],
  3257. RequestPoolManager: _requestPool_RequestPoolManager_ts__WEBPACK_IMPORTED_MODULE_8__["RequestPoolManager"]
  3258. };
  3259. /* harmony default export */ __webpack_exports__["default"] = (cornerstone);
  3260. /***/ }),
  3261. /***/ "./internal/calculateTransform.js":
  3262. /*!****************************************!*\
  3263. !*** ./internal/calculateTransform.js ***!
  3264. \****************************************/
  3265. /*! exports provided: default */
  3266. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  3267. "use strict";
  3268. __webpack_require__.r(__webpack_exports__);
  3269. /* harmony import */ var _transform_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./transform.js */ "./internal/transform.js");
  3270. /* harmony import */ var _getDisplayedArea_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getDisplayedArea.js */ "./internal/getDisplayedArea.js");
  3271. /**
  3272. * Calculate the transform for a Cornerstone enabled element
  3273. *
  3274. * @param {EnabledElement} enabledElement The Cornerstone Enabled Element
  3275. * @param {Number} [scale] The viewport scale
  3276. * @return {Transform} The current transform
  3277. * @memberof Internal
  3278. */
  3279. /* harmony default export */ __webpack_exports__["default"] = (function (enabledElement, scale) {
  3280. var transform = new _transform_js__WEBPACK_IMPORTED_MODULE_0__["Transform"](); // Move to center of canvas
  3281. transform.translate(enabledElement.canvas.width / 2, enabledElement.canvas.height / 2); // Apply the rotation before scaling for non square pixels
  3282. var angle = enabledElement.viewport.rotation;
  3283. if (angle !== 0) {
  3284. transform.rotate(angle * Math.PI / 180);
  3285. } // Apply the scale
  3286. var widthScale = enabledElement.viewport.scale;
  3287. var heightScale = enabledElement.viewport.scale;
  3288. var imageDisplayedArea = Object(_getDisplayedArea_js__WEBPACK_IMPORTED_MODULE_1__["default"])(enabledElement.image, enabledElement.viewport);
  3289. var offsetX = imageDisplayedArea.tlhc.x - 1;
  3290. var offsetY = imageDisplayedArea.tlhc.y - 1;
  3291. var width = imageDisplayedArea.brhc.x - offsetX;
  3292. var height = imageDisplayedArea.brhc.y - offsetY;
  3293. if (imageDisplayedArea.presentationSizeMode === 'NONE') {
  3294. if (enabledElement.image.rowPixelSpacing < enabledElement.image.columnPixelSpacing) {
  3295. widthScale *= enabledElement.image.columnPixelSpacing / enabledElement.image.rowPixelSpacing;
  3296. } else if (enabledElement.image.columnPixelSpacing < enabledElement.image.rowPixelSpacing) {
  3297. heightScale *= enabledElement.image.rowPixelSpacing / enabledElement.image.columnPixelSpacing;
  3298. }
  3299. } else {
  3300. // These should be good for "TRUE SIZE" and "MAGNIFY"
  3301. widthScale = imageDisplayedArea.columnPixelSpacing;
  3302. heightScale = imageDisplayedArea.rowPixelSpacing;
  3303. if (imageDisplayedArea.presentationSizeMode === 'SCALE TO FIT') {
  3304. // Fit TRUE IMAGE image (width/height) to window
  3305. var verticalScale = enabledElement.canvas.height / (height * heightScale);
  3306. var horizontalScale = enabledElement.canvas.width / (width * widthScale); // Apply new scale
  3307. widthScale = heightScale = Math.min(horizontalScale, verticalScale);
  3308. if (imageDisplayedArea.rowPixelSpacing < imageDisplayedArea.columnPixelSpacing) {
  3309. widthScale *= imageDisplayedArea.columnPixelSpacing / imageDisplayedArea.rowPixelSpacing;
  3310. } else if (imageDisplayedArea.columnPixelSpacing < imageDisplayedArea.rowPixelSpacing) {
  3311. heightScale *= imageDisplayedArea.rowPixelSpacing / imageDisplayedArea.columnPixelSpacing;
  3312. }
  3313. }
  3314. }
  3315. transform.scale(widthScale, heightScale); // Unrotate to so we can translate unrotated
  3316. if (angle !== 0) {
  3317. transform.rotate(-angle * Math.PI / 180);
  3318. } // Apply the pan offset
  3319. transform.translate(enabledElement.viewport.translation.x, enabledElement.viewport.translation.y); // Rotate again so we can apply general scale
  3320. if (angle !== 0) {
  3321. transform.rotate(angle * Math.PI / 180);
  3322. }
  3323. if (scale !== undefined) {
  3324. // Apply the font scale
  3325. transform.scale(scale, scale);
  3326. } // Apply Flip if required
  3327. if (enabledElement.viewport.hflip) {
  3328. transform.scale(-1, 1);
  3329. }
  3330. if (enabledElement.viewport.vflip) {
  3331. transform.scale(1, -1);
  3332. } // Move back from center of image
  3333. transform.translate(-width / 2, -height / 2); // Move to displayedArea
  3334. transform.translate(-offsetX, -offsetY);
  3335. return transform;
  3336. });
  3337. /***/ }),
  3338. /***/ "./internal/computeAutoVoi.js":
  3339. /*!************************************!*\
  3340. !*** ./internal/computeAutoVoi.js ***!
  3341. \************************************/
  3342. /*! exports provided: default */
  3343. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  3344. "use strict";
  3345. __webpack_require__.r(__webpack_exports__);
  3346. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return computeAutoVoi; });
  3347. /**
  3348. * Computes the VOI to display all the pixels if no VOI LUT data (Window Width/Window Center or voiLUT) exists on the viewport object.
  3349. *
  3350. * @param {Viewport} viewport - Object containing the viewport properties
  3351. * @param {Object} image An Image loaded by a Cornerstone Image Loader
  3352. * @returns {void}
  3353. * @memberof Internal
  3354. */
  3355. function computeAutoVoi(viewport, image) {
  3356. if (hasVoi(viewport)) {
  3357. return;
  3358. }
  3359. var maxVoi = image.maxPixelValue * image.slope + image.intercept;
  3360. var minVoi = image.minPixelValue * image.slope + image.intercept;
  3361. var ww = maxVoi - minVoi;
  3362. var wc = (maxVoi + minVoi) / 2;
  3363. if (viewport.voi === undefined) {
  3364. viewport.voi = {
  3365. windowWidth: ww,
  3366. windowCenter: wc
  3367. };
  3368. } else {
  3369. viewport.voi.windowWidth = ww;
  3370. viewport.voi.windowCenter = wc;
  3371. }
  3372. }
  3373. /**
  3374. * Check if viewport has voi LUT data
  3375. * @param {any} viewport The viewport to check for voi LUT data
  3376. * @returns {Boolean} true viewport has LUT data (Window Width/Window Center or voiLUT). Otherwise, false.
  3377. * @memberof Internal
  3378. */
  3379. function hasVoi(viewport) {
  3380. var hasLut = viewport.voiLUT && viewport.voiLUT.lut && viewport.voiLUT.lut.length > 0;
  3381. return hasLut || viewport.voi.windowWidth !== undefined && viewport.voi.windowCenter !== undefined;
  3382. }
  3383. /***/ }),
  3384. /***/ "./internal/createViewport.js":
  3385. /*!************************************!*\
  3386. !*** ./internal/createViewport.js ***!
  3387. \************************************/
  3388. /*! exports provided: default */
  3389. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  3390. "use strict";
  3391. __webpack_require__.r(__webpack_exports__);
  3392. /* harmony import */ var _setDefaultViewport_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./setDefaultViewport.js */ "./internal/setDefaultViewport.js");
  3393. /**
  3394. * Creates a new viewport object containing default values
  3395. *
  3396. * @returns {Viewport} viewport object
  3397. * @memberof Internal
  3398. */
  3399. /* harmony default export */ __webpack_exports__["default"] = (function () {
  3400. var initialDefaultViewport = {
  3401. scale: 1,
  3402. translation: {
  3403. x: 0,
  3404. y: 0
  3405. },
  3406. voi: {
  3407. windowWidth: undefined,
  3408. windowCenter: undefined
  3409. },
  3410. invert: false,
  3411. pixelReplication: false,
  3412. rotation: 0,
  3413. hflip: false,
  3414. vflip: false,
  3415. modalityLUT: undefined,
  3416. voiLUT: undefined,
  3417. colormap: undefined,
  3418. labelmap: false,
  3419. displayedArea: undefined
  3420. };
  3421. return Object.assign({}, initialDefaultViewport, _setDefaultViewport_js__WEBPACK_IMPORTED_MODULE_0__["state"].viewport);
  3422. });
  3423. /***/ }),
  3424. /***/ "./internal/drawCompositeImage.js":
  3425. /*!****************************************!*\
  3426. !*** ./internal/drawCompositeImage.js ***!
  3427. \****************************************/
  3428. /*! exports provided: default */
  3429. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  3430. "use strict";
  3431. __webpack_require__.r(__webpack_exports__);
  3432. /* harmony import */ var _layers_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../layers.js */ "./layers.js");
  3433. /* harmony import */ var _rendering_renderGrayscaleImage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../rendering/renderGrayscaleImage.js */ "./rendering/renderGrayscaleImage.js");
  3434. /* harmony import */ var _rendering_renderColorImage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../rendering/renderColorImage.js */ "./rendering/renderColorImage.js");
  3435. /* harmony import */ var _rendering_renderPseudoColorImage_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../rendering/renderPseudoColorImage.js */ "./rendering/renderPseudoColorImage.js");
  3436. /* harmony import */ var _rendering_renderLabelMapImage_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../rendering/renderLabelMapImage.js */ "./rendering/renderLabelMapImage.js");
  3437. /* harmony import */ var _setToPixelCoordinateSystem_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../setToPixelCoordinateSystem.js */ "./setToPixelCoordinateSystem.js");
  3438. /* harmony import */ var _getDisplayedArea_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./getDisplayedArea.js */ "./internal/getDisplayedArea.js");
  3439. function getViewportRatio(baseLayer, targetLayer) {
  3440. if (!baseLayer.syncProps) {
  3441. updateLayerSyncProps(baseLayer);
  3442. }
  3443. if (!targetLayer.syncProps) {
  3444. updateLayerSyncProps(targetLayer);
  3445. }
  3446. return targetLayer.syncProps.originalScale / baseLayer.syncProps.originalScale;
  3447. }
  3448. function updateLayerSyncProps(layer) {
  3449. var syncProps = layer.syncProps || {}; // This is used to keep each of the layers' viewports in sync with the active layer
  3450. syncProps.originalScale = layer.viewport.scale;
  3451. layer.syncProps = syncProps;
  3452. } // Sync all viewports based on active layer's viewport
  3453. function syncViewports(layers, activeLayer) {
  3454. // If we intend to keep the viewport's scale, translation and rotation in sync,
  3455. // loop through the layers
  3456. layers.forEach(function (layer) {
  3457. // Don't do anything to the active layer
  3458. // Don't do anything if this layer has no viewport
  3459. if (layer === activeLayer || !layer.viewport || !activeLayer.viewport) {
  3460. return;
  3461. }
  3462. if (!layer.syncProps) {
  3463. updateLayerSyncProps(layer);
  3464. }
  3465. var viewportRatio = getViewportRatio(activeLayer, layer); // Update the layer's translation and scale to keep them in sync with the first image
  3466. // based on the ratios between the images
  3467. layer.viewport.scale = activeLayer.viewport.scale * viewportRatio;
  3468. layer.viewport.rotation = activeLayer.viewport.rotation;
  3469. layer.viewport.translation = {
  3470. x: activeLayer.viewport.translation.x / viewportRatio,
  3471. y: activeLayer.viewport.translation.y / viewportRatio
  3472. };
  3473. layer.viewport.hflip = activeLayer.viewport.hflip;
  3474. layer.viewport.vflip = activeLayer.viewport.vflip;
  3475. });
  3476. }
  3477. /**
  3478. * Internal function to render all layers for a Cornerstone enabled element
  3479. *
  3480. * @param {CanvasRenderingContext2D} context Canvas context to draw upon
  3481. * @param {EnabledElementLayer[]} layers The array of all layers for this enabled element
  3482. * @param {Boolean} invalidated A boolean whether or not this image has been invalidated and must be redrawn
  3483. * @returns {void}
  3484. * @memberof Internal
  3485. */
  3486. function renderLayers(context, layers, invalidated) {
  3487. // Loop through each layer and draw it to the canvas
  3488. layers.forEach(function (layer, index) {
  3489. if (!layer.image) {
  3490. return;
  3491. }
  3492. context.save(); // Set the layer's canvas to the pixel coordinate system
  3493. layer.canvas = context.canvas;
  3494. Object(_setToPixelCoordinateSystem_js__WEBPACK_IMPORTED_MODULE_5__["default"])(layer, context); // Render into the layer's canvas
  3495. var colormap = layer.viewport.colormap || layer.options.colormap;
  3496. var labelmap = layer.viewport.labelmap;
  3497. var isInvalid = layer.invalid || invalidated;
  3498. if (colormap && colormap !== '' && labelmap === true) {
  3499. Object(_rendering_renderLabelMapImage_js__WEBPACK_IMPORTED_MODULE_4__["addLabelMapLayer"])(layer, isInvalid);
  3500. } else if (colormap && colormap !== '') {
  3501. Object(_rendering_renderPseudoColorImage_js__WEBPACK_IMPORTED_MODULE_3__["addPseudoColorLayer"])(layer, isInvalid);
  3502. } else if (layer.image.color === true) {
  3503. Object(_rendering_renderColorImage_js__WEBPACK_IMPORTED_MODULE_2__["addColorLayer"])(layer, isInvalid);
  3504. } else {
  3505. // If this is the base layer, use the alpha channel for rendering of the grayscale image
  3506. var useAlphaChannel = index === 0;
  3507. Object(_rendering_renderGrayscaleImage_js__WEBPACK_IMPORTED_MODULE_1__["addGrayscaleLayer"])(layer, isInvalid, useAlphaChannel);
  3508. } // Apply any global opacity settings that have been defined for this layer
  3509. if (layer.options && layer.options.opacity) {
  3510. context.globalAlpha = layer.options.opacity;
  3511. } else {
  3512. context.globalAlpha = 1;
  3513. }
  3514. if (layer.options && layer.options.fillStyle) {
  3515. context.fillStyle = layer.options.fillStyle;
  3516. } // Set the pixelReplication property before drawing from the layer into the
  3517. // composite canvas
  3518. context.imageSmoothingEnabled = !layer.viewport.pixelReplication;
  3519. context.mozImageSmoothingEnabled = context.imageSmoothingEnabled; // Draw from the current layer's canvas onto the enabled element's canvas
  3520. var layerDisplayedArea = Object(_getDisplayedArea_js__WEBPACK_IMPORTED_MODULE_6__["default"])(layer.image, layer.viewport);
  3521. var sx = layerDisplayedArea.tlhc.x - 1;
  3522. var sy = layerDisplayedArea.tlhc.y - 1;
  3523. var width = layerDisplayedArea.brhc.x - sx;
  3524. var height = layerDisplayedArea.brhc.y - sy;
  3525. context.drawImage(layer.canvas, sx, sy, width, height, sx, sy, width, height);
  3526. context.restore();
  3527. layer.invalid = false;
  3528. });
  3529. }
  3530. /**
  3531. * Internal API function to draw a composite image to a given enabled element
  3532. *
  3533. * @param {EnabledElement} enabledElement An enabled element to draw into
  3534. * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used
  3535. * @returns {void}
  3536. */
  3537. /* harmony default export */ __webpack_exports__["default"] = (function (enabledElement, invalidated) {
  3538. var element = enabledElement.element;
  3539. var allLayers = Object(_layers_js__WEBPACK_IMPORTED_MODULE_0__["getLayers"])(element);
  3540. var activeLayer = Object(_layers_js__WEBPACK_IMPORTED_MODULE_0__["getActiveLayer"])(element);
  3541. var visibleLayers = Object(_layers_js__WEBPACK_IMPORTED_MODULE_0__["getVisibleLayers"])(element);
  3542. var resynced = !enabledElement.lastSyncViewportsState && enabledElement.syncViewports; // This state will help us to determine if the user has re-synced the
  3543. // layers allowing us to make a new copy of the viewports
  3544. enabledElement.lastSyncViewportsState = enabledElement.syncViewports; // Stores a copy of all viewports if the user has just synced them then we can use the
  3545. // copies to calculate anything later (ratio, translation offset, rotation offset, etc)
  3546. if (resynced) {
  3547. allLayers.forEach(function (layer) {
  3548. if (layer.viewport) {
  3549. updateLayerSyncProps(layer);
  3550. }
  3551. });
  3552. } // Sync all viewports in case it's activated
  3553. if (enabledElement.syncViewports === true) {
  3554. syncViewports(visibleLayers, activeLayer);
  3555. } // Get the enabled element's canvas so we can draw to it
  3556. var context = enabledElement.canvas.getContext('2d', {
  3557. desynchronized: true
  3558. });
  3559. context.setTransform(1, 0, 0, 1, 0, 0); // Clear the canvas
  3560. context.fillStyle = 'black';
  3561. context.fillRect(0, 0, enabledElement.canvas.width, enabledElement.canvas.height); // Render all visible layers
  3562. renderLayers(context, visibleLayers, invalidated);
  3563. });
  3564. /***/ }),
  3565. /***/ "./internal/drawImage.js":
  3566. /*!*******************************!*\
  3567. !*** ./internal/drawImage.js ***!
  3568. \*******************************/
  3569. /*! exports provided: default */
  3570. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  3571. "use strict";
  3572. __webpack_require__.r(__webpack_exports__);
  3573. /**
  3574. * Internal API function to draw an image to a given enabled element
  3575. *
  3576. * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw
  3577. * @param {Boolean} [invalidated = false] - true if pixel data has been invalidated and cached rendering should not be used
  3578. * @returns {void}
  3579. * @memberof Internal
  3580. */
  3581. /* harmony default export */ __webpack_exports__["default"] = (function (enabledElement) {
  3582. var invalidated = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
  3583. enabledElement.needsRedraw = true;
  3584. if (invalidated) {
  3585. enabledElement.invalid = true;
  3586. }
  3587. });
  3588. /***/ }),
  3589. /***/ "./internal/drawImageSync.js":
  3590. /*!***********************************!*\
  3591. !*** ./internal/drawImageSync.js ***!
  3592. \***********************************/
  3593. /*! exports provided: default */
  3594. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  3595. "use strict";
  3596. __webpack_require__.r(__webpack_exports__);
  3597. /* harmony import */ var _now_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./now.js */ "./internal/now.js");
  3598. /* harmony import */ var _drawCompositeImage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./drawCompositeImage.js */ "./internal/drawCompositeImage.js");
  3599. /* harmony import */ var _rendering_renderColorImage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../rendering/renderColorImage.js */ "./rendering/renderColorImage.js");
  3600. /* harmony import */ var _rendering_renderGrayscaleImage_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../rendering/renderGrayscaleImage.js */ "./rendering/renderGrayscaleImage.js");
  3601. /* harmony import */ var _rendering_renderPseudoColorImage_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../rendering/renderPseudoColorImage.js */ "./rendering/renderPseudoColorImage.js");
  3602. /* harmony import */ var _rendering_renderLabelMapImage_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../rendering/renderLabelMapImage.js */ "./rendering/renderLabelMapImage.js");
  3603. /* harmony import */ var _triggerEvent_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../triggerEvent.js */ "./triggerEvent.js");
  3604. /* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../events.js */ "./events.js");
  3605. /**
  3606. * Draw an image to a given enabled element synchronously
  3607. *
  3608. * @param {EnabledElement} enabledElement An enabled element to draw into
  3609. * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used
  3610. * @returns {void}
  3611. * @memberof Internal
  3612. */
  3613. /* harmony default export */ __webpack_exports__["default"] = (function (enabledElement, invalidated) {
  3614. var image = enabledElement.image;
  3615. var element = enabledElement.element;
  3616. var layers = enabledElement.layers || []; // Check if enabledElement can be redrawn
  3617. if (!enabledElement.canvas || !enabledElement.image) {
  3618. return;
  3619. } // Start measuring the time needed to draw the image/layers
  3620. var start = Object(_now_js__WEBPACK_IMPORTED_MODULE_0__["default"])();
  3621. image.stats = {
  3622. lastGetPixelDataTime: -1.0,
  3623. lastStoredPixelDataToCanvasImageDataTime: -1.0,
  3624. lastPutImageDataTime: -1.0,
  3625. lastRenderTime: -1.0,
  3626. lastLutGenerateTime: -1.0
  3627. };
  3628. if (layers && layers.length) {
  3629. Object(_drawCompositeImage_js__WEBPACK_IMPORTED_MODULE_1__["default"])(enabledElement, invalidated);
  3630. } else if (image) {
  3631. var render = image.render;
  3632. if (!render) {
  3633. if (enabledElement.viewport.colormap && enabledElement.viewport.colormap !== '' && enabledElement.image.labelmap === true) {
  3634. render = _rendering_renderLabelMapImage_js__WEBPACK_IMPORTED_MODULE_5__["renderLabelMapImage"];
  3635. } else if (enabledElement.viewport.colormap && enabledElement.viewport.colormap !== '') {
  3636. render = _rendering_renderPseudoColorImage_js__WEBPACK_IMPORTED_MODULE_4__["renderPseudoColorImage"];
  3637. } else if (image.color) {
  3638. render = _rendering_renderColorImage_js__WEBPACK_IMPORTED_MODULE_2__["renderColorImage"];
  3639. } else {
  3640. render = _rendering_renderGrayscaleImage_js__WEBPACK_IMPORTED_MODULE_3__["renderGrayscaleImage"];
  3641. }
  3642. }
  3643. render(enabledElement, invalidated);
  3644. } // Calculate how long it took to draw the image/layers
  3645. var renderTimeInMs = Object(_now_js__WEBPACK_IMPORTED_MODULE_0__["default"])() - start;
  3646. var eventData = {
  3647. viewport: enabledElement.viewport,
  3648. element: element,
  3649. image: image,
  3650. enabledElement: enabledElement,
  3651. canvasContext: enabledElement.canvas.getContext('2d', {
  3652. desynchronized: true
  3653. }),
  3654. renderTimeInMs: renderTimeInMs
  3655. };
  3656. image.stats.lastRenderTime = renderTimeInMs;
  3657. enabledElement.invalid = false;
  3658. enabledElement.needsRedraw = false;
  3659. Object(_triggerEvent_js__WEBPACK_IMPORTED_MODULE_6__["default"])(element, _events_js__WEBPACK_IMPORTED_MODULE_7__["default"].IMAGE_RENDERED, eventData);
  3660. });
  3661. /***/ }),
  3662. /***/ "./internal/generateColorLut.js":
  3663. /*!**************************************!*\
  3664. !*** ./internal/generateColorLut.js ***!
  3665. \**************************************/
  3666. /*! exports provided: default */
  3667. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  3668. "use strict";
  3669. __webpack_require__.r(__webpack_exports__);
  3670. /* harmony import */ var _getVOILut_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getVOILut.js */ "./internal/getVOILut.js");
  3671. /**
  3672. * Creates a LUT used while rendering to convert stored pixel values to
  3673. * display pixels
  3674. *
  3675. * @param {Image} image A Cornerstone Image Object
  3676. * @param {Number} windowWidth The Window Width
  3677. * @param {Number} windowCenter The Window Center
  3678. * @param {Boolean} invert A boolean describing whether or not the image has been inverted
  3679. * @param {Array} [voiLUT] A Volume of Interest Lookup Table
  3680. *
  3681. * @returns {Uint8ClampedArray} A lookup table to apply to the image
  3682. * @memberof Internal
  3683. */
  3684. /* harmony default export */ __webpack_exports__["default"] = (function (image, windowWidth, windowCenter, invert, voiLUT) {
  3685. var maxPixelValue = image.maxPixelValue;
  3686. var minPixelValue = image.minPixelValue;
  3687. var offset = Math.min(minPixelValue, 0);
  3688. if (image.cachedLut === undefined) {
  3689. var length = maxPixelValue - offset + 1;
  3690. image.cachedLut = {};
  3691. image.cachedLut.lutArray = new Uint8ClampedArray(length);
  3692. }
  3693. var lut = image.cachedLut.lutArray;
  3694. var vlutfn = Object(_getVOILut_js__WEBPACK_IMPORTED_MODULE_0__["default"])(windowWidth, windowCenter, voiLUT);
  3695. if (invert === true) {
  3696. for (var storedValue = minPixelValue; storedValue <= maxPixelValue; storedValue++) {
  3697. lut[storedValue + -offset] = 255 - vlutfn(storedValue);
  3698. }
  3699. } else {
  3700. for (var _storedValue = minPixelValue; _storedValue <= maxPixelValue; _storedValue++) {
  3701. lut[_storedValue + -offset] = vlutfn(_storedValue);
  3702. }
  3703. }
  3704. return lut;
  3705. });
  3706. /***/ }),
  3707. /***/ "./internal/generateLut.js":
  3708. /*!*********************************!*\
  3709. !*** ./internal/generateLut.js ***!
  3710. \*********************************/
  3711. /*! exports provided: default */
  3712. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  3713. "use strict";
  3714. __webpack_require__.r(__webpack_exports__);
  3715. /* harmony import */ var _getModalityLUT_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getModalityLUT.js */ "./internal/getModalityLUT.js");
  3716. /* harmony import */ var _getVOILut_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getVOILut.js */ "./internal/getVOILut.js");
  3717. /**
  3718. * Creates a LUT used while rendering to convert stored pixel values to
  3719. * display pixels
  3720. *
  3721. * @param {Image} image A Cornerstone Image Object
  3722. * @param {Number} windowWidth The Window Width
  3723. * @param {Number} windowCenter The Window Center
  3724. * @param {Boolean} invert A boolean describing whether or not the image has been inverted
  3725. * @param {Array} [modalityLUT] A modality Lookup Table
  3726. * @param {Array} [voiLUT] A Volume of Interest Lookup Table
  3727. *
  3728. * @returns {Uint8ClampedArray} A lookup table to apply to the image
  3729. * @memberof Internal
  3730. */
  3731. /* harmony default export */ __webpack_exports__["default"] = (function (image, windowWidth, windowCenter, invert, modalityLUT, voiLUT) {
  3732. var maxPixelValue = image.maxPixelValue;
  3733. var minPixelValue = image.minPixelValue;
  3734. var offset = Math.min(minPixelValue, 0);
  3735. if (image.cachedLut === undefined) {
  3736. var length = maxPixelValue - offset + 1;
  3737. image.cachedLut = {};
  3738. image.cachedLut.lutArray = new Uint8ClampedArray(length);
  3739. }
  3740. var lut = image.cachedLut.lutArray;
  3741. var slopeOrInterceptAreFloat = Boolean(image.slope % 1) || Boolean(image.intercept % 1);
  3742. var mlutfn = Object(_getModalityLUT_js__WEBPACK_IMPORTED_MODULE_0__["default"])(image.slope, image.intercept, modalityLUT);
  3743. var vlutfn = Object(_getVOILut_js__WEBPACK_IMPORTED_MODULE_1__["default"])(windowWidth, windowCenter, voiLUT, slopeOrInterceptAreFloat);
  3744. if (invert === true) {
  3745. for (var storedValue = minPixelValue; storedValue <= maxPixelValue; storedValue++) {
  3746. lut[storedValue + -offset] = 255 - vlutfn(mlutfn(storedValue));
  3747. }
  3748. } else {
  3749. for (var _storedValue = minPixelValue; _storedValue <= maxPixelValue; _storedValue++) {
  3750. lut[_storedValue + -offset] = vlutfn(mlutfn(_storedValue));
  3751. }
  3752. }
  3753. return lut;
  3754. });
  3755. /***/ }),
  3756. /***/ "./internal/getCanvas.js":
  3757. /*!*******************************!*\
  3758. !*** ./internal/getCanvas.js ***!
  3759. \*******************************/
  3760. /*! exports provided: default */
  3761. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  3762. "use strict";
  3763. __webpack_require__.r(__webpack_exports__);
  3764. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getCanvas; });
  3765. var CANVAS_CSS_CLASS = 'cornerstone-canvas';
  3766. /**
  3767. * Create a canvas and append it to the element
  3768. *
  3769. * @param {HTMLElement} element An HTML Element
  3770. * @return {HTMLElement} canvas A Canvas DOM element
  3771. */
  3772. function createCanvas(element) {
  3773. var canvas = document.createElement('canvas');
  3774. canvas.style.display = 'block';
  3775. canvas.classList.add(CANVAS_CSS_CLASS);
  3776. element.appendChild(canvas);
  3777. return canvas;
  3778. }
  3779. /**
  3780. * Create a canvas or returns the one that already exists for a given element
  3781. *
  3782. * @param {HTMLElement} element An HTML Element
  3783. * @return {HTMLElement} canvas A Canvas DOM element
  3784. */
  3785. function getCanvas(element) {
  3786. var selector = "canvas.".concat(CANVAS_CSS_CLASS);
  3787. return element.querySelector(selector) || createCanvas(element);
  3788. }
  3789. /***/ }),
  3790. /***/ "./internal/getDefaultViewport.js":
  3791. /*!****************************************!*\
  3792. !*** ./internal/getDefaultViewport.js ***!
  3793. \****************************************/
  3794. /*! exports provided: default */
  3795. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  3796. "use strict";
  3797. __webpack_require__.r(__webpack_exports__);
  3798. /* harmony import */ var _createViewport_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./createViewport.js */ "./internal/createViewport.js");
  3799. /* harmony import */ var _getImageFitScale_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getImageFitScale.js */ "./internal/getImageFitScale.js");
  3800. /**
  3801. * Creates a new viewport object containing default values for the image and canvas
  3802. *
  3803. * @param {HTMLElement} canvas A Canvas DOM element
  3804. * @param {Image} image A Cornerstone Image Object
  3805. * @returns {Viewport} viewport object
  3806. * @memberof Internal
  3807. */
  3808. /* harmony default export */ __webpack_exports__["default"] = (function (canvas, image) {
  3809. if (canvas === undefined) {
  3810. throw new Error('getDefaultViewport: parameter canvas must not be undefined');
  3811. }
  3812. if (image === undefined) {
  3813. return Object(_createViewport_js__WEBPACK_IMPORTED_MODULE_0__["default"])();
  3814. } // Fit image to window
  3815. var scale = Object(_getImageFitScale_js__WEBPACK_IMPORTED_MODULE_1__["default"])(canvas, image, 0).scaleFactor;
  3816. return {
  3817. scale: scale,
  3818. translation: {
  3819. x: 0,
  3820. y: 0
  3821. },
  3822. voi: {
  3823. windowWidth: image.windowWidth,
  3824. windowCenter: image.windowCenter
  3825. },
  3826. invert: image.invert,
  3827. pixelReplication: false,
  3828. rotation: 0,
  3829. hflip: false,
  3830. vflip: false,
  3831. modalityLUT: image.modalityLUT,
  3832. voiLUT: image.voiLUT,
  3833. colormap: image.colormap,
  3834. labelmap: Boolean(image.labelmap),
  3835. displayedArea: undefined
  3836. };
  3837. });
  3838. /***/ }),
  3839. /***/ "./internal/getDisplayedArea.js":
  3840. /*!**************************************!*\
  3841. !*** ./internal/getDisplayedArea.js ***!
  3842. \**************************************/
  3843. /*! exports provided: default */
  3844. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  3845. "use strict";
  3846. __webpack_require__.r(__webpack_exports__);
  3847. /**
  3848. * Returns the displayedArea from the viewport if exists or
  3849. * creates a new displayedArea object containing default values for the image
  3850. *
  3851. * @param {Image} image A Cornerstone Image Object
  3852. * @param {Viewport} viewport An optional viewport Object
  3853. * @returns {DisplayedArea} displayedArea object
  3854. * @memberof Internal
  3855. */
  3856. /* harmony default export */ __webpack_exports__["default"] = (function (image) {
  3857. var viewport = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
  3858. if (viewport && viewport.displayedArea) {
  3859. return viewport.displayedArea;
  3860. }
  3861. if (image === undefined) {
  3862. throw new Error('getDisplayedArea: parameter image must not be undefined');
  3863. }
  3864. return {
  3865. tlhc: {
  3866. x: 1,
  3867. y: 1
  3868. },
  3869. brhc: {
  3870. x: image.columns,
  3871. y: image.rows
  3872. },
  3873. rowPixelSpacing: image.rowPixelSpacing === undefined ? 1 : image.rowPixelSpacing,
  3874. columnPixelSpacing: image.columnPixelSpacing === undefined ? 1 : image.columnPixelSpacing,
  3875. presentationSizeMode: 'NONE'
  3876. };
  3877. });
  3878. /***/ }),
  3879. /***/ "./internal/getFillStyle.js":
  3880. /*!**********************************!*\
  3881. !*** ./internal/getFillStyle.js ***!
  3882. \**********************************/
  3883. /*! exports provided: default */
  3884. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  3885. "use strict";
  3886. __webpack_require__.r(__webpack_exports__);
  3887. /**
  3888. * Get current fillStyle for enabled element
  3889. *
  3890. * @param {Object} enabledElement Enabled element
  3891. * @returns {String} Current fillStyle of enabled element
  3892. */
  3893. /* harmony default export */ __webpack_exports__["default"] = (function (enabledElement) {
  3894. var _ref = enabledElement.viewport || {},
  3895. invert = _ref.invert;
  3896. var _ref2 = enabledElement.options || {},
  3897. fillStyle = _ref2.fillStyle;
  3898. if (['black', 'white'].indexOf(fillStyle) !== -1) {
  3899. return invert ? 'white' : 'black';
  3900. }
  3901. return 'black';
  3902. });
  3903. /***/ }),
  3904. /***/ "./internal/getImageFitScale.js":
  3905. /*!**************************************!*\
  3906. !*** ./internal/getImageFitScale.js ***!
  3907. \**************************************/
  3908. /*! exports provided: default */
  3909. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  3910. "use strict";
  3911. __webpack_require__.r(__webpack_exports__);
  3912. /* harmony import */ var _validator_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./validator.js */ "./internal/validator.js");
  3913. /* harmony import */ var _getImageSize_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getImageSize.js */ "./internal/getImageSize.js");
  3914. /**
  3915. * Calculates the horizontal, vertical and minimum scale factor for an image
  3916. @param {{width, height}} windowSize The window size where the image is displayed. This can be any HTML element or structure with a width, height fields (e.g. canvas).
  3917. * @param {any} image The cornerstone image object
  3918. * @param {Number} rotation Optional. The rotation angle of the image.
  3919. * @return {{horizontalScale, verticalScale, scaleFactor}} The calculated horizontal, vertical and minimum scale factor
  3920. * @memberof Internal
  3921. */
  3922. /* harmony default export */ __webpack_exports__["default"] = (function (windowSize, image) {
  3923. var rotation = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
  3924. Object(_validator_js__WEBPACK_IMPORTED_MODULE_0__["validateParameterUndefinedOrNull"])(windowSize, 'getImageScale: parameter windowSize must not be undefined');
  3925. Object(_validator_js__WEBPACK_IMPORTED_MODULE_0__["validateParameterUndefinedOrNull"])(image, 'getImageScale: parameter image must not be undefined');
  3926. var imageSize = Object(_getImageSize_js__WEBPACK_IMPORTED_MODULE_1__["default"])(image, rotation);
  3927. var rowPixelSpacing = image.rowPixelSpacing || 1;
  3928. var columnPixelSpacing = image.columnPixelSpacing || 1;
  3929. var verticalRatio = 1;
  3930. var horizontalRatio = 1;
  3931. if (rowPixelSpacing < columnPixelSpacing) {
  3932. horizontalRatio = columnPixelSpacing / rowPixelSpacing;
  3933. } else {
  3934. // even if they are equal we want to calculate this ratio (the ration might be 0.5)
  3935. verticalRatio = rowPixelSpacing / columnPixelSpacing;
  3936. }
  3937. var verticalScale = windowSize.height / imageSize.height / verticalRatio;
  3938. var horizontalScale = windowSize.width / imageSize.width / horizontalRatio; // Fit image to window
  3939. return {
  3940. verticalScale: verticalScale,
  3941. horizontalScale: horizontalScale,
  3942. scaleFactor: Math.min(horizontalScale, verticalScale)
  3943. };
  3944. });
  3945. /***/ }),
  3946. /***/ "./internal/getImageSize.js":
  3947. /*!**********************************!*\
  3948. !*** ./internal/getImageSize.js ***!
  3949. \**********************************/
  3950. /*! exports provided: default */
  3951. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  3952. "use strict";
  3953. __webpack_require__.r(__webpack_exports__);
  3954. /* harmony import */ var _validator_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./validator.js */ "./internal/validator.js");
  3955. /**
  3956. * Check if the angle is rotated
  3957. * @param {Number} rotation the rotation angle
  3958. * @returns {Boolean} true if the angle is rotated; Otherwise, false.
  3959. * @memberof Internal
  3960. */
  3961. function isRotated(rotation) {
  3962. return !(rotation === null || rotation === undefined || rotation === 0 || rotation === 180);
  3963. }
  3964. /**
  3965. * Retrieves the current image dimensions given an enabled element
  3966. *
  3967. * @param {any} image The Cornerstone image.
  3968. * @param {Number} rotation Optional. The rotation angle of the image.
  3969. * @return {{width:Number, height:Number}} The Image dimensions
  3970. * @memberof Internal
  3971. */
  3972. /* harmony default export */ __webpack_exports__["default"] = (function (image) {
  3973. var rotation = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
  3974. Object(_validator_js__WEBPACK_IMPORTED_MODULE_0__["validateParameterUndefinedOrNull"])(image, 'getImageSize: parameter image must not be undefined');
  3975. Object(_validator_js__WEBPACK_IMPORTED_MODULE_0__["validateParameterUndefinedOrNull"])(image.width, 'getImageSize: parameter image must have width');
  3976. Object(_validator_js__WEBPACK_IMPORTED_MODULE_0__["validateParameterUndefinedOrNull"])(image.height, 'getImageSize: parameter image must have height');
  3977. if (isRotated(rotation)) {
  3978. return {
  3979. height: image.width,
  3980. width: image.height
  3981. };
  3982. }
  3983. return {
  3984. width: image.width,
  3985. height: image.height
  3986. };
  3987. });
  3988. /***/ }),
  3989. /***/ "./internal/getModalityLUT.js":
  3990. /*!************************************!*\
  3991. !*** ./internal/getModalityLUT.js ***!
  3992. \************************************/
  3993. /*! exports provided: default */
  3994. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  3995. "use strict";
  3996. __webpack_require__.r(__webpack_exports__);
  3997. /**
  3998. * Generates a linear modality transformation function
  3999. *
  4000. * See DICOM PS3.3 C.11.1 Modality LUT Module
  4001. *
  4002. * http://dicom.nema.org/medical/Dicom/current/output/chtml/part03/sect_C.11.html
  4003. *
  4004. * @param {Number} slope m in the equation specified by Rescale Intercept (0028,1052).
  4005. * @param {Number} intercept The value b in relationship between stored values (SV) and the output units specified in Rescale Type (0028,1054).
  4006. Output units = m*SV + b.
  4007. * @return {function(*): *} A linear modality LUT function. Given a stored pixel it returns the modality pixel value
  4008. * @memberof Internal
  4009. */
  4010. function generateLinearModalityLUT(slope, intercept) {
  4011. return function (storedPixelValue) {
  4012. return storedPixelValue * slope + intercept;
  4013. };
  4014. }
  4015. function generateNonLinearModalityLUT(modalityLUT) {
  4016. var minValue = modalityLUT.lut[0];
  4017. var maxValue = modalityLUT.lut[modalityLUT.lut.length - 1];
  4018. var maxValueMapped = modalityLUT.firstValueMapped + modalityLUT.lut.length;
  4019. return function (storedPixelValue) {
  4020. if (storedPixelValue < modalityLUT.firstValueMapped) {
  4021. return minValue;
  4022. } else if (storedPixelValue >= maxValueMapped) {
  4023. return maxValue;
  4024. }
  4025. return modalityLUT.lut[storedPixelValue];
  4026. };
  4027. }
  4028. /**
  4029. * Get the appropriate Modality LUT for the current situation.
  4030. *
  4031. * @param {Number} [slope] m in the equation specified by Rescale Intercept (0028,1052).
  4032. * @param {Number} [intercept] The value b in relationship between stored values (SV) and the output units specified in Rescale Type (0028,1054).
  4033. * @param {Function} [modalityLUT] A modality LUT function. Given a stored pixel it returns the modality pixel value.
  4034. *
  4035. * @return {function(*): *} A modality LUT function. Given a stored pixel it returns the modality pixel value.
  4036. * @memberof Internal
  4037. */
  4038. /* harmony default export */ __webpack_exports__["default"] = (function (slope, intercept, modalityLUT) {
  4039. if (modalityLUT) {
  4040. return generateNonLinearModalityLUT(modalityLUT);
  4041. }
  4042. return generateLinearModalityLUT(slope, intercept);
  4043. });
  4044. /***/ }),
  4045. /***/ "./internal/getTransform.js":
  4046. /*!**********************************!*\
  4047. !*** ./internal/getTransform.js ***!
  4048. \**********************************/
  4049. /*! exports provided: default */
  4050. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  4051. "use strict";
  4052. __webpack_require__.r(__webpack_exports__);
  4053. /* harmony import */ var _calculateTransform_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./calculateTransform.js */ "./internal/calculateTransform.js");
  4054. /* harmony default export */ __webpack_exports__["default"] = (function (enabledElement) {
  4055. // For now we will calculate it every time it is requested.
  4056. // In the future, we may want to cache it in the enabled element to speed things up.
  4057. return Object(_calculateTransform_js__WEBPACK_IMPORTED_MODULE_0__["default"])(enabledElement);
  4058. });
  4059. /***/ }),
  4060. /***/ "./internal/getVOILut.js":
  4061. /*!*******************************!*\
  4062. !*** ./internal/getVOILut.js ***!
  4063. \*******************************/
  4064. /*! exports provided: default */
  4065. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  4066. "use strict";
  4067. __webpack_require__.r(__webpack_exports__);
  4068. function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
  4069. function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
  4070. function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
  4071. function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
  4072. function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
  4073. function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
  4074. /* eslint no-bitwise: 0 */
  4075. /**
  4076. * Volume of Interest Lookup Table Function
  4077. *
  4078. * @typedef {Function} VOILUTFunction
  4079. *
  4080. * @param {Number} modalityLutValue
  4081. * @returns {Number} transformed value
  4082. * @memberof Objects
  4083. */
  4084. /**
  4085. * @module: VOILUT
  4086. */
  4087. /**
  4088. *
  4089. * @param {Number} windowWidth Window Width
  4090. * @param {Number} windowCenter Window Center
  4091. * @returns {VOILUTFunction} VOI LUT mapping function
  4092. * @memberof VOILUT
  4093. */
  4094. function generateLinearVOILUT(windowWidth, windowCenter) {
  4095. return function (modalityLutValue) {
  4096. return ((modalityLutValue - windowCenter) / windowWidth + 0.5) * 255.0;
  4097. };
  4098. }
  4099. /**
  4100. * Generate a non-linear volume of interest lookup table
  4101. *
  4102. * @param {LUT} voiLUT Volume of Interest Lookup Table Object
  4103. * @param {Boolean} roundModalityLUTValues Do a Math.round of modality lut to compute non linear voilut
  4104. *
  4105. * @returns {VOILUTFunction} VOI LUT mapping function
  4106. * @memberof VOILUT
  4107. */
  4108. function generateNonLinearVOILUT(voiLUT, roundModalityLUTValues) {
  4109. // We don't trust the voiLUT.numBitsPerEntry, mainly thanks to Agfa!
  4110. var bitsPerEntry = Math.max.apply(Math, _toConsumableArray(voiLUT.lut)).toString(2).length;
  4111. var shift = bitsPerEntry - 8;
  4112. var minValue = voiLUT.lut[0] >> shift;
  4113. var maxValue = voiLUT.lut[voiLUT.lut.length - 1] >> shift;
  4114. var maxValueMapped = voiLUT.firstValueMapped + voiLUT.lut.length - 1;
  4115. return function (modalityLutValue) {
  4116. if (modalityLutValue < voiLUT.firstValueMapped) {
  4117. return minValue;
  4118. } else if (modalityLutValue >= maxValueMapped) {
  4119. return maxValue;
  4120. }
  4121. if (roundModalityLUTValues) {
  4122. return voiLUT.lut[Math.round(modalityLutValue) - voiLUT.firstValueMapped] >> shift;
  4123. }
  4124. return voiLUT.lut[modalityLutValue - voiLUT.firstValueMapped] >> shift;
  4125. };
  4126. }
  4127. /**
  4128. * Retrieve a VOI LUT mapping function given the current windowing settings
  4129. * and the VOI LUT for the image
  4130. *
  4131. * @param {Number} windowWidth Window Width
  4132. * @param {Number} windowCenter Window Center
  4133. * @param {LUT} [voiLUT] Volume of Interest Lookup Table Object
  4134. * @param {Boolean} roundModalityLUTValues Do a Math.round of modality lut to compute non linear voilut
  4135. *
  4136. * @return {VOILUTFunction} VOI LUT mapping function
  4137. * @memberof VOILUT
  4138. */
  4139. /* harmony default export */ __webpack_exports__["default"] = (function (windowWidth, windowCenter, voiLUT, roundModalityLUTValues) {
  4140. if (voiLUT) {
  4141. return generateNonLinearVOILUT(voiLUT, roundModalityLUTValues);
  4142. }
  4143. return generateLinearVOILUT(windowWidth, windowCenter);
  4144. });
  4145. /***/ }),
  4146. /***/ "./internal/guid.js":
  4147. /*!**************************!*\
  4148. !*** ./internal/guid.js ***!
  4149. \**************************/
  4150. /*! exports provided: default */
  4151. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  4152. "use strict";
  4153. __webpack_require__.r(__webpack_exports__);
  4154. function s4() {
  4155. return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);
  4156. }
  4157. /**
  4158. * Generate a unique identifier
  4159. *
  4160. * @return {string} A unique identifier
  4161. * @memberof Internal
  4162. */
  4163. /* harmony default export */ __webpack_exports__["default"] = (function () {
  4164. return "".concat(s4() + s4(), "-").concat(s4(), "-").concat(s4(), "-").concat(s4(), "-").concat(s4()).concat(s4()).concat(s4());
  4165. });
  4166. /***/ }),
  4167. /***/ "./internal/index.js":
  4168. /*!***************************!*\
  4169. !*** ./internal/index.js ***!
  4170. \***************************/
  4171. /*! exports provided: default */
  4172. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  4173. "use strict";
  4174. __webpack_require__.r(__webpack_exports__);
  4175. /* harmony import */ var _transform_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./transform.js */ "./internal/transform.js");
  4176. /* harmony import */ var _calculateTransform_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./calculateTransform.js */ "./internal/calculateTransform.js");
  4177. /* harmony import */ var _drawImage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./drawImage.js */ "./internal/drawImage.js");
  4178. /* harmony import */ var _generateLut_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./generateLut.js */ "./internal/generateLut.js");
  4179. /* harmony import */ var _getDefaultViewport_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./getDefaultViewport.js */ "./internal/getDefaultViewport.js");
  4180. /* harmony import */ var _getTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./getTransform.js */ "./internal/getTransform.js");
  4181. /* harmony import */ var _requestAnimationFrame_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./requestAnimationFrame.js */ "./internal/requestAnimationFrame.js");
  4182. /* harmony import */ var _setDefaultViewport_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./setDefaultViewport.js */ "./internal/setDefaultViewport.js");
  4183. /* harmony import */ var _storedColorPixelDataToCanvasImageData_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./storedColorPixelDataToCanvasImageData.js */ "./internal/storedColorPixelDataToCanvasImageData.js");
  4184. /* harmony import */ var _storedPixelDataToCanvasImageData_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./storedPixelDataToCanvasImageData.js */ "./internal/storedPixelDataToCanvasImageData.js");
  4185. /* harmony import */ var _storedPixelDataToCanvasImageDataColorLUT_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./storedPixelDataToCanvasImageDataColorLUT.js */ "./internal/storedPixelDataToCanvasImageDataColorLUT.js");
  4186. /* harmony import */ var _storedPixelDataToCanvasImageDataPseudocolorLUT_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./storedPixelDataToCanvasImageDataPseudocolorLUT.js */ "./internal/storedPixelDataToCanvasImageDataPseudocolorLUT.js");
  4187. /* harmony import */ var _storedPixelDataToCanvasImageDataRGBA_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./storedPixelDataToCanvasImageDataRGBA.js */ "./internal/storedPixelDataToCanvasImageDataRGBA.js");
  4188. /**
  4189. * @module Internal
  4190. */
  4191. /* harmony default export */ __webpack_exports__["default"] = ({
  4192. drawImage: _drawImage_js__WEBPACK_IMPORTED_MODULE_2__["default"],
  4193. generateLut: _generateLut_js__WEBPACK_IMPORTED_MODULE_3__["default"],
  4194. getDefaultViewport: _getDefaultViewport_js__WEBPACK_IMPORTED_MODULE_4__["default"],
  4195. requestAnimationFrame: _requestAnimationFrame_js__WEBPACK_IMPORTED_MODULE_6__["default"],
  4196. setDefaultViewport: _setDefaultViewport_js__WEBPACK_IMPORTED_MODULE_7__["default"],
  4197. storedPixelDataToCanvasImageData: _storedPixelDataToCanvasImageData_js__WEBPACK_IMPORTED_MODULE_9__["default"],
  4198. storedPixelDataToCanvasImageDataRGBA: _storedPixelDataToCanvasImageDataRGBA_js__WEBPACK_IMPORTED_MODULE_12__["default"],
  4199. storedPixelDataToCanvasImageDataColorLUT: _storedPixelDataToCanvasImageDataColorLUT_js__WEBPACK_IMPORTED_MODULE_10__["default"],
  4200. storedPixelDataToCanvasImageDataPseudocolorLUT: _storedPixelDataToCanvasImageDataPseudocolorLUT_js__WEBPACK_IMPORTED_MODULE_11__["default"],
  4201. storedColorPixelDataToCanvasImageData: _storedColorPixelDataToCanvasImageData_js__WEBPACK_IMPORTED_MODULE_8__["default"],
  4202. getTransform: _getTransform_js__WEBPACK_IMPORTED_MODULE_5__["default"],
  4203. calculateTransform: _calculateTransform_js__WEBPACK_IMPORTED_MODULE_1__["default"],
  4204. Transform: _transform_js__WEBPACK_IMPORTED_MODULE_0__["Transform"]
  4205. });
  4206. /***/ }),
  4207. /***/ "./internal/now.js":
  4208. /*!*************************!*\
  4209. !*** ./internal/now.js ***!
  4210. \*************************/
  4211. /*! exports provided: default */
  4212. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  4213. "use strict";
  4214. __webpack_require__.r(__webpack_exports__);
  4215. /**
  4216. * @module Polyfills
  4217. */
  4218. /**
  4219. * Use the performance.now() method if possible, and if not, use Date.now()
  4220. *
  4221. * @return {number} Time elapsed since the time origin
  4222. * @memberof Polyfills
  4223. */
  4224. /* harmony default export */ __webpack_exports__["default"] = (function () {
  4225. if (window.performance) {
  4226. return performance.now();
  4227. }
  4228. return Date.now();
  4229. });
  4230. /***/ }),
  4231. /***/ "./internal/requestAnimationFrame.js":
  4232. /*!*******************************************!*\
  4233. !*** ./internal/requestAnimationFrame.js ***!
  4234. \*******************************************/
  4235. /*! exports provided: default */
  4236. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  4237. "use strict";
  4238. __webpack_require__.r(__webpack_exports__);
  4239. function requestFrame(callback) {
  4240. window.setTimeout(callback, 1000 / 60);
  4241. }
  4242. /**
  4243. * Polyfills requestAnimationFrame for older browsers.
  4244. *
  4245. * @param {Function} callback A parameter specifying a function to call when it's time to update your animation for the next repaint. The callback has one single argument, a DOMHighResTimeStamp, which indicates the current time (the time returned from performance.now() ) for when requestAnimationFrame starts to fire callbacks.
  4246. *
  4247. * @return {Number} A long integer value, the request id, that uniquely identifies the entry in the callback list. This is a non-zero value, but you may not make any other assumptions about its value. You can pass this value to window.cancelAnimationFrame() to cancel the refresh callback request.
  4248. * @memberof Polyfills
  4249. */
  4250. /* harmony default export */ __webpack_exports__["default"] = (function (callback) {
  4251. return window.requestAnimationFrame(callback) || window.webkitRequestAnimationFrame(callback) || window.mozRequestAnimationFrame(callback) || window.oRequestAnimationFrame(callback) || window.msRequestAnimationFrame(callback) || requestFrame(callback);
  4252. });
  4253. /***/ }),
  4254. /***/ "./internal/setDefaultViewport.js":
  4255. /*!****************************************!*\
  4256. !*** ./internal/setDefaultViewport.js ***!
  4257. \****************************************/
  4258. /*! exports provided: default, state */
  4259. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  4260. "use strict";
  4261. __webpack_require__.r(__webpack_exports__);
  4262. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "state", function() { return state; });
  4263. var state = {
  4264. viewport: {}
  4265. };
  4266. /**
  4267. * Sets new default values for `getDefaultViewport`
  4268. *
  4269. * @param {Object} viewport - Object that sets new default values for getDefaultViewport
  4270. * @returns {undefined}
  4271. */
  4272. /* harmony default export */ __webpack_exports__["default"] = (function (viewport) {
  4273. state.viewport = viewport || {};
  4274. });
  4275. /***/ }),
  4276. /***/ "./internal/storedColorPixelDataToCanvasImageData.js":
  4277. /*!***********************************************************!*\
  4278. !*** ./internal/storedColorPixelDataToCanvasImageData.js ***!
  4279. \***********************************************************/
  4280. /*! exports provided: default */
  4281. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  4282. "use strict";
  4283. __webpack_require__.r(__webpack_exports__);
  4284. /* harmony import */ var _now_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./now.js */ "./internal/now.js");
  4285. /**
  4286. * Converts stored color pixel values to display pixel values using a LUT.
  4287. *
  4288. * Note: Skips alpha value for any input image pixel data.
  4289. *
  4290. * @param {Image} image A Cornerstone Image Object
  4291. * @param {Array} lut Lookup table array
  4292. * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels
  4293. *
  4294. * @returns {void}
  4295. * @memberof Internal
  4296. */
  4297. /* harmony default export */ __webpack_exports__["default"] = (function (image, lut, canvasImageDataData) {
  4298. var start = Object(_now_js__WEBPACK_IMPORTED_MODULE_0__["default"])();
  4299. var pixelData = image.getPixelData();
  4300. image.stats.lastGetPixelDataTime = Object(_now_js__WEBPACK_IMPORTED_MODULE_0__["default"])() - start;
  4301. var minPixelValue = image.minPixelValue;
  4302. var canvasImageDataIndex = 0;
  4303. var storedPixelDataIndex = 0;
  4304. var numPixels = pixelData.length; // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.
  4305. // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement
  4306. start = Object(_now_js__WEBPACK_IMPORTED_MODULE_0__["default"])();
  4307. if (minPixelValue < 0) {
  4308. while (storedPixelDataIndex < numPixels) {
  4309. canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++] + -minPixelValue]; // Red
  4310. canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++] + -minPixelValue]; // Green
  4311. canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex] + -minPixelValue]; // Blue
  4312. storedPixelDataIndex += 2;
  4313. canvasImageDataIndex += 2;
  4314. }
  4315. } else {
  4316. while (storedPixelDataIndex < numPixels) {
  4317. canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++]]; // Red
  4318. canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++]]; // Green
  4319. canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex]]; // Blue
  4320. storedPixelDataIndex += 2;
  4321. canvasImageDataIndex += 2;
  4322. }
  4323. }
  4324. image.stats.lastStoredPixelDataToCanvasImageDataTime = Object(_now_js__WEBPACK_IMPORTED_MODULE_0__["default"])() - start;
  4325. });
  4326. /***/ }),
  4327. /***/ "./internal/storedPixelDataToCanvasImageData.js":
  4328. /*!******************************************************!*\
  4329. !*** ./internal/storedPixelDataToCanvasImageData.js ***!
  4330. \******************************************************/
  4331. /*! exports provided: default */
  4332. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  4333. "use strict";
  4334. __webpack_require__.r(__webpack_exports__);
  4335. /* harmony import */ var _now_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./now.js */ "./internal/now.js");
  4336. /**
  4337. * This function transforms stored pixel values into a canvas image data buffer
  4338. * by using a LUT. This is the most performance sensitive code in cornerstone and
  4339. * we use a special trick to make this go as fast as possible. Specifically we
  4340. * use the alpha channel only to control the luminance rather than the red, green and
  4341. * blue channels which makes it over 3x faster. The canvasImageDataData buffer needs
  4342. * to be previously filled with white pixels.
  4343. *
  4344. * NOTE: Attribution would be appreciated if you use this technique!
  4345. *
  4346. * @param {Image} image A Cornerstone Image Object
  4347. * @param {Array} lut Lookup table array
  4348. * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels
  4349. *
  4350. * @returns {void}
  4351. * @memberof Internal
  4352. */
  4353. /* harmony default export */ __webpack_exports__["default"] = (function (image, lut, canvasImageDataData) {
  4354. var start = Object(_now_js__WEBPACK_IMPORTED_MODULE_0__["default"])();
  4355. var pixelData = image.getPixelData();
  4356. image.stats.lastGetPixelDataTime = Object(_now_js__WEBPACK_IMPORTED_MODULE_0__["default"])() - start;
  4357. var numPixels = pixelData.length;
  4358. var minPixelValue = image.minPixelValue;
  4359. var canvasImageDataIndex = 3;
  4360. var storedPixelDataIndex = 0; // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.
  4361. // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement
  4362. // Added two paths (Int16Array, Uint16Array) to avoid polymorphic deoptimization in chrome.
  4363. start = Object(_now_js__WEBPACK_IMPORTED_MODULE_0__["default"])();
  4364. if (pixelData instanceof Int16Array) {
  4365. if (minPixelValue < 0) {
  4366. while (storedPixelDataIndex < numPixels) {
  4367. canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex++] + -minPixelValue]; // Alpha
  4368. canvasImageDataIndex += 4;
  4369. }
  4370. } else {
  4371. while (storedPixelDataIndex < numPixels) {
  4372. canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex++]]; // Alpha
  4373. canvasImageDataIndex += 4;
  4374. }
  4375. }
  4376. } else if (pixelData instanceof Uint16Array) {
  4377. while (storedPixelDataIndex < numPixels) {
  4378. canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex++]]; // Alpha
  4379. canvasImageDataIndex += 4;
  4380. }
  4381. } else if (minPixelValue < 0) {
  4382. while (storedPixelDataIndex < numPixels) {
  4383. canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex++] + -minPixelValue]; // Alpha
  4384. canvasImageDataIndex += 4;
  4385. }
  4386. } else {
  4387. while (storedPixelDataIndex < numPixels) {
  4388. canvasImageDataData[canvasImageDataIndex] = lut[pixelData[storedPixelDataIndex++]]; // Alpha
  4389. canvasImageDataIndex += 4;
  4390. }
  4391. }
  4392. image.stats.lastStoredPixelDataToCanvasImageDataTime = Object(_now_js__WEBPACK_IMPORTED_MODULE_0__["default"])() - start;
  4393. });
  4394. /***/ }),
  4395. /***/ "./internal/storedPixelDataToCanvasImageDataColorLUT.js":
  4396. /*!**************************************************************!*\
  4397. !*** ./internal/storedPixelDataToCanvasImageDataColorLUT.js ***!
  4398. \**************************************************************/
  4399. /*! exports provided: default */
  4400. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  4401. "use strict";
  4402. __webpack_require__.r(__webpack_exports__);
  4403. /* harmony import */ var _colors_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../colors/index.js */ "./colors/index.js");
  4404. /* harmony import */ var _now_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./now.js */ "./internal/now.js");
  4405. /**
  4406. *
  4407. * @param {Image} image A Cornerstone Image Object
  4408. * @param {LookupTable|Array} colorLut Lookup table array
  4409. * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels
  4410. *
  4411. * @returns {void}
  4412. * @memberof Internal
  4413. */
  4414. function storedPixelDataToCanvasImageDataColorLUT(image, colorLut, canvasImageDataData) {
  4415. var start = Object(_now_js__WEBPACK_IMPORTED_MODULE_1__["default"])();
  4416. var pixelData = image.getPixelData();
  4417. image.stats.lastGetPixelDataTime = Object(_now_js__WEBPACK_IMPORTED_MODULE_1__["default"])() - start;
  4418. var numPixels = pixelData.length;
  4419. var minPixelValue = image.minPixelValue;
  4420. var canvasImageDataIndex = 0;
  4421. var storedPixelDataIndex = 0;
  4422. var rgba;
  4423. var clut;
  4424. start = Object(_now_js__WEBPACK_IMPORTED_MODULE_1__["default"])();
  4425. if (colorLut instanceof _colors_index_js__WEBPACK_IMPORTED_MODULE_0__["default"].LookupTable) {
  4426. clut = colorLut.Table;
  4427. } else {
  4428. clut = colorLut;
  4429. }
  4430. if (minPixelValue < 0) {
  4431. while (storedPixelDataIndex < numPixels) {
  4432. rgba = clut[pixelData[storedPixelDataIndex++] + -minPixelValue];
  4433. canvasImageDataData[canvasImageDataIndex++] = rgba[0];
  4434. canvasImageDataData[canvasImageDataIndex++] = rgba[1];
  4435. canvasImageDataData[canvasImageDataIndex++] = rgba[2];
  4436. canvasImageDataData[canvasImageDataIndex++] = rgba[3];
  4437. }
  4438. } else {
  4439. while (storedPixelDataIndex < numPixels) {
  4440. rgba = clut[pixelData[storedPixelDataIndex++]];
  4441. canvasImageDataData[canvasImageDataIndex++] = rgba[0];
  4442. canvasImageDataData[canvasImageDataIndex++] = rgba[1];
  4443. canvasImageDataData[canvasImageDataIndex++] = rgba[2];
  4444. canvasImageDataData[canvasImageDataIndex++] = rgba[3];
  4445. }
  4446. }
  4447. image.stats.lastStoredPixelDataToCanvasImageDataTime = Object(_now_js__WEBPACK_IMPORTED_MODULE_1__["default"])() - start;
  4448. }
  4449. /* harmony default export */ __webpack_exports__["default"] = (storedPixelDataToCanvasImageDataColorLUT);
  4450. /***/ }),
  4451. /***/ "./internal/storedPixelDataToCanvasImageDataPseudocolorLUT.js":
  4452. /*!********************************************************************!*\
  4453. !*** ./internal/storedPixelDataToCanvasImageDataPseudocolorLUT.js ***!
  4454. \********************************************************************/
  4455. /*! exports provided: default */
  4456. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  4457. "use strict";
  4458. __webpack_require__.r(__webpack_exports__);
  4459. /* harmony import */ var _colors_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../colors/index.js */ "./colors/index.js");
  4460. /* harmony import */ var _now_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./now.js */ "./internal/now.js");
  4461. /**
  4462. *
  4463. * @param {Image} image A Cornerstone Image Object
  4464. * @param {Array} grayscaleLut Lookup table array
  4465. * @param {LookupTable|Array} colorLut Lookup table array
  4466. * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels
  4467. *
  4468. * @returns {void}
  4469. * @memberof Internal
  4470. */
  4471. function storedPixelDataToCanvasImageDataPseudocolorLUT(image, grayscaleLut, colorLut, canvasImageDataData) {
  4472. var start = Object(_now_js__WEBPACK_IMPORTED_MODULE_1__["default"])();
  4473. var pixelData = image.getPixelData();
  4474. image.stats.lastGetPixelDataTime = Object(_now_js__WEBPACK_IMPORTED_MODULE_1__["default"])() - start;
  4475. var numPixels = pixelData.length;
  4476. var minPixelValue = image.minPixelValue;
  4477. var canvasImageDataIndex = 0;
  4478. var storedPixelDataIndex = 0;
  4479. var grayscale;
  4480. var rgba;
  4481. var clut;
  4482. start = Object(_now_js__WEBPACK_IMPORTED_MODULE_1__["default"])();
  4483. if (colorLut instanceof _colors_index_js__WEBPACK_IMPORTED_MODULE_0__["default"].LookupTable) {
  4484. clut = colorLut.Table;
  4485. } else {
  4486. clut = colorLut;
  4487. }
  4488. if (minPixelValue < 0) {
  4489. while (storedPixelDataIndex < numPixels) {
  4490. grayscale = grayscaleLut[pixelData[storedPixelDataIndex++] + -minPixelValue];
  4491. rgba = clut[grayscale];
  4492. canvasImageDataData[canvasImageDataIndex++] = rgba[0];
  4493. canvasImageDataData[canvasImageDataIndex++] = rgba[1];
  4494. canvasImageDataData[canvasImageDataIndex++] = rgba[2];
  4495. canvasImageDataData[canvasImageDataIndex++] = rgba[3];
  4496. }
  4497. } else {
  4498. while (storedPixelDataIndex < numPixels) {
  4499. grayscale = grayscaleLut[pixelData[storedPixelDataIndex++]];
  4500. rgba = clut[grayscale];
  4501. canvasImageDataData[canvasImageDataIndex++] = rgba[0];
  4502. canvasImageDataData[canvasImageDataIndex++] = rgba[1];
  4503. canvasImageDataData[canvasImageDataIndex++] = rgba[2];
  4504. canvasImageDataData[canvasImageDataIndex++] = rgba[3];
  4505. }
  4506. }
  4507. image.stats.lastStoredPixelDataToCanvasImageDataTime = Object(_now_js__WEBPACK_IMPORTED_MODULE_1__["default"])() - start;
  4508. }
  4509. /* harmony default export */ __webpack_exports__["default"] = (storedPixelDataToCanvasImageDataPseudocolorLUT);
  4510. /***/ }),
  4511. /***/ "./internal/storedPixelDataToCanvasImageDataRGBA.js":
  4512. /*!**********************************************************!*\
  4513. !*** ./internal/storedPixelDataToCanvasImageDataRGBA.js ***!
  4514. \**********************************************************/
  4515. /*! exports provided: default */
  4516. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  4517. "use strict";
  4518. __webpack_require__.r(__webpack_exports__);
  4519. /* harmony import */ var _now_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./now.js */ "./internal/now.js");
  4520. /**
  4521. * This function transforms stored pixel values into a canvas image data buffer
  4522. * by using a LUT.
  4523. *
  4524. * @param {Image} image A Cornerstone Image Object
  4525. * @param {Array} lut Lookup table array
  4526. * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels
  4527. *
  4528. * @returns {void}
  4529. * @memberof Internal
  4530. */
  4531. /* harmony default export */ __webpack_exports__["default"] = (function (image, lut, canvasImageDataData) {
  4532. var start = Object(_now_js__WEBPACK_IMPORTED_MODULE_0__["default"])();
  4533. var pixelData = image.getPixelData();
  4534. image.stats.lastGetPixelDataTime = Object(_now_js__WEBPACK_IMPORTED_MODULE_0__["default"])() - start;
  4535. var numPixels = pixelData.length;
  4536. var minPixelValue = image.minPixelValue;
  4537. var canvasImageDataIndex = 0;
  4538. var storedPixelDataIndex = 0;
  4539. var pixelValue; // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.
  4540. // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement
  4541. // Added two paths (Int16Array, Uint16Array) to avoid polymorphic deoptimization in chrome.
  4542. start = Object(_now_js__WEBPACK_IMPORTED_MODULE_0__["default"])();
  4543. if (pixelData instanceof Int16Array) {
  4544. if (minPixelValue < 0) {
  4545. while (storedPixelDataIndex < numPixels) {
  4546. pixelValue = lut[pixelData[storedPixelDataIndex++] + -minPixelValue];
  4547. canvasImageDataData[canvasImageDataIndex++] = pixelValue;
  4548. canvasImageDataData[canvasImageDataIndex++] = pixelValue;
  4549. canvasImageDataData[canvasImageDataIndex++] = pixelValue;
  4550. canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha
  4551. }
  4552. } else {
  4553. while (storedPixelDataIndex < numPixels) {
  4554. pixelValue = lut[pixelData[storedPixelDataIndex++]];
  4555. canvasImageDataData[canvasImageDataIndex++] = pixelValue;
  4556. canvasImageDataData[canvasImageDataIndex++] = pixelValue;
  4557. canvasImageDataData[canvasImageDataIndex++] = pixelValue;
  4558. canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha
  4559. }
  4560. }
  4561. } else if (pixelData instanceof Uint16Array) {
  4562. while (storedPixelDataIndex < numPixels) {
  4563. pixelValue = lut[pixelData[storedPixelDataIndex++]];
  4564. canvasImageDataData[canvasImageDataIndex++] = pixelValue;
  4565. canvasImageDataData[canvasImageDataIndex++] = pixelValue;
  4566. canvasImageDataData[canvasImageDataIndex++] = pixelValue;
  4567. canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha
  4568. }
  4569. } else if (minPixelValue < 0) {
  4570. while (storedPixelDataIndex < numPixels) {
  4571. pixelValue = lut[pixelData[storedPixelDataIndex++] + -minPixelValue];
  4572. canvasImageDataData[canvasImageDataIndex++] = pixelValue;
  4573. canvasImageDataData[canvasImageDataIndex++] = pixelValue;
  4574. canvasImageDataData[canvasImageDataIndex++] = pixelValue;
  4575. canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha
  4576. }
  4577. } else {
  4578. while (storedPixelDataIndex < numPixels) {
  4579. pixelValue = lut[pixelData[storedPixelDataIndex++]];
  4580. canvasImageDataData[canvasImageDataIndex++] = pixelValue;
  4581. canvasImageDataData[canvasImageDataIndex++] = pixelValue;
  4582. canvasImageDataData[canvasImageDataIndex++] = pixelValue;
  4583. canvasImageDataData[canvasImageDataIndex++] = 255; // Alpha
  4584. }
  4585. }
  4586. image.stats.lastStoredPixelDataToCanvasImageDataTime = Object(_now_js__WEBPACK_IMPORTED_MODULE_0__["default"])() - start;
  4587. });
  4588. /***/ }),
  4589. /***/ "./internal/storedRGBAPixelDataToCanvasImageData.js":
  4590. /*!**********************************************************!*\
  4591. !*** ./internal/storedRGBAPixelDataToCanvasImageData.js ***!
  4592. \**********************************************************/
  4593. /*! exports provided: default */
  4594. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  4595. "use strict";
  4596. __webpack_require__.r(__webpack_exports__);
  4597. /* harmony import */ var _now_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./now.js */ "./internal/now.js");
  4598. /**
  4599. * Converts stored RGBA color pixel values to display pixel values using a LUT.
  4600. *
  4601. * @param {Image} image A Cornerstone Image Object
  4602. * @param {Array} lut Lookup table array
  4603. * @param {Uint8ClampedArray} canvasImageDataData canvasImageData.data buffer filled with white pixels
  4604. *
  4605. * @returns {void}
  4606. * @memberof Internal
  4607. */
  4608. /* harmony default export */ __webpack_exports__["default"] = (function (image, lut, canvasImageDataData) {
  4609. var start = Object(_now_js__WEBPACK_IMPORTED_MODULE_0__["default"])();
  4610. var pixelData = image.getPixelData();
  4611. image.stats.lastGetPixelDataTime = Object(_now_js__WEBPACK_IMPORTED_MODULE_0__["default"])() - start;
  4612. var minPixelValue = image.minPixelValue;
  4613. var canvasImageDataIndex = 0;
  4614. var storedPixelDataIndex = 0;
  4615. var numPixels = pixelData.length; // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.
  4616. // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement
  4617. start = Object(_now_js__WEBPACK_IMPORTED_MODULE_0__["default"])();
  4618. if (minPixelValue < 0) {
  4619. while (storedPixelDataIndex < numPixels) {
  4620. canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++] + -minPixelValue]; // Red
  4621. canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++] + -minPixelValue]; // Green
  4622. canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++] + -minPixelValue]; // Blue
  4623. canvasImageDataData[canvasImageDataIndex++] = pixelData[storedPixelDataIndex++];
  4624. }
  4625. } else {
  4626. while (storedPixelDataIndex < numPixels) {
  4627. canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++]]; // Red
  4628. canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++]]; // Green
  4629. canvasImageDataData[canvasImageDataIndex++] = lut[pixelData[storedPixelDataIndex++]]; // Blue
  4630. canvasImageDataData[canvasImageDataIndex++] = pixelData[storedPixelDataIndex++];
  4631. }
  4632. }
  4633. image.stats.lastStoredPixelDataToCanvasImageDataTime = Object(_now_js__WEBPACK_IMPORTED_MODULE_0__["default"])() - start;
  4634. });
  4635. /***/ }),
  4636. /***/ "./internal/transform.js":
  4637. /*!*******************************!*\
  4638. !*** ./internal/transform.js ***!
  4639. \*******************************/
  4640. /*! exports provided: Transform */
  4641. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  4642. "use strict";
  4643. __webpack_require__.r(__webpack_exports__);
  4644. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Transform", function() { return Transform; });
  4645. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  4646. function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
  4647. function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
  4648. // By Simon Sarris
  4649. // Www.simonsarris.com
  4650. // Sarris@acm.org
  4651. //
  4652. // Free to use and distribute at will
  4653. // So long as you are nice to people, etc
  4654. // Simple class for keeping track of the current transformation matrix
  4655. // For instance:
  4656. // Var t = new Transform();
  4657. // T.rotate(5);
  4658. // Var m = t.m;
  4659. // Ctx.setTransform(m[0], m[1], m[2], m[3], m[4], m[5]);
  4660. // Is equivalent to:
  4661. // Ctx.rotate(5);
  4662. // But now you can retrieve it :)
  4663. // Remember that this does not account for any CSS transforms applied to the canvas
  4664. var Transform = /*#__PURE__*/function () {
  4665. function Transform() {
  4666. _classCallCheck(this, Transform);
  4667. this.reset();
  4668. }
  4669. _createClass(Transform, [{
  4670. key: "reset",
  4671. value: function reset() {
  4672. this.m = [1, 0, 0, 1, 0, 0];
  4673. }
  4674. }, {
  4675. key: "clone",
  4676. value: function clone() {
  4677. var transform = new Transform();
  4678. transform.m[0] = this.m[0];
  4679. transform.m[1] = this.m[1];
  4680. transform.m[2] = this.m[2];
  4681. transform.m[3] = this.m[3];
  4682. transform.m[4] = this.m[4];
  4683. transform.m[5] = this.m[5];
  4684. return transform;
  4685. }
  4686. }, {
  4687. key: "multiply",
  4688. value: function multiply(matrix) {
  4689. var m11 = this.m[0] * matrix.m[0] + this.m[2] * matrix.m[1];
  4690. var m12 = this.m[1] * matrix.m[0] + this.m[3] * matrix.m[1];
  4691. var m21 = this.m[0] * matrix.m[2] + this.m[2] * matrix.m[3];
  4692. var m22 = this.m[1] * matrix.m[2] + this.m[3] * matrix.m[3];
  4693. var dx = this.m[0] * matrix.m[4] + this.m[2] * matrix.m[5] + this.m[4];
  4694. var dy = this.m[1] * matrix.m[4] + this.m[3] * matrix.m[5] + this.m[5];
  4695. this.m[0] = m11;
  4696. this.m[1] = m12;
  4697. this.m[2] = m21;
  4698. this.m[3] = m22;
  4699. this.m[4] = dx;
  4700. this.m[5] = dy;
  4701. }
  4702. }, {
  4703. key: "invert",
  4704. value: function invert() {
  4705. var d = 1 / (this.m[0] * this.m[3] - this.m[1] * this.m[2]);
  4706. var m0 = this.m[3] * d;
  4707. var m1 = -this.m[1] * d;
  4708. var m2 = -this.m[2] * d;
  4709. var m3 = this.m[0] * d;
  4710. var m4 = d * (this.m[2] * this.m[5] - this.m[3] * this.m[4]);
  4711. var m5 = d * (this.m[1] * this.m[4] - this.m[0] * this.m[5]);
  4712. this.m[0] = m0;
  4713. this.m[1] = m1;
  4714. this.m[2] = m2;
  4715. this.m[3] = m3;
  4716. this.m[4] = m4;
  4717. this.m[5] = m5;
  4718. }
  4719. }, {
  4720. key: "rotate",
  4721. value: function rotate(rad) {
  4722. var c = Math.cos(rad);
  4723. var s = Math.sin(rad);
  4724. var m11 = this.m[0] * c + this.m[2] * s;
  4725. var m12 = this.m[1] * c + this.m[3] * s;
  4726. var m21 = this.m[0] * -s + this.m[2] * c;
  4727. var m22 = this.m[1] * -s + this.m[3] * c;
  4728. this.m[0] = m11;
  4729. this.m[1] = m12;
  4730. this.m[2] = m21;
  4731. this.m[3] = m22;
  4732. }
  4733. }, {
  4734. key: "translate",
  4735. value: function translate(x, y) {
  4736. this.m[4] += this.m[0] * x + this.m[2] * y;
  4737. this.m[5] += this.m[1] * x + this.m[3] * y;
  4738. }
  4739. }, {
  4740. key: "scale",
  4741. value: function scale(sx, sy) {
  4742. this.m[0] *= sx;
  4743. this.m[1] *= sx;
  4744. this.m[2] *= sy;
  4745. this.m[3] *= sy;
  4746. }
  4747. }, {
  4748. key: "transformPoint",
  4749. value: function transformPoint(px, py) {
  4750. var x = px;
  4751. var y = py;
  4752. px = x * this.m[0] + y * this.m[2] + this.m[4];
  4753. py = x * this.m[1] + y * this.m[3] + this.m[5];
  4754. return {
  4755. x: px,
  4756. y: py
  4757. };
  4758. }
  4759. }]);
  4760. return Transform;
  4761. }();
  4762. /***/ }),
  4763. /***/ "./internal/tryEnableWebgl.js":
  4764. /*!************************************!*\
  4765. !*** ./internal/tryEnableWebgl.js ***!
  4766. \************************************/
  4767. /*! exports provided: default */
  4768. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  4769. "use strict";
  4770. __webpack_require__.r(__webpack_exports__);
  4771. /* harmony import */ var _webgl_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../webgl/index.js */ "./webgl/index.js");
  4772. /**
  4773. * Checks if webGL is supported and initializes the rendering engine.
  4774. * @param {any} options Options to check if webgl rendering is requested (e.g. enable webgl by passing {renderer: 'webgl'})
  4775. * @returns {Boolean} true if webgl rendering has been successfully initialized. Otherwise, false.
  4776. */
  4777. /* harmony default export */ __webpack_exports__["default"] = (function (options) {
  4778. if (_webgl_index_js__WEBPACK_IMPORTED_MODULE_0__["default"].renderer.isWebGLAvailable()) {
  4779. // If WebGL is available on the device, initialize the renderer
  4780. // And return the renderCanvas from the WebGL rendering path
  4781. _webgl_index_js__WEBPACK_IMPORTED_MODULE_0__["default"].renderer.initRenderer();
  4782. options.renderer = 'webgl';
  4783. options.desynchronized = true;
  4784. options.preserveDrawingBuffer = true;
  4785. return true;
  4786. } // If WebGL is not available on this device, we will fall back
  4787. // To using the Canvas renderer
  4788. console.error('WebGL not available, falling back to Canvas renderer');
  4789. delete options.renderer;
  4790. delete options.preserveDrawingBuffer;
  4791. return false;
  4792. });
  4793. /***/ }),
  4794. /***/ "./internal/validator.js":
  4795. /*!*******************************!*\
  4796. !*** ./internal/validator.js ***!
  4797. \*******************************/
  4798. /*! exports provided: validateParameterUndefined, validateParameterUndefinedOrNull */
  4799. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  4800. "use strict";
  4801. __webpack_require__.r(__webpack_exports__);
  4802. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "validateParameterUndefined", function() { return validateParameterUndefined; });
  4803. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "validateParameterUndefinedOrNull", function() { return validateParameterUndefinedOrNull; });
  4804. /**
  4805. * Check if the supplied parameter is undefined and throws and error
  4806. * @param {any} checkParam the parameter to validate for undefined
  4807. * @param {any} errorMsg the error message to be thrown
  4808. * @returns {void}
  4809. * @memberof internal
  4810. */
  4811. function validateParameterUndefined(checkParam, errorMsg) {
  4812. if (checkParam === undefined) {
  4813. throw new Error(errorMsg);
  4814. }
  4815. }
  4816. /**
  4817. * Check if the supplied parameter is undefined or null and throws and error
  4818. * @param {any} checkParam the parameter to validate for undefined
  4819. * @param {any} errorMsg the error message to be thrown
  4820. * @returns {void}
  4821. * @memberof internal
  4822. */
  4823. function validateParameterUndefinedOrNull(checkParam, errorMsg) {
  4824. if (checkParam === undefined || checkParam === null) {
  4825. throw new Error(errorMsg);
  4826. }
  4827. }
  4828. /***/ }),
  4829. /***/ "./invalidate.js":
  4830. /*!***********************!*\
  4831. !*** ./invalidate.js ***!
  4832. \***********************/
  4833. /*! exports provided: default */
  4834. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  4835. "use strict";
  4836. __webpack_require__.r(__webpack_exports__);
  4837. /* harmony import */ var _enabledElements_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./enabledElements.js */ "./enabledElements.js");
  4838. /* harmony import */ var _triggerEvent_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./triggerEvent.js */ "./triggerEvent.js");
  4839. /* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./events.js */ "./events.js");
  4840. /**
  4841. * Sets the invalid flag on the enabled element and fires an event
  4842. * @param {HTMLElement} element The DOM element enabled for Cornerstone
  4843. * @returns {void}
  4844. * @memberof Drawing
  4845. */
  4846. /* harmony default export */ __webpack_exports__["default"] = (function (element) {
  4847. var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_0__["getEnabledElement"])(element);
  4848. enabledElement.invalid = true;
  4849. enabledElement.needsRedraw = true;
  4850. var eventData = {
  4851. element: element
  4852. };
  4853. Object(_triggerEvent_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element, _events_js__WEBPACK_IMPORTED_MODULE_2__["default"].INVALIDATED, eventData);
  4854. });
  4855. /***/ }),
  4856. /***/ "./invalidateImageId.js":
  4857. /*!******************************!*\
  4858. !*** ./invalidateImageId.js ***!
  4859. \******************************/
  4860. /*! exports provided: default */
  4861. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  4862. "use strict";
  4863. __webpack_require__.r(__webpack_exports__);
  4864. /* harmony import */ var _enabledElements_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./enabledElements.js */ "./enabledElements.js");
  4865. /* harmony import */ var _internal_drawImage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/drawImage.js */ "./internal/drawImage.js");
  4866. /**
  4867. * Forces the image to be updated/redrawn for all enabled elements
  4868. * displaying the specified imageId
  4869. *
  4870. * @param {string} imageId The imageId of the Cornerstone Image Object to redraw
  4871. * @returns {void}
  4872. * @memberof Drawing
  4873. */
  4874. /* harmony default export */ __webpack_exports__["default"] = (function (imageId) {
  4875. var enabledElements = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_0__["getEnabledElementsByImageId"])(imageId);
  4876. enabledElements.forEach(function (enabledElement) {
  4877. Object(_internal_drawImage_js__WEBPACK_IMPORTED_MODULE_1__["default"])(enabledElement, true);
  4878. });
  4879. });
  4880. /***/ }),
  4881. /***/ "./layers.js":
  4882. /*!*******************!*\
  4883. !*** ./layers.js ***!
  4884. \*******************/
  4885. /*! exports provided: rescaleImage, addLayer, removeLayer, getLayer, getLayers, getVisibleLayers, setActiveLayer, setLayerImage, getActiveLayer, purgeLayers */
  4886. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  4887. "use strict";
  4888. __webpack_require__.r(__webpack_exports__);
  4889. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rescaleImage", function() { return rescaleImage; });
  4890. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addLayer", function() { return addLayer; });
  4891. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeLayer", function() { return removeLayer; });
  4892. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLayer", function() { return getLayer; });
  4893. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLayers", function() { return getLayers; });
  4894. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getVisibleLayers", function() { return getVisibleLayers; });
  4895. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setActiveLayer", function() { return setActiveLayer; });
  4896. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setLayerImage", function() { return setLayerImage; });
  4897. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getActiveLayer", function() { return getActiveLayer; });
  4898. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "purgeLayers", function() { return purgeLayers; });
  4899. /* harmony import */ var _internal_guid_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/guid.js */ "./internal/guid.js");
  4900. /* harmony import */ var _enabledElements_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./enabledElements.js */ "./enabledElements.js");
  4901. /* harmony import */ var _internal_getDefaultViewport_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./internal/getDefaultViewport.js */ "./internal/getDefaultViewport.js");
  4902. /* harmony import */ var _internal_getDisplayedArea_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./internal/getDisplayedArea.js */ "./internal/getDisplayedArea.js");
  4903. /* harmony import */ var _updateImage_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./updateImage.js */ "./updateImage.js");
  4904. /* harmony import */ var _triggerEvent_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./triggerEvent.js */ "./triggerEvent.js");
  4905. /* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./events.js */ "./events.js");
  4906. /**
  4907. * @module EnabledElementLayers
  4908. */
  4909. /**
  4910. * Helper function to trigger an event on a Cornerstone element with
  4911. * a specific layerId
  4912. *
  4913. * @param {String} eventName The event name (e.g. CornerstoneLayerAdded)
  4914. * @param {EnabledElement} enabledElement The Cornerstone enabled element
  4915. * @param {String} layerId The layer's unique identifier
  4916. * @returns {void}
  4917. * @memberof EnabledElementLayers
  4918. */
  4919. function triggerEventForLayer(eventName, enabledElement, layerId) {
  4920. var element = enabledElement.element;
  4921. var eventData = {
  4922. viewport: enabledElement.viewport,
  4923. element: enabledElement.element,
  4924. image: enabledElement.image,
  4925. enabledElement: enabledElement,
  4926. layerId: layerId
  4927. };
  4928. Object(_triggerEvent_js__WEBPACK_IMPORTED_MODULE_5__["default"])(element, eventName, eventData);
  4929. }
  4930. /**
  4931. * Rescale the target layer to the base layer based on the
  4932. * relative size of each image and their pixel dimensions.
  4933. *
  4934. * This function will update the Viewport parameters of the
  4935. * target layer to a new scale.
  4936. *
  4937. * @param {EnabledElementLayer} baseLayer The base layer
  4938. * @param {EnabledElementLayer} targetLayer The target layer to rescale
  4939. * @returns {void}
  4940. * @memberof EnabledElementLayers
  4941. */
  4942. function rescaleImage(baseLayer, targetLayer) {
  4943. if (baseLayer.layerId === targetLayer.layerId) {
  4944. throw new Error('rescaleImage: both arguments represent the same layer');
  4945. }
  4946. var baseImage = baseLayer.image;
  4947. var targetImage = targetLayer.image; // Return if these images don't have an imageId (e.g. for dynamic images)
  4948. if (!baseImage.imageId || !targetImage.imageId) {
  4949. return;
  4950. } // Column pixel spacing need to be considered when calculating the
  4951. // ratio between the layer added and base layer images
  4952. var targetDisplayedArea = Object(_internal_getDisplayedArea_js__WEBPACK_IMPORTED_MODULE_3__["default"])(targetImage, targetLayer.viewport);
  4953. var baseDisplayedArea = Object(_internal_getDisplayedArea_js__WEBPACK_IMPORTED_MODULE_3__["default"])(baseImage, baseLayer.viewport);
  4954. var colRelative = targetDisplayedArea.columnPixelSpacing * targetImage.width / (baseDisplayedArea.columnPixelSpacing * baseImage.width);
  4955. var viewportRatio = targetLayer.viewport.scale / baseLayer.viewport.scale * colRelative;
  4956. targetLayer.viewport.scale = baseLayer.viewport.scale * viewportRatio;
  4957. }
  4958. /**
  4959. * Add a layer to a Cornerstone element
  4960. *
  4961. * @param {HTMLElement} element The DOM element enabled for Cornerstone
  4962. * @param {Image} image A Cornerstone Image object to add as a new layer
  4963. * @param {Object} options Options for the layer
  4964. *
  4965. * @returns {String} layerId The new layer's unique identifier
  4966. * @memberof EnabledElementLayers
  4967. */
  4968. function addLayer(element, image, options) {
  4969. var layerId = Object(_internal_guid_js__WEBPACK_IMPORTED_MODULE_0__["default"])();
  4970. var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_1__["getEnabledElement"])(element);
  4971. var layers = enabledElement.layers;
  4972. var viewport;
  4973. if (image) {
  4974. viewport = Object(_internal_getDefaultViewport_js__WEBPACK_IMPORTED_MODULE_2__["default"])(enabledElement.canvas, image); // Override the defaults if any optional viewport settings
  4975. // have been specified
  4976. if (options && options.viewport) {
  4977. viewport = Object.assign(viewport, options.viewport);
  4978. }
  4979. } // Set syncViewports to true by default when a new layer is added
  4980. if (enabledElement.syncViewports !== false) {
  4981. enabledElement.syncViewports = true;
  4982. }
  4983. var newLayer = {
  4984. image: image,
  4985. layerId: layerId,
  4986. viewport: viewport,
  4987. options: options || {},
  4988. renderingTools: {}
  4989. }; // Rescale the new layer based on the base layer to make sure
  4990. // they will have a proportional size (pixel spacing)
  4991. if (layers.length && image) {
  4992. rescaleImage(layers[0], newLayer);
  4993. }
  4994. layers.push(newLayer);
  4995. triggerEventForLayer(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].LAYER_ADDED, enabledElement, layerId); // Set the layer as active if it's the first layer added
  4996. if (layers.length === 1 && image) {
  4997. setActiveLayer(element, layerId);
  4998. }
  4999. return layerId;
  5000. }
  5001. /**
  5002. * Remove a layer from a Cornerstone element given a layer ID
  5003. *
  5004. * @param {HTMLElement} element The DOM element enabled for Cornerstone
  5005. * @param {String} layerId The unique identifier for the layer
  5006. * @returns {void}
  5007. * @memberof EnabledElementLayers
  5008. */
  5009. function removeLayer(element, layerId) {
  5010. var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_1__["getEnabledElement"])(element);
  5011. var layers = enabledElement.layers;
  5012. var index = enabledElement.layers.findIndex(function (layer) {
  5013. return layer.layerId === layerId;
  5014. });
  5015. if (index !== -1) {
  5016. layers.splice(index, 1); // If the current layer is active, and we have other layers,
  5017. // switch to the first layer that remains in the array
  5018. if (layerId === enabledElement.activeLayerId && layers.length) {
  5019. setActiveLayer(element, layers[0].layerId);
  5020. }
  5021. triggerEventForLayer(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].LAYER_REMOVED, enabledElement, layerId);
  5022. }
  5023. }
  5024. /**
  5025. * Retrieve a layer from a Cornerstone element given a layer ID
  5026. *
  5027. * @param {HTMLElement} element The DOM element enabled for Cornerstone
  5028. * @param {String} layerId The unique identifier for the layer
  5029. * @return {EnabledElementLayer} The layer
  5030. * @memberof EnabledElementLayers
  5031. */
  5032. function getLayer(element, layerId) {
  5033. var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_1__["getEnabledElement"])(element);
  5034. return enabledElement.layers.find(function (layer) {
  5035. return layer.layerId === layerId;
  5036. });
  5037. }
  5038. /**
  5039. * Retrieve all layers for a Cornerstone element
  5040. *
  5041. * @param {HTMLElement} element The DOM element enabled for Cornerstone
  5042. *
  5043. * @return {EnabledElementLayer[]} An array of layers
  5044. * @memberof EnabledElementLayers
  5045. */
  5046. function getLayers(element) {
  5047. var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_1__["getEnabledElement"])(element);
  5048. return enabledElement.layers;
  5049. }
  5050. /**
  5051. * Retrieve all visible layers for a Cornerstone element
  5052. *
  5053. * @param {HTMLElement} element The DOM element enabled for Cornerstone
  5054. *
  5055. * @return {EnabledElementLayer[]} An array of layers
  5056. * @memberof EnabledElementLayers
  5057. */
  5058. function getVisibleLayers(element) {
  5059. var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_1__["getEnabledElement"])(element);
  5060. return enabledElement.layers.filter(function (layer) {
  5061. return layer.options && layer.options.visible !== false && layer.options.opacity !== 0;
  5062. });
  5063. }
  5064. /**
  5065. * Set the active layer for a Cornerstone element
  5066. *
  5067. * @param {HTMLElement} element The DOM element enabled for Cornerstone
  5068. * @param {String} layerId The unique identifier for the layer
  5069. * @returns {void}
  5070. * @memberof EnabledElementLayers
  5071. */
  5072. function setActiveLayer(element, layerId) {
  5073. var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_1__["getEnabledElement"])(element); // Stop here if this layer is already active
  5074. if (enabledElement.activeLayerId === layerId) {
  5075. return;
  5076. }
  5077. var index = enabledElement.layers.findIndex(function (layer) {
  5078. return layer.layerId === layerId;
  5079. });
  5080. if (index === -1) {
  5081. throw new Error('setActiveLayer: layer not found in layers array');
  5082. }
  5083. var layer = enabledElement.layers[index];
  5084. if (!layer.image) {
  5085. throw new Error('setActiveLayer: layer with undefined image cannot be set as active.');
  5086. }
  5087. enabledElement.activeLayerId = layerId;
  5088. enabledElement.image = layer.image;
  5089. enabledElement.viewport = layer.viewport;
  5090. Object(_updateImage_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element);
  5091. triggerEventForLayer(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].ACTIVE_LAYER_CHANGED, enabledElement, layerId);
  5092. }
  5093. /**
  5094. * Set a new image for a specific layerId
  5095. *
  5096. * @param {HTMLElement} element The DOM element enabled for Cornerstone
  5097. * @param {Image} image The image to be displayed in this layer
  5098. * @param {String} [layerId] The unique identifier for the layer
  5099. * @returns {void}
  5100. * @memberof EnabledElementLayers
  5101. */
  5102. function setLayerImage(element, image, layerId) {
  5103. var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_1__["getEnabledElement"])(element);
  5104. var baseLayer = enabledElement.layers[0];
  5105. var layer;
  5106. if (layerId) {
  5107. layer = getLayer(element, layerId);
  5108. } else {
  5109. layer = getActiveLayer(element);
  5110. }
  5111. if (!layer) {
  5112. throw new Error('setLayerImage: Layer not found');
  5113. }
  5114. layer.image = image;
  5115. if (!image) {
  5116. layer.viewport = undefined;
  5117. return;
  5118. }
  5119. if (!layer.viewport) {
  5120. var defaultViewport = Object(_internal_getDefaultViewport_js__WEBPACK_IMPORTED_MODULE_2__["default"])(enabledElement.canvas, image); // Override the defaults if any optional viewport settings
  5121. // have been specified
  5122. if (layer.options && layer.options.viewport) {
  5123. layer.viewport = Object.assign(defaultViewport, layer.options.viewport);
  5124. }
  5125. if (baseLayer.layerId !== layerId) {
  5126. rescaleImage(baseLayer, layer);
  5127. }
  5128. }
  5129. }
  5130. /**
  5131. * Retrieve the currently active layer for a Cornerstone element
  5132. *
  5133. * @param {HTMLElement} element The DOM element enabled for Cornerstone
  5134. * @return {EnabledElementLayer} The currently active layer
  5135. * @memberof EnabledElementLayers
  5136. */
  5137. function getActiveLayer(element) {
  5138. var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_1__["getEnabledElement"])(element);
  5139. return enabledElement.layers.find(function (layer) {
  5140. return layer.layerId === enabledElement.activeLayerId;
  5141. });
  5142. }
  5143. /**
  5144. * Purge the layers
  5145. *
  5146. * @param {HTMLElement} element The DOM element enabled for Cornerstone
  5147. *
  5148. * @returns {void}
  5149. */
  5150. function purgeLayers(element) {
  5151. var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_1__["getEnabledElement"])(element);
  5152. enabledElement.layers = [];
  5153. delete enabledElement.activeLayerId;
  5154. delete enabledElement.lastSyncViewportsState;
  5155. }
  5156. /***/ }),
  5157. /***/ "./metaData.js":
  5158. /*!*********************!*\
  5159. !*** ./metaData.js ***!
  5160. \*********************/
  5161. /*! exports provided: addProvider, removeProvider, default */
  5162. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  5163. "use strict";
  5164. __webpack_require__.r(__webpack_exports__);
  5165. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addProvider", function() { return addProvider; });
  5166. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeProvider", function() { return removeProvider; });
  5167. // This module defines a way to access various metadata about an imageId. This layer of abstraction exists
  5168. // So metadata can be provided in different ways (e.g. by parsing DICOM P10 or by a WADO-RS document)
  5169. var providers = [];
  5170. /**
  5171. * @module Metadata
  5172. */
  5173. /**
  5174. * Adds a metadata provider with the specified priority
  5175. * @param {Function} provider Metadata provider function
  5176. * @param {Number} [priority=0] - 0 is default/normal, > 0 is high, < 0 is low
  5177. *
  5178. * @returns {void}
  5179. * @memberof Metadata
  5180. */
  5181. function addProvider(provider) {
  5182. var priority = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
  5183. var i; // Find the right spot to insert this provider based on priority
  5184. for (i = 0; i < providers.length; i++) {
  5185. if (providers[i].priority <= priority) {
  5186. break;
  5187. }
  5188. } // Insert the decode task at position i
  5189. providers.splice(i, 0, {
  5190. priority: priority,
  5191. provider: provider
  5192. });
  5193. }
  5194. /**
  5195. * Removes the specified provider
  5196. *
  5197. * @param {Function} provider Metadata provider function
  5198. *
  5199. * @returns {void}
  5200. * @memberof Metadata
  5201. */
  5202. function removeProvider(provider) {
  5203. for (var i = 0; i < providers.length; i++) {
  5204. if (providers[i].provider === provider) {
  5205. providers.splice(i, 1);
  5206. break;
  5207. }
  5208. }
  5209. }
  5210. /**
  5211. * Gets metadata from the registered metadata providers. Will call each one from highest priority to lowest
  5212. * until one responds
  5213. *
  5214. * @param {String} type The type of metadata requested from the metadata store
  5215. * @param {String} imageId The Cornerstone Image Object's imageId
  5216. *
  5217. * @returns {*} The metadata retrieved from the metadata store
  5218. * @memberof Metadata
  5219. */
  5220. function getMetaData(type, imageId) {
  5221. // Invoke each provider in priority order until one returns something
  5222. for (var i = 0; i < providers.length; i++) {
  5223. var result = providers[i].provider(type, imageId);
  5224. if (result !== undefined) {
  5225. return result;
  5226. }
  5227. }
  5228. }
  5229. /* harmony default export */ __webpack_exports__["default"] = ({
  5230. addProvider: addProvider,
  5231. removeProvider: removeProvider,
  5232. get: getMetaData
  5233. });
  5234. /***/ }),
  5235. /***/ "./pageToPixel.js":
  5236. /*!************************!*\
  5237. !*** ./pageToPixel.js ***!
  5238. \************************/
  5239. /*! exports provided: default */
  5240. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  5241. "use strict";
  5242. __webpack_require__.r(__webpack_exports__);
  5243. /* harmony import */ var _enabledElements_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./enabledElements.js */ "./enabledElements.js");
  5244. /* harmony import */ var _internal_getTransform_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/getTransform.js */ "./internal/getTransform.js");
  5245. /**
  5246. * Converts a point in the page coordinate system to the pixel coordinate
  5247. * system
  5248. *
  5249. * @param {HTMLElement} element The Cornerstone element within which the input point lies
  5250. * @param {Number} pageX The x value in the page coordinate system
  5251. * @param {Number} pageY The y value in the page coordinate system
  5252. *
  5253. * @returns {{x: Number, y: Number}} The transformed point in the pixel coordinate system
  5254. */
  5255. /* harmony default export */ __webpack_exports__["default"] = (function (element, pageX, pageY) {
  5256. var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_0__["getEnabledElement"])(element);
  5257. if (enabledElement.image === undefined) {
  5258. throw new Error('image has not been loaded yet');
  5259. } // Convert the pageX and pageY to the canvas client coordinates
  5260. var rect = element.getBoundingClientRect();
  5261. var clientX = pageX - rect.left - window.pageXOffset;
  5262. var clientY = pageY - rect.top - window.pageYOffset;
  5263. var pt = {
  5264. x: clientX,
  5265. y: clientY
  5266. };
  5267. var transform = Object(_internal_getTransform_js__WEBPACK_IMPORTED_MODULE_1__["default"])(enabledElement);
  5268. transform.invert();
  5269. return transform.transformPoint(pt.x, pt.y);
  5270. });
  5271. /***/ }),
  5272. /***/ "./pixelDataToFalseColorData.js":
  5273. /*!**************************************!*\
  5274. !*** ./pixelDataToFalseColorData.js ***!
  5275. \**************************************/
  5276. /*! exports provided: default */
  5277. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  5278. "use strict";
  5279. __webpack_require__.r(__webpack_exports__);
  5280. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return pixelDataToFalseColorData; });
  5281. /* harmony import */ var _colors_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./colors/index.js */ "./colors/index.js");
  5282. /**
  5283. * Converts the image pixel data into a false color data
  5284. *
  5285. * @param {Image} image A Cornerstone Image Object
  5286. * @param {Object} lookupTable A lookup table Object
  5287. *
  5288. * @returns {void}
  5289. * @deprecated This function is superseded by the ability to set the Viewport parameters
  5290. * to include colormaps.
  5291. */
  5292. function pixelDataToFalseColorData(image, lookupTable) {
  5293. if (image.color && !image.falseColor) {
  5294. throw new Error('Color transforms are not implemented yet');
  5295. }
  5296. var minPixelValue = image.minPixelValue;
  5297. var canvasImageDataIndex = 0;
  5298. var storedPixelDataIndex = 0;
  5299. var numPixels = image.width * image.height;
  5300. var origPixelData = image.origPixelData || image.getPixelData();
  5301. var storedColorPixelData = new Uint8Array(numPixels * 4);
  5302. var sp;
  5303. var mapped;
  5304. image.color = true;
  5305. image.falseColor = true;
  5306. image.origPixelData = origPixelData;
  5307. if (lookupTable instanceof _colors_index_js__WEBPACK_IMPORTED_MODULE_0__["default"].LookupTable) {
  5308. lookupTable.build();
  5309. while (storedPixelDataIndex < numPixels) {
  5310. sp = origPixelData[storedPixelDataIndex++];
  5311. mapped = lookupTable.mapValue(sp);
  5312. storedColorPixelData[canvasImageDataIndex++] = mapped[0];
  5313. storedColorPixelData[canvasImageDataIndex++] = mapped[1];
  5314. storedColorPixelData[canvasImageDataIndex++] = mapped[2];
  5315. storedColorPixelData[canvasImageDataIndex++] = mapped[3];
  5316. }
  5317. } else if (minPixelValue < 0) {
  5318. while (storedPixelDataIndex < numPixels) {
  5319. sp = origPixelData[storedPixelDataIndex++];
  5320. storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp + -minPixelValue][0]; // Red
  5321. storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp + -minPixelValue][1]; // Green
  5322. storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp + -minPixelValue][2]; // Blue
  5323. storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp + -minPixelValue][3]; // Alpha
  5324. }
  5325. } else {
  5326. while (storedPixelDataIndex < numPixels) {
  5327. sp = origPixelData[storedPixelDataIndex++];
  5328. storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp][0]; // Red
  5329. storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp][1]; // Green
  5330. storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp][2]; // Blue
  5331. storedColorPixelData[canvasImageDataIndex++] = lookupTable[sp][3]; // Alpha
  5332. }
  5333. }
  5334. image.rgba = true;
  5335. image.cachedLut = undefined;
  5336. image.render = undefined;
  5337. image.slope = 1;
  5338. image.intercept = 0;
  5339. image.minPixelValue = 0;
  5340. image.maxPixelValue = 255;
  5341. image.windowWidth = 255;
  5342. image.windowCenter = 128;
  5343. image.getPixelData = function () {
  5344. return storedColorPixelData;
  5345. };
  5346. }
  5347. /***/ }),
  5348. /***/ "./pixelToCanvas.js":
  5349. /*!**************************!*\
  5350. !*** ./pixelToCanvas.js ***!
  5351. \**************************/
  5352. /*! exports provided: default */
  5353. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  5354. "use strict";
  5355. __webpack_require__.r(__webpack_exports__);
  5356. /* harmony import */ var _enabledElements_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./enabledElements.js */ "./enabledElements.js");
  5357. /* harmony import */ var _internal_getTransform_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/getTransform.js */ "./internal/getTransform.js");
  5358. /**
  5359. * Converts a point in the pixel coordinate system to the canvas coordinate system
  5360. * system. This can be used to render using canvas context without having the weird
  5361. * side effects that come from scaling and non square pixels
  5362. *
  5363. * @param {HTMLElement} element An HTML Element enabled for Cornerstone
  5364. * @param {{x: Number, y: Number}} pt The transformed point in the pixel coordinate system
  5365. *
  5366. * @returns {{x: Number, y: Number}} The input point in the canvas coordinate system
  5367. * @memberof PixelCoordinateSystem
  5368. */
  5369. /* harmony default export */ __webpack_exports__["default"] = (function (element, pt) {
  5370. var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_0__["getEnabledElement"])(element);
  5371. var transform = Object(_internal_getTransform_js__WEBPACK_IMPORTED_MODULE_1__["default"])(enabledElement);
  5372. return transform.transformPoint(pt.x, pt.y);
  5373. });
  5374. /***/ }),
  5375. /***/ "./rendering/doesImageNeedToBeRendered.js":
  5376. /*!************************************************!*\
  5377. !*** ./rendering/doesImageNeedToBeRendered.js ***!
  5378. \************************************************/
  5379. /*! exports provided: default */
  5380. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  5381. "use strict";
  5382. __webpack_require__.r(__webpack_exports__);
  5383. /**
  5384. * Determine whether or not an Enabled Element needs to be re-rendered.
  5385. *
  5386. * If the imageId has changed, or if any of the last rendered viewport
  5387. * parameters have changed, this function will return true.
  5388. *
  5389. * @param {EnabledElement} enabledElement An Enabled Element
  5390. * @param {Image} image An Image
  5391. * @return {boolean} Whether or not the Enabled Element needs to re-render its image
  5392. * @memberof rendering
  5393. */
  5394. /* harmony default export */ __webpack_exports__["default"] = (function (enabledElement, image) {
  5395. var lastRenderedImageId = enabledElement.renderingTools.lastRenderedImageId;
  5396. var lastRenderedViewport = enabledElement.renderingTools.lastRenderedViewport;
  5397. return image.imageId !== lastRenderedImageId || !lastRenderedViewport || lastRenderedViewport.windowCenter !== enabledElement.viewport.voi.windowCenter || lastRenderedViewport.windowWidth !== enabledElement.viewport.voi.windowWidth || lastRenderedViewport.invert !== enabledElement.viewport.invert || lastRenderedViewport.rotation !== enabledElement.viewport.rotation || lastRenderedViewport.hflip !== enabledElement.viewport.hflip || lastRenderedViewport.vflip !== enabledElement.viewport.vflip || lastRenderedViewport.modalityLUT !== enabledElement.viewport.modalityLUT || lastRenderedViewport.voiLUT !== enabledElement.viewport.voiLUT || lastRenderedViewport.colormap !== enabledElement.viewport.colormap;
  5398. });
  5399. /***/ }),
  5400. /***/ "./rendering/getLut.js":
  5401. /*!*****************************!*\
  5402. !*** ./rendering/getLut.js ***!
  5403. \*****************************/
  5404. /*! exports provided: default */
  5405. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  5406. "use strict";
  5407. __webpack_require__.r(__webpack_exports__);
  5408. /* harmony import */ var _internal_computeAutoVoi_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../internal/computeAutoVoi.js */ "./internal/computeAutoVoi.js");
  5409. /* harmony import */ var _lutMatches_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./lutMatches.js */ "./rendering/lutMatches.js");
  5410. /* harmony import */ var _internal_generateLut_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../internal/generateLut.js */ "./internal/generateLut.js");
  5411. /**
  5412. * Retrieve or generate a LUT Array for an Image and Viewport
  5413. *
  5414. * @param {Image} image An Image Object
  5415. * @param {Viewport} viewport An Viewport Object
  5416. * @param {Boolean} invalidated Whether or not the LUT data has been invalidated
  5417. * (e.g. by a change to the windowWidth, windowCenter, or invert viewport parameters).
  5418. * @return {Uint8ClampedArray} LUT Array
  5419. * @memberof rendering
  5420. */
  5421. /* harmony default export */ __webpack_exports__["default"] = (function (image, viewport, invalidated) {
  5422. // If we have a cached lut and it has the right values, return it immediately
  5423. if (image.cachedLut !== undefined && image.cachedLut.windowCenter === viewport.voi.windowCenter && image.cachedLut.windowWidth === viewport.voi.windowWidth && Object(_lutMatches_js__WEBPACK_IMPORTED_MODULE_1__["default"])(image.cachedLut.modalityLUT, viewport.modalityLUT) && Object(_lutMatches_js__WEBPACK_IMPORTED_MODULE_1__["default"])(image.cachedLut.voiLUT, viewport.voiLUT) && image.cachedLut.invert === viewport.invert && invalidated !== true) {
  5424. return image.cachedLut.lutArray;
  5425. }
  5426. Object(_internal_computeAutoVoi_js__WEBPACK_IMPORTED_MODULE_0__["default"])(viewport, image); // Lut is invalid or not present, regenerate it and cache it
  5427. Object(_internal_generateLut_js__WEBPACK_IMPORTED_MODULE_2__["default"])(image, viewport.voi.windowWidth, viewport.voi.windowCenter, viewport.invert, viewport.modalityLUT, viewport.voiLUT);
  5428. image.cachedLut.windowWidth = viewport.voi.windowWidth;
  5429. image.cachedLut.windowCenter = viewport.voi.windowCenter;
  5430. image.cachedLut.invert = viewport.invert;
  5431. image.cachedLut.voiLUT = viewport.voiLUT;
  5432. image.cachedLut.modalityLUT = viewport.modalityLUT;
  5433. return image.cachedLut.lutArray;
  5434. });
  5435. /***/ }),
  5436. /***/ "./rendering/index.js":
  5437. /*!****************************!*\
  5438. !*** ./rendering/index.js ***!
  5439. \****************************/
  5440. /*! exports provided: default */
  5441. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  5442. "use strict";
  5443. __webpack_require__.r(__webpack_exports__);
  5444. /* harmony import */ var _renderColorImage_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./renderColorImage.js */ "./rendering/renderColorImage.js");
  5445. /* harmony import */ var _renderGrayscaleImage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./renderGrayscaleImage.js */ "./rendering/renderGrayscaleImage.js");
  5446. /* harmony import */ var _renderWebImage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./renderWebImage.js */ "./rendering/renderWebImage.js");
  5447. /* harmony import */ var _renderPseudoColorImage_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./renderPseudoColorImage.js */ "./rendering/renderPseudoColorImage.js");
  5448. /* harmony import */ var _renderLabelMapImage_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./renderLabelMapImage.js */ "./rendering/renderLabelMapImage.js");
  5449. /* harmony import */ var _renderToCanvas_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./renderToCanvas.js */ "./rendering/renderToCanvas.js");
  5450. /**
  5451. * @module rendering
  5452. */
  5453. /* harmony default export */ __webpack_exports__["default"] = ({
  5454. colorImage: _renderColorImage_js__WEBPACK_IMPORTED_MODULE_0__["renderColorImage"],
  5455. grayscaleImage: _renderGrayscaleImage_js__WEBPACK_IMPORTED_MODULE_1__["renderGrayscaleImage"],
  5456. webImage: _renderWebImage_js__WEBPACK_IMPORTED_MODULE_2__["renderWebImage"],
  5457. pseudoColorImage: _renderPseudoColorImage_js__WEBPACK_IMPORTED_MODULE_3__["renderPseudoColorImage"],
  5458. labelMapImage: _renderLabelMapImage_js__WEBPACK_IMPORTED_MODULE_4__["renderLabelMapImage"],
  5459. toCanvas: _renderToCanvas_js__WEBPACK_IMPORTED_MODULE_5__["default"]
  5460. });
  5461. /***/ }),
  5462. /***/ "./rendering/initializeRenderCanvas.js":
  5463. /*!*********************************************!*\
  5464. !*** ./rendering/initializeRenderCanvas.js ***!
  5465. \*********************************************/
  5466. /*! exports provided: default */
  5467. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  5468. "use strict";
  5469. __webpack_require__.r(__webpack_exports__);
  5470. /**
  5471. * Sets size and clears canvas
  5472. *
  5473. * @param {Object} enabledElement Cornerstone Enabled Element
  5474. * @param {Object} image Image to be rendered
  5475. * @returns {void}
  5476. * @memberof rendering
  5477. */
  5478. /* harmony default export */ __webpack_exports__["default"] = (function (enabledElement, image) {
  5479. var renderCanvas = enabledElement.renderingTools.renderCanvas; // Resize the canvas
  5480. renderCanvas.width = image.width;
  5481. renderCanvas.height = image.height;
  5482. var canvasContext = renderCanvas.getContext('2d', {
  5483. desynchronized: true
  5484. }); // NOTE - we need to fill the render canvas with white pixels since we
  5485. // control the luminance using the alpha channel to improve rendering performance.
  5486. canvasContext.fillStyle = 'white';
  5487. canvasContext.fillRect(0, 0, renderCanvas.width, renderCanvas.height);
  5488. var renderCanvasData = canvasContext.getImageData(0, 0, image.width, image.height);
  5489. enabledElement.renderingTools.renderCanvasContext = canvasContext;
  5490. enabledElement.renderingTools.renderCanvasData = renderCanvasData;
  5491. });
  5492. /***/ }),
  5493. /***/ "./rendering/lutMatches.js":
  5494. /*!*********************************!*\
  5495. !*** ./rendering/lutMatches.js ***!
  5496. \*********************************/
  5497. /*! exports provided: default */
  5498. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  5499. "use strict";
  5500. __webpack_require__.r(__webpack_exports__);
  5501. /**
  5502. * Check if two lookup tables match
  5503. *
  5504. * @param {LUT} a A lookup table function
  5505. * @param {LUT} b Another lookup table function
  5506. * @return {boolean} Whether or not they match
  5507. * @memberof rendering
  5508. */
  5509. /* harmony default export */ __webpack_exports__["default"] = (function (a, b) {
  5510. // If undefined, they are equal
  5511. if (!a && !b) {
  5512. return true;
  5513. } // If one is undefined, not equal
  5514. if (!a || !b) {
  5515. return false;
  5516. } // Check the unique ids
  5517. return a.id === b.id;
  5518. });
  5519. /***/ }),
  5520. /***/ "./rendering/renderColorImage.js":
  5521. /*!***************************************!*\
  5522. !*** ./rendering/renderColorImage.js ***!
  5523. \***************************************/
  5524. /*! exports provided: renderColorImage, addColorLayer */
  5525. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  5526. "use strict";
  5527. __webpack_require__.r(__webpack_exports__);
  5528. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "renderColorImage", function() { return renderColorImage; });
  5529. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addColorLayer", function() { return addColorLayer; });
  5530. /* harmony import */ var _internal_now_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../internal/now.js */ "./internal/now.js");
  5531. /* harmony import */ var _internal_getFillStyle_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../internal/getFillStyle.js */ "./internal/getFillStyle.js");
  5532. /* harmony import */ var _internal_generateColorLut_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../internal/generateColorLut.js */ "./internal/generateColorLut.js");
  5533. /* harmony import */ var _internal_storedColorPixelDataToCanvasImageData_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../internal/storedColorPixelDataToCanvasImageData.js */ "./internal/storedColorPixelDataToCanvasImageData.js");
  5534. /* harmony import */ var _internal_storedRGBAPixelDataToCanvasImageData_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../internal/storedRGBAPixelDataToCanvasImageData.js */ "./internal/storedRGBAPixelDataToCanvasImageData.js");
  5535. /* harmony import */ var _setToPixelCoordinateSystem_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../setToPixelCoordinateSystem.js */ "./setToPixelCoordinateSystem.js");
  5536. /* harmony import */ var _webgl_index_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../webgl/index.js */ "./webgl/index.js");
  5537. /* harmony import */ var _doesImageNeedToBeRendered_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./doesImageNeedToBeRendered.js */ "./rendering/doesImageNeedToBeRendered.js");
  5538. /* harmony import */ var _initializeRenderCanvas_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./initializeRenderCanvas.js */ "./rendering/initializeRenderCanvas.js");
  5539. /* harmony import */ var _saveLastRendered_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./saveLastRendered.js */ "./rendering/saveLastRendered.js");
  5540. /* harmony import */ var _internal_getDisplayedArea_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../internal/getDisplayedArea.js */ "./internal/getDisplayedArea.js");
  5541. /**
  5542. * Generates an appropriate Look Up Table to render the given image with the given window width and level (specified in the viewport)
  5543. * Uses an internal cache for performance
  5544. *
  5545. * @param {Object} image The image to be rendered
  5546. * @param {Object} viewport The viewport values used for rendering
  5547. * @returns {Uint8ClampedArray} Look Up Table array.
  5548. * @memberof rendering
  5549. */
  5550. function getLut(image, viewport) {
  5551. // If we have a cached lut and it has the right values, return it immediately
  5552. if (image.cachedLut !== undefined && image.cachedLut.windowCenter === viewport.voi.windowCenter && image.cachedLut.windowWidth === viewport.voi.windowWidth && image.cachedLut.invert === viewport.invert) {
  5553. return image.cachedLut.lutArray;
  5554. } // Lut is invalid or not present, regenerate it and cache it
  5555. Object(_internal_generateColorLut_js__WEBPACK_IMPORTED_MODULE_2__["default"])(image, viewport.voi.windowWidth, viewport.voi.windowCenter, viewport.invert);
  5556. image.cachedLut.windowWidth = viewport.voi.windowWidth;
  5557. image.cachedLut.windowCenter = viewport.voi.windowCenter;
  5558. image.cachedLut.invert = viewport.invert;
  5559. return image.cachedLut.lutArray;
  5560. }
  5561. /**
  5562. * Returns an appropriate canvas to render the Image. If the canvas available in the cache is appropriate
  5563. * it is returned, otherwise adjustments are made. It also sets the color transfer functions.
  5564. *
  5565. * @param {Object} enabledElement The cornerstone enabled element
  5566. * @param {Object} image The image to be rendered
  5567. * @param {Boolean} invalidated Is pixel data valid
  5568. * @returns {HTMLCanvasElement} An appropriate canvas for rendering the image
  5569. * @memberof rendering
  5570. */
  5571. function getRenderCanvas(enabledElement, image, invalidated) {
  5572. var canvasWasColor = enabledElement.renderingTools.lastRenderedIsColor === true;
  5573. if (!enabledElement.renderingTools.renderCanvas || !canvasWasColor) {
  5574. enabledElement.renderingTools.renderCanvas = document.createElement('canvas');
  5575. }
  5576. var renderCanvas = enabledElement.renderingTools.renderCanvas; // The ww/wc is identity and not inverted - get a canvas with the image rendered into it for
  5577. // Fast drawing
  5578. if (enabledElement.viewport.voi.windowWidth === 255 && enabledElement.viewport.voi.windowCenter === 128 && enabledElement.viewport.invert === false && image.getCanvas && image.getCanvas()) {
  5579. return image.getCanvas();
  5580. } // Apply the lut to the stored pixel data onto the render canvas
  5581. if (Object(_doesImageNeedToBeRendered_js__WEBPACK_IMPORTED_MODULE_7__["default"])(enabledElement, image) === false && invalidated !== true) {
  5582. return renderCanvas;
  5583. } // If our render canvas does not match the size of this image reset it
  5584. // NOTE: This might be inefficient if we are updating multiple images of different
  5585. // Sizes frequently.
  5586. if (renderCanvas.width !== image.width || renderCanvas.height !== image.height) {
  5587. Object(_initializeRenderCanvas_js__WEBPACK_IMPORTED_MODULE_8__["default"])(enabledElement, image);
  5588. } // Get the lut to use
  5589. var start = Object(_internal_now_js__WEBPACK_IMPORTED_MODULE_0__["default"])();
  5590. var colorLut = getLut(image, enabledElement.viewport);
  5591. image.stats = image.stats || {};
  5592. image.stats.lastLutGenerateTime = Object(_internal_now_js__WEBPACK_IMPORTED_MODULE_0__["default"])() - start;
  5593. var renderCanvasData = enabledElement.renderingTools.renderCanvasData;
  5594. var renderCanvasContext = enabledElement.renderingTools.renderCanvasContext; // The color image voi/invert has been modified - apply the lut to the underlying
  5595. // Pixel data and put it into the renderCanvas
  5596. if (image.rgba) {
  5597. Object(_internal_storedRGBAPixelDataToCanvasImageData_js__WEBPACK_IMPORTED_MODULE_4__["default"])(image, colorLut, renderCanvasData.data);
  5598. } else {
  5599. Object(_internal_storedColorPixelDataToCanvasImageData_js__WEBPACK_IMPORTED_MODULE_3__["default"])(image, colorLut, renderCanvasData.data);
  5600. }
  5601. start = Object(_internal_now_js__WEBPACK_IMPORTED_MODULE_0__["default"])();
  5602. renderCanvasContext.putImageData(renderCanvasData, 0, 0);
  5603. image.stats.lastPutImageDataTime = Object(_internal_now_js__WEBPACK_IMPORTED_MODULE_0__["default"])() - start;
  5604. return renderCanvas;
  5605. }
  5606. /**
  5607. * API function to render a color image to an enabled element
  5608. *
  5609. * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw
  5610. * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used
  5611. * @returns {void}
  5612. * @memberof rendering
  5613. */
  5614. function renderColorImage(enabledElement, invalidated) {
  5615. if (enabledElement === undefined) {
  5616. throw new Error('renderColorImage: enabledElement parameter must not be undefined');
  5617. }
  5618. var image = enabledElement.image;
  5619. if (image === undefined) {
  5620. throw new Error('renderColorImage: image must be loaded before it can be drawn');
  5621. } // Get the canvas context and reset the transform
  5622. var context = enabledElement.canvas.getContext('2d', {
  5623. desynchronized: true
  5624. });
  5625. context.setTransform(1, 0, 0, 1, 0, 0); // Clear the canvas
  5626. context.fillStyle = Object(_internal_getFillStyle_js__WEBPACK_IMPORTED_MODULE_1__["default"])(enabledElement);
  5627. context.fillRect(0, 0, enabledElement.canvas.width, enabledElement.canvas.height); // Turn off image smooth/interpolation if pixelReplication is set in the viewport
  5628. context.imageSmoothingEnabled = !enabledElement.viewport.pixelReplication;
  5629. context.mozImageSmoothingEnabled = context.imageSmoothingEnabled; // Save the canvas context state and apply the viewport properties
  5630. Object(_setToPixelCoordinateSystem_js__WEBPACK_IMPORTED_MODULE_5__["default"])(enabledElement, context);
  5631. var renderCanvas;
  5632. if (enabledElement.options && enabledElement.options.renderer && enabledElement.options.renderer.toLowerCase() === 'webgl') {
  5633. // If this enabled element has the option set for WebGL, we should
  5634. // User it as our renderer.
  5635. renderCanvas = _webgl_index_js__WEBPACK_IMPORTED_MODULE_6__["default"].renderer.render(enabledElement);
  5636. } else {
  5637. // If no options are set we will retrieve the renderCanvas through the
  5638. // Normal Canvas rendering path
  5639. renderCanvas = getRenderCanvas(enabledElement, image, invalidated);
  5640. }
  5641. var imageDisplayedArea = Object(_internal_getDisplayedArea_js__WEBPACK_IMPORTED_MODULE_10__["default"])(enabledElement.image, enabledElement.viewport);
  5642. var sx = imageDisplayedArea.tlhc.x - 1;
  5643. var sy = imageDisplayedArea.tlhc.y - 1;
  5644. var width = imageDisplayedArea.brhc.x - sx;
  5645. var height = imageDisplayedArea.brhc.y - sy;
  5646. context.drawImage(renderCanvas, sx, sy, width, height, sx, sy, width, height);
  5647. enabledElement.renderingTools = Object(_saveLastRendered_js__WEBPACK_IMPORTED_MODULE_9__["default"])(enabledElement);
  5648. }
  5649. function addColorLayer(layer, invalidated) {
  5650. if (layer === undefined) {
  5651. throw new Error('addColorLayer: layer parameter must not be undefined');
  5652. }
  5653. var image = layer.image;
  5654. if (image === undefined) {
  5655. throw new Error('addColorLayer: image must be loaded before it can be drawn');
  5656. } // All multi-layer images should include the alpha value
  5657. image.rgba = true;
  5658. layer.canvas = getRenderCanvas(layer, image, invalidated);
  5659. var context = layer.canvas.getContext('2d', {
  5660. desynchronized: true
  5661. }); // Turn off image smooth/interpolation if pixelReplication is set in the viewport
  5662. context.imageSmoothingEnabled = !layer.viewport.pixelReplication;
  5663. context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;
  5664. layer.renderingTools = Object(_saveLastRendered_js__WEBPACK_IMPORTED_MODULE_9__["default"])(layer);
  5665. }
  5666. /***/ }),
  5667. /***/ "./rendering/renderGrayscaleImage.js":
  5668. /*!*******************************************!*\
  5669. !*** ./rendering/renderGrayscaleImage.js ***!
  5670. \*******************************************/
  5671. /*! exports provided: renderGrayscaleImage, addGrayscaleLayer */
  5672. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  5673. "use strict";
  5674. __webpack_require__.r(__webpack_exports__);
  5675. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "renderGrayscaleImage", function() { return renderGrayscaleImage; });
  5676. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addGrayscaleLayer", function() { return addGrayscaleLayer; });
  5677. /* harmony import */ var _internal_getFillStyle_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../internal/getFillStyle.js */ "./internal/getFillStyle.js");
  5678. /* harmony import */ var _internal_storedPixelDataToCanvasImageData_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../internal/storedPixelDataToCanvasImageData.js */ "./internal/storedPixelDataToCanvasImageData.js");
  5679. /* harmony import */ var _internal_storedPixelDataToCanvasImageDataRGBA_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../internal/storedPixelDataToCanvasImageDataRGBA.js */ "./internal/storedPixelDataToCanvasImageDataRGBA.js");
  5680. /* harmony import */ var _setToPixelCoordinateSystem_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../setToPixelCoordinateSystem.js */ "./setToPixelCoordinateSystem.js");
  5681. /* harmony import */ var _internal_now_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../internal/now.js */ "./internal/now.js");
  5682. /* harmony import */ var _webgl_index_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../webgl/index.js */ "./webgl/index.js");
  5683. /* harmony import */ var _getLut_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./getLut.js */ "./rendering/getLut.js");
  5684. /* harmony import */ var _doesImageNeedToBeRendered_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./doesImageNeedToBeRendered.js */ "./rendering/doesImageNeedToBeRendered.js");
  5685. /* harmony import */ var _initializeRenderCanvas_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./initializeRenderCanvas.js */ "./rendering/initializeRenderCanvas.js");
  5686. /* harmony import */ var _saveLastRendered_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./saveLastRendered.js */ "./rendering/saveLastRendered.js");
  5687. /* harmony import */ var _internal_getDisplayedArea_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../internal/getDisplayedArea.js */ "./internal/getDisplayedArea.js");
  5688. /**
  5689. * Returns an appropriate canvas to render the Image. If the canvas available in the cache is appropriate
  5690. * it is returned, otherwise adjustments are made. It also sets the color transfer functions.
  5691. *
  5692. * @param {Object} enabledElement The cornerstone enabled element
  5693. * @param {Object} image The image to be rendered
  5694. * @param {Boolean} invalidated Is pixel data valid
  5695. * @param {Boolean} [useAlphaChannel = true] Will an alpha channel be used
  5696. * @returns {HTMLCanvasElement} An appropriate canvas for rendering the image
  5697. * @memberof rendering
  5698. */
  5699. function getRenderCanvas(enabledElement, image, invalidated) {
  5700. var useAlphaChannel = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
  5701. var canvasWasColor = enabledElement.renderingTools.lastRenderedIsColor === true;
  5702. if (!enabledElement.renderingTools.renderCanvas || canvasWasColor) {
  5703. enabledElement.renderingTools.renderCanvas = document.createElement('canvas');
  5704. Object(_initializeRenderCanvas_js__WEBPACK_IMPORTED_MODULE_8__["default"])(enabledElement, image);
  5705. }
  5706. var renderCanvas = enabledElement.renderingTools.renderCanvas;
  5707. if (Object(_doesImageNeedToBeRendered_js__WEBPACK_IMPORTED_MODULE_7__["default"])(enabledElement, image) === false && invalidated !== true) {
  5708. return renderCanvas;
  5709. } // If our render canvas does not match the size of this image reset it
  5710. // NOTE: This might be inefficient if we are updating multiple images of different
  5711. // Sizes frequently.
  5712. if (renderCanvas.width !== image.width || renderCanvas.height !== image.height) {
  5713. Object(_initializeRenderCanvas_js__WEBPACK_IMPORTED_MODULE_8__["default"])(enabledElement, image);
  5714. } // Get the lut to use
  5715. var start = Object(_internal_now_js__WEBPACK_IMPORTED_MODULE_4__["default"])();
  5716. var lut = Object(_getLut_js__WEBPACK_IMPORTED_MODULE_6__["default"])(image, enabledElement.viewport, invalidated);
  5717. image.stats = image.stats || {};
  5718. image.stats.lastLutGenerateTime = Object(_internal_now_js__WEBPACK_IMPORTED_MODULE_4__["default"])() - start;
  5719. var renderCanvasData = enabledElement.renderingTools.renderCanvasData;
  5720. var renderCanvasContext = enabledElement.renderingTools.renderCanvasContext; // Gray scale image - apply the lut and put the resulting image onto the render canvas
  5721. if (useAlphaChannel) {
  5722. Object(_internal_storedPixelDataToCanvasImageData_js__WEBPACK_IMPORTED_MODULE_1__["default"])(image, lut, renderCanvasData.data);
  5723. } else {
  5724. Object(_internal_storedPixelDataToCanvasImageDataRGBA_js__WEBPACK_IMPORTED_MODULE_2__["default"])(image, lut, renderCanvasData.data);
  5725. }
  5726. start = Object(_internal_now_js__WEBPACK_IMPORTED_MODULE_4__["default"])();
  5727. renderCanvasContext.putImageData(renderCanvasData, 0, 0);
  5728. image.stats.lastPutImageDataTime = Object(_internal_now_js__WEBPACK_IMPORTED_MODULE_4__["default"])() - start;
  5729. return renderCanvas;
  5730. }
  5731. /**
  5732. * API function to draw a grayscale image to a given enabledElement
  5733. *
  5734. * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw
  5735. * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used
  5736. * @returns {void}
  5737. * @memberof rendering
  5738. */
  5739. function renderGrayscaleImage(enabledElement, invalidated) {
  5740. if (enabledElement === undefined) {
  5741. throw new Error('drawImage: enabledElement parameter must not be undefined');
  5742. }
  5743. var image = enabledElement.image;
  5744. if (image === undefined) {
  5745. throw new Error('drawImage: image must be loaded before it can be drawn');
  5746. } // Get the canvas context and reset the transform
  5747. var context = enabledElement.canvas.getContext('2d', {
  5748. desynchronized: true
  5749. });
  5750. context.setTransform(1, 0, 0, 1, 0, 0); // Clear the canvas
  5751. context.fillStyle = Object(_internal_getFillStyle_js__WEBPACK_IMPORTED_MODULE_0__["default"])(enabledElement);
  5752. context.fillRect(0, 0, enabledElement.canvas.width, enabledElement.canvas.height); // Turn off image smooth/interpolation if pixelReplication is set in the viewport
  5753. context.imageSmoothingEnabled = !enabledElement.viewport.pixelReplication;
  5754. context.mozImageSmoothingEnabled = context.imageSmoothingEnabled; // Save the canvas context state and apply the viewport properties
  5755. Object(_setToPixelCoordinateSystem_js__WEBPACK_IMPORTED_MODULE_3__["default"])(enabledElement, context);
  5756. var renderCanvas;
  5757. if (enabledElement.options && enabledElement.options.renderer && enabledElement.options.renderer.toLowerCase() === 'webgl') {
  5758. // If this enabled element has the option set for WebGL, we should
  5759. // User it as our renderer.
  5760. renderCanvas = _webgl_index_js__WEBPACK_IMPORTED_MODULE_5__["default"].renderer.render(enabledElement);
  5761. } else {
  5762. // If no options are set we will retrieve the renderCanvas through the
  5763. // Normal Canvas rendering path
  5764. renderCanvas = getRenderCanvas(enabledElement, image, invalidated);
  5765. }
  5766. var imageDisplayedArea = Object(_internal_getDisplayedArea_js__WEBPACK_IMPORTED_MODULE_10__["default"])(enabledElement.image, enabledElement.viewport);
  5767. var sx = imageDisplayedArea.tlhc.x - 1;
  5768. var sy = imageDisplayedArea.tlhc.y - 1;
  5769. var width = imageDisplayedArea.brhc.x - sx;
  5770. var height = imageDisplayedArea.brhc.y - sy;
  5771. context.drawImage(renderCanvas, sx, sy, width, height, sx, sy, width, height);
  5772. enabledElement.renderingTools = Object(_saveLastRendered_js__WEBPACK_IMPORTED_MODULE_9__["default"])(enabledElement);
  5773. }
  5774. /**
  5775. * API function to draw a grayscale image to a given layer
  5776. *
  5777. * @param {EnabledElementLayer} layer The layer that the image will be added to
  5778. * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used
  5779. * @param {Boolean} [useAlphaChannel] - Whether or not to render the grayscale image using only the alpha channel.
  5780. This does not work if this layer is not the first layer in the enabledElement.
  5781. * @returns {void}
  5782. */
  5783. function addGrayscaleLayer(layer, invalidated) {
  5784. var useAlphaChannel = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
  5785. if (layer === undefined) {
  5786. throw new Error('addGrayscaleLayer: layer parameter must not be undefined');
  5787. }
  5788. var image = layer.image;
  5789. if (image === undefined) {
  5790. throw new Error('addGrayscaleLayer: image must be loaded before it can be drawn');
  5791. }
  5792. layer.canvas = getRenderCanvas(layer, image, invalidated, useAlphaChannel);
  5793. var context = layer.canvas.getContext('2d', {
  5794. desynchronized: true
  5795. }); // Turn off image smooth/interpolation if pixelReplication is set in the viewport
  5796. context.imageSmoothingEnabled = !layer.viewport.pixelReplication;
  5797. context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;
  5798. layer.renderingTools = Object(_saveLastRendered_js__WEBPACK_IMPORTED_MODULE_9__["default"])(layer);
  5799. }
  5800. /***/ }),
  5801. /***/ "./rendering/renderLabelMapImage.js":
  5802. /*!******************************************!*\
  5803. !*** ./rendering/renderLabelMapImage.js ***!
  5804. \******************************************/
  5805. /*! exports provided: renderLabelMapImage, addLabelMapLayer */
  5806. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  5807. "use strict";
  5808. __webpack_require__.r(__webpack_exports__);
  5809. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "renderLabelMapImage", function() { return renderLabelMapImage; });
  5810. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addLabelMapLayer", function() { return addLabelMapLayer; });
  5811. /* harmony import */ var _setToPixelCoordinateSystem_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../setToPixelCoordinateSystem.js */ "./setToPixelCoordinateSystem.js");
  5812. /* harmony import */ var _internal_now_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../internal/now.js */ "./internal/now.js");
  5813. /* harmony import */ var _internal_getFillStyle_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../internal/getFillStyle.js */ "./internal/getFillStyle.js");
  5814. /* harmony import */ var _initializeRenderCanvas_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./initializeRenderCanvas.js */ "./rendering/initializeRenderCanvas.js");
  5815. /* harmony import */ var _saveLastRendered_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./saveLastRendered.js */ "./rendering/saveLastRendered.js");
  5816. /* harmony import */ var _doesImageNeedToBeRendered_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./doesImageNeedToBeRendered.js */ "./rendering/doesImageNeedToBeRendered.js");
  5817. /* harmony import */ var _internal_storedPixelDataToCanvasImageDataColorLUT_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../internal/storedPixelDataToCanvasImageDataColorLUT.js */ "./internal/storedPixelDataToCanvasImageDataColorLUT.js");
  5818. /* harmony import */ var _colors_index_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../colors/index.js */ "./colors/index.js");
  5819. /* harmony import */ var _internal_getDisplayedArea_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../internal/getDisplayedArea.js */ "./internal/getDisplayedArea.js");
  5820. /**
  5821. * Returns an appropriate canvas to render the Image. If the canvas available in the cache is appropriate
  5822. * it is returned, otherwise adjustments are made. It also sets the color transfer functions.
  5823. *
  5824. * @param {Object} enabledElement The cornerstone enabled element
  5825. * @param {Object} image The image to be rendered
  5826. * @param {Boolean} invalidated Is pixel data valid
  5827. * @returns {HTMLCanvasElement} An appropriate canvas for rendering the image
  5828. * @memberof rendering
  5829. */
  5830. function getRenderCanvas(enabledElement, image, invalidated) {
  5831. if (!enabledElement.renderingTools.renderCanvas) {
  5832. enabledElement.renderingTools.renderCanvas = document.createElement('canvas');
  5833. }
  5834. var renderCanvas = enabledElement.renderingTools.renderCanvas;
  5835. var colormap = enabledElement.viewport.colormap || enabledElement.options.colormap;
  5836. if (enabledElement.options.colormap) {
  5837. console.warn('enabledElement.options.colormap is deprecated. Use enabledElement.viewport.colormap instead');
  5838. }
  5839. if (colormap && typeof colormap === 'string') {
  5840. colormap = _colors_index_js__WEBPACK_IMPORTED_MODULE_7__["default"].getColormap(colormap);
  5841. }
  5842. if (!colormap) {
  5843. throw new Error('renderLabelMapImage: colormap not found.');
  5844. }
  5845. var colormapId = colormap.getId();
  5846. if (Object(_doesImageNeedToBeRendered_js__WEBPACK_IMPORTED_MODULE_5__["default"])(enabledElement, image) === false && invalidated !== true && enabledElement.renderingTools.colormapId === colormapId) {
  5847. return renderCanvas;
  5848. } // If our render canvas does not match the size of this image reset it
  5849. // NOTE: This might be inefficient if we are updating multiple images of different
  5850. // Sizes frequently.
  5851. if (renderCanvas.width !== image.width || renderCanvas.height !== image.height) {
  5852. Object(_initializeRenderCanvas_js__WEBPACK_IMPORTED_MODULE_3__["default"])(enabledElement, image);
  5853. } // Get the lut to use
  5854. var start = Object(_internal_now_js__WEBPACK_IMPORTED_MODULE_1__["default"])();
  5855. if (!enabledElement.renderingTools.colorLut || invalidated || enabledElement.renderingTools.colormapId !== colormapId) {
  5856. enabledElement.renderingTools.colorLut = colormap.createLookupTable();
  5857. enabledElement.renderingTools.colormapId = colormapId;
  5858. }
  5859. image.stats = image.stats || {};
  5860. image.stats.lastLutGenerateTime = Object(_internal_now_js__WEBPACK_IMPORTED_MODULE_1__["default"])() - start;
  5861. var colorLut = enabledElement.renderingTools.colorLut;
  5862. var renderCanvasData = enabledElement.renderingTools.renderCanvasData;
  5863. var renderCanvasContext = enabledElement.renderingTools.renderCanvasContext;
  5864. Object(_internal_storedPixelDataToCanvasImageDataColorLUT_js__WEBPACK_IMPORTED_MODULE_6__["default"])(image, colorLut, renderCanvasData.data);
  5865. start = Object(_internal_now_js__WEBPACK_IMPORTED_MODULE_1__["default"])();
  5866. renderCanvasContext.putImageData(renderCanvasData, 0, 0);
  5867. image.stats.lastPutImageDataTime = Object(_internal_now_js__WEBPACK_IMPORTED_MODULE_1__["default"])() - start;
  5868. return renderCanvas;
  5869. }
  5870. /**
  5871. * API function to draw a label map image to a given enabledElement
  5872. *
  5873. * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw
  5874. * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used
  5875. * @returns {void}
  5876. * @memberof rendering
  5877. */
  5878. function renderLabelMapImage(enabledElement, invalidated) {
  5879. if (enabledElement === undefined) {
  5880. throw new Error('renderLabelMapImage: enabledElement parameter must not be undefined');
  5881. }
  5882. var image = enabledElement.image;
  5883. if (image === undefined) {
  5884. throw new Error('renderLabelMapImage: image must be loaded before it can be drawn');
  5885. } // Get the canvas context and reset the transform
  5886. var context = enabledElement.canvas.getContext('2d', {
  5887. desynchronized: true
  5888. });
  5889. context.setTransform(1, 0, 0, 1, 0, 0); // Clear the canvas
  5890. context.fillStyle = Object(_internal_getFillStyle_js__WEBPACK_IMPORTED_MODULE_2__["default"])(enabledElement);
  5891. context.fillRect(0, 0, enabledElement.canvas.width, enabledElement.canvas.height); // Turn off image smooth/interpolation if pixelReplication is set in the viewport
  5892. context.imageSmoothingEnabled = !enabledElement.viewport.pixelReplication;
  5893. context.mozImageSmoothingEnabled = context.imageSmoothingEnabled; // Save the canvas context state and apply the viewport properties
  5894. Object(_setToPixelCoordinateSystem_js__WEBPACK_IMPORTED_MODULE_0__["default"])(enabledElement, context); // If no options are set we will retrieve the renderCanvas through the
  5895. // Normal Canvas rendering path
  5896. // TODO: Add WebGL support for label map pipeline
  5897. var renderCanvas = getRenderCanvas(enabledElement, image, invalidated);
  5898. var imageDisplayedArea = Object(_internal_getDisplayedArea_js__WEBPACK_IMPORTED_MODULE_8__["default"])(enabledElement.image, enabledElement.viewport);
  5899. var sx = imageDisplayedArea.tlhc.x - 1;
  5900. var sy = imageDisplayedArea.tlhc.y - 1;
  5901. var width = imageDisplayedArea.brhc.x - sx;
  5902. var height = imageDisplayedArea.brhc.y - sy;
  5903. context.drawImage(renderCanvas, sx, sy, width, height, sx, sy, width, height);
  5904. enabledElement.renderingTools = Object(_saveLastRendered_js__WEBPACK_IMPORTED_MODULE_4__["default"])(enabledElement);
  5905. }
  5906. /**
  5907. * API function to draw a pseudo-color image to a given layer
  5908. *
  5909. * @param {EnabledElementLayer} layer The layer that the image will be added to
  5910. * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used
  5911. * @returns {void}
  5912. */
  5913. function addLabelMapLayer(layer, invalidated) {
  5914. if (layer === undefined) {
  5915. throw new Error('addLabelMapLayer: layer parameter must not be undefined');
  5916. }
  5917. var image = layer.image;
  5918. if (image === undefined) {
  5919. throw new Error('addLabelMapLayer: image must be loaded before it can be drawn');
  5920. }
  5921. layer.canvas = getRenderCanvas(layer, image, invalidated);
  5922. var context = layer.canvas.getContext('2d', {
  5923. desynchronized: true
  5924. }); // Turn off image smooth/interpolation if pixelReplication is set in the viewport
  5925. context.imageSmoothingEnabled = !layer.viewport.pixelReplication;
  5926. context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;
  5927. layer.renderingTools = Object(_saveLastRendered_js__WEBPACK_IMPORTED_MODULE_4__["default"])(layer);
  5928. }
  5929. /***/ }),
  5930. /***/ "./rendering/renderPseudoColorImage.js":
  5931. /*!*********************************************!*\
  5932. !*** ./rendering/renderPseudoColorImage.js ***!
  5933. \*********************************************/
  5934. /*! exports provided: renderPseudoColorImage, addPseudoColorLayer */
  5935. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  5936. "use strict";
  5937. __webpack_require__.r(__webpack_exports__);
  5938. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "renderPseudoColorImage", function() { return renderPseudoColorImage; });
  5939. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addPseudoColorLayer", function() { return addPseudoColorLayer; });
  5940. /* harmony import */ var _setToPixelCoordinateSystem_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../setToPixelCoordinateSystem.js */ "./setToPixelCoordinateSystem.js");
  5941. /* harmony import */ var _internal_now_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../internal/now.js */ "./internal/now.js");
  5942. /* harmony import */ var _internal_getFillStyle_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../internal/getFillStyle.js */ "./internal/getFillStyle.js");
  5943. /* harmony import */ var _initializeRenderCanvas_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./initializeRenderCanvas.js */ "./rendering/initializeRenderCanvas.js");
  5944. /* harmony import */ var _getLut_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./getLut.js */ "./rendering/getLut.js");
  5945. /* harmony import */ var _saveLastRendered_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./saveLastRendered.js */ "./rendering/saveLastRendered.js");
  5946. /* harmony import */ var _doesImageNeedToBeRendered_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./doesImageNeedToBeRendered.js */ "./rendering/doesImageNeedToBeRendered.js");
  5947. /* harmony import */ var _internal_storedPixelDataToCanvasImageDataPseudocolorLUT_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../internal/storedPixelDataToCanvasImageDataPseudocolorLUT.js */ "./internal/storedPixelDataToCanvasImageDataPseudocolorLUT.js");
  5948. /* harmony import */ var _colors_index_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../colors/index.js */ "./colors/index.js");
  5949. /* harmony import */ var _internal_getDisplayedArea_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../internal/getDisplayedArea.js */ "./internal/getDisplayedArea.js");
  5950. /**
  5951. * Returns an appropriate canvas to render the Image. If the canvas available in the cache is appropriate
  5952. * it is returned, otherwise adjustments are made. It also sets the color transfer functions.
  5953. *
  5954. * @param {Object} enabledElement The cornerstone enabled element
  5955. * @param {Object} image The image to be rendered
  5956. * @param {Boolean} invalidated Is pixel data valid
  5957. * @returns {HTMLCanvasElement} An appropriate canvas for rendering the image
  5958. * @memberof rendering
  5959. */
  5960. function getRenderCanvas(enabledElement, image, invalidated) {
  5961. if (!enabledElement.renderingTools.renderCanvas) {
  5962. enabledElement.renderingTools.renderCanvas = document.createElement('canvas');
  5963. }
  5964. var renderCanvas = enabledElement.renderingTools.renderCanvas;
  5965. var colormap = enabledElement.viewport.colormap || enabledElement.options.colormap;
  5966. if (enabledElement.options && enabledElement.options.colormap) {
  5967. console.warn('enabledElement.options.colormap is deprecated. Use enabledElement.viewport.colormap instead');
  5968. }
  5969. if (colormap && typeof colormap === 'string') {
  5970. colormap = _colors_index_js__WEBPACK_IMPORTED_MODULE_8__["default"].getColormap(colormap);
  5971. }
  5972. if (!colormap) {
  5973. throw new Error('renderPseudoColorImage: colormap not found.');
  5974. }
  5975. var colormapId = colormap.getId();
  5976. if (Object(_doesImageNeedToBeRendered_js__WEBPACK_IMPORTED_MODULE_6__["default"])(enabledElement, image) === false && invalidated !== true && enabledElement.renderingTools.colormapId === colormapId) {
  5977. return renderCanvas;
  5978. } // If our render canvas does not match the size of this image reset it
  5979. // NOTE: This might be inefficient if we are updating multiple images of different
  5980. // Sizes frequently.
  5981. if (renderCanvas.width !== image.width || renderCanvas.height !== image.height) {
  5982. Object(_initializeRenderCanvas_js__WEBPACK_IMPORTED_MODULE_3__["default"])(enabledElement, image);
  5983. } // Get the lut to use
  5984. var start = Object(_internal_now_js__WEBPACK_IMPORTED_MODULE_1__["default"])();
  5985. if (!enabledElement.renderingTools.colorLut || invalidated || enabledElement.renderingTools.colormapId !== colormapId) {
  5986. colormap.setNumberOfColors(256);
  5987. enabledElement.renderingTools.colorLut = colormap.createLookupTable();
  5988. enabledElement.renderingTools.colormapId = colormapId;
  5989. }
  5990. var lut = Object(_getLut_js__WEBPACK_IMPORTED_MODULE_4__["default"])(image, enabledElement.viewport, invalidated);
  5991. image.stats = image.stats || {};
  5992. image.stats.lastLutGenerateTime = Object(_internal_now_js__WEBPACK_IMPORTED_MODULE_1__["default"])() - start;
  5993. var colorLut = enabledElement.renderingTools.colorLut;
  5994. var renderCanvasData = enabledElement.renderingTools.renderCanvasData;
  5995. var renderCanvasContext = enabledElement.renderingTools.renderCanvasContext;
  5996. Object(_internal_storedPixelDataToCanvasImageDataPseudocolorLUT_js__WEBPACK_IMPORTED_MODULE_7__["default"])(image, lut, colorLut, renderCanvasData.data);
  5997. start = Object(_internal_now_js__WEBPACK_IMPORTED_MODULE_1__["default"])();
  5998. renderCanvasContext.putImageData(renderCanvasData, 0, 0);
  5999. image.stats.lastPutImageDataTime = Object(_internal_now_js__WEBPACK_IMPORTED_MODULE_1__["default"])() - start;
  6000. return renderCanvas;
  6001. }
  6002. /**
  6003. * API function to draw a pseudo-color image to a given enabledElement
  6004. *
  6005. * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw
  6006. * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used
  6007. * @returns {void}
  6008. * @memberof rendering
  6009. */
  6010. function renderPseudoColorImage(enabledElement, invalidated) {
  6011. if (enabledElement === undefined) {
  6012. throw new Error('drawImage: enabledElement parameter must not be undefined');
  6013. }
  6014. var image = enabledElement.image;
  6015. if (image === undefined) {
  6016. throw new Error('drawImage: image must be loaded before it can be drawn');
  6017. } // Get the canvas context and reset the transform
  6018. var context = enabledElement.canvas.getContext('2d', {
  6019. desynchronized: true
  6020. });
  6021. context.setTransform(1, 0, 0, 1, 0, 0); // Clear the canvas
  6022. context.fillStyle = Object(_internal_getFillStyle_js__WEBPACK_IMPORTED_MODULE_2__["default"])(enabledElement);
  6023. context.fillRect(0, 0, enabledElement.canvas.width, enabledElement.canvas.height); // Turn off image smooth/interpolation if pixelReplication is set in the viewport
  6024. context.imageSmoothingEnabled = !enabledElement.viewport.pixelReplication;
  6025. context.mozImageSmoothingEnabled = context.imageSmoothingEnabled; // Save the canvas context state and apply the viewport properties
  6026. Object(_setToPixelCoordinateSystem_js__WEBPACK_IMPORTED_MODULE_0__["default"])(enabledElement, context); // If no options are set we will retrieve the renderCanvas through the
  6027. // Normal Canvas rendering path
  6028. // TODO: Add WebGL support for pseudocolor pipeline
  6029. var renderCanvas = getRenderCanvas(enabledElement, image, invalidated);
  6030. var imageDisplayedArea = Object(_internal_getDisplayedArea_js__WEBPACK_IMPORTED_MODULE_9__["default"])(enabledElement.image, enabledElement.viewport);
  6031. var sx = imageDisplayedArea.tlhc.x - 1;
  6032. var sy = imageDisplayedArea.tlhc.y - 1;
  6033. var width = imageDisplayedArea.brhc.x - sx;
  6034. var height = imageDisplayedArea.brhc.y - sy;
  6035. context.drawImage(renderCanvas, sx, sy, width, height, sx, sy, width, height);
  6036. enabledElement.renderingTools = Object(_saveLastRendered_js__WEBPACK_IMPORTED_MODULE_5__["default"])(enabledElement);
  6037. }
  6038. /**
  6039. * API function to draw a pseudo-color image to a given layer
  6040. *
  6041. * @param {EnabledElementLayer} layer The layer that the image will be added to
  6042. * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used
  6043. * @returns {void}
  6044. */
  6045. function addPseudoColorLayer(layer, invalidated) {
  6046. if (layer === undefined) {
  6047. throw new Error('addPseudoColorLayer: layer parameter must not be undefined');
  6048. }
  6049. var image = layer.image;
  6050. if (image === undefined) {
  6051. throw new Error('addPseudoColorLayer: image must be loaded before it can be drawn');
  6052. }
  6053. layer.canvas = getRenderCanvas(layer, image, invalidated);
  6054. var context = layer.canvas.getContext('2d', {
  6055. desynchronized: true
  6056. }); // Turn off image smooth/interpolation if pixelReplication is set in the viewport
  6057. context.imageSmoothingEnabled = !layer.viewport.pixelReplication;
  6058. context.mozImageSmoothingEnabled = context.imageSmoothingEnabled;
  6059. layer.renderingTools = Object(_saveLastRendered_js__WEBPACK_IMPORTED_MODULE_5__["default"])(layer);
  6060. }
  6061. /***/ }),
  6062. /***/ "./rendering/renderToCanvas.js":
  6063. /*!*************************************!*\
  6064. !*** ./rendering/renderToCanvas.js ***!
  6065. \*************************************/
  6066. /*! exports provided: default */
  6067. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  6068. "use strict";
  6069. __webpack_require__.r(__webpack_exports__);
  6070. /* harmony import */ var _triggerEvent_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../triggerEvent.js */ "./triggerEvent.js");
  6071. /* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../events.js */ "./events.js");
  6072. /* harmony import */ var _internal_drawImageSync_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../internal/drawImageSync.js */ "./internal/drawImageSync.js");
  6073. /* harmony import */ var _internal_getDefaultViewport_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../internal/getDefaultViewport.js */ "./internal/getDefaultViewport.js");
  6074. /* harmony import */ var _internal_tryEnableWebgl_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../internal/tryEnableWebgl.js */ "./internal/tryEnableWebgl.js");
  6075. /**
  6076. * @typedef {Object} EnabledElementStub
  6077. * @property {HTMLElement} element The enabled element
  6078. * @property {HTMLCanvasElement} canvas The current canvas
  6079. * @property {Object} image Currently displayed image
  6080. * @property {Boolean} invalid Whether or not the image pixel data has been changed
  6081. * @property {Boolean} needsRedraw A flag for triggering a redraw of the canvas without re-retrieving the pixel data, since it remains valid
  6082. * @property {Object} options Layer drawing options
  6083. * @property {Object[]} layers Layers added to the EnabledElement
  6084. * @property {Object} data
  6085. * @property {Object} renderingTools
  6086. * @property {Object} viewport The current viewport
  6087. * @memberof rendering
  6088. */
  6089. /**
  6090. * creates a dummy enabled element
  6091. *
  6092. * @param {HTMLCanvasElement} canvas the canvas that will be assigned to the enabled element.
  6093. * @param {any} image An Image loaded by a Cornerstone Image Loader
  6094. * @param { any } options Options for rendering the image (e.g.enable webgl by {renderer: 'webgl' })
  6095. * @param { any } viewport A set of Cornerstone viewport parameters
  6096. * @returns {EnabledElementStub} a dummy enabled element
  6097. * @memberof rendering
  6098. */
  6099. function createEnabledElementStub(canvas, image, options, viewport) {
  6100. return {
  6101. element: canvas,
  6102. canvas: canvas,
  6103. image: image,
  6104. invalid: true,
  6105. // True if image needs to be drawn, false if not
  6106. needsRedraw: true,
  6107. options: options,
  6108. layers: [],
  6109. data: {},
  6110. renderingTools: {},
  6111. viewport: viewport
  6112. };
  6113. }
  6114. /**
  6115. * Render the image to the provided canvas immediately.
  6116. * @param {any} canvas The HTML canvas where the image will be rendered.
  6117. * @param {any} image An Image loaded by a Cornerstone Image Loader
  6118. * @param {any} [viewport = null] A set of Cornerstone viewport parameters
  6119. * @param {any} [options = null] Options for rendering the image (e.g. enable webgl by {renderer: 'webgl'})
  6120. * @returns {void}
  6121. * @memberof rendering
  6122. */
  6123. /* harmony default export */ __webpack_exports__["default"] = (function (canvas, image) {
  6124. var viewport = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
  6125. var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
  6126. if (canvas === undefined) {
  6127. throw new Error('renderToCanvas: parameter canvas cannot be undefined');
  6128. } // If this enabled element has the option set for WebGL, we should
  6129. // Check if this device actually supports it
  6130. if (options && options.renderer && options.renderer.toLowerCase() === 'webgl') {
  6131. Object(_internal_tryEnableWebgl_js__WEBPACK_IMPORTED_MODULE_4__["default"])(options);
  6132. }
  6133. var defaultViewport = Object(_internal_getDefaultViewport_js__WEBPACK_IMPORTED_MODULE_3__["default"])(canvas, image);
  6134. if (viewport) {
  6135. Object.assign(defaultViewport, viewport);
  6136. }
  6137. var enabledElementStub = createEnabledElementStub(canvas, image, options, defaultViewport);
  6138. var eventDetails = {
  6139. enabledElement: enabledElementStub,
  6140. timestamp: Date.now()
  6141. };
  6142. Object(_triggerEvent_js__WEBPACK_IMPORTED_MODULE_0__["default"])(enabledElementStub.element, _events_js__WEBPACK_IMPORTED_MODULE_1__["default"].PRE_RENDER, eventDetails);
  6143. Object(_internal_drawImageSync_js__WEBPACK_IMPORTED_MODULE_2__["default"])(enabledElementStub, enabledElementStub.invalid);
  6144. });
  6145. /***/ }),
  6146. /***/ "./rendering/renderWebImage.js":
  6147. /*!*************************************!*\
  6148. !*** ./rendering/renderWebImage.js ***!
  6149. \*************************************/
  6150. /*! exports provided: renderWebImage */
  6151. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  6152. "use strict";
  6153. __webpack_require__.r(__webpack_exports__);
  6154. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "renderWebImage", function() { return renderWebImage; });
  6155. /* harmony import */ var _setToPixelCoordinateSystem_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../setToPixelCoordinateSystem.js */ "./setToPixelCoordinateSystem.js");
  6156. /* harmony import */ var _renderColorImage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./renderColorImage.js */ "./rendering/renderColorImage.js");
  6157. /* harmony import */ var _internal_getDisplayedArea_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../internal/getDisplayedArea.js */ "./internal/getDisplayedArea.js");
  6158. /**
  6159. * API function to draw a standard web image (PNG, JPG) to an enabledImage
  6160. *
  6161. * @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw
  6162. * @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used
  6163. * @returns {void}
  6164. * @memberof rendering
  6165. */
  6166. function renderWebImage(enabledElement, invalidated) {
  6167. if (enabledElement === undefined) {
  6168. throw new Error('renderWebImage: enabledElement parameter must not be undefined');
  6169. }
  6170. var image = enabledElement.image;
  6171. if (image === undefined) {
  6172. throw new Error('renderWebImage: image must be loaded before it can be drawn');
  6173. } // If the viewport ww/wc and invert all match the initial state of the image, we can draw the image
  6174. // Directly. If any of those are changed, we call renderColorImage() to apply the lut
  6175. if (enabledElement.viewport.voi.windowWidth === enabledElement.image.windowWidth && enabledElement.viewport.voi.windowCenter === enabledElement.image.windowCenter && enabledElement.viewport.invert === false) {
  6176. // Get the canvas context and reset the transform
  6177. var context = enabledElement.canvas.getContext('2d', {
  6178. desynchronized: true
  6179. });
  6180. context.setTransform(1, 0, 0, 1, 0, 0); // Clear the canvas
  6181. context.fillStyle = 'black';
  6182. context.fillRect(0, 0, enabledElement.canvas.width, enabledElement.canvas.height); // Turn off image smooth/interpolation if pixelReplication is set in the viewport
  6183. context.imageSmoothingEnabled = !enabledElement.viewport.pixelReplication;
  6184. context.mozImageSmoothingEnabled = context.imageSmoothingEnabled; // Save the canvas context state and apply the viewport properties
  6185. Object(_setToPixelCoordinateSystem_js__WEBPACK_IMPORTED_MODULE_0__["default"])(enabledElement, context);
  6186. var imageDisplayedArea = Object(_internal_getDisplayedArea_js__WEBPACK_IMPORTED_MODULE_2__["default"])(enabledElement.image, enabledElement.viewport);
  6187. var sx = imageDisplayedArea.tlhc.x - 1;
  6188. var sy = imageDisplayedArea.tlhc.y - 1;
  6189. var width = imageDisplayedArea.brhc.x - sx;
  6190. var height = imageDisplayedArea.brhc.y - sy;
  6191. context.drawImage(image.getImage(), sx, sy, width, height, sx, sy, width, height);
  6192. } else {
  6193. Object(_renderColorImage_js__WEBPACK_IMPORTED_MODULE_1__["renderColorImage"])(enabledElement, invalidated);
  6194. }
  6195. }
  6196. /***/ }),
  6197. /***/ "./rendering/saveLastRendered.js":
  6198. /*!***************************************!*\
  6199. !*** ./rendering/saveLastRendered.js ***!
  6200. \***************************************/
  6201. /*! exports provided: default */
  6202. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  6203. "use strict";
  6204. __webpack_require__.r(__webpack_exports__);
  6205. /**
  6206. * Saves the parameters of the last render into renderingTools, used later to decide if data can be reused.
  6207. *
  6208. * @param {Object} enabledElement Cornerstone EnabledElement
  6209. * @returns {Object} enabledElement.renderingTools
  6210. * @memberof rendering
  6211. */
  6212. /* harmony default export */ __webpack_exports__["default"] = (function (enabledElement) {
  6213. var imageId = enabledElement.image.imageId;
  6214. var viewport = enabledElement.viewport;
  6215. var isColor = enabledElement.image.color;
  6216. enabledElement.renderingTools.lastRenderedImageId = imageId;
  6217. enabledElement.renderingTools.lastRenderedIsColor = isColor;
  6218. enabledElement.renderingTools.lastRenderedViewport = {
  6219. windowCenter: viewport.voi.windowCenter,
  6220. windowWidth: viewport.voi.windowWidth,
  6221. invert: viewport.invert,
  6222. rotation: viewport.rotation,
  6223. hflip: viewport.hflip,
  6224. vflip: viewport.vflip,
  6225. modalityLUT: viewport.modalityLUT,
  6226. voiLUT: viewport.voiLUT,
  6227. colormap: viewport.colormap
  6228. };
  6229. return enabledElement.renderingTools;
  6230. });
  6231. /***/ }),
  6232. /***/ "./requestPool/RequestPoolManager.ts":
  6233. /*!*******************************************!*\
  6234. !*** ./requestPool/RequestPoolManager.ts ***!
  6235. \*******************************************/
  6236. /*! exports provided: RequestPoolManager */
  6237. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  6238. "use strict";
  6239. __webpack_require__.r(__webpack_exports__);
  6240. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RequestPoolManager", function() { return RequestPoolManager; });
  6241. function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
  6242. function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
  6243. function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
  6244. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  6245. function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
  6246. function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
  6247. function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
  6248. var RequestPoolManager = /*#__PURE__*/function () {
  6249. // priority is fixed for interaction and thumbnail to be 0, however,
  6250. // the priority of prefetch can be configured and it can have priorities other
  6251. // than 0 (highest priority)
  6252. // TODO: Some of this stuff shouldn't be public but it's easier right now
  6253. function RequestPoolManager() {
  6254. _classCallCheck(this, RequestPoolManager);
  6255. _defineProperty(this, "requestPool", void 0);
  6256. _defineProperty(this, "awake", void 0);
  6257. _defineProperty(this, "numRequests", void 0);
  6258. _defineProperty(this, "maxNumRequests", void 0);
  6259. _defineProperty(this, "grabDelay", void 0);
  6260. _defineProperty(this, "timeoutHandle", void 0);
  6261. this.requestPool = {
  6262. interaction: {
  6263. 0: []
  6264. },
  6265. thumbnail: {
  6266. 0: []
  6267. },
  6268. prefetch: {
  6269. 0: []
  6270. }
  6271. };
  6272. this.awake = false;
  6273. this.grabDelay = 5;
  6274. this.numRequests = {
  6275. interaction: 0,
  6276. thumbnail: 0,
  6277. prefetch: 0
  6278. };
  6279. this.maxNumRequests = {
  6280. interaction: 6,
  6281. thumbnail: 6,
  6282. prefetch: 5
  6283. };
  6284. }
  6285. _createClass(RequestPoolManager, [{
  6286. key: "destroy",
  6287. value: function destroy() {
  6288. if (this.timeoutHandle) {
  6289. window.clearTimeout(this.timeoutHandle);
  6290. }
  6291. }
  6292. /**
  6293. * Adds the requests to the pool of requests.
  6294. *
  6295. * @param requestFn - A function that returns a promise which resolves in the image
  6296. * @param type - Priority category, it can be either of interaction, prefetch,
  6297. * or thumbnail.
  6298. * @param additionalDetails - Additional details that requests can contain.
  6299. * For instance the volumeUID for the volume requests
  6300. * @param priority - Priority number for each category of requests. Its default
  6301. * value is priority 0. The lower the priority number, the higher the priority number
  6302. *
  6303. * @returns void
  6304. *
  6305. */
  6306. }, {
  6307. key: "addRequest",
  6308. value: function addRequest(requestFn, type, additionalDetails) {
  6309. var priority = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
  6310. var addToBeginning = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
  6311. // Describe the request
  6312. var requestDetails = {
  6313. requestFn: requestFn,
  6314. type: type,
  6315. additionalDetails: additionalDetails
  6316. }; // Check if the priority group exists on the request type
  6317. if (this.requestPool[type][priority] === undefined) {
  6318. this.requestPool[type][priority] = [];
  6319. } // Adding the request to the correct priority group of the request type
  6320. if (addToBeginning) {
  6321. // Add it to the beginning of the stack
  6322. this.requestPool[type][priority].unshift(requestDetails);
  6323. } else {
  6324. // Add it to the end of the stack
  6325. this.requestPool[type][priority].push(requestDetails);
  6326. } // Wake up
  6327. if (!this.awake) {
  6328. this.awake = true;
  6329. this.startGrabbing();
  6330. }
  6331. }
  6332. /**
  6333. * Filter the requestPoolManager's pool of request based on the result of
  6334. * provided filter function. The provided filter function needs to return false or true
  6335. *
  6336. * @param filterFunction The filter function for filtering of the requests to keep
  6337. * @category requestPool
  6338. */
  6339. }, {
  6340. key: "filterRequests",
  6341. value: function filterRequests(filterFunction) {
  6342. var _this = this;
  6343. Object.keys(this.requestPool).forEach(function (type) {
  6344. var requestType = _this.requestPool[type];
  6345. Object.keys(requestType).forEach(function (priority) {
  6346. requestType[priority] = requestType[priority].filter(function (requestDetails) {
  6347. return filterFunction(requestDetails);
  6348. });
  6349. });
  6350. });
  6351. }
  6352. /**
  6353. * Clears the requests specific to the provided type. For instance, the
  6354. * pool of requests of type 'interaction' can be cleared via this function.
  6355. *
  6356. *
  6357. * @param type category of the request (either interaction, prefetch or thumbnail)
  6358. * @category requestPool
  6359. */
  6360. }, {
  6361. key: "clearRequestStack",
  6362. value: function clearRequestStack(type) {
  6363. if (!this.requestPool[type]) {
  6364. throw new Error("No category for the type ".concat(type, " found"));
  6365. }
  6366. this.requestPool[type] = {
  6367. 0: []
  6368. };
  6369. }
  6370. }, {
  6371. key: "sendRequest",
  6372. value: function sendRequest(_ref) {
  6373. var _this2 = this;
  6374. var requestFn = _ref.requestFn,
  6375. type = _ref.type;
  6376. // Increment the number of current requests of this type
  6377. this.numRequests[type]++;
  6378. this.awake = true;
  6379. requestFn()["finally"](function () {
  6380. _this2.numRequests[type]--;
  6381. _this2.startAgain();
  6382. });
  6383. }
  6384. }, {
  6385. key: "startGrabbing",
  6386. value: function startGrabbing() {
  6387. // Begin by grabbing X images
  6388. // TODO: This is the reason things aren't going as fast as expected
  6389. // const maxSimultaneousRequests = getMaxSimultaneousRequests()
  6390. // this.maxNumRequests = {
  6391. // interaction: Math.max(maxSimultaneousRequests, 1),
  6392. // thumbnail: Math.max(maxSimultaneousRequests - 2, 1),
  6393. // prefetch: Math.max(maxSimultaneousRequests - 1, 1),
  6394. // }
  6395. var maxRequests = this.maxNumRequests.interaction + this.maxNumRequests.thumbnail + this.maxNumRequests.prefetch;
  6396. var currentRequests = this.numRequests.interaction + this.numRequests.thumbnail + this.numRequests.prefetch;
  6397. var requestsToSend = maxRequests - currentRequests;
  6398. for (var i = 0; i < requestsToSend; i++) {
  6399. var _requestDetails = this.getNextRequest();
  6400. if (_requestDetails === false) {
  6401. break;
  6402. } else if (_requestDetails) {
  6403. this.sendRequest(_requestDetails);
  6404. }
  6405. }
  6406. }
  6407. }, {
  6408. key: "startAgain",
  6409. value: function startAgain() {
  6410. var _this3 = this;
  6411. if (!this.awake) {
  6412. return;
  6413. }
  6414. if (this.grabDelay) {
  6415. this.timeoutHandle = window.setTimeout(function () {
  6416. _this3.startGrabbing();
  6417. }, this.grabDelay);
  6418. } else {
  6419. this.startGrabbing();
  6420. }
  6421. }
  6422. }, {
  6423. key: "getSortedPriorityGroups",
  6424. value: function getSortedPriorityGroups(type) {
  6425. var _this4 = this;
  6426. var priorities = Object.keys(this.requestPool[type]).map(Number).filter(function (priority) {
  6427. return _this4.requestPool[type][priority].length;
  6428. }).sort();
  6429. return priorities;
  6430. }
  6431. }, {
  6432. key: "getNextRequest",
  6433. value: function getNextRequest() {
  6434. var interactionPriorities = this.getSortedPriorityGroups('interaction');
  6435. var _iterator = _createForOfIteratorHelper(interactionPriorities),
  6436. _step;
  6437. try {
  6438. for (_iterator.s(); !(_step = _iterator.n()).done;) {
  6439. var priority = _step.value;
  6440. if (this.requestPool.interaction[priority].length && this.numRequests.interaction < this.maxNumRequests.interaction) {
  6441. return this.requestPool.interaction[priority].shift();
  6442. }
  6443. }
  6444. } catch (err) {
  6445. _iterator.e(err);
  6446. } finally {
  6447. _iterator.f();
  6448. }
  6449. var thumbnailPriorities = this.getSortedPriorityGroups('thumbnail');
  6450. var _iterator2 = _createForOfIteratorHelper(thumbnailPriorities),
  6451. _step2;
  6452. try {
  6453. for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
  6454. var _priority = _step2.value;
  6455. if (this.requestPool.thumbnail[_priority].length && this.numRequests.thumbnail < this.maxNumRequests.thumbnail) {
  6456. return this.requestPool.thumbnail[_priority].shift();
  6457. }
  6458. }
  6459. } catch (err) {
  6460. _iterator2.e(err);
  6461. } finally {
  6462. _iterator2.f();
  6463. }
  6464. var prefetchPriorities = this.getSortedPriorityGroups('prefetch');
  6465. var _iterator3 = _createForOfIteratorHelper(prefetchPriorities),
  6466. _step3;
  6467. try {
  6468. for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
  6469. var _priority2 = _step3.value;
  6470. if (this.requestPool.prefetch[_priority2].length && this.numRequests.prefetch < this.maxNumRequests.prefetch) {
  6471. return this.requestPool.prefetch[_priority2].shift();
  6472. }
  6473. }
  6474. } catch (err) {
  6475. _iterator3.e(err);
  6476. } finally {
  6477. _iterator3.f();
  6478. }
  6479. if (!interactionPriorities.length && !thumbnailPriorities.length && !prefetchPriorities.length) {
  6480. this.awake = false;
  6481. }
  6482. return false;
  6483. }
  6484. /**
  6485. * Returns the request pool containing different categories, their priority and
  6486. * the added request details.
  6487. *
  6488. * @returns
  6489. * @category requestPool
  6490. */
  6491. }, {
  6492. key: "getRequestPool",
  6493. value: function getRequestPool() {
  6494. return this.requestPool;
  6495. }
  6496. }]);
  6497. return RequestPoolManager;
  6498. }();
  6499. /***/ }),
  6500. /***/ "./requestPool/imageLoadPoolManager.ts":
  6501. /*!*********************************************!*\
  6502. !*** ./requestPool/imageLoadPoolManager.ts ***!
  6503. \*********************************************/
  6504. /*! exports provided: default */
  6505. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  6506. "use strict";
  6507. __webpack_require__.r(__webpack_exports__);
  6508. /* harmony import */ var _RequestPoolManager_ts__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./RequestPoolManager.ts */ "./requestPool/RequestPoolManager.ts");
  6509. // Loading = Retrieval + Decoding
  6510. var imageLoadPoolManager = new _RequestPoolManager_ts__WEBPACK_IMPORTED_MODULE_0__["RequestPoolManager"]();
  6511. imageLoadPoolManager.maxNumRequests = {
  6512. interaction: 1000,
  6513. thumbnail: 1000,
  6514. prefetch: 1000
  6515. };
  6516. imageLoadPoolManager.grabDelay = 0;
  6517. /* harmony default export */ __webpack_exports__["default"] = (imageLoadPoolManager);
  6518. /***/ }),
  6519. /***/ "./requestPool/imageRetrievalPoolManager.ts":
  6520. /*!**************************************************!*\
  6521. !*** ./requestPool/imageRetrievalPoolManager.ts ***!
  6522. \**************************************************/
  6523. /*! exports provided: default */
  6524. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  6525. "use strict";
  6526. __webpack_require__.r(__webpack_exports__);
  6527. /* harmony import */ var _RequestPoolManager_ts__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./RequestPoolManager.ts */ "./requestPool/RequestPoolManager.ts");
  6528. // Retrieval (usually) === XHR requests
  6529. var imageRetrievalPoolManager = new _RequestPoolManager_ts__WEBPACK_IMPORTED_MODULE_0__["RequestPoolManager"]();
  6530. imageRetrievalPoolManager.maxNumRequests = {
  6531. interaction: 20,
  6532. thumbnail: 20,
  6533. prefetch: 20
  6534. };
  6535. imageRetrievalPoolManager.grabDelay = 0;
  6536. /* harmony default export */ __webpack_exports__["default"] = (imageRetrievalPoolManager);
  6537. /***/ }),
  6538. /***/ "./reset.js":
  6539. /*!******************!*\
  6540. !*** ./reset.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 _internal_getDefaultViewport_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/getDefaultViewport.js */ "./internal/getDefaultViewport.js");
  6547. /* harmony import */ var _enabledElements_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./enabledElements.js */ "./enabledElements.js");
  6548. /* harmony import */ var _updateImage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./updateImage.js */ "./updateImage.js");
  6549. /**
  6550. * Resets the viewport to the default settings
  6551. *
  6552. * @param {HTMLElement} element An HTML Element enabled for Cornerstone
  6553. * @returns {void}
  6554. */
  6555. /* harmony default export */ __webpack_exports__["default"] = (function (element) {
  6556. var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_1__["getEnabledElement"])(element);
  6557. enabledElement.viewport = Object(_internal_getDefaultViewport_js__WEBPACK_IMPORTED_MODULE_0__["default"])(enabledElement.canvas, enabledElement.image);
  6558. Object(_updateImage_js__WEBPACK_IMPORTED_MODULE_2__["default"])(element);
  6559. });
  6560. /***/ }),
  6561. /***/ "./resize.js":
  6562. /*!*******************!*\
  6563. !*** ./resize.js ***!
  6564. \*******************/
  6565. /*! exports provided: default */
  6566. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  6567. "use strict";
  6568. __webpack_require__.r(__webpack_exports__);
  6569. /* harmony import */ var _enabledElements_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./enabledElements.js */ "./enabledElements.js");
  6570. /* harmony import */ var _fitToWindow_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./fitToWindow.js */ "./fitToWindow.js");
  6571. /* harmony import */ var _updateImage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./updateImage.js */ "./updateImage.js");
  6572. /* harmony import */ var _triggerEvent_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./triggerEvent.js */ "./triggerEvent.js");
  6573. /* harmony import */ var _internal_getImageSize_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./internal/getImageSize.js */ "./internal/getImageSize.js");
  6574. /* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./events.js */ "./events.js");
  6575. /**
  6576. * This module is responsible for enabling an element to display images with cornerstone
  6577. *
  6578. * @param {HTMLElement} element The DOM element enabled for Cornerstone
  6579. * @param {HTMLElement} canvas The Canvas DOM element within the DOM element enabled for Cornerstone
  6580. * @returns {void}
  6581. */
  6582. function setCanvasSize(element, canvas) {
  6583. // The device pixel ratio is 1.0 for normal displays and > 1.0
  6584. // For high DPI displays like Retina
  6585. /*
  6586. This functionality is disabled due to buggy behavior on systems with mixed DPI's. If the canvas
  6587. is created on a display with high DPI (e.g. 2.0) and then the browser window is dragged to
  6588. a different display with a different DPI (e.g. 1.0), the canvas is not recreated so the pageToPixel
  6589. produces incorrect results. I couldn't find any way to determine when the DPI changed other than
  6590. by polling which is not very clean. If anyone has any ideas here, please let me know, but for now
  6591. we will disable this functionality. We may want
  6592. to add a mechanism to optionally enable this functionality if we can determine it is safe to do
  6593. so (e.g. iPad or iPhone or perhaps enumerate the displays on the system. I am choosing
  6594. to be cautious here since I would rather not have bug reports or safety issues related to this
  6595. scenario.
  6596. var devicePixelRatio = window.devicePixelRatio;
  6597. if(devicePixelRatio === undefined) {
  6598. devicePixelRatio = 1.0;
  6599. }
  6600. */
  6601. // Avoid setting the same value because it flashes the canvas with IE and Edge
  6602. if (canvas.width !== element.clientWidth) {
  6603. canvas.width = element.clientWidth;
  6604. canvas.style.width = "".concat(element.clientWidth, "px");
  6605. } // Avoid setting the same value because it flashes the canvas with IE and Edge
  6606. if (canvas.height !== element.clientHeight) {
  6607. canvas.height = element.clientHeight;
  6608. canvas.style.height = "".concat(element.clientHeight, "px");
  6609. }
  6610. }
  6611. /**
  6612. * Checks if the image of a given enabled element fitted the window
  6613. * before the resize
  6614. *
  6615. * @param {EnabledElement} enabledElement The Cornerstone Enabled Element
  6616. * @param {number} oldCanvasWidth The width of the canvas before the resize
  6617. * @param {number} oldCanvasHeight The height of the canvas before the resize
  6618. * @return {Boolean} true if it fitted the windows, false otherwise
  6619. */
  6620. function wasFitToWindow(enabledElement, oldCanvasWidth, oldCanvasHeight) {
  6621. var scale = enabledElement.viewport.scale;
  6622. var imageSize = Object(_internal_getImageSize_js__WEBPACK_IMPORTED_MODULE_4__["default"])(enabledElement.image, enabledElement.viewport.rotation);
  6623. var imageWidth = Math.round(imageSize.width * scale);
  6624. var imageHeight = Math.round(imageSize.height * scale);
  6625. var x = enabledElement.viewport.translation.x;
  6626. var y = enabledElement.viewport.translation.y;
  6627. return imageWidth === oldCanvasWidth && imageHeight <= oldCanvasHeight || imageWidth <= oldCanvasWidth && imageHeight === oldCanvasHeight && x === 0 && y === 0;
  6628. }
  6629. /**
  6630. * Rescale the image relative to the changed size of the canvas
  6631. *
  6632. * @param {EnabledElement} enabledElement The Cornerstone Enabled Element
  6633. * @param {number} oldCanvasWidth The width of the canvas before the resize
  6634. * @param {number} oldCanvasHeight The height of the canvas before the resize
  6635. * @return {void}
  6636. */
  6637. function relativeRescale(enabledElement, oldCanvasWidth, oldCanvasHeight) {
  6638. var scale = enabledElement.viewport.scale;
  6639. var canvasWidth = enabledElement.canvas.width;
  6640. var canvasHeight = enabledElement.canvas.height;
  6641. var relWidthChange = canvasWidth / oldCanvasWidth;
  6642. var relHeightChange = canvasHeight / oldCanvasHeight;
  6643. var relChange = Math.sqrt(relWidthChange * relHeightChange);
  6644. enabledElement.viewport.scale = relChange * scale;
  6645. }
  6646. /**
  6647. * Resizes an enabled element and optionally fits the image to window
  6648. *
  6649. * @param {HTMLElement} element The DOM element enabled for Cornerstone
  6650. * @param {Boolean} forceFitToWindow true to to force a refit, false to rescale accordingly
  6651. * @returns {void}
  6652. */
  6653. /* harmony default export */ __webpack_exports__["default"] = (function (element, forceFitToWindow) {
  6654. var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_0__["getEnabledElement"])(element);
  6655. var oldCanvasWidth = enabledElement.canvas.width;
  6656. var oldCanvasHeight = enabledElement.canvas.height;
  6657. setCanvasSize(element, enabledElement.canvas);
  6658. var eventData = {
  6659. element: element
  6660. };
  6661. Object(_triggerEvent_js__WEBPACK_IMPORTED_MODULE_3__["default"])(element, _events_js__WEBPACK_IMPORTED_MODULE_5__["default"].ELEMENT_RESIZED, eventData);
  6662. if (enabledElement.image === undefined) {
  6663. return;
  6664. }
  6665. if (forceFitToWindow || wasFitToWindow(enabledElement, oldCanvasWidth, oldCanvasHeight)) {
  6666. // Fit the image to the window again if it fitted before the resize
  6667. Object(_fitToWindow_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element);
  6668. } else {
  6669. // Adapt the scale of a zoomed or panned image relative to the size change
  6670. relativeRescale(enabledElement, oldCanvasWidth, oldCanvasHeight);
  6671. Object(_updateImage_js__WEBPACK_IMPORTED_MODULE_2__["default"])(element);
  6672. }
  6673. });
  6674. /***/ }),
  6675. /***/ "./setToPixelCoordinateSystem.js":
  6676. /*!***************************************!*\
  6677. !*** ./setToPixelCoordinateSystem.js ***!
  6678. \***************************************/
  6679. /*! exports provided: default */
  6680. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  6681. "use strict";
  6682. __webpack_require__.r(__webpack_exports__);
  6683. /* harmony import */ var _internal_calculateTransform_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/calculateTransform.js */ "./internal/calculateTransform.js");
  6684. /**
  6685. * Sets the canvas context transformation matrix to the pixel coordinate system. This allows
  6686. * geometry to be driven using the canvas context using coordinates in the pixel coordinate system
  6687. * @param {EnabledElement} enabledElement The
  6688. * @param {CanvasRenderingContext2D} context The CanvasRenderingContext2D for the enabledElement's Canvas
  6689. * @param {Number} [scale] Optional scale to apply
  6690. * @returns {void}
  6691. */
  6692. /* harmony default export */ __webpack_exports__["default"] = (function (enabledElement, context, scale) {
  6693. if (enabledElement === undefined) {
  6694. throw new Error('setToPixelCoordinateSystem: parameter enabledElement must not be undefined');
  6695. }
  6696. if (context === undefined) {
  6697. throw new Error('setToPixelCoordinateSystem: parameter context must not be undefined');
  6698. }
  6699. var transform = Object(_internal_calculateTransform_js__WEBPACK_IMPORTED_MODULE_0__["default"])(enabledElement, scale);
  6700. context.setTransform(transform.m[0], transform.m[1], transform.m[2], transform.m[3], transform.m[4], transform.m[5]);
  6701. });
  6702. /***/ }),
  6703. /***/ "./setViewport.js":
  6704. /*!************************!*\
  6705. !*** ./setViewport.js ***!
  6706. \************************/
  6707. /*! exports provided: default */
  6708. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  6709. "use strict";
  6710. __webpack_require__.r(__webpack_exports__);
  6711. /* harmony import */ var _internal_getDefaultViewport_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/getDefaultViewport.js */ "./internal/getDefaultViewport.js");
  6712. /* harmony import */ var _enabledElements_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./enabledElements.js */ "./enabledElements.js");
  6713. /* harmony import */ var _updateImage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./updateImage.js */ "./updateImage.js");
  6714. var MIN_WINDOW_WIDTH = 0.000001;
  6715. var MIN_VIEWPORT_SCALE = 0.0001;
  6716. /**
  6717. * Sets/updates viewport of a given enabled element
  6718. *
  6719. * @param {HTMLElement} element - DOM element of the enabled element
  6720. * @param {Viewport} [viewport] - Object containing the viewport properties
  6721. * @returns {void}
  6722. * @memberof ViewportSettings
  6723. */
  6724. /* harmony default export */ __webpack_exports__["default"] = (function (element, viewport) {
  6725. var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_1__["getEnabledElement"])(element); // If viewport is not already set, start with default and merge new
  6726. // viewport options later
  6727. if (enabledElement.viewport === undefined) {
  6728. enabledElement.viewport = Object(_internal_getDefaultViewport_js__WEBPACK_IMPORTED_MODULE_0__["default"])(enabledElement.canvas);
  6729. } // Merge viewport
  6730. if (viewport) {
  6731. for (var attrname in viewport) {
  6732. if (viewport[attrname] !== null) {
  6733. enabledElement.viewport[attrname] = viewport[attrname];
  6734. }
  6735. }
  6736. } // Prevent window width from being too small (note that values close to zero are valid and can occur with
  6737. // PET images in particular)
  6738. if (enabledElement.viewport.voi.windowWidth) {
  6739. enabledElement.viewport.voi.windowWidth = Math.max(enabledElement.viewport.voi.windowWidth, MIN_WINDOW_WIDTH);
  6740. } // Prevent scale from getting too small
  6741. if (enabledElement.viewport.scale) {
  6742. enabledElement.viewport.scale = Math.max(enabledElement.viewport.scale, MIN_VIEWPORT_SCALE);
  6743. } // Normalize the rotation value to a positive rotation in degrees
  6744. enabledElement.viewport.rotation %= 360;
  6745. if (enabledElement.viewport.rotation < 0) {
  6746. enabledElement.viewport.rotation += 360;
  6747. }
  6748. if (enabledElement.image) {
  6749. // Force the image to be updated since the viewport has been modified
  6750. Object(_updateImage_js__WEBPACK_IMPORTED_MODULE_2__["default"])(element);
  6751. }
  6752. });
  6753. /***/ }),
  6754. /***/ "./triggerEvent.js":
  6755. /*!*************************!*\
  6756. !*** ./triggerEvent.js ***!
  6757. \*************************/
  6758. /*! exports provided: default */
  6759. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  6760. "use strict";
  6761. __webpack_require__.r(__webpack_exports__);
  6762. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return triggerEvent; });
  6763. /**
  6764. * Trigger a CustomEvent
  6765. *
  6766. * @param {EventTarget} el The element or EventTarget to trigger the event upon
  6767. * @param {String} type The event type name
  6768. * @param {Object|null} detail=null The event data to be sent
  6769. * @returns {Boolean} The return value is false if at least one event listener called preventDefault(). Otherwise it returns true.
  6770. */
  6771. function triggerEvent(el, type) {
  6772. var detail = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
  6773. var event; // This check is needed to polyfill CustomEvent on IE11-
  6774. if (typeof window.CustomEvent === 'function') {
  6775. event = new CustomEvent(type, {
  6776. detail: detail,
  6777. cancelable: true
  6778. });
  6779. } else {
  6780. event = document.createEvent('CustomEvent');
  6781. event.initCustomEvent(type, true, true, detail);
  6782. }
  6783. return el.dispatchEvent(event);
  6784. }
  6785. /***/ }),
  6786. /***/ "./updateImage.js":
  6787. /*!************************!*\
  6788. !*** ./updateImage.js ***!
  6789. \************************/
  6790. /*! exports provided: default */
  6791. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  6792. "use strict";
  6793. __webpack_require__.r(__webpack_exports__);
  6794. /* harmony import */ var _enabledElements_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./enabledElements.js */ "./enabledElements.js");
  6795. /* harmony import */ var _internal_drawImage_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/drawImage.js */ "./internal/drawImage.js");
  6796. /**
  6797. * Forces the image to be updated/redrawn for the specified enabled element
  6798. * @param {HTMLElement} element An HTML Element enabled for Cornerstone
  6799. * @param {Boolean} [invalidated=false] Whether or not the image pixel data has been changed, necessitating a redraw
  6800. *
  6801. * @returns {void}
  6802. * @memberof Drawing
  6803. */
  6804. /* harmony default export */ __webpack_exports__["default"] = (function (element) {
  6805. var invalidated = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
  6806. var enabledElement = Object(_enabledElements_js__WEBPACK_IMPORTED_MODULE_0__["getEnabledElement"])(element);
  6807. Object(_internal_drawImage_js__WEBPACK_IMPORTED_MODULE_1__["default"])(enabledElement, invalidated);
  6808. });
  6809. /***/ }),
  6810. /***/ "./webgl/createProgramFromString.js":
  6811. /*!******************************************!*\
  6812. !*** ./webgl/createProgramFromString.js ***!
  6813. \******************************************/
  6814. /*! exports provided: default */
  6815. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  6816. "use strict";
  6817. __webpack_require__.r(__webpack_exports__);
  6818. /**
  6819. * Creates and compiles a shader.
  6820. *
  6821. * @param {!WebGLRenderingContext} gl The WebGL Context.
  6822. * @param {string} shaderSource The GLSL source code for the shader.
  6823. * @param {number} shaderType The type of shader, VERTEX_SHADER or FRAGMENT_SHADER.
  6824. *
  6825. * @return {!WebGLShader} The shader.
  6826. * @memberof WebGLRendering
  6827. */
  6828. function compileShader(gl, shaderSource, shaderType) {
  6829. // Create the shader object
  6830. var shader = gl.createShader(shaderType); // Set the shader source code.
  6831. gl.shaderSource(shader, shaderSource); // Compile the shader
  6832. gl.compileShader(shader); // Check if it compiled
  6833. var success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
  6834. if (!success && !gl.isContextLost()) {
  6835. // Something went wrong during compilation; get the error
  6836. var infoLog = gl.getShaderInfoLog(shader);
  6837. console.error("Could not compile shader:\n".concat(infoLog));
  6838. }
  6839. return shader;
  6840. }
  6841. /**
  6842. * Creates a program from 2 shaders.
  6843. *
  6844. * @param {!WebGLRenderingContext} gl The WebGL context.
  6845. * @param {!WebGLShader} vertexShader A vertex shader.
  6846. * @param {!WebGLShader} fragmentShader A fragment shader.
  6847. * @return {!WebGLProgram} A program.
  6848. * @memberof WebGLRendering
  6849. */
  6850. function createProgram(gl, vertexShader, fragmentShader) {
  6851. // Create a program.
  6852. var program = gl.createProgram(); // Attach the shaders.
  6853. gl.attachShader(program, vertexShader);
  6854. gl.attachShader(program, fragmentShader); // Link the program.
  6855. gl.linkProgram(program); // Check if it linked.
  6856. var success = gl.getProgramParameter(program, gl.LINK_STATUS);
  6857. if (!success && !gl.isContextLost()) {
  6858. // Something went wrong with the link
  6859. var infoLog = gl.getProgramInfoLog(program);
  6860. console.error("WebGL program filed to link:\n".concat(infoLog));
  6861. }
  6862. return program;
  6863. }
  6864. /**
  6865. * Creates a program from 2 shaders source (Strings)
  6866. * @param {!WebGLRenderingContext} gl The WebGL context.
  6867. * @param {!WebGLShader} vertexShaderSrc Vertex shader string
  6868. * @param {!WebGLShader} fragShaderSrc Fragment shader string
  6869. * @return {!WebGLProgram} A program
  6870. * @memberof WebGLRendering
  6871. */
  6872. /* harmony default export */ __webpack_exports__["default"] = (function (gl, vertexShaderSrc, fragShaderSrc) {
  6873. var vertexShader = compileShader(gl, vertexShaderSrc, gl.VERTEX_SHADER);
  6874. var fragShader = compileShader(gl, fragShaderSrc, gl.FRAGMENT_SHADER);
  6875. return createProgram(gl, vertexShader, fragShader);
  6876. });
  6877. /***/ }),
  6878. /***/ "./webgl/index.js":
  6879. /*!************************!*\
  6880. !*** ./webgl/index.js ***!
  6881. \************************/
  6882. /*! exports provided: default */
  6883. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  6884. "use strict";
  6885. __webpack_require__.r(__webpack_exports__);
  6886. /* harmony import */ var _renderer_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./renderer.js */ "./webgl/renderer.js");
  6887. /* harmony import */ var _createProgramFromString_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./createProgramFromString.js */ "./webgl/createProgramFromString.js");
  6888. /* harmony import */ var _textureCache_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./textureCache.js */ "./webgl/textureCache.js");
  6889. /**
  6890. * @module WebGLRendering
  6891. */
  6892. var mod = {
  6893. createProgramFromString: _createProgramFromString_js__WEBPACK_IMPORTED_MODULE_1__["default"],
  6894. renderer: {
  6895. render: _renderer_js__WEBPACK_IMPORTED_MODULE_0__["render"],
  6896. initRenderer: _renderer_js__WEBPACK_IMPORTED_MODULE_0__["initRenderer"],
  6897. getRenderCanvas: _renderer_js__WEBPACK_IMPORTED_MODULE_0__["getRenderCanvas"],
  6898. isWebGLAvailable: _renderer_js__WEBPACK_IMPORTED_MODULE_0__["isWebGLAvailable"]
  6899. },
  6900. textureCache: _textureCache_js__WEBPACK_IMPORTED_MODULE_2__["default"]
  6901. };
  6902. Object.defineProperty(mod, 'isWebGLInitialized', {
  6903. enumerable: true,
  6904. configurable: false,
  6905. get: function get() {
  6906. return _renderer_js__WEBPACK_IMPORTED_MODULE_0__["isWebGLInitialized"];
  6907. }
  6908. });
  6909. /* harmony default export */ __webpack_exports__["default"] = (mod);
  6910. /***/ }),
  6911. /***/ "./webgl/renderer.js":
  6912. /*!***************************!*\
  6913. !*** ./webgl/renderer.js ***!
  6914. \***************************/
  6915. /*! exports provided: isWebGLInitialized, getRenderCanvas, initRenderer, render, isWebGLAvailable */
  6916. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  6917. "use strict";
  6918. __webpack_require__.r(__webpack_exports__);
  6919. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isWebGLInitialized", function() { return isWebGLInitialized; });
  6920. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getRenderCanvas", function() { return getRenderCanvas; });
  6921. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "initRenderer", function() { return initRenderer; });
  6922. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "render", function() { return render; });
  6923. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isWebGLAvailable", function() { return isWebGLAvailable; });
  6924. /* harmony import */ var _shaders_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./shaders/index.js */ "./webgl/shaders/index.js");
  6925. /* harmony import */ var _vertexShader_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./vertexShader.js */ "./webgl/vertexShader.js");
  6926. /* harmony import */ var _textureCache_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./textureCache.js */ "./webgl/textureCache.js");
  6927. /* harmony import */ var _createProgramFromString_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./createProgramFromString.js */ "./webgl/createProgramFromString.js");
  6928. /* eslint no-bitwise: 0 */
  6929. var renderCanvas = document.createElement('canvas');
  6930. var gl;
  6931. var texCoordBuffer;
  6932. var positionBuffer;
  6933. var isWebGLInitialized = false;
  6934. function getRenderCanvas() {
  6935. return renderCanvas;
  6936. }
  6937. function initShaders() {
  6938. for (var id in _shaders_index_js__WEBPACK_IMPORTED_MODULE_0__["shaders"]) {
  6939. // Console.log("WEBGL: Loading shader", id);
  6940. var shader = _shaders_index_js__WEBPACK_IMPORTED_MODULE_0__["shaders"][id];
  6941. shader.attributes = {};
  6942. shader.uniforms = {};
  6943. shader.vert = _vertexShader_js__WEBPACK_IMPORTED_MODULE_1__["vertexShader"];
  6944. shader.program = Object(_createProgramFromString_js__WEBPACK_IMPORTED_MODULE_3__["default"])(gl, shader.vert, shader.frag);
  6945. shader.attributes.texCoordLocation = gl.getAttribLocation(shader.program, 'a_texCoord');
  6946. gl.enableVertexAttribArray(shader.attributes.texCoordLocation);
  6947. shader.attributes.positionLocation = gl.getAttribLocation(shader.program, 'a_position');
  6948. gl.enableVertexAttribArray(shader.attributes.positionLocation);
  6949. shader.uniforms.resolutionLocation = gl.getUniformLocation(shader.program, 'u_resolution');
  6950. }
  6951. }
  6952. function initRenderer() {
  6953. if (isWebGLInitialized === true) {
  6954. // Console.log("WEBGL Renderer already initialized");
  6955. return;
  6956. }
  6957. if (initWebGL(renderCanvas)) {
  6958. initBuffers();
  6959. initShaders(); // Console.log("WEBGL Renderer initialized!");
  6960. isWebGLInitialized = true;
  6961. }
  6962. }
  6963. function updateRectangle(gl, width, height) {
  6964. gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([width, height, 0, height, width, 0, 0, 0]), gl.STATIC_DRAW);
  6965. }
  6966. function handleLostContext(event) {
  6967. event.preventDefault();
  6968. console.warn('WebGL Context Lost!');
  6969. }
  6970. function handleRestoredContext(event) {
  6971. event.preventDefault();
  6972. isWebGLInitialized = false;
  6973. _textureCache_js__WEBPACK_IMPORTED_MODULE_2__["default"].purgeCache();
  6974. initRenderer(); // Console.log('WebGL Context Restored.');
  6975. }
  6976. function initWebGL(canvas) {
  6977. gl = null;
  6978. try {
  6979. // Try to grab the standard context. If it fails, fallback to experimental.
  6980. var options = {
  6981. desynchronized: true,
  6982. preserveDrawingBuffer: true // Preserve buffer so we can copy to display canvas element
  6983. }; // ---------------- Testing purposes -------------
  6984. // If (debug === true && WebGLDebugUtils) {
  6985. // RenderCanvas = WebGLDebugUtils.makeLostContextSimulatingCanvas(renderCanvas);
  6986. // }
  6987. // ---------------- Testing purposes -------------
  6988. gl = canvas.getContext('webgl', options) || canvas.getContext('experimental-webgl', options); // Set up event listeners for context lost / context restored
  6989. canvas.removeEventListener('webglcontextlost', handleLostContext, false);
  6990. canvas.addEventListener('webglcontextlost', handleLostContext, false);
  6991. canvas.removeEventListener('webglcontextrestored', handleRestoredContext, false);
  6992. canvas.addEventListener('webglcontextrestored', handleRestoredContext, false);
  6993. } catch (error) {
  6994. throw new Error('Error creating WebGL context');
  6995. } // If we don't have a GL context, give up now
  6996. if (!gl) {
  6997. console.error('Unable to initialize WebGL. Your browser may not support it.');
  6998. gl = null;
  6999. }
  7000. return gl;
  7001. }
  7002. /**
  7003. * Returns the image data type as a string representation.
  7004. * @param {any} image The cornerstone image object
  7005. * @returns {string} image data type (rgb, iint16, uint16, int8 and uint8)
  7006. * @memberof WebGLRendering
  7007. */
  7008. function getImageDataType(image) {
  7009. if (image.color) {
  7010. return 'rgb';
  7011. }
  7012. var pixelData = image.getPixelData();
  7013. if (pixelData instanceof Int16Array) {
  7014. return 'int16';
  7015. }
  7016. if (pixelData instanceof Uint16Array) {
  7017. return 'uint16';
  7018. }
  7019. if (pixelData instanceof Int8Array) {
  7020. return 'int8';
  7021. }
  7022. return 'uint8';
  7023. }
  7024. function getShaderProgram(image) {
  7025. var datatype = getImageDataType(image); // We need a mechanism for
  7026. // Choosing the shader based on the image datatype
  7027. // Console.log("Datatype: " + datatype);
  7028. if (_shaders_index_js__WEBPACK_IMPORTED_MODULE_0__["shaders"].hasOwnProperty(datatype)) {
  7029. return _shaders_index_js__WEBPACK_IMPORTED_MODULE_0__["shaders"][datatype];
  7030. }
  7031. return _shaders_index_js__WEBPACK_IMPORTED_MODULE_0__["shaders"].rgb;
  7032. }
  7033. function generateTexture(image) {
  7034. var TEXTURE_FORMAT = {
  7035. uint8: gl.LUMINANCE,
  7036. int8: gl.LUMINANCE_ALPHA,
  7037. uint16: gl.LUMINANCE_ALPHA,
  7038. int16: gl.RGB,
  7039. rgb: gl.RGB
  7040. };
  7041. var TEXTURE_BYTES = {
  7042. int8: 1,
  7043. // Luminance
  7044. uint16: 2,
  7045. // Luminance + Alpha
  7046. int16: 3,
  7047. // RGB
  7048. rgb: 3 // RGB
  7049. };
  7050. var imageDataType = getImageDataType(image);
  7051. var format = TEXTURE_FORMAT[imageDataType]; // GL texture configuration
  7052. var texture = gl.createTexture();
  7053. gl.bindTexture(gl.TEXTURE_2D, texture);
  7054. gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
  7055. gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
  7056. gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
  7057. gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
  7058. gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1);
  7059. var imageData = _shaders_index_js__WEBPACK_IMPORTED_MODULE_0__["dataUtilities"][imageDataType].storedPixelDataToImageData(image, image.width, image.height);
  7060. gl.texImage2D(gl.TEXTURE_2D, 0, format, image.width, image.height, 0, format, gl.UNSIGNED_BYTE, imageData); // Calculate the size in bytes of this image in memory
  7061. var sizeInBytes = image.width * image.height * TEXTURE_BYTES[imageDataType];
  7062. return {
  7063. texture: texture,
  7064. sizeInBytes: sizeInBytes
  7065. };
  7066. }
  7067. function getImageTexture(image) {
  7068. var imageTexture = _textureCache_js__WEBPACK_IMPORTED_MODULE_2__["default"].getImageTexture(image.imageId);
  7069. if (!imageTexture) {
  7070. // Console.log("Generating texture for imageid: ", image.imageId);
  7071. imageTexture = generateTexture(image);
  7072. _textureCache_js__WEBPACK_IMPORTED_MODULE_2__["default"].putImageTexture(image, imageTexture);
  7073. }
  7074. return imageTexture.texture;
  7075. }
  7076. function initBuffers() {
  7077. positionBuffer = gl.createBuffer();
  7078. gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
  7079. gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, 0, 1, 1, 0, 0, 0]), gl.STATIC_DRAW);
  7080. texCoordBuffer = gl.createBuffer();
  7081. gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);
  7082. gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0]), gl.STATIC_DRAW);
  7083. }
  7084. function renderQuad(shader, parameters, texture, width, height) {
  7085. gl.clearColor(1.0, 0.0, 0.0, 1.0);
  7086. gl.viewport(0, 0, width, height);
  7087. gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
  7088. gl.useProgram(shader.program);
  7089. gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);
  7090. gl.vertexAttribPointer(shader.attributes.texCoordLocation, 2, gl.FLOAT, false, 0, 0);
  7091. gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
  7092. gl.vertexAttribPointer(shader.attributes.positionLocation, 2, gl.FLOAT, false, 0, 0);
  7093. for (var key in parameters) {
  7094. var uniformLocation = gl.getUniformLocation(shader.program, key);
  7095. if (!uniformLocation) {
  7096. continue; // Disabling this error for now since RGB requires minPixelValue
  7097. // but the other shaders do not.
  7098. // throw `Could not access location for uniform: ${key}`;
  7099. }
  7100. var uniform = parameters[key];
  7101. var type = uniform.type;
  7102. var value = uniform.value;
  7103. if (type === 'i') {
  7104. gl.uniform1i(uniformLocation, value);
  7105. } else if (type === 'f') {
  7106. gl.uniform1f(uniformLocation, value);
  7107. } else if (type === '2f') {
  7108. gl.uniform2f(uniformLocation, value[0], value[1]);
  7109. }
  7110. }
  7111. updateRectangle(gl, width, height);
  7112. gl.activeTexture(gl.TEXTURE0);
  7113. gl.bindTexture(gl.TEXTURE_2D, texture);
  7114. gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
  7115. }
  7116. function render(enabledElement) {
  7117. // Resize the canvas
  7118. var image = enabledElement.image;
  7119. renderCanvas.width = image.width;
  7120. renderCanvas.height = image.height;
  7121. var viewport = enabledElement.viewport; // Render the current image
  7122. var shader = getShaderProgram(image);
  7123. var texture = getImageTexture(image);
  7124. var parameters = {
  7125. u_resolution: {
  7126. type: '2f',
  7127. value: [image.width, image.height]
  7128. },
  7129. wc: {
  7130. type: 'f',
  7131. value: viewport.voi.windowCenter
  7132. },
  7133. ww: {
  7134. type: 'f',
  7135. value: viewport.voi.windowWidth
  7136. },
  7137. slope: {
  7138. type: 'f',
  7139. value: image.slope
  7140. },
  7141. intercept: {
  7142. type: 'f',
  7143. value: image.intercept
  7144. },
  7145. minPixelValue: {
  7146. type: 'f',
  7147. value: image.minPixelValue
  7148. },
  7149. invert: {
  7150. type: 'i',
  7151. value: viewport.invert ? 1 : 0
  7152. }
  7153. };
  7154. renderQuad(shader, parameters, texture, image.width, image.height);
  7155. return renderCanvas;
  7156. }
  7157. function isWebGLAvailable() {
  7158. // Adapted from
  7159. // http://stackoverflow.com/questions/9899807/three-js-detect-webgl-support-and-fallback-to-regular-canvas
  7160. var options = {
  7161. failIfMajorPerformanceCaveat: true
  7162. };
  7163. try {
  7164. var canvas = document.createElement('canvas');
  7165. return Boolean(window.WebGLRenderingContext) && (canvas.getContext('webgl', options) || canvas.getContext('experimental-webgl', options));
  7166. } catch (e) {
  7167. return false;
  7168. }
  7169. }
  7170. /***/ }),
  7171. /***/ "./webgl/shaders/index.js":
  7172. /*!********************************!*\
  7173. !*** ./webgl/shaders/index.js ***!
  7174. \********************************/
  7175. /*! exports provided: shaders, dataUtilities */
  7176. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  7177. "use strict";
  7178. __webpack_require__.r(__webpack_exports__);
  7179. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "shaders", function() { return shaders; });
  7180. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dataUtilities", function() { return dataUtilities; });
  7181. /* harmony import */ var _int16_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./int16.js */ "./webgl/shaders/int16.js");
  7182. /* harmony import */ var _int8_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./int8.js */ "./webgl/shaders/int8.js");
  7183. /* harmony import */ var _rgb_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./rgb.js */ "./webgl/shaders/rgb.js");
  7184. /* harmony import */ var _uint16_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./uint16.js */ "./webgl/shaders/uint16.js");
  7185. /* harmony import */ var _uint8_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./uint8.js */ "./webgl/shaders/uint8.js");
  7186. var shaders = {
  7187. int16: _int16_js__WEBPACK_IMPORTED_MODULE_0__["int16Shader"],
  7188. int8: _int8_js__WEBPACK_IMPORTED_MODULE_1__["int8Shader"],
  7189. rgb: _rgb_js__WEBPACK_IMPORTED_MODULE_2__["rgbShader"],
  7190. uint16: _uint16_js__WEBPACK_IMPORTED_MODULE_3__["uint16Shader"],
  7191. uint8: _uint8_js__WEBPACK_IMPORTED_MODULE_4__["uint8Shader"]
  7192. };
  7193. var dataUtilities = {
  7194. int16: _int16_js__WEBPACK_IMPORTED_MODULE_0__["int16DataUtilities"],
  7195. int8: _int8_js__WEBPACK_IMPORTED_MODULE_1__["int8DataUtilities"],
  7196. rgb: _rgb_js__WEBPACK_IMPORTED_MODULE_2__["rgbDataUtilities"],
  7197. uint16: _uint16_js__WEBPACK_IMPORTED_MODULE_3__["uint16DataUtilities"],
  7198. uint8: _uint8_js__WEBPACK_IMPORTED_MODULE_4__["uint8DataUtilities"]
  7199. };
  7200. /***/ }),
  7201. /***/ "./webgl/shaders/int16.js":
  7202. /*!********************************!*\
  7203. !*** ./webgl/shaders/int16.js ***!
  7204. \********************************/
  7205. /*! exports provided: int16DataUtilities, int16Shader */
  7206. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  7207. "use strict";
  7208. __webpack_require__.r(__webpack_exports__);
  7209. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "int16DataUtilities", function() { return int16DataUtilities; });
  7210. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "int16Shader", function() { return int16Shader; });
  7211. /* eslint no-bitwise: 0 */
  7212. var int16Shader = {};
  7213. /**
  7214. * Convert stored pixel data to image data.
  7215. *
  7216. * Pack int16 into three uint8 channels (r, g, b)
  7217. *
  7218. * @param {Image} image A Cornerstone Image Object
  7219. * @returns {Uint8Array} The image data for use by the WebGL shader
  7220. * @memberof WebGLRendering
  7221. */
  7222. function storedPixelDataToImageData(image) {
  7223. // Transfer image data to alpha and luminance channels of WebGL texture
  7224. // Credit to @jpambrun and @fernandojsg
  7225. // Pack int16 into three uint8 channels (r, g, b)
  7226. var pixelData = image.getPixelData();
  7227. var numberOfChannels = 3;
  7228. var data = new Uint8Array(image.width * image.height * numberOfChannels);
  7229. var offset = 0;
  7230. for (var i = 0; i < pixelData.length; i++) {
  7231. var val = Math.abs(pixelData[i]);
  7232. data[offset++] = val & 0xFF;
  7233. data[offset++] = val >> 8;
  7234. data[offset++] = pixelData[i] < 0 ? 0 : 1; // 0 For negative, 1 for positive
  7235. }
  7236. return data;
  7237. }
  7238. var int16DataUtilities = {
  7239. storedPixelDataToImageData: storedPixelDataToImageData
  7240. };
  7241. int16Shader.frag = 'precision mediump float;' + 'uniform sampler2D u_image;' + 'uniform float ww;' + 'uniform float wc;' + 'uniform float slope;' + 'uniform float intercept;' + 'uniform int invert;' + 'varying vec2 v_texCoord;' + 'void main() {' + // Get texture
  7242. 'vec4 color = texture2D(u_image, v_texCoord);' + // Calculate luminance from packed texture
  7243. 'float intensity = color.r*256.0 + color.g*65536.0;' + 'if (color.b == 0.0)' + 'intensity = -intensity;' + // Rescale based on slope and window settings
  7244. 'intensity = intensity * slope + intercept;' + 'float center0 = wc - 0.5;' + 'float width0 = max(ww, 1.0);' + 'intensity = (intensity - center0) / width0 + 0.5;' + // Clamp intensity
  7245. 'intensity = clamp(intensity, 0.0, 1.0);' + // RGBA output
  7246. 'gl_FragColor = vec4(intensity, intensity, intensity, 1.0);' + // Apply any inversion necessary
  7247. 'if (invert == 1)' + 'gl_FragColor.rgb = 1.0 - gl_FragColor.rgb;' + '}';
  7248. /***/ }),
  7249. /***/ "./webgl/shaders/int8.js":
  7250. /*!*******************************!*\
  7251. !*** ./webgl/shaders/int8.js ***!
  7252. \*******************************/
  7253. /*! exports provided: int8DataUtilities, int8Shader */
  7254. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  7255. "use strict";
  7256. __webpack_require__.r(__webpack_exports__);
  7257. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "int8DataUtilities", function() { return int8DataUtilities; });
  7258. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "int8Shader", function() { return int8Shader; });
  7259. var int8Shader = {};
  7260. /**
  7261. * Convert stored pixel data to image data.
  7262. *
  7263. * Store data in Uint8Array
  7264. *
  7265. * @param {Image} image A Cornerstone Image Object
  7266. * @returns {Uint8Array} The image data for use by the WebGL shader
  7267. * @memberof WebGLRendering
  7268. */
  7269. function storedPixelDataToImageData(image) {
  7270. // Transfer image data to alpha channel of WebGL texture
  7271. // Store data in Uint8Array
  7272. var pixelData = image.getPixelData();
  7273. var numberOfChannels = 2;
  7274. var data = new Uint8Array(image.width * image.height * numberOfChannels);
  7275. var offset = 0;
  7276. for (var i = 0; i < pixelData.length; i++) {
  7277. data[offset++] = pixelData[i];
  7278. data[offset++] = pixelData[i] < 0 ? 0 : 1; // 0 For negative, 1 for positive
  7279. }
  7280. return data;
  7281. }
  7282. var int8DataUtilities = {
  7283. storedPixelDataToImageData: storedPixelDataToImageData
  7284. };
  7285. int8Shader.frag = 'precision mediump float;' + 'uniform sampler2D u_image;' + 'uniform float ww;' + 'uniform float wc;' + 'uniform float slope;' + 'uniform float intercept;' + 'uniform int invert;' + 'varying vec2 v_texCoord;' + 'void main() {' + // Get texture
  7286. 'vec4 color = texture2D(u_image, v_texCoord);' + // Calculate luminance from packed texture
  7287. 'float intensity = color.r*256.;' + 'if (color.a == 0.0)' + 'intensity = -intensity;' + // Rescale based on slope and window settings
  7288. 'intensity = intensity * slope + intercept;' + 'float center0 = wc - 0.5;' + 'float width0 = max(ww, 1.0);' + 'intensity = (intensity - center0) / width0 + 0.5;' + // Clamp intensity
  7289. 'intensity = clamp(intensity, 0.0, 1.0);' + // RGBA output
  7290. 'gl_FragColor = vec4(intensity, intensity, intensity, 1.0);' + // Apply any inversion necessary
  7291. 'if (invert == 1)' + 'gl_FragColor.rgb = 1.0 - gl_FragColor.rgb;' + '}';
  7292. /***/ }),
  7293. /***/ "./webgl/shaders/rgb.js":
  7294. /*!******************************!*\
  7295. !*** ./webgl/shaders/rgb.js ***!
  7296. \******************************/
  7297. /*! exports provided: rgbDataUtilities, rgbShader */
  7298. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  7299. "use strict";
  7300. __webpack_require__.r(__webpack_exports__);
  7301. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rgbDataUtilities", function() { return rgbDataUtilities; });
  7302. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rgbShader", function() { return rgbShader; });
  7303. var rgbShader = {};
  7304. /**
  7305. * Convert stored pixel data to image data.
  7306. *
  7307. * Pack RGB images into a 3-channel RGB texture
  7308. *
  7309. * @param {Image} image A Cornerstone Image Object
  7310. * @returns {Uint8Array} The image data for use by the WebGL shader
  7311. * @memberof WebGLRendering
  7312. */
  7313. function storedPixelDataToImageData(image) {
  7314. var minPixelValue = image.minPixelValue;
  7315. var canvasImageDataIndex = 0;
  7316. var storedPixelDataIndex = 0; // Only 3 channels, since we use WebGL's RGB texture format
  7317. var numStoredPixels = image.width * image.height * 4;
  7318. var numOutputPixels = image.width * image.height * 3;
  7319. var storedPixelData = image.getPixelData();
  7320. var data = new Uint8Array(numOutputPixels); // NOTE: As of Nov 2014, most javascript engines have lower performance when indexing negative indexes.
  7321. // We have a special code path for this case that improves performance. Thanks to @jpambrun for this enhancement
  7322. if (minPixelValue < 0) {
  7323. while (storedPixelDataIndex < numStoredPixels) {
  7324. data[canvasImageDataIndex++] = storedPixelData[storedPixelDataIndex++] + -minPixelValue; // Red
  7325. data[canvasImageDataIndex++] = storedPixelData[storedPixelDataIndex++] + -minPixelValue; // Green
  7326. data[canvasImageDataIndex++] = storedPixelData[storedPixelDataIndex++] + -minPixelValue; // Blue
  7327. storedPixelDataIndex += 1; // The stored pixel data has 4 channels
  7328. }
  7329. } else {
  7330. while (storedPixelDataIndex < numStoredPixels) {
  7331. data[canvasImageDataIndex++] = storedPixelData[storedPixelDataIndex++]; // Red
  7332. data[canvasImageDataIndex++] = storedPixelData[storedPixelDataIndex++]; // Green
  7333. data[canvasImageDataIndex++] = storedPixelData[storedPixelDataIndex++]; // Blue
  7334. storedPixelDataIndex += 1; // The stored pixel data has 4 channels
  7335. }
  7336. }
  7337. return data;
  7338. }
  7339. var rgbDataUtilities = {
  7340. storedPixelDataToImageData: storedPixelDataToImageData
  7341. };
  7342. rgbShader.frag = 'precision mediump float;' + 'uniform sampler2D u_image;' + 'uniform float ww;' + 'uniform float wc;' + 'uniform float slope;' + 'uniform float intercept;' + 'uniform float minPixelValue;' + 'uniform int invert;' + 'varying vec2 v_texCoord;' + 'void main() {' + // Get texture
  7343. 'vec3 color = texture2D(u_image, v_texCoord).xyz;' + // Rescale based on slope and intercept
  7344. 'color = color * 256.0 * slope + intercept;' + // Apply window settings
  7345. 'float center0 = wc - 0.5 - minPixelValue;' + 'float width0 = max(ww, 1.0);' + 'color = (color - center0) / width0 + 0.5;' + // RGBA output
  7346. 'gl_FragColor = vec4(color, 1);' + // Apply any inversion necessary
  7347. 'if (invert == 1)' + 'gl_FragColor.rgb = 1. - gl_FragColor.rgb;' + '}';
  7348. /***/ }),
  7349. /***/ "./webgl/shaders/uint16.js":
  7350. /*!*********************************!*\
  7351. !*** ./webgl/shaders/uint16.js ***!
  7352. \*********************************/
  7353. /*! exports provided: uint16DataUtilities, uint16Shader */
  7354. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  7355. "use strict";
  7356. __webpack_require__.r(__webpack_exports__);
  7357. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "uint16DataUtilities", function() { return uint16DataUtilities; });
  7358. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "uint16Shader", function() { return uint16Shader; });
  7359. /* eslint no-bitwise: 0 */
  7360. var uint16Shader = {};
  7361. /**
  7362. * Convert stored pixel data to image data.
  7363. *
  7364. * For uint16 pack uint16 into two uint8 channels (r and a).
  7365. *
  7366. * @param {Image} image A Cornerstone Image Object
  7367. * @returns {Uint8Array} The image data for use by the WebGL shader
  7368. * @memberof WebGLRendering
  7369. */
  7370. function storedPixelDataToImageData(image) {
  7371. // Transfer image data to alpha and luminance channels of WebGL texture
  7372. // Credit to @jpambrun and @fernandojsg
  7373. // Pack uint16 into two uint8 channels (r and a)
  7374. var pixelData = image.getPixelData();
  7375. var numberOfChannels = 2;
  7376. var data = new Uint8Array(image.width * image.height * numberOfChannels);
  7377. var offset = 0;
  7378. for (var i = 0; i < pixelData.length; i++) {
  7379. var val = pixelData[i];
  7380. data[offset++] = val & 0xFF;
  7381. data[offset++] = val >> 8;
  7382. }
  7383. return data;
  7384. }
  7385. var uint16DataUtilities = {
  7386. storedPixelDataToImageData: storedPixelDataToImageData
  7387. };
  7388. uint16Shader.frag = 'precision mediump float;' + 'uniform sampler2D u_image;' + 'uniform float ww;' + 'uniform float wc;' + 'uniform float slope;' + 'uniform float intercept;' + 'uniform int invert;' + 'varying vec2 v_texCoord;' + 'void main() {' + // Get texture
  7389. 'vec4 color = texture2D(u_image, v_texCoord);' + // Calculate luminance from packed texture
  7390. 'float intensity = color.r*256.0 + color.a*65536.0;' + // Rescale based on slope and window settings
  7391. 'intensity = intensity * slope + intercept;' + 'float center0 = wc - 0.5;' + 'float width0 = max(ww, 1.0);' + 'intensity = (intensity - center0) / width0 + 0.5;' + // Clamp intensity
  7392. 'intensity = clamp(intensity, 0.0, 1.0);' + // RGBA output
  7393. 'gl_FragColor = vec4(intensity, intensity, intensity, 1.0);' + // Apply any inversion necessary
  7394. 'if (invert == 1)' + 'gl_FragColor.rgb = 1.0 - gl_FragColor.rgb;' + '}';
  7395. /***/ }),
  7396. /***/ "./webgl/shaders/uint8.js":
  7397. /*!********************************!*\
  7398. !*** ./webgl/shaders/uint8.js ***!
  7399. \********************************/
  7400. /*! exports provided: uint8DataUtilities, uint8Shader */
  7401. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  7402. "use strict";
  7403. __webpack_require__.r(__webpack_exports__);
  7404. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "uint8DataUtilities", function() { return uint8DataUtilities; });
  7405. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "uint8Shader", function() { return uint8Shader; });
  7406. var uint8Shader = {};
  7407. /**
  7408. * Convert stored pixel data to image data. Here we will store
  7409. * all data in the alpha channel.
  7410. *
  7411. * @param {Image} image A Cornerstone Image Object
  7412. * @returns {Uint8Array} The image data for use by the WebGL shader
  7413. * @memberof WebGLRendering
  7414. */
  7415. function storedPixelDataToImageData(image) {
  7416. // Transfer image data to alpha channel of WebGL texture
  7417. return image.getPixelData();
  7418. }
  7419. var uint8DataUtilities = {
  7420. storedPixelDataToImageData: storedPixelDataToImageData
  7421. };
  7422. uint8Shader.frag = 'precision mediump float;' + 'uniform sampler2D u_image;' + 'uniform float ww;' + 'uniform float wc;' + 'uniform float slope;' + 'uniform float intercept;' + 'uniform int invert;' + 'varying vec2 v_texCoord;' + 'void main() {' + // Get texture
  7423. 'vec4 color = texture2D(u_image, v_texCoord);' + // Calculate luminance from packed texture
  7424. 'float intensity = color.r*256.0;' + // Rescale based on slope and window settings
  7425. 'intensity = intensity * slope + intercept;' + 'float center0 = wc - 0.5;' + 'float width0 = max(ww, 1.0);' + 'intensity = (intensity - center0) / width0 + 0.5;' + // Clamp intensity
  7426. 'intensity = clamp(intensity, 0.0, 1.0);' + // RGBA output
  7427. 'gl_FragColor = vec4(intensity, intensity, intensity, 1.0);' + // Apply any inversion necessary
  7428. 'if (invert == 1)' + 'gl_FragColor.rgb = 1.0 - gl_FragColor.rgb;' + '}';
  7429. /***/ }),
  7430. /***/ "./webgl/textureCache.js":
  7431. /*!*******************************!*\
  7432. !*** ./webgl/textureCache.js ***!
  7433. \*******************************/
  7434. /*! exports provided: default */
  7435. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  7436. "use strict";
  7437. __webpack_require__.r(__webpack_exports__);
  7438. /* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../events.js */ "./events.js");
  7439. /* harmony import */ var _triggerEvent_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../triggerEvent.js */ "./triggerEvent.js");
  7440. /**
  7441. * This module deals with caching image textures in VRAM for WebGL
  7442. * @module WebGLTextureCache
  7443. */
  7444. var imageCache = {};
  7445. var cachedImages = [];
  7446. var maximumSizeInBytes = 1024 * 1024 * 256; // 256 MB
  7447. var cacheSizeInBytes = 0;
  7448. function getCacheInfo() {
  7449. return {
  7450. maximumSizeInBytes: maximumSizeInBytes,
  7451. cacheSizeInBytes: cacheSizeInBytes,
  7452. numberOfImagesCached: cachedImages.length
  7453. };
  7454. }
  7455. function purgeCacheIfNecessary() {
  7456. // If max cache size has not been exceeded, do nothing
  7457. if (cacheSizeInBytes <= maximumSizeInBytes) {
  7458. return;
  7459. } // Cache size has been exceeded, create list of images sorted by timeStamp
  7460. // So we can purge the least recently used image
  7461. function compare(a, b) {
  7462. if (a.timeStamp > b.timeStamp) {
  7463. return -1;
  7464. }
  7465. if (a.timeStamp < b.timeStamp) {
  7466. return 1;
  7467. }
  7468. return 0;
  7469. }
  7470. cachedImages.sort(compare); // Remove images as necessary
  7471. while (cacheSizeInBytes > maximumSizeInBytes) {
  7472. var lastCachedImage = cachedImages[cachedImages.length - 1];
  7473. cacheSizeInBytes -= lastCachedImage.sizeInBytes;
  7474. delete imageCache[lastCachedImage.imageId];
  7475. cachedImages.pop();
  7476. Object(_triggerEvent_js__WEBPACK_IMPORTED_MODULE_1__["default"])(_events_js__WEBPACK_IMPORTED_MODULE_0__["events"], _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].WEBGL_TEXTURE_REMOVED, {
  7477. imageId: lastCachedImage.imageId
  7478. });
  7479. }
  7480. var cacheInfo = getCacheInfo();
  7481. Object(_triggerEvent_js__WEBPACK_IMPORTED_MODULE_1__["default"])(_events_js__WEBPACK_IMPORTED_MODULE_0__["events"], _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].WEBGL_TEXTURE_CACHE_FULL, cacheInfo);
  7482. }
  7483. function setMaximumSizeBytes(numBytes) {
  7484. if (numBytes === undefined) {
  7485. throw new Error('setMaximumSizeBytes: parameter numBytes must not be undefined');
  7486. }
  7487. if (numBytes.toFixed === undefined) {
  7488. throw new Error('setMaximumSizeBytes: parameter numBytes must be a number');
  7489. }
  7490. maximumSizeInBytes = numBytes;
  7491. purgeCacheIfNecessary();
  7492. }
  7493. function putImageTexture(image, imageTexture) {
  7494. var imageId = image.imageId;
  7495. if (image === undefined) {
  7496. throw new Error('putImageTexture: image must not be undefined');
  7497. }
  7498. if (imageId === undefined) {
  7499. throw new Error('putImageTexture: imageId must not be undefined');
  7500. }
  7501. if (imageTexture === undefined) {
  7502. throw new Error('putImageTexture: imageTexture must not be undefined');
  7503. }
  7504. if (Object.prototype.hasOwnProperty.call(imageCache, imageId) === true) {
  7505. throw new Error('putImageTexture: imageId already in cache');
  7506. }
  7507. var cachedImage = {
  7508. imageId: imageId,
  7509. imageTexture: imageTexture,
  7510. timeStamp: new Date(),
  7511. sizeInBytes: imageTexture.sizeInBytes
  7512. };
  7513. imageCache[imageId] = cachedImage;
  7514. cachedImages.push(cachedImage);
  7515. if (imageTexture.sizeInBytes === undefined) {
  7516. throw new Error('putImageTexture: imageTexture.sizeInBytes must not be undefined');
  7517. }
  7518. if (imageTexture.sizeInBytes.toFixed === undefined) {
  7519. throw new Error('putImageTexture: imageTexture.sizeInBytes is not a number');
  7520. }
  7521. cacheSizeInBytes += cachedImage.sizeInBytes;
  7522. purgeCacheIfNecessary();
  7523. }
  7524. function getImageTexture(imageId) {
  7525. if (imageId === undefined) {
  7526. throw new Error('getImageTexture: imageId must not be undefined');
  7527. }
  7528. var cachedImage = imageCache[imageId];
  7529. if (cachedImage === undefined) {
  7530. return;
  7531. } // Bump time stamp for cached image
  7532. cachedImage.timeStamp = new Date();
  7533. return cachedImage.imageTexture;
  7534. }
  7535. function removeImageTexture(imageId) {
  7536. if (imageId === undefined) {
  7537. throw new Error('removeImageTexture: imageId must not be undefined');
  7538. }
  7539. var cachedImage = imageCache[imageId];
  7540. if (cachedImage === undefined) {
  7541. throw new Error('removeImageTexture: imageId must not be undefined');
  7542. }
  7543. cachedImages.splice(cachedImages.indexOf(cachedImage), 1);
  7544. cacheSizeInBytes -= cachedImage.sizeInBytes;
  7545. delete imageCache[imageId];
  7546. return cachedImage.imageTexture;
  7547. }
  7548. function purgeCache() {
  7549. while (cachedImages.length > 0) {
  7550. var removedCachedImage = cachedImages.pop();
  7551. delete imageCache[removedCachedImage.imageId];
  7552. }
  7553. cacheSizeInBytes = 0;
  7554. }
  7555. /* harmony default export */ __webpack_exports__["default"] = ({
  7556. purgeCache: purgeCache,
  7557. getImageTexture: getImageTexture,
  7558. putImageTexture: putImageTexture,
  7559. removeImageTexture: removeImageTexture,
  7560. setMaximumSizeBytes: setMaximumSizeBytes
  7561. });
  7562. /***/ }),
  7563. /***/ "./webgl/vertexShader.js":
  7564. /*!*******************************!*\
  7565. !*** ./webgl/vertexShader.js ***!
  7566. \*******************************/
  7567. /*! exports provided: vertexShader */
  7568. /***/ (function(module, __webpack_exports__, __webpack_require__) {
  7569. "use strict";
  7570. __webpack_require__.r(__webpack_exports__);
  7571. /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "vertexShader", function() { return vertexShader; });
  7572. var vertexShader = 'attribute vec2 a_position;' + 'attribute vec2 a_texCoord;' + 'uniform vec2 u_resolution;' + 'varying vec2 v_texCoord;' + 'void main() {' + 'vec2 zeroToOne = a_position / u_resolution;' + 'vec2 zeroToTwo = zeroToOne * 2.0;' + 'vec2 clipSpace = zeroToTwo - 1.0;' + 'gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);' + 'v_texCoord = a_texCoord;' + '}';
  7573. /***/ })
  7574. /******/ });
  7575. });
  7576. //# sourceMappingURL=cornerstone.js.map