plugin.js 100 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684
  1. (function () {
  2. var imagetools = (function () {
  3. 'use strict';
  4. var Cell = function (initial) {
  5. var value = initial;
  6. var get = function () {
  7. return value;
  8. };
  9. var set = function (v) {
  10. value = v;
  11. };
  12. var clone = function () {
  13. return Cell(get());
  14. };
  15. return {
  16. get: get,
  17. set: set,
  18. clone: clone
  19. };
  20. };
  21. var global = tinymce.util.Tools.resolve('tinymce.PluginManager');
  22. var global$1 = tinymce.util.Tools.resolve('tinymce.util.Tools');
  23. function create(width, height) {
  24. return resize(document.createElement('canvas'), width, height);
  25. }
  26. function clone(canvas) {
  27. var tCanvas, ctx;
  28. tCanvas = create(canvas.width, canvas.height);
  29. ctx = get2dContext(tCanvas);
  30. ctx.drawImage(canvas, 0, 0);
  31. return tCanvas;
  32. }
  33. function get2dContext(canvas) {
  34. return canvas.getContext('2d');
  35. }
  36. function get3dContext(canvas) {
  37. var gl = null;
  38. try {
  39. gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
  40. } catch (e) {
  41. }
  42. if (!gl) {
  43. gl = null;
  44. }
  45. return gl;
  46. }
  47. function resize(canvas, width, height) {
  48. canvas.width = width;
  49. canvas.height = height;
  50. return canvas;
  51. }
  52. var $_2bu9lddrjkmcwot1 = {
  53. create: create,
  54. clone: clone,
  55. resize: resize,
  56. get2dContext: get2dContext,
  57. get3dContext: get3dContext
  58. };
  59. function getWidth(image) {
  60. return image.naturalWidth || image.width;
  61. }
  62. function getHeight(image) {
  63. return image.naturalHeight || image.height;
  64. }
  65. var $_ff7zkmdsjkmcwot2 = {
  66. getWidth: getWidth,
  67. getHeight: getHeight
  68. };
  69. var promise = function () {
  70. var Promise = function (fn) {
  71. if (typeof this !== 'object')
  72. throw new TypeError('Promises must be constructed via new');
  73. if (typeof fn !== 'function')
  74. throw new TypeError('not a function');
  75. this._state = null;
  76. this._value = null;
  77. this._deferreds = [];
  78. doResolve(fn, bind(resolve, this), bind(reject, this));
  79. };
  80. var asap = Promise.immediateFn || typeof setImmediate === 'function' && setImmediate || function (fn) {
  81. setTimeout(fn, 1);
  82. };
  83. function bind(fn, thisArg) {
  84. return function () {
  85. fn.apply(thisArg, arguments);
  86. };
  87. }
  88. var isArray = Array.isArray || function (value) {
  89. return Object.prototype.toString.call(value) === '[object Array]';
  90. };
  91. function handle(deferred) {
  92. var me = this;
  93. if (this._state === null) {
  94. this._deferreds.push(deferred);
  95. return;
  96. }
  97. asap(function () {
  98. var cb = me._state ? deferred.onFulfilled : deferred.onRejected;
  99. if (cb === null) {
  100. (me._state ? deferred.resolve : deferred.reject)(me._value);
  101. return;
  102. }
  103. var ret;
  104. try {
  105. ret = cb(me._value);
  106. } catch (e) {
  107. deferred.reject(e);
  108. return;
  109. }
  110. deferred.resolve(ret);
  111. });
  112. }
  113. function resolve(newValue) {
  114. try {
  115. if (newValue === this)
  116. throw new TypeError('A promise cannot be resolved with itself.');
  117. if (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) {
  118. var then = newValue.then;
  119. if (typeof then === 'function') {
  120. doResolve(bind(then, newValue), bind(resolve, this), bind(reject, this));
  121. return;
  122. }
  123. }
  124. this._state = true;
  125. this._value = newValue;
  126. finale.call(this);
  127. } catch (e) {
  128. reject.call(this, e);
  129. }
  130. }
  131. function reject(newValue) {
  132. this._state = false;
  133. this._value = newValue;
  134. finale.call(this);
  135. }
  136. function finale() {
  137. for (var i = 0, len = this._deferreds.length; i < len; i++) {
  138. handle.call(this, this._deferreds[i]);
  139. }
  140. this._deferreds = null;
  141. }
  142. function Handler(onFulfilled, onRejected, resolve, reject) {
  143. this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;
  144. this.onRejected = typeof onRejected === 'function' ? onRejected : null;
  145. this.resolve = resolve;
  146. this.reject = reject;
  147. }
  148. function doResolve(fn, onFulfilled, onRejected) {
  149. var done = false;
  150. try {
  151. fn(function (value) {
  152. if (done)
  153. return;
  154. done = true;
  155. onFulfilled(value);
  156. }, function (reason) {
  157. if (done)
  158. return;
  159. done = true;
  160. onRejected(reason);
  161. });
  162. } catch (ex) {
  163. if (done)
  164. return;
  165. done = true;
  166. onRejected(ex);
  167. }
  168. }
  169. Promise.prototype['catch'] = function (onRejected) {
  170. return this.then(null, onRejected);
  171. };
  172. Promise.prototype.then = function (onFulfilled, onRejected) {
  173. var me = this;
  174. return new Promise(function (resolve, reject) {
  175. handle.call(me, new Handler(onFulfilled, onRejected, resolve, reject));
  176. });
  177. };
  178. Promise.all = function () {
  179. var args = Array.prototype.slice.call(arguments.length === 1 && isArray(arguments[0]) ? arguments[0] : arguments);
  180. return new Promise(function (resolve, reject) {
  181. if (args.length === 0)
  182. return resolve([]);
  183. var remaining = args.length;
  184. function res(i, val) {
  185. try {
  186. if (val && (typeof val === 'object' || typeof val === 'function')) {
  187. var then = val.then;
  188. if (typeof then === 'function') {
  189. then.call(val, function (val) {
  190. res(i, val);
  191. }, reject);
  192. return;
  193. }
  194. }
  195. args[i] = val;
  196. if (--remaining === 0) {
  197. resolve(args);
  198. }
  199. } catch (ex) {
  200. reject(ex);
  201. }
  202. }
  203. for (var i = 0; i < args.length; i++) {
  204. res(i, args[i]);
  205. }
  206. });
  207. };
  208. Promise.resolve = function (value) {
  209. if (value && typeof value === 'object' && value.constructor === Promise) {
  210. return value;
  211. }
  212. return new Promise(function (resolve) {
  213. resolve(value);
  214. });
  215. };
  216. Promise.reject = function (value) {
  217. return new Promise(function (resolve, reject) {
  218. reject(value);
  219. });
  220. };
  221. Promise.race = function (values) {
  222. return new Promise(function (resolve, reject) {
  223. for (var i = 0, len = values.length; i < len; i++) {
  224. values[i].then(resolve, reject);
  225. }
  226. });
  227. };
  228. return Promise;
  229. };
  230. var Promise = window.Promise ? window.Promise : promise();
  231. var constant = function (value) {
  232. return function () {
  233. return value;
  234. };
  235. };
  236. var curry = function (f) {
  237. var x = [];
  238. for (var _i = 1; _i < arguments.length; _i++) {
  239. x[_i - 1] = arguments[_i];
  240. }
  241. var args = new Array(arguments.length - 1);
  242. for (var i = 1; i < arguments.length; i++)
  243. args[i - 1] = arguments[i];
  244. return function () {
  245. var x = [];
  246. for (var _i = 0; _i < arguments.length; _i++) {
  247. x[_i] = arguments[_i];
  248. }
  249. var newArgs = new Array(arguments.length);
  250. for (var j = 0; j < newArgs.length; j++)
  251. newArgs[j] = arguments[j];
  252. var all = args.concat(newArgs);
  253. return f.apply(null, all);
  254. };
  255. };
  256. var never = constant(false);
  257. var always = constant(true);
  258. var never$1 = never;
  259. var always$1 = always;
  260. var none = function () {
  261. return NONE;
  262. };
  263. var NONE = function () {
  264. var eq = function (o) {
  265. return o.isNone();
  266. };
  267. var call$$1 = function (thunk) {
  268. return thunk();
  269. };
  270. var id = function (n) {
  271. return n;
  272. };
  273. var noop$$1 = function () {
  274. };
  275. var nul = function () {
  276. return null;
  277. };
  278. var undef = function () {
  279. return undefined;
  280. };
  281. var me = {
  282. fold: function (n, s) {
  283. return n();
  284. },
  285. is: never$1,
  286. isSome: never$1,
  287. isNone: always$1,
  288. getOr: id,
  289. getOrThunk: call$$1,
  290. getOrDie: function (msg) {
  291. throw new Error(msg || 'error: getOrDie called on none.');
  292. },
  293. getOrNull: nul,
  294. getOrUndefined: undef,
  295. or: id,
  296. orThunk: call$$1,
  297. map: none,
  298. ap: none,
  299. each: noop$$1,
  300. bind: none,
  301. flatten: none,
  302. exists: never$1,
  303. forall: always$1,
  304. filter: none,
  305. equals: eq,
  306. equals_: eq,
  307. toArray: function () {
  308. return [];
  309. },
  310. toString: constant('none()')
  311. };
  312. if (Object.freeze)
  313. Object.freeze(me);
  314. return me;
  315. }();
  316. var some = function (a) {
  317. var constant_a = function () {
  318. return a;
  319. };
  320. var self = function () {
  321. return me;
  322. };
  323. var map = function (f) {
  324. return some(f(a));
  325. };
  326. var bind = function (f) {
  327. return f(a);
  328. };
  329. var me = {
  330. fold: function (n, s) {
  331. return s(a);
  332. },
  333. is: function (v) {
  334. return a === v;
  335. },
  336. isSome: always$1,
  337. isNone: never$1,
  338. getOr: constant_a,
  339. getOrThunk: constant_a,
  340. getOrDie: constant_a,
  341. getOrNull: constant_a,
  342. getOrUndefined: constant_a,
  343. or: self,
  344. orThunk: self,
  345. map: map,
  346. ap: function (optfab) {
  347. return optfab.fold(none, function (fab) {
  348. return some(fab(a));
  349. });
  350. },
  351. each: function (f) {
  352. f(a);
  353. },
  354. bind: bind,
  355. flatten: constant_a,
  356. exists: bind,
  357. forall: bind,
  358. filter: function (f) {
  359. return f(a) ? me : NONE;
  360. },
  361. equals: function (o) {
  362. return o.is(a);
  363. },
  364. equals_: function (o, elementEq) {
  365. return o.fold(never$1, function (b) {
  366. return elementEq(a, b);
  367. });
  368. },
  369. toArray: function () {
  370. return [a];
  371. },
  372. toString: function () {
  373. return 'some(' + a + ')';
  374. }
  375. };
  376. return me;
  377. };
  378. var from = function (value) {
  379. return value === null || value === undefined ? NONE : some(value);
  380. };
  381. var Option = {
  382. some: some,
  383. none: none,
  384. from: from
  385. };
  386. var Global = typeof window !== 'undefined' ? window : Function('return this;')();
  387. var path = function (parts, scope) {
  388. var o = scope !== undefined && scope !== null ? scope : Global;
  389. for (var i = 0; i < parts.length && o !== undefined && o !== null; ++i)
  390. o = o[parts[i]];
  391. return o;
  392. };
  393. var resolve = function (p, scope) {
  394. var parts = p.split('.');
  395. return path(parts, scope);
  396. };
  397. var unsafe = function (name, scope) {
  398. return resolve(name, scope);
  399. };
  400. var getOrDie = function (name, scope) {
  401. var actual = unsafe(name, scope);
  402. if (actual === undefined || actual === null)
  403. throw name + ' not available on this browser';
  404. return actual;
  405. };
  406. var $_901qfodxjkmcwotj = { getOrDie: getOrDie };
  407. function Blob (parts, properties) {
  408. var f = $_901qfodxjkmcwotj.getOrDie('Blob');
  409. return new f(parts, properties);
  410. }
  411. function FileReader () {
  412. var f = $_901qfodxjkmcwotj.getOrDie('FileReader');
  413. return new f();
  414. }
  415. function Uint8Array (arr) {
  416. var f = $_901qfodxjkmcwotj.getOrDie('Uint8Array');
  417. return new f(arr);
  418. }
  419. var requestAnimationFrame = function (callback) {
  420. var f = $_901qfodxjkmcwotj.getOrDie('requestAnimationFrame');
  421. f(callback);
  422. };
  423. var atob = function (base64) {
  424. var f = $_901qfodxjkmcwotj.getOrDie('atob');
  425. return f(base64);
  426. };
  427. var $_cygb2he2jkmcwotp = {
  428. atob: atob,
  429. requestAnimationFrame: requestAnimationFrame
  430. };
  431. function imageToBlob(image) {
  432. var src = image.src;
  433. if (src.indexOf('data:') === 0) {
  434. return dataUriToBlob(src);
  435. }
  436. return anyUriToBlob(src);
  437. }
  438. function blobToImage(blob) {
  439. return new Promise(function (resolve, reject) {
  440. var blobUrl = URL.createObjectURL(blob);
  441. var image = new Image();
  442. var removeListeners = function () {
  443. image.removeEventListener('load', loaded);
  444. image.removeEventListener('error', error);
  445. };
  446. function loaded() {
  447. removeListeners();
  448. resolve(image);
  449. }
  450. function error() {
  451. removeListeners();
  452. reject('Unable to load data of type ' + blob.type + ': ' + blobUrl);
  453. }
  454. image.addEventListener('load', loaded);
  455. image.addEventListener('error', error);
  456. image.src = blobUrl;
  457. if (image.complete) {
  458. loaded();
  459. }
  460. });
  461. }
  462. function anyUriToBlob(url) {
  463. return new Promise(function (resolve, reject) {
  464. var xhr = new XMLHttpRequest();
  465. xhr.open('GET', url, true);
  466. xhr.responseType = 'blob';
  467. xhr.onload = function () {
  468. if (this.status == 200) {
  469. resolve(this.response);
  470. }
  471. };
  472. xhr.onerror = function () {
  473. var _this = this;
  474. var corsError = function () {
  475. var obj = new Error('No access to download image');
  476. obj.code = 18;
  477. obj.name = 'SecurityError';
  478. return obj;
  479. };
  480. var genericError = function () {
  481. return new Error('Error ' + _this.status + ' downloading image');
  482. };
  483. reject(this.status === 0 ? corsError() : genericError());
  484. };
  485. xhr.send();
  486. });
  487. }
  488. function dataUriToBlobSync(uri) {
  489. var data = uri.split(',');
  490. var matches = /data:([^;]+)/.exec(data[0]);
  491. if (!matches)
  492. return Option.none();
  493. var mimetype = matches[1];
  494. var base64 = data[1];
  495. var sliceSize = 1024;
  496. var byteCharacters = $_cygb2he2jkmcwotp.atob(base64);
  497. var bytesLength = byteCharacters.length;
  498. var slicesCount = Math.ceil(bytesLength / sliceSize);
  499. var byteArrays = new Array(slicesCount);
  500. for (var sliceIndex = 0; sliceIndex < slicesCount; ++sliceIndex) {
  501. var begin = sliceIndex * sliceSize;
  502. var end = Math.min(begin + sliceSize, bytesLength);
  503. var bytes = new Array(end - begin);
  504. for (var offset = begin, i = 0; offset < end; ++i, ++offset) {
  505. bytes[i] = byteCharacters[offset].charCodeAt(0);
  506. }
  507. byteArrays[sliceIndex] = Uint8Array(bytes);
  508. }
  509. return Option.some(Blob(byteArrays, { type: mimetype }));
  510. }
  511. function dataUriToBlob(uri) {
  512. return new Promise(function (resolve, reject) {
  513. dataUriToBlobSync(uri).fold(function () {
  514. reject('uri is not base64: ' + uri);
  515. }, resolve);
  516. });
  517. }
  518. function uriToBlob(url) {
  519. if (url.indexOf('blob:') === 0) {
  520. return anyUriToBlob(url);
  521. }
  522. if (url.indexOf('data:') === 0) {
  523. return dataUriToBlob(url);
  524. }
  525. return null;
  526. }
  527. function canvasToBlob(canvas, type, quality) {
  528. type = type || 'image/png';
  529. if (HTMLCanvasElement.prototype.toBlob) {
  530. return new Promise(function (resolve) {
  531. canvas.toBlob(function (blob) {
  532. resolve(blob);
  533. }, type, quality);
  534. });
  535. } else {
  536. return dataUriToBlob(canvas.toDataURL(type, quality));
  537. }
  538. }
  539. function canvasToDataURL(getCanvas, type, quality) {
  540. type = type || 'image/png';
  541. return getCanvas.then(function (canvas) {
  542. return canvas.toDataURL(type, quality);
  543. });
  544. }
  545. function blobToCanvas(blob) {
  546. return blobToImage(blob).then(function (image) {
  547. revokeImageUrl(image);
  548. var context, canvas;
  549. canvas = $_2bu9lddrjkmcwot1.create($_ff7zkmdsjkmcwot2.getWidth(image), $_ff7zkmdsjkmcwot2.getHeight(image));
  550. context = $_2bu9lddrjkmcwot1.get2dContext(canvas);
  551. context.drawImage(image, 0, 0);
  552. return canvas;
  553. });
  554. }
  555. function blobToDataUri(blob) {
  556. return new Promise(function (resolve) {
  557. var reader = new FileReader();
  558. reader.onloadend = function () {
  559. resolve(reader.result);
  560. };
  561. reader.readAsDataURL(blob);
  562. });
  563. }
  564. function blobToArrayBuffer(blob) {
  565. return new Promise(function (resolve) {
  566. var reader = new FileReader();
  567. reader.onloadend = function () {
  568. resolve(reader.result);
  569. };
  570. reader.readAsArrayBuffer(blob);
  571. });
  572. }
  573. function blobToBase64(blob) {
  574. return blobToDataUri(blob).then(function (dataUri) {
  575. return dataUri.split(',')[1];
  576. });
  577. }
  578. function revokeImageUrl(image) {
  579. URL.revokeObjectURL(image.src);
  580. }
  581. var $_818cu1dqjkmcwosl = {
  582. blobToImage: blobToImage,
  583. imageToBlob: imageToBlob,
  584. blobToArrayBuffer: blobToArrayBuffer,
  585. blobToDataUri: blobToDataUri,
  586. blobToBase64: blobToBase64,
  587. dataUriToBlobSync: dataUriToBlobSync,
  588. canvasToBlob: canvasToBlob,
  589. canvasToDataURL: canvasToDataURL,
  590. blobToCanvas: blobToCanvas,
  591. uriToBlob: uriToBlob
  592. };
  593. var blobToImage$1 = function (image) {
  594. return $_818cu1dqjkmcwosl.blobToImage(image);
  595. };
  596. var imageToBlob$1 = function (blob) {
  597. return $_818cu1dqjkmcwosl.imageToBlob(blob);
  598. };
  599. var blobToDataUri$1 = function (blob) {
  600. return $_818cu1dqjkmcwosl.blobToDataUri(blob);
  601. };
  602. var blobToBase64$1 = function (blob) {
  603. return $_818cu1dqjkmcwosl.blobToBase64(blob);
  604. };
  605. var dataUriToBlobSync$1 = function (uri) {
  606. return $_818cu1dqjkmcwosl.dataUriToBlobSync(uri);
  607. };
  608. var uriToBlob$1 = function (uri) {
  609. return Option.from($_818cu1dqjkmcwosl.uriToBlob(uri));
  610. };
  611. var $_l0c0gdpjkmcwosd = {
  612. blobToImage: blobToImage$1,
  613. imageToBlob: imageToBlob$1,
  614. blobToDataUri: blobToDataUri$1,
  615. blobToBase64: blobToBase64$1,
  616. dataUriToBlobSync: dataUriToBlobSync$1,
  617. uriToBlob: uriToBlob$1
  618. };
  619. function create$1(getCanvas, blob, uri) {
  620. var initialType = blob.type;
  621. var getType = constant(initialType);
  622. function toBlob() {
  623. return Promise.resolve(blob);
  624. }
  625. function toDataURL() {
  626. return uri;
  627. }
  628. function toBase64() {
  629. return uri.split(',')[1];
  630. }
  631. function toAdjustedBlob(type, quality) {
  632. return getCanvas.then(function (canvas) {
  633. return $_818cu1dqjkmcwosl.canvasToBlob(canvas, type, quality);
  634. });
  635. }
  636. function toAdjustedDataURL(type, quality) {
  637. return getCanvas.then(function (canvas) {
  638. return $_818cu1dqjkmcwosl.canvasToDataURL(canvas, type, quality);
  639. });
  640. }
  641. function toAdjustedBase64(type, quality) {
  642. return toAdjustedDataURL(type, quality).then(function (dataurl) {
  643. return dataurl.split(',')[1];
  644. });
  645. }
  646. function toCanvas() {
  647. return getCanvas.then($_2bu9lddrjkmcwot1.clone);
  648. }
  649. return {
  650. getType: getType,
  651. toBlob: toBlob,
  652. toDataURL: toDataURL,
  653. toBase64: toBase64,
  654. toAdjustedBlob: toAdjustedBlob,
  655. toAdjustedDataURL: toAdjustedDataURL,
  656. toAdjustedBase64: toAdjustedBase64,
  657. toCanvas: toCanvas
  658. };
  659. }
  660. function fromBlob(blob) {
  661. return $_818cu1dqjkmcwosl.blobToDataUri(blob).then(function (uri) {
  662. return create$1($_818cu1dqjkmcwosl.blobToCanvas(blob), blob, uri);
  663. });
  664. }
  665. function fromCanvas(canvas, type) {
  666. return $_818cu1dqjkmcwosl.canvasToBlob(canvas, type).then(function (blob) {
  667. return create$1(Promise.resolve(canvas), blob, canvas.toDataURL());
  668. });
  669. }
  670. function fromImage(image) {
  671. return $_818cu1dqjkmcwosl.imageToBlob(image).then(function (blob) {
  672. return fromBlob(blob);
  673. });
  674. }
  675. var fromBlobAndUrlSync = function (blob, url) {
  676. return create$1($_818cu1dqjkmcwosl.blobToCanvas(blob), blob, url);
  677. };
  678. var $_1fnn2re5jkmcwou0 = {
  679. fromBlob: fromBlob,
  680. fromCanvas: fromCanvas,
  681. fromImage: fromImage,
  682. fromBlobAndUrlSync: fromBlobAndUrlSync
  683. };
  684. function clamp(value, min, max) {
  685. value = parseFloat(value);
  686. if (value > max) {
  687. value = max;
  688. } else if (value < min) {
  689. value = min;
  690. }
  691. return value;
  692. }
  693. function identity$1() {
  694. return [
  695. 1,
  696. 0,
  697. 0,
  698. 0,
  699. 0,
  700. 0,
  701. 1,
  702. 0,
  703. 0,
  704. 0,
  705. 0,
  706. 0,
  707. 1,
  708. 0,
  709. 0,
  710. 0,
  711. 0,
  712. 0,
  713. 1,
  714. 0,
  715. 0,
  716. 0,
  717. 0,
  718. 0,
  719. 1
  720. ];
  721. }
  722. var DELTA_INDEX = [
  723. 0,
  724. 0.01,
  725. 0.02,
  726. 0.04,
  727. 0.05,
  728. 0.06,
  729. 0.07,
  730. 0.08,
  731. 0.1,
  732. 0.11,
  733. 0.12,
  734. 0.14,
  735. 0.15,
  736. 0.16,
  737. 0.17,
  738. 0.18,
  739. 0.2,
  740. 0.21,
  741. 0.22,
  742. 0.24,
  743. 0.25,
  744. 0.27,
  745. 0.28,
  746. 0.3,
  747. 0.32,
  748. 0.34,
  749. 0.36,
  750. 0.38,
  751. 0.4,
  752. 0.42,
  753. 0.44,
  754. 0.46,
  755. 0.48,
  756. 0.5,
  757. 0.53,
  758. 0.56,
  759. 0.59,
  760. 0.62,
  761. 0.65,
  762. 0.68,
  763. 0.71,
  764. 0.74,
  765. 0.77,
  766. 0.8,
  767. 0.83,
  768. 0.86,
  769. 0.89,
  770. 0.92,
  771. 0.95,
  772. 0.98,
  773. 1,
  774. 1.06,
  775. 1.12,
  776. 1.18,
  777. 1.24,
  778. 1.3,
  779. 1.36,
  780. 1.42,
  781. 1.48,
  782. 1.54,
  783. 1.6,
  784. 1.66,
  785. 1.72,
  786. 1.78,
  787. 1.84,
  788. 1.9,
  789. 1.96,
  790. 2,
  791. 2.12,
  792. 2.25,
  793. 2.37,
  794. 2.5,
  795. 2.62,
  796. 2.75,
  797. 2.87,
  798. 3,
  799. 3.2,
  800. 3.4,
  801. 3.6,
  802. 3.8,
  803. 4,
  804. 4.3,
  805. 4.7,
  806. 4.9,
  807. 5,
  808. 5.5,
  809. 6,
  810. 6.5,
  811. 6.8,
  812. 7,
  813. 7.3,
  814. 7.5,
  815. 7.8,
  816. 8,
  817. 8.4,
  818. 8.7,
  819. 9,
  820. 9.4,
  821. 9.6,
  822. 9.8,
  823. 10
  824. ];
  825. function multiply(matrix1, matrix2) {
  826. var i, j, k, val, col = [], out = new Array(10);
  827. for (i = 0; i < 5; i++) {
  828. for (j = 0; j < 5; j++) {
  829. col[j] = matrix2[j + i * 5];
  830. }
  831. for (j = 0; j < 5; j++) {
  832. val = 0;
  833. for (k = 0; k < 5; k++) {
  834. val += matrix1[j + k * 5] * col[k];
  835. }
  836. out[j + i * 5] = val;
  837. }
  838. }
  839. return out;
  840. }
  841. function adjust(matrix, adjustValue) {
  842. adjustValue = clamp(adjustValue, 0, 1);
  843. return matrix.map(function (value, index) {
  844. if (index % 6 === 0) {
  845. value = 1 - (1 - value) * adjustValue;
  846. } else {
  847. value *= adjustValue;
  848. }
  849. return clamp(value, 0, 1);
  850. });
  851. }
  852. function adjustContrast(matrix, value) {
  853. var x;
  854. value = clamp(value, -1, 1);
  855. value *= 100;
  856. if (value < 0) {
  857. x = 127 + value / 100 * 127;
  858. } else {
  859. x = value % 1;
  860. if (x === 0) {
  861. x = DELTA_INDEX[value];
  862. } else {
  863. x = DELTA_INDEX[Math.floor(value)] * (1 - x) + DELTA_INDEX[Math.floor(value) + 1] * x;
  864. }
  865. x = x * 127 + 127;
  866. }
  867. return multiply(matrix, [
  868. x / 127,
  869. 0,
  870. 0,
  871. 0,
  872. 0.5 * (127 - x),
  873. 0,
  874. x / 127,
  875. 0,
  876. 0,
  877. 0.5 * (127 - x),
  878. 0,
  879. 0,
  880. x / 127,
  881. 0,
  882. 0.5 * (127 - x),
  883. 0,
  884. 0,
  885. 0,
  886. 1,
  887. 0,
  888. 0,
  889. 0,
  890. 0,
  891. 0,
  892. 1
  893. ]);
  894. }
  895. function adjustSaturation(matrix, value) {
  896. var x, lumR, lumG, lumB;
  897. value = clamp(value, -1, 1);
  898. x = 1 + (value > 0 ? 3 * value : value);
  899. lumR = 0.3086;
  900. lumG = 0.6094;
  901. lumB = 0.082;
  902. return multiply(matrix, [
  903. lumR * (1 - x) + x,
  904. lumG * (1 - x),
  905. lumB * (1 - x),
  906. 0,
  907. 0,
  908. lumR * (1 - x),
  909. lumG * (1 - x) + x,
  910. lumB * (1 - x),
  911. 0,
  912. 0,
  913. lumR * (1 - x),
  914. lumG * (1 - x),
  915. lumB * (1 - x) + x,
  916. 0,
  917. 0,
  918. 0,
  919. 0,
  920. 0,
  921. 1,
  922. 0,
  923. 0,
  924. 0,
  925. 0,
  926. 0,
  927. 1
  928. ]);
  929. }
  930. function adjustHue(matrix, angle) {
  931. var cosVal, sinVal, lumR, lumG, lumB;
  932. angle = clamp(angle, -180, 180) / 180 * Math.PI;
  933. cosVal = Math.cos(angle);
  934. sinVal = Math.sin(angle);
  935. lumR = 0.213;
  936. lumG = 0.715;
  937. lumB = 0.072;
  938. return multiply(matrix, [
  939. lumR + cosVal * (1 - lumR) + sinVal * -lumR,
  940. lumG + cosVal * -lumG + sinVal * -lumG,
  941. lumB + cosVal * -lumB + sinVal * (1 - lumB),
  942. 0,
  943. 0,
  944. lumR + cosVal * -lumR + sinVal * 0.143,
  945. lumG + cosVal * (1 - lumG) + sinVal * 0.14,
  946. lumB + cosVal * -lumB + sinVal * -0.283,
  947. 0,
  948. 0,
  949. lumR + cosVal * -lumR + sinVal * -(1 - lumR),
  950. lumG + cosVal * -lumG + sinVal * lumG,
  951. lumB + cosVal * (1 - lumB) + sinVal * lumB,
  952. 0,
  953. 0,
  954. 0,
  955. 0,
  956. 0,
  957. 1,
  958. 0,
  959. 0,
  960. 0,
  961. 0,
  962. 0,
  963. 1
  964. ]);
  965. }
  966. function adjustBrightness(matrix, value) {
  967. value = clamp(255 * value, -255, 255);
  968. return multiply(matrix, [
  969. 1,
  970. 0,
  971. 0,
  972. 0,
  973. value,
  974. 0,
  975. 1,
  976. 0,
  977. 0,
  978. value,
  979. 0,
  980. 0,
  981. 1,
  982. 0,
  983. value,
  984. 0,
  985. 0,
  986. 0,
  987. 1,
  988. 0,
  989. 0,
  990. 0,
  991. 0,
  992. 0,
  993. 1
  994. ]);
  995. }
  996. function adjustColors(matrix, adjustR, adjustG, adjustB) {
  997. adjustR = clamp(adjustR, 0, 2);
  998. adjustG = clamp(adjustG, 0, 2);
  999. adjustB = clamp(adjustB, 0, 2);
  1000. return multiply(matrix, [
  1001. adjustR,
  1002. 0,
  1003. 0,
  1004. 0,
  1005. 0,
  1006. 0,
  1007. adjustG,
  1008. 0,
  1009. 0,
  1010. 0,
  1011. 0,
  1012. 0,
  1013. adjustB,
  1014. 0,
  1015. 0,
  1016. 0,
  1017. 0,
  1018. 0,
  1019. 1,
  1020. 0,
  1021. 0,
  1022. 0,
  1023. 0,
  1024. 0,
  1025. 1
  1026. ]);
  1027. }
  1028. function adjustSepia(matrix, value) {
  1029. value = clamp(value, 0, 1);
  1030. return multiply(matrix, adjust([
  1031. 0.393,
  1032. 0.769,
  1033. 0.189,
  1034. 0,
  1035. 0,
  1036. 0.349,
  1037. 0.686,
  1038. 0.168,
  1039. 0,
  1040. 0,
  1041. 0.272,
  1042. 0.534,
  1043. 0.131,
  1044. 0,
  1045. 0,
  1046. 0,
  1047. 0,
  1048. 0,
  1049. 1,
  1050. 0,
  1051. 0,
  1052. 0,
  1053. 0,
  1054. 0,
  1055. 1
  1056. ], value));
  1057. }
  1058. function adjustGrayscale(matrix, value) {
  1059. value = clamp(value, 0, 1);
  1060. return multiply(matrix, adjust([
  1061. 0.33,
  1062. 0.34,
  1063. 0.33,
  1064. 0,
  1065. 0,
  1066. 0.33,
  1067. 0.34,
  1068. 0.33,
  1069. 0,
  1070. 0,
  1071. 0.33,
  1072. 0.34,
  1073. 0.33,
  1074. 0,
  1075. 0,
  1076. 0,
  1077. 0,
  1078. 0,
  1079. 1,
  1080. 0,
  1081. 0,
  1082. 0,
  1083. 0,
  1084. 0,
  1085. 1
  1086. ], value));
  1087. }
  1088. var $_5zsstde6jkmcwou6 = {
  1089. identity: identity$1,
  1090. adjust: adjust,
  1091. multiply: multiply,
  1092. adjustContrast: adjustContrast,
  1093. adjustBrightness: adjustBrightness,
  1094. adjustSaturation: adjustSaturation,
  1095. adjustHue: adjustHue,
  1096. adjustColors: adjustColors,
  1097. adjustSepia: adjustSepia,
  1098. adjustGrayscale: adjustGrayscale
  1099. };
  1100. function colorFilter(ir, matrix) {
  1101. return ir.toCanvas().then(function (canvas) {
  1102. return applyColorFilter(canvas, ir.getType(), matrix);
  1103. });
  1104. }
  1105. function applyColorFilter(canvas, type, matrix) {
  1106. var context = $_2bu9lddrjkmcwot1.get2dContext(canvas);
  1107. var pixels;
  1108. function applyMatrix(pixels, m) {
  1109. var d = pixels.data, r, g, b, a, i, m0 = m[0], m1 = m[1], m2 = m[2], m3 = m[3], m4 = m[4], m5 = m[5], m6 = m[6], m7 = m[7], m8 = m[8], m9 = m[9], m10 = m[10], m11 = m[11], m12 = m[12], m13 = m[13], m14 = m[14], m15 = m[15], m16 = m[16], m17 = m[17], m18 = m[18], m19 = m[19];
  1110. for (i = 0; i < d.length; i += 4) {
  1111. r = d[i];
  1112. g = d[i + 1];
  1113. b = d[i + 2];
  1114. a = d[i + 3];
  1115. d[i] = r * m0 + g * m1 + b * m2 + a * m3 + m4;
  1116. d[i + 1] = r * m5 + g * m6 + b * m7 + a * m8 + m9;
  1117. d[i + 2] = r * m10 + g * m11 + b * m12 + a * m13 + m14;
  1118. d[i + 3] = r * m15 + g * m16 + b * m17 + a * m18 + m19;
  1119. }
  1120. return pixels;
  1121. }
  1122. pixels = applyMatrix(context.getImageData(0, 0, canvas.width, canvas.height), matrix);
  1123. context.putImageData(pixels, 0, 0);
  1124. return $_1fnn2re5jkmcwou0.fromCanvas(canvas, type);
  1125. }
  1126. function convoluteFilter(ir, matrix) {
  1127. return ir.toCanvas().then(function (canvas) {
  1128. return applyConvoluteFilter(canvas, ir.getType(), matrix);
  1129. });
  1130. }
  1131. function applyConvoluteFilter(canvas, type, matrix) {
  1132. var context = $_2bu9lddrjkmcwot1.get2dContext(canvas);
  1133. var pixelsIn, pixelsOut;
  1134. function applyMatrix(pixelsIn, pixelsOut, matrix) {
  1135. var rgba, drgba, side, halfSide, x, y, r, g, b, cx, cy, scx, scy, offset, wt, w, h;
  1136. function clamp(value, min, max) {
  1137. if (value > max) {
  1138. value = max;
  1139. } else if (value < min) {
  1140. value = min;
  1141. }
  1142. return value;
  1143. }
  1144. side = Math.round(Math.sqrt(matrix.length));
  1145. halfSide = Math.floor(side / 2);
  1146. rgba = pixelsIn.data;
  1147. drgba = pixelsOut.data;
  1148. w = pixelsIn.width;
  1149. h = pixelsIn.height;
  1150. for (y = 0; y < h; y++) {
  1151. for (x = 0; x < w; x++) {
  1152. r = g = b = 0;
  1153. for (cy = 0; cy < side; cy++) {
  1154. for (cx = 0; cx < side; cx++) {
  1155. scx = clamp(x + cx - halfSide, 0, w - 1);
  1156. scy = clamp(y + cy - halfSide, 0, h - 1);
  1157. offset = (scy * w + scx) * 4;
  1158. wt = matrix[cy * side + cx];
  1159. r += rgba[offset] * wt;
  1160. g += rgba[offset + 1] * wt;
  1161. b += rgba[offset + 2] * wt;
  1162. }
  1163. }
  1164. offset = (y * w + x) * 4;
  1165. drgba[offset] = clamp(r, 0, 255);
  1166. drgba[offset + 1] = clamp(g, 0, 255);
  1167. drgba[offset + 2] = clamp(b, 0, 255);
  1168. }
  1169. }
  1170. return pixelsOut;
  1171. }
  1172. pixelsIn = context.getImageData(0, 0, canvas.width, canvas.height);
  1173. pixelsOut = context.getImageData(0, 0, canvas.width, canvas.height);
  1174. pixelsOut = applyMatrix(pixelsIn, pixelsOut, matrix);
  1175. context.putImageData(pixelsOut, 0, 0);
  1176. return $_1fnn2re5jkmcwou0.fromCanvas(canvas, type);
  1177. }
  1178. function functionColorFilter(colorFn) {
  1179. var filterImpl = function (canvas, type, value) {
  1180. var context = $_2bu9lddrjkmcwot1.get2dContext(canvas);
  1181. var pixels, i, lookup = new Array(256);
  1182. function applyLookup(pixels, lookup) {
  1183. var d = pixels.data, i;
  1184. for (i = 0; i < d.length; i += 4) {
  1185. d[i] = lookup[d[i]];
  1186. d[i + 1] = lookup[d[i + 1]];
  1187. d[i + 2] = lookup[d[i + 2]];
  1188. }
  1189. return pixels;
  1190. }
  1191. for (i = 0; i < lookup.length; i++) {
  1192. lookup[i] = colorFn(i, value);
  1193. }
  1194. pixels = applyLookup(context.getImageData(0, 0, canvas.width, canvas.height), lookup);
  1195. context.putImageData(pixels, 0, 0);
  1196. return $_1fnn2re5jkmcwou0.fromCanvas(canvas, type);
  1197. };
  1198. return function (ir, value) {
  1199. return ir.toCanvas().then(function (canvas) {
  1200. return filterImpl(canvas, ir.getType(), value);
  1201. });
  1202. };
  1203. }
  1204. function complexAdjustableColorFilter(matrixAdjustFn) {
  1205. return function (ir, adjust) {
  1206. return colorFilter(ir, matrixAdjustFn($_5zsstde6jkmcwou6.identity(), adjust));
  1207. };
  1208. }
  1209. function basicColorFilter(matrix) {
  1210. return function (ir) {
  1211. return colorFilter(ir, matrix);
  1212. };
  1213. }
  1214. function basicConvolutionFilter(kernel) {
  1215. return function (ir) {
  1216. return convoluteFilter(ir, kernel);
  1217. };
  1218. }
  1219. var $_3lo5mbe4jkmcwotv = {
  1220. invert: basicColorFilter([
  1221. -1,
  1222. 0,
  1223. 0,
  1224. 0,
  1225. 255,
  1226. 0,
  1227. -1,
  1228. 0,
  1229. 0,
  1230. 255,
  1231. 0,
  1232. 0,
  1233. -1,
  1234. 0,
  1235. 255,
  1236. 0,
  1237. 0,
  1238. 0,
  1239. 1,
  1240. 0
  1241. ]),
  1242. brightness: complexAdjustableColorFilter($_5zsstde6jkmcwou6.adjustBrightness),
  1243. hue: complexAdjustableColorFilter($_5zsstde6jkmcwou6.adjustHue),
  1244. saturate: complexAdjustableColorFilter($_5zsstde6jkmcwou6.adjustSaturation),
  1245. contrast: complexAdjustableColorFilter($_5zsstde6jkmcwou6.adjustContrast),
  1246. grayscale: complexAdjustableColorFilter($_5zsstde6jkmcwou6.adjustGrayscale),
  1247. sepia: complexAdjustableColorFilter($_5zsstde6jkmcwou6.adjustSepia),
  1248. colorize: function (ir, adjustR, adjustG, adjustB) {
  1249. return colorFilter(ir, $_5zsstde6jkmcwou6.adjustColors($_5zsstde6jkmcwou6.identity(), adjustR, adjustG, adjustB));
  1250. },
  1251. sharpen: basicConvolutionFilter([
  1252. 0,
  1253. -1,
  1254. 0,
  1255. -1,
  1256. 5,
  1257. -1,
  1258. 0,
  1259. -1,
  1260. 0
  1261. ]),
  1262. emboss: basicConvolutionFilter([
  1263. -2,
  1264. -1,
  1265. 0,
  1266. -1,
  1267. 1,
  1268. 1,
  1269. 0,
  1270. 1,
  1271. 2
  1272. ]),
  1273. gamma: functionColorFilter(function (color, value) {
  1274. return Math.pow(color / 255, 1 - value) * 255;
  1275. }),
  1276. exposure: functionColorFilter(function (color, value) {
  1277. return 255 * (1 - Math.exp(-(color / 255) * value));
  1278. }),
  1279. colorFilter: colorFilter,
  1280. convoluteFilter: convoluteFilter
  1281. };
  1282. function scale(image, dW, dH) {
  1283. var sW = $_ff7zkmdsjkmcwot2.getWidth(image);
  1284. var sH = $_ff7zkmdsjkmcwot2.getHeight(image);
  1285. var wRatio = dW / sW;
  1286. var hRatio = dH / sH;
  1287. var scaleCapped = false;
  1288. if (wRatio < 0.5 || wRatio > 2) {
  1289. wRatio = wRatio < 0.5 ? 0.5 : 2;
  1290. scaleCapped = true;
  1291. }
  1292. if (hRatio < 0.5 || hRatio > 2) {
  1293. hRatio = hRatio < 0.5 ? 0.5 : 2;
  1294. scaleCapped = true;
  1295. }
  1296. var scaled = _scale(image, wRatio, hRatio);
  1297. return !scaleCapped ? scaled : scaled.then(function (tCanvas) {
  1298. return scale(tCanvas, dW, dH);
  1299. });
  1300. }
  1301. function _scale(image, wRatio, hRatio) {
  1302. return new Promise(function (resolve) {
  1303. var sW = $_ff7zkmdsjkmcwot2.getWidth(image);
  1304. var sH = $_ff7zkmdsjkmcwot2.getHeight(image);
  1305. var dW = Math.floor(sW * wRatio);
  1306. var dH = Math.floor(sH * hRatio);
  1307. var canvas = $_2bu9lddrjkmcwot1.create(dW, dH);
  1308. var context = $_2bu9lddrjkmcwot1.get2dContext(canvas);
  1309. context.drawImage(image, 0, 0, sW, sH, 0, 0, dW, dH);
  1310. resolve(canvas);
  1311. });
  1312. }
  1313. var $_4zfeepe8jkmcwoud = { scale: scale };
  1314. function rotate(ir, angle) {
  1315. return ir.toCanvas().then(function (canvas) {
  1316. return applyRotate(canvas, ir.getType(), angle);
  1317. });
  1318. }
  1319. function applyRotate(image, type, angle) {
  1320. var canvas = $_2bu9lddrjkmcwot1.create(image.width, image.height);
  1321. var context = $_2bu9lddrjkmcwot1.get2dContext(canvas);
  1322. var translateX = 0, translateY = 0;
  1323. angle = angle < 0 ? 360 + angle : angle;
  1324. if (angle == 90 || angle == 270) {
  1325. $_2bu9lddrjkmcwot1.resize(canvas, canvas.height, canvas.width);
  1326. }
  1327. if (angle == 90 || angle == 180) {
  1328. translateX = canvas.width;
  1329. }
  1330. if (angle == 270 || angle == 180) {
  1331. translateY = canvas.height;
  1332. }
  1333. context.translate(translateX, translateY);
  1334. context.rotate(angle * Math.PI / 180);
  1335. context.drawImage(image, 0, 0);
  1336. return $_1fnn2re5jkmcwou0.fromCanvas(canvas, type);
  1337. }
  1338. function flip(ir, axis) {
  1339. return ir.toCanvas().then(function (canvas) {
  1340. return applyFlip(canvas, ir.getType(), axis);
  1341. });
  1342. }
  1343. function applyFlip(image, type, axis) {
  1344. var canvas = $_2bu9lddrjkmcwot1.create(image.width, image.height);
  1345. var context = $_2bu9lddrjkmcwot1.get2dContext(canvas);
  1346. if (axis == 'v') {
  1347. context.scale(1, -1);
  1348. context.drawImage(image, 0, -canvas.height);
  1349. } else {
  1350. context.scale(-1, 1);
  1351. context.drawImage(image, -canvas.width, 0);
  1352. }
  1353. return $_1fnn2re5jkmcwou0.fromCanvas(canvas, type);
  1354. }
  1355. function crop(ir, x, y, w, h) {
  1356. return ir.toCanvas().then(function (canvas) {
  1357. return applyCrop(canvas, ir.getType(), x, y, w, h);
  1358. });
  1359. }
  1360. function applyCrop(image, type, x, y, w, h) {
  1361. var canvas = $_2bu9lddrjkmcwot1.create(w, h);
  1362. var context = $_2bu9lddrjkmcwot1.get2dContext(canvas);
  1363. context.drawImage(image, -x, -y);
  1364. return $_1fnn2re5jkmcwou0.fromCanvas(canvas, type);
  1365. }
  1366. function resize$1(ir, w, h) {
  1367. return ir.toCanvas().then(function (canvas) {
  1368. return $_4zfeepe8jkmcwoud.scale(canvas, w, h).then(function (newCanvas) {
  1369. return $_1fnn2re5jkmcwou0.fromCanvas(newCanvas, ir.getType());
  1370. });
  1371. });
  1372. }
  1373. var $_dd55mbe7jkmcwoub = {
  1374. rotate: rotate,
  1375. flip: flip,
  1376. crop: crop,
  1377. resize: resize$1
  1378. };
  1379. var BinaryReader = function () {
  1380. function BinaryReader(ar) {
  1381. this.littleEndian = false;
  1382. this._dv = new DataView(ar);
  1383. }
  1384. BinaryReader.prototype.readByteAt = function (idx) {
  1385. return this._dv.getUint8(idx);
  1386. };
  1387. BinaryReader.prototype.read = function (idx, size) {
  1388. if (idx + size > this.length()) {
  1389. return null;
  1390. }
  1391. var mv = this.littleEndian ? 0 : -8 * (size - 1);
  1392. for (var i = 0, sum = 0; i < size; i++) {
  1393. sum |= this.readByteAt(idx + i) << Math.abs(mv + i * 8);
  1394. }
  1395. return sum;
  1396. };
  1397. BinaryReader.prototype.BYTE = function (idx) {
  1398. return this.read(idx, 1);
  1399. };
  1400. BinaryReader.prototype.SHORT = function (idx) {
  1401. return this.read(idx, 2);
  1402. };
  1403. BinaryReader.prototype.LONG = function (idx) {
  1404. return this.read(idx, 4);
  1405. };
  1406. BinaryReader.prototype.SLONG = function (idx) {
  1407. var num = this.read(idx, 4);
  1408. return num > 2147483647 ? num - 4294967296 : num;
  1409. };
  1410. BinaryReader.prototype.CHAR = function (idx) {
  1411. return String.fromCharCode(this.read(idx, 1));
  1412. };
  1413. BinaryReader.prototype.STRING = function (idx, count) {
  1414. return this.asArray('CHAR', idx, count).join('');
  1415. };
  1416. BinaryReader.prototype.SEGMENT = function (idx, size) {
  1417. var ar = this._dv.buffer;
  1418. switch (arguments.length) {
  1419. case 2:
  1420. return ar.slice(idx, idx + size);
  1421. case 1:
  1422. return ar.slice(idx);
  1423. default:
  1424. return ar;
  1425. }
  1426. };
  1427. BinaryReader.prototype.asArray = function (type, idx, count) {
  1428. var values = [];
  1429. for (var i = 0; i < count; i++) {
  1430. values[i] = this[type](idx + i);
  1431. }
  1432. return values;
  1433. };
  1434. BinaryReader.prototype.length = function () {
  1435. return this._dv ? this._dv.byteLength : 0;
  1436. };
  1437. return BinaryReader;
  1438. }();
  1439. var tags = {
  1440. tiff: {
  1441. 274: 'Orientation',
  1442. 270: 'ImageDescription',
  1443. 271: 'Make',
  1444. 272: 'Model',
  1445. 305: 'Software',
  1446. 34665: 'ExifIFDPointer',
  1447. 34853: 'GPSInfoIFDPointer'
  1448. },
  1449. exif: {
  1450. 36864: 'ExifVersion',
  1451. 40961: 'ColorSpace',
  1452. 40962: 'PixelXDimension',
  1453. 40963: 'PixelYDimension',
  1454. 36867: 'DateTimeOriginal',
  1455. 33434: 'ExposureTime',
  1456. 33437: 'FNumber',
  1457. 34855: 'ISOSpeedRatings',
  1458. 37377: 'ShutterSpeedValue',
  1459. 37378: 'ApertureValue',
  1460. 37383: 'MeteringMode',
  1461. 37384: 'LightSource',
  1462. 37385: 'Flash',
  1463. 37386: 'FocalLength',
  1464. 41986: 'ExposureMode',
  1465. 41987: 'WhiteBalance',
  1466. 41990: 'SceneCaptureType',
  1467. 41988: 'DigitalZoomRatio',
  1468. 41992: 'Contrast',
  1469. 41993: 'Saturation',
  1470. 41994: 'Sharpness'
  1471. },
  1472. gps: {
  1473. 0: 'GPSVersionID',
  1474. 1: 'GPSLatitudeRef',
  1475. 2: 'GPSLatitude',
  1476. 3: 'GPSLongitudeRef',
  1477. 4: 'GPSLongitude'
  1478. },
  1479. thumb: {
  1480. 513: 'JPEGInterchangeFormat',
  1481. 514: 'JPEGInterchangeFormatLength'
  1482. }
  1483. };
  1484. var tagDescs = {
  1485. 'ColorSpace': {
  1486. 1: 'sRGB',
  1487. 0: 'Uncalibrated'
  1488. },
  1489. 'MeteringMode': {
  1490. 0: 'Unknown',
  1491. 1: 'Average',
  1492. 2: 'CenterWeightedAverage',
  1493. 3: 'Spot',
  1494. 4: 'MultiSpot',
  1495. 5: 'Pattern',
  1496. 6: 'Partial',
  1497. 255: 'Other'
  1498. },
  1499. 'LightSource': {
  1500. 1: 'Daylight',
  1501. 2: 'Fliorescent',
  1502. 3: 'Tungsten',
  1503. 4: 'Flash',
  1504. 9: 'Fine weather',
  1505. 10: 'Cloudy weather',
  1506. 11: 'Shade',
  1507. 12: 'Daylight fluorescent (D 5700 - 7100K)',
  1508. 13: 'Day white fluorescent (N 4600 -5400K)',
  1509. 14: 'Cool white fluorescent (W 3900 - 4500K)',
  1510. 15: 'White fluorescent (WW 3200 - 3700K)',
  1511. 17: 'Standard light A',
  1512. 18: 'Standard light B',
  1513. 19: 'Standard light C',
  1514. 20: 'D55',
  1515. 21: 'D65',
  1516. 22: 'D75',
  1517. 23: 'D50',
  1518. 24: 'ISO studio tungsten',
  1519. 255: 'Other'
  1520. },
  1521. 'Flash': {
  1522. 0: 'Flash did not fire',
  1523. 1: 'Flash fired',
  1524. 5: 'Strobe return light not detected',
  1525. 7: 'Strobe return light detected',
  1526. 9: 'Flash fired, compulsory flash mode',
  1527. 13: 'Flash fired, compulsory flash mode, return light not detected',
  1528. 15: 'Flash fired, compulsory flash mode, return light detected',
  1529. 16: 'Flash did not fire, compulsory flash mode',
  1530. 24: 'Flash did not fire, auto mode',
  1531. 25: 'Flash fired, auto mode',
  1532. 29: 'Flash fired, auto mode, return light not detected',
  1533. 31: 'Flash fired, auto mode, return light detected',
  1534. 32: 'No flash function',
  1535. 65: 'Flash fired, red-eye reduction mode',
  1536. 69: 'Flash fired, red-eye reduction mode, return light not detected',
  1537. 71: 'Flash fired, red-eye reduction mode, return light detected',
  1538. 73: 'Flash fired, compulsory flash mode, red-eye reduction mode',
  1539. 77: 'Flash fired, compulsory flash mode, red-eye reduction mode, return light not detected',
  1540. 79: 'Flash fired, compulsory flash mode, red-eye reduction mode, return light detected',
  1541. 89: 'Flash fired, auto mode, red-eye reduction mode',
  1542. 93: 'Flash fired, auto mode, return light not detected, red-eye reduction mode',
  1543. 95: 'Flash fired, auto mode, return light detected, red-eye reduction mode'
  1544. },
  1545. 'ExposureMode': {
  1546. 0: 'Auto exposure',
  1547. 1: 'Manual exposure',
  1548. 2: 'Auto bracket'
  1549. },
  1550. 'WhiteBalance': {
  1551. 0: 'Auto white balance',
  1552. 1: 'Manual white balance'
  1553. },
  1554. 'SceneCaptureType': {
  1555. 0: 'Standard',
  1556. 1: 'Landscape',
  1557. 2: 'Portrait',
  1558. 3: 'Night scene'
  1559. },
  1560. 'Contrast': {
  1561. 0: 'Normal',
  1562. 1: 'Soft',
  1563. 2: 'Hard'
  1564. },
  1565. 'Saturation': {
  1566. 0: 'Normal',
  1567. 1: 'Low saturation',
  1568. 2: 'High saturation'
  1569. },
  1570. 'Sharpness': {
  1571. 0: 'Normal',
  1572. 1: 'Soft',
  1573. 2: 'Hard'
  1574. },
  1575. 'GPSLatitudeRef': {
  1576. N: 'North latitude',
  1577. S: 'South latitude'
  1578. },
  1579. 'GPSLongitudeRef': {
  1580. E: 'East longitude',
  1581. W: 'West longitude'
  1582. }
  1583. };
  1584. var ExifReader = function () {
  1585. function ExifReader(ar) {
  1586. this._offsets = {
  1587. tiffHeader: 10,
  1588. IFD0: null,
  1589. IFD1: null,
  1590. exifIFD: null,
  1591. gpsIFD: null
  1592. };
  1593. this._tiffTags = {};
  1594. var self = this;
  1595. self._reader = new BinaryReader(ar);
  1596. self._idx = self._offsets.tiffHeader;
  1597. if (self.SHORT(0) !== 65505 || self.STRING(4, 5).toUpperCase() !== 'EXIF\0') {
  1598. throw new Error('Exif data cannot be read or not available.');
  1599. }
  1600. self._reader.littleEndian = self.SHORT(self._idx) == 18761;
  1601. if (self.SHORT(self._idx += 2) !== 42) {
  1602. throw new Error('Invalid Exif data.');
  1603. }
  1604. self._offsets.IFD0 = self._offsets.tiffHeader + self.LONG(self._idx += 2);
  1605. self._tiffTags = self.extractTags(self._offsets.IFD0, tags.tiff);
  1606. if ('ExifIFDPointer' in self._tiffTags) {
  1607. self._offsets.exifIFD = self._offsets.tiffHeader + self._tiffTags.ExifIFDPointer;
  1608. delete self._tiffTags.ExifIFDPointer;
  1609. }
  1610. if ('GPSInfoIFDPointer' in self._tiffTags) {
  1611. self._offsets.gpsIFD = self._offsets.tiffHeader + self._tiffTags.GPSInfoIFDPointer;
  1612. delete self._tiffTags.GPSInfoIFDPointer;
  1613. }
  1614. var IFD1Offset = self.LONG(self._offsets.IFD0 + self.SHORT(self._offsets.IFD0) * 12 + 2);
  1615. if (IFD1Offset) {
  1616. self._offsets.IFD1 = self._offsets.tiffHeader + IFD1Offset;
  1617. }
  1618. }
  1619. ExifReader.prototype.BYTE = function (idx) {
  1620. return this._reader.BYTE(idx);
  1621. };
  1622. ExifReader.prototype.SHORT = function (idx) {
  1623. return this._reader.SHORT(idx);
  1624. };
  1625. ExifReader.prototype.LONG = function (idx) {
  1626. return this._reader.LONG(idx);
  1627. };
  1628. ExifReader.prototype.SLONG = function (idx) {
  1629. return this._reader.SLONG(idx);
  1630. };
  1631. ExifReader.prototype.CHAR = function (idx) {
  1632. return this._reader.CHAR(idx);
  1633. };
  1634. ExifReader.prototype.STRING = function (idx, count) {
  1635. return this._reader.STRING(idx, count);
  1636. };
  1637. ExifReader.prototype.SEGMENT = function (idx, size) {
  1638. return this._reader.SEGMENT(idx, size);
  1639. };
  1640. ExifReader.prototype.asArray = function (type, idx, count) {
  1641. var values = [];
  1642. for (var i = 0; i < count; i++) {
  1643. values[i] = this[type](idx + i);
  1644. }
  1645. return values;
  1646. };
  1647. ExifReader.prototype.length = function () {
  1648. return this._reader.length();
  1649. };
  1650. ExifReader.prototype.UNDEFINED = function () {
  1651. return this.BYTE.apply(this, arguments);
  1652. };
  1653. ExifReader.prototype.RATIONAL = function (idx) {
  1654. return this.LONG(idx) / this.LONG(idx + 4);
  1655. };
  1656. ExifReader.prototype.SRATIONAL = function (idx) {
  1657. return this.SLONG(idx) / this.SLONG(idx + 4);
  1658. };
  1659. ExifReader.prototype.ASCII = function (idx) {
  1660. return this.CHAR(idx);
  1661. };
  1662. ExifReader.prototype.TIFF = function () {
  1663. return this._tiffTags;
  1664. };
  1665. ExifReader.prototype.EXIF = function () {
  1666. var self = this;
  1667. var Exif = null;
  1668. if (self._offsets.exifIFD) {
  1669. try {
  1670. Exif = self.extractTags(self._offsets.exifIFD, tags.exif);
  1671. } catch (ex) {
  1672. return null;
  1673. }
  1674. if (Exif.ExifVersion && Array.isArray(Exif.ExifVersion)) {
  1675. for (var i = 0, exifVersion = ''; i < Exif.ExifVersion.length; i++) {
  1676. exifVersion += String.fromCharCode(Exif.ExifVersion[i]);
  1677. }
  1678. Exif.ExifVersion = exifVersion;
  1679. }
  1680. }
  1681. return Exif;
  1682. };
  1683. ExifReader.prototype.GPS = function () {
  1684. var self = this;
  1685. var GPS = null;
  1686. if (self._offsets.gpsIFD) {
  1687. try {
  1688. GPS = self.extractTags(self._offsets.gpsIFD, tags.gps);
  1689. } catch (ex) {
  1690. return null;
  1691. }
  1692. if (GPS.GPSVersionID && Array.isArray(GPS.GPSVersionID)) {
  1693. GPS.GPSVersionID = GPS.GPSVersionID.join('.');
  1694. }
  1695. }
  1696. return GPS;
  1697. };
  1698. ExifReader.prototype.thumb = function () {
  1699. var self = this;
  1700. if (self._offsets.IFD1) {
  1701. try {
  1702. var IFD1Tags = self.extractTags(self._offsets.IFD1, tags.thumb);
  1703. if ('JPEGInterchangeFormat' in IFD1Tags) {
  1704. return self.SEGMENT(self._offsets.tiffHeader + IFD1Tags.JPEGInterchangeFormat, IFD1Tags.JPEGInterchangeFormatLength);
  1705. }
  1706. } catch (ex) {
  1707. }
  1708. }
  1709. return null;
  1710. };
  1711. ExifReader.prototype.extractTags = function (IFD_offset, tags2extract) {
  1712. var self = this;
  1713. var length, i, tag, type, count, size, offset, value, values = [], hash = {};
  1714. var types = {
  1715. 1: 'BYTE',
  1716. 7: 'UNDEFINED',
  1717. 2: 'ASCII',
  1718. 3: 'SHORT',
  1719. 4: 'LONG',
  1720. 5: 'RATIONAL',
  1721. 9: 'SLONG',
  1722. 10: 'SRATIONAL'
  1723. };
  1724. var sizes = {
  1725. 'BYTE': 1,
  1726. 'UNDEFINED': 1,
  1727. 'ASCII': 1,
  1728. 'SHORT': 2,
  1729. 'LONG': 4,
  1730. 'RATIONAL': 8,
  1731. 'SLONG': 4,
  1732. 'SRATIONAL': 8
  1733. };
  1734. length = self.SHORT(IFD_offset);
  1735. for (i = 0; i < length; i++) {
  1736. values = [];
  1737. offset = IFD_offset + 2 + i * 12;
  1738. tag = tags2extract[self.SHORT(offset)];
  1739. if (tag === undefined) {
  1740. continue;
  1741. }
  1742. type = types[self.SHORT(offset += 2)];
  1743. count = self.LONG(offset += 2);
  1744. size = sizes[type];
  1745. if (!size) {
  1746. throw new Error('Invalid Exif data.');
  1747. }
  1748. offset += 4;
  1749. if (size * count > 4) {
  1750. offset = self.LONG(offset) + self._offsets.tiffHeader;
  1751. }
  1752. if (offset + size * count >= self.length()) {
  1753. throw new Error('Invalid Exif data.');
  1754. }
  1755. if (type === 'ASCII') {
  1756. hash[tag] = self.STRING(offset, count).replace(/\0$/, '').trim();
  1757. continue;
  1758. } else {
  1759. values = self.asArray(type, offset, count);
  1760. value = count == 1 ? values[0] : values;
  1761. if (tagDescs.hasOwnProperty(tag) && typeof value != 'object') {
  1762. hash[tag] = tagDescs[tag][value];
  1763. } else {
  1764. hash[tag] = value;
  1765. }
  1766. }
  1767. }
  1768. return hash;
  1769. };
  1770. return ExifReader;
  1771. }();
  1772. var extractFrom = function (blob) {
  1773. return $_818cu1dqjkmcwosl.blobToArrayBuffer(blob).then(function (ar) {
  1774. try {
  1775. var br = new BinaryReader(ar);
  1776. if (br.SHORT(0) === 65496) {
  1777. var headers = extractHeaders(br);
  1778. var app1 = headers.filter(function (header) {
  1779. return header.name === 'APP1';
  1780. });
  1781. var meta = {};
  1782. if (app1.length) {
  1783. var exifReader = new ExifReader(app1[0].segment);
  1784. meta = {
  1785. tiff: exifReader.TIFF(),
  1786. exif: exifReader.EXIF(),
  1787. gps: exifReader.GPS(),
  1788. thumb: exifReader.thumb()
  1789. };
  1790. } else {
  1791. return Promise.reject('Headers did not include required information');
  1792. }
  1793. meta.rawHeaders = headers;
  1794. return meta;
  1795. }
  1796. return Promise.reject('Image was not a jpeg');
  1797. } catch (ex) {
  1798. return Promise.reject('Unsupported format or not an image: ' + blob.type + ' (Exception: ' + ex.message + ')');
  1799. }
  1800. });
  1801. };
  1802. var extractHeaders = function (br) {
  1803. var headers = [], idx, marker, length = 0;
  1804. idx = 2;
  1805. while (idx <= br.length()) {
  1806. marker = br.SHORT(idx);
  1807. if (marker >= 65488 && marker <= 65495) {
  1808. idx += 2;
  1809. continue;
  1810. }
  1811. if (marker === 65498 || marker === 65497) {
  1812. break;
  1813. }
  1814. length = br.SHORT(idx + 2) + 2;
  1815. if (marker >= 65505 && marker <= 65519) {
  1816. headers.push({
  1817. hex: marker,
  1818. name: 'APP' + (marker & 15),
  1819. start: idx,
  1820. length: length,
  1821. segment: br.SEGMENT(idx, length)
  1822. });
  1823. }
  1824. idx += length;
  1825. }
  1826. return headers;
  1827. };
  1828. var $_61aovte9jkmcwoug = { extractFrom: extractFrom };
  1829. var invert = function (ir) {
  1830. return $_3lo5mbe4jkmcwotv.invert(ir);
  1831. };
  1832. var sharpen = function (ir) {
  1833. return $_3lo5mbe4jkmcwotv.sharpen(ir);
  1834. };
  1835. var emboss = function (ir) {
  1836. return $_3lo5mbe4jkmcwotv.emboss(ir);
  1837. };
  1838. var gamma = function (ir, value) {
  1839. return $_3lo5mbe4jkmcwotv.gamma(ir, value);
  1840. };
  1841. var exposure = function (ir, value) {
  1842. return $_3lo5mbe4jkmcwotv.exposure(ir, value);
  1843. };
  1844. var colorize = function (ir, adjustR, adjustG, adjustB) {
  1845. return $_3lo5mbe4jkmcwotv.colorize(ir, adjustR, adjustG, adjustB);
  1846. };
  1847. var brightness = function (ir, adjust) {
  1848. return $_3lo5mbe4jkmcwotv.brightness(ir, adjust);
  1849. };
  1850. var hue = function (ir, adjust) {
  1851. return $_3lo5mbe4jkmcwotv.hue(ir, adjust);
  1852. };
  1853. var saturate = function (ir, adjust) {
  1854. return $_3lo5mbe4jkmcwotv.saturate(ir, adjust);
  1855. };
  1856. var contrast = function (ir, adjust) {
  1857. return $_3lo5mbe4jkmcwotv.contrast(ir, adjust);
  1858. };
  1859. var grayscale = function (ir, adjust) {
  1860. return $_3lo5mbe4jkmcwotv.grayscale(ir, adjust);
  1861. };
  1862. var sepia = function (ir, adjust) {
  1863. return $_3lo5mbe4jkmcwotv.sepia(ir, adjust);
  1864. };
  1865. var flip$1 = function (ir, axis) {
  1866. return $_dd55mbe7jkmcwoub.flip(ir, axis);
  1867. };
  1868. var crop$1 = function (ir, x, y, w, h) {
  1869. return $_dd55mbe7jkmcwoub.crop(ir, x, y, w, h);
  1870. };
  1871. var resize$2 = function (ir, w, h) {
  1872. return $_dd55mbe7jkmcwoub.resize(ir, w, h);
  1873. };
  1874. var rotate$1 = function (ir, angle) {
  1875. return $_dd55mbe7jkmcwoub.rotate(ir, angle);
  1876. };
  1877. var exifRotate = function (ir) {
  1878. var ROTATE_90 = 6;
  1879. var ROTATE_180 = 3;
  1880. var ROTATE_270 = 8;
  1881. var checkRotation = function (data) {
  1882. var orientation = data.tiff.Orientation;
  1883. switch (orientation) {
  1884. case ROTATE_90:
  1885. return rotate$1(ir, 90);
  1886. case ROTATE_180:
  1887. return rotate$1(ir, 180);
  1888. case ROTATE_270:
  1889. return rotate$1(ir, 270);
  1890. default:
  1891. return ir;
  1892. }
  1893. };
  1894. var notJpeg = function () {
  1895. return ir;
  1896. };
  1897. return ir.toBlob().then($_61aovte9jkmcwoug.extractFrom).then(checkRotation, notJpeg);
  1898. };
  1899. var $_5tl1cxe3jkmcwotr = {
  1900. invert: invert,
  1901. sharpen: sharpen,
  1902. emboss: emboss,
  1903. brightness: brightness,
  1904. hue: hue,
  1905. saturate: saturate,
  1906. contrast: contrast,
  1907. grayscale: grayscale,
  1908. sepia: sepia,
  1909. colorize: colorize,
  1910. gamma: gamma,
  1911. exposure: exposure,
  1912. flip: flip$1,
  1913. crop: crop$1,
  1914. resize: resize$2,
  1915. rotate: rotate$1,
  1916. exifRotate: exifRotate
  1917. };
  1918. var blobToImageResult = function (blob) {
  1919. return $_1fnn2re5jkmcwou0.fromBlob(blob);
  1920. };
  1921. var fromBlobAndUrlSync$1 = function (blob, uri) {
  1922. return $_1fnn2re5jkmcwou0.fromBlobAndUrlSync(blob, uri);
  1923. };
  1924. var imageToImageResult = function (image) {
  1925. return $_1fnn2re5jkmcwou0.fromImage(image);
  1926. };
  1927. var imageResultToBlob = function (ir, type, quality) {
  1928. if (type === undefined && quality === undefined) {
  1929. return imageResultToOriginalBlob(ir);
  1930. } else {
  1931. return ir.toAdjustedBlob(type, quality);
  1932. }
  1933. };
  1934. var imageResultToOriginalBlob = function (ir) {
  1935. return ir.toBlob();
  1936. };
  1937. var imageResultToDataURL = function (ir) {
  1938. return ir.toDataURL();
  1939. };
  1940. var $_5w2bq6ecjkmcwov0 = {
  1941. blobToImageResult: blobToImageResult,
  1942. fromBlobAndUrlSync: fromBlobAndUrlSync$1,
  1943. imageToImageResult: imageToImageResult,
  1944. imageResultToBlob: imageResultToBlob,
  1945. imageResultToOriginalBlob: imageResultToOriginalBlob,
  1946. imageResultToDataURL: imageResultToDataURL
  1947. };
  1948. var url = function () {
  1949. return $_901qfodxjkmcwotj.getOrDie('URL');
  1950. };
  1951. var createObjectURL = function (blob) {
  1952. return url().createObjectURL(blob);
  1953. };
  1954. var revokeObjectURL = function (u) {
  1955. url().revokeObjectURL(u);
  1956. };
  1957. var $_51cs3oedjkmcwov1 = {
  1958. createObjectURL: createObjectURL,
  1959. revokeObjectURL: revokeObjectURL
  1960. };
  1961. var global$2 = tinymce.util.Tools.resolve('tinymce.util.Delay');
  1962. var global$3 = tinymce.util.Tools.resolve('tinymce.util.Promise');
  1963. var global$4 = tinymce.util.Tools.resolve('tinymce.util.URI');
  1964. var getToolbarItems = function (editor) {
  1965. return editor.getParam('imagetools_toolbar', 'rotateleft rotateright | flipv fliph | crop editimage imageoptions');
  1966. };
  1967. var getProxyUrl = function (editor) {
  1968. return editor.getParam('imagetools_proxy');
  1969. };
  1970. var getCorsHosts = function (editor) {
  1971. return editor.getParam('imagetools_cors_hosts', [], 'string[]');
  1972. };
  1973. var getCredentialsHosts = function (editor) {
  1974. return editor.getParam('imagetools_credentials_hosts', [], 'string[]');
  1975. };
  1976. var getApiKey = function (editor) {
  1977. return editor.getParam('api_key', editor.getParam('imagetools_api_key', '', 'string'), 'string');
  1978. };
  1979. var getUploadTimeout = function (editor) {
  1980. return editor.getParam('images_upload_timeout', 30000, 'number');
  1981. };
  1982. var shouldReuseFilename = function (editor) {
  1983. return editor.getParam('images_reuse_filename', false, 'boolean');
  1984. };
  1985. var global$5 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils');
  1986. var global$6 = tinymce.util.Tools.resolve('tinymce.ui.Factory');
  1987. function UndoStack () {
  1988. var data = [];
  1989. var index = -1;
  1990. function add(state) {
  1991. var removed;
  1992. removed = data.splice(++index);
  1993. data.push(state);
  1994. return {
  1995. state: state,
  1996. removed: removed
  1997. };
  1998. }
  1999. function undo() {
  2000. if (canUndo()) {
  2001. return data[--index];
  2002. }
  2003. }
  2004. function redo() {
  2005. if (canRedo()) {
  2006. return data[++index];
  2007. }
  2008. }
  2009. function canUndo() {
  2010. return index > 0;
  2011. }
  2012. function canRedo() {
  2013. return index !== -1 && index < data.length - 1;
  2014. }
  2015. return {
  2016. data: data,
  2017. add: add,
  2018. undo: undo,
  2019. redo: redo,
  2020. canUndo: canUndo,
  2021. canRedo: canRedo
  2022. };
  2023. }
  2024. var global$7 = tinymce.util.Tools.resolve('tinymce.geom.Rect');
  2025. var loadImage$1 = function (image) {
  2026. return new global$3(function (resolve) {
  2027. var loaded = function () {
  2028. image.removeEventListener('load', loaded);
  2029. resolve(image);
  2030. };
  2031. if (image.complete) {
  2032. resolve(image);
  2033. } else {
  2034. image.addEventListener('load', loaded);
  2035. }
  2036. });
  2037. };
  2038. var $_4u6vvleojkmcwow0 = { loadImage: loadImage$1 };
  2039. var global$8 = tinymce.util.Tools.resolve('tinymce.dom.DomQuery');
  2040. var global$9 = tinymce.util.Tools.resolve('tinymce.util.Observable');
  2041. var global$10 = tinymce.util.Tools.resolve('tinymce.util.VK');
  2042. var count = 0;
  2043. function CropRect (currentRect, viewPortRect, clampRect, containerElm, action) {
  2044. var instance;
  2045. var handles;
  2046. var dragHelpers;
  2047. var blockers;
  2048. var prefix = 'mce-';
  2049. var id = prefix + 'crid-' + count++;
  2050. handles = [
  2051. {
  2052. name: 'move',
  2053. xMul: 0,
  2054. yMul: 0,
  2055. deltaX: 1,
  2056. deltaY: 1,
  2057. deltaW: 0,
  2058. deltaH: 0,
  2059. label: 'Crop Mask'
  2060. },
  2061. {
  2062. name: 'nw',
  2063. xMul: 0,
  2064. yMul: 0,
  2065. deltaX: 1,
  2066. deltaY: 1,
  2067. deltaW: -1,
  2068. deltaH: -1,
  2069. label: 'Top Left Crop Handle'
  2070. },
  2071. {
  2072. name: 'ne',
  2073. xMul: 1,
  2074. yMul: 0,
  2075. deltaX: 0,
  2076. deltaY: 1,
  2077. deltaW: 1,
  2078. deltaH: -1,
  2079. label: 'Top Right Crop Handle'
  2080. },
  2081. {
  2082. name: 'sw',
  2083. xMul: 0,
  2084. yMul: 1,
  2085. deltaX: 1,
  2086. deltaY: 0,
  2087. deltaW: -1,
  2088. deltaH: 1,
  2089. label: 'Bottom Left Crop Handle'
  2090. },
  2091. {
  2092. name: 'se',
  2093. xMul: 1,
  2094. yMul: 1,
  2095. deltaX: 0,
  2096. deltaY: 0,
  2097. deltaW: 1,
  2098. deltaH: 1,
  2099. label: 'Bottom Right Crop Handle'
  2100. }
  2101. ];
  2102. blockers = [
  2103. 'top',
  2104. 'right',
  2105. 'bottom',
  2106. 'left'
  2107. ];
  2108. function getAbsoluteRect(outerRect, relativeRect) {
  2109. return {
  2110. x: relativeRect.x + outerRect.x,
  2111. y: relativeRect.y + outerRect.y,
  2112. w: relativeRect.w,
  2113. h: relativeRect.h
  2114. };
  2115. }
  2116. function getRelativeRect(outerRect, innerRect) {
  2117. return {
  2118. x: innerRect.x - outerRect.x,
  2119. y: innerRect.y - outerRect.y,
  2120. w: innerRect.w,
  2121. h: innerRect.h
  2122. };
  2123. }
  2124. function getInnerRect() {
  2125. return getRelativeRect(clampRect, currentRect);
  2126. }
  2127. function moveRect(handle, startRect, deltaX, deltaY) {
  2128. var x, y, w, h, rect;
  2129. x = startRect.x;
  2130. y = startRect.y;
  2131. w = startRect.w;
  2132. h = startRect.h;
  2133. x += deltaX * handle.deltaX;
  2134. y += deltaY * handle.deltaY;
  2135. w += deltaX * handle.deltaW;
  2136. h += deltaY * handle.deltaH;
  2137. if (w < 20) {
  2138. w = 20;
  2139. }
  2140. if (h < 20) {
  2141. h = 20;
  2142. }
  2143. rect = currentRect = global$7.clamp({
  2144. x: x,
  2145. y: y,
  2146. w: w,
  2147. h: h
  2148. }, clampRect, handle.name === 'move');
  2149. rect = getRelativeRect(clampRect, rect);
  2150. instance.fire('updateRect', { rect: rect });
  2151. setInnerRect(rect);
  2152. }
  2153. function render() {
  2154. function createDragHelper(handle) {
  2155. var startRect;
  2156. var DragHelper = global$6.get('DragHelper');
  2157. return new DragHelper(id, {
  2158. document: containerElm.ownerDocument,
  2159. handle: id + '-' + handle.name,
  2160. start: function () {
  2161. startRect = currentRect;
  2162. },
  2163. drag: function (e) {
  2164. moveRect(handle, startRect, e.deltaX, e.deltaY);
  2165. }
  2166. });
  2167. }
  2168. global$8('<div id="' + id + '" class="' + prefix + 'croprect-container"' + ' role="grid" aria-dropeffect="execute">').appendTo(containerElm);
  2169. global$1.each(blockers, function (blocker) {
  2170. global$8('#' + id, containerElm).append('<div id="' + id + '-' + blocker + '"class="' + prefix + 'croprect-block" style="display: none" data-mce-bogus="all">');
  2171. });
  2172. global$1.each(handles, function (handle) {
  2173. global$8('#' + id, containerElm).append('<div id="' + id + '-' + handle.name + '" class="' + prefix + 'croprect-handle ' + prefix + 'croprect-handle-' + handle.name + '"' + 'style="display: none" data-mce-bogus="all" role="gridcell" tabindex="-1"' + ' aria-label="' + handle.label + '" aria-grabbed="false">');
  2174. });
  2175. dragHelpers = global$1.map(handles, createDragHelper);
  2176. repaint(currentRect);
  2177. global$8(containerElm).on('focusin focusout', function (e) {
  2178. global$8(e.target).attr('aria-grabbed', e.type === 'focus');
  2179. });
  2180. global$8(containerElm).on('keydown', function (e) {
  2181. var activeHandle;
  2182. global$1.each(handles, function (handle) {
  2183. if (e.target.id === id + '-' + handle.name) {
  2184. activeHandle = handle;
  2185. return false;
  2186. }
  2187. });
  2188. function moveAndBlock(evt, handle, startRect, deltaX, deltaY) {
  2189. evt.stopPropagation();
  2190. evt.preventDefault();
  2191. moveRect(activeHandle, startRect, deltaX, deltaY);
  2192. }
  2193. switch (e.keyCode) {
  2194. case global$10.LEFT:
  2195. moveAndBlock(e, activeHandle, currentRect, -10, 0);
  2196. break;
  2197. case global$10.RIGHT:
  2198. moveAndBlock(e, activeHandle, currentRect, 10, 0);
  2199. break;
  2200. case global$10.UP:
  2201. moveAndBlock(e, activeHandle, currentRect, 0, -10);
  2202. break;
  2203. case global$10.DOWN:
  2204. moveAndBlock(e, activeHandle, currentRect, 0, 10);
  2205. break;
  2206. case global$10.ENTER:
  2207. case global$10.SPACEBAR:
  2208. e.preventDefault();
  2209. action();
  2210. break;
  2211. }
  2212. });
  2213. }
  2214. function toggleVisibility(state) {
  2215. var selectors;
  2216. selectors = global$1.map(handles, function (handle) {
  2217. return '#' + id + '-' + handle.name;
  2218. }).concat(global$1.map(blockers, function (blocker) {
  2219. return '#' + id + '-' + blocker;
  2220. })).join(',');
  2221. if (state) {
  2222. global$8(selectors, containerElm).show();
  2223. } else {
  2224. global$8(selectors, containerElm).hide();
  2225. }
  2226. }
  2227. function repaint(rect) {
  2228. function updateElementRect(name, rect) {
  2229. if (rect.h < 0) {
  2230. rect.h = 0;
  2231. }
  2232. if (rect.w < 0) {
  2233. rect.w = 0;
  2234. }
  2235. global$8('#' + id + '-' + name, containerElm).css({
  2236. left: rect.x,
  2237. top: rect.y,
  2238. width: rect.w,
  2239. height: rect.h
  2240. });
  2241. }
  2242. global$1.each(handles, function (handle) {
  2243. global$8('#' + id + '-' + handle.name, containerElm).css({
  2244. left: rect.w * handle.xMul + rect.x,
  2245. top: rect.h * handle.yMul + rect.y
  2246. });
  2247. });
  2248. updateElementRect('top', {
  2249. x: viewPortRect.x,
  2250. y: viewPortRect.y,
  2251. w: viewPortRect.w,
  2252. h: rect.y - viewPortRect.y
  2253. });
  2254. updateElementRect('right', {
  2255. x: rect.x + rect.w,
  2256. y: rect.y,
  2257. w: viewPortRect.w - rect.x - rect.w + viewPortRect.x,
  2258. h: rect.h
  2259. });
  2260. updateElementRect('bottom', {
  2261. x: viewPortRect.x,
  2262. y: rect.y + rect.h,
  2263. w: viewPortRect.w,
  2264. h: viewPortRect.h - rect.y - rect.h + viewPortRect.y
  2265. });
  2266. updateElementRect('left', {
  2267. x: viewPortRect.x,
  2268. y: rect.y,
  2269. w: rect.x - viewPortRect.x,
  2270. h: rect.h
  2271. });
  2272. updateElementRect('move', rect);
  2273. }
  2274. function setRect(rect) {
  2275. currentRect = rect;
  2276. repaint(currentRect);
  2277. }
  2278. function setViewPortRect(rect) {
  2279. viewPortRect = rect;
  2280. repaint(currentRect);
  2281. }
  2282. function setInnerRect(rect) {
  2283. setRect(getAbsoluteRect(clampRect, rect));
  2284. }
  2285. function setClampRect(rect) {
  2286. clampRect = rect;
  2287. repaint(currentRect);
  2288. }
  2289. function destroy() {
  2290. global$1.each(dragHelpers, function (helper) {
  2291. helper.destroy();
  2292. });
  2293. dragHelpers = [];
  2294. }
  2295. render();
  2296. instance = global$1.extend({
  2297. toggleVisibility: toggleVisibility,
  2298. setClampRect: setClampRect,
  2299. setRect: setRect,
  2300. getInnerRect: getInnerRect,
  2301. setInnerRect: setInnerRect,
  2302. setViewPortRect: setViewPortRect,
  2303. destroy: destroy
  2304. }, global$9);
  2305. return instance;
  2306. }
  2307. var create$2 = function (settings) {
  2308. var Control = global$6.get('Control');
  2309. var ImagePanel = Control.extend({
  2310. Defaults: { classes: 'imagepanel' },
  2311. selection: function (rect) {
  2312. if (arguments.length) {
  2313. this.state.set('rect', rect);
  2314. return this;
  2315. }
  2316. return this.state.get('rect');
  2317. },
  2318. imageSize: function () {
  2319. var viewRect = this.state.get('viewRect');
  2320. return {
  2321. w: viewRect.w,
  2322. h: viewRect.h
  2323. };
  2324. },
  2325. toggleCropRect: function (state) {
  2326. this.state.set('cropEnabled', state);
  2327. },
  2328. imageSrc: function (url) {
  2329. var self$$1 = this, img = new Image();
  2330. img.src = url;
  2331. $_4u6vvleojkmcwow0.loadImage(img).then(function () {
  2332. var rect, $img;
  2333. var lastRect = self$$1.state.get('viewRect');
  2334. $img = self$$1.$el.find('img');
  2335. if ($img[0]) {
  2336. $img.replaceWith(img);
  2337. } else {
  2338. var bg = document.createElement('div');
  2339. bg.className = 'mce-imagepanel-bg';
  2340. self$$1.getEl().appendChild(bg);
  2341. self$$1.getEl().appendChild(img);
  2342. }
  2343. rect = {
  2344. x: 0,
  2345. y: 0,
  2346. w: img.naturalWidth,
  2347. h: img.naturalHeight
  2348. };
  2349. self$$1.state.set('viewRect', rect);
  2350. self$$1.state.set('rect', global$7.inflate(rect, -20, -20));
  2351. if (!lastRect || lastRect.w !== rect.w || lastRect.h !== rect.h) {
  2352. self$$1.zoomFit();
  2353. }
  2354. self$$1.repaintImage();
  2355. self$$1.fire('load');
  2356. });
  2357. },
  2358. zoom: function (value) {
  2359. if (arguments.length) {
  2360. this.state.set('zoom', value);
  2361. return this;
  2362. }
  2363. return this.state.get('zoom');
  2364. },
  2365. postRender: function () {
  2366. this.imageSrc(this.settings.imageSrc);
  2367. return this._super();
  2368. },
  2369. zoomFit: function () {
  2370. var self$$1 = this;
  2371. var $img, pw, ph, w, h, zoom, padding;
  2372. padding = 10;
  2373. $img = self$$1.$el.find('img');
  2374. pw = self$$1.getEl().clientWidth;
  2375. ph = self$$1.getEl().clientHeight;
  2376. w = $img[0].naturalWidth;
  2377. h = $img[0].naturalHeight;
  2378. zoom = Math.min((pw - padding) / w, (ph - padding) / h);
  2379. if (zoom >= 1) {
  2380. zoom = 1;
  2381. }
  2382. self$$1.zoom(zoom);
  2383. },
  2384. repaintImage: function () {
  2385. var x, y, w, h, pw, ph, $img, $bg, zoom, rect, elm;
  2386. elm = this.getEl();
  2387. zoom = this.zoom();
  2388. rect = this.state.get('rect');
  2389. $img = this.$el.find('img');
  2390. $bg = this.$el.find('.mce-imagepanel-bg');
  2391. pw = elm.offsetWidth;
  2392. ph = elm.offsetHeight;
  2393. w = $img[0].naturalWidth * zoom;
  2394. h = $img[0].naturalHeight * zoom;
  2395. x = Math.max(0, pw / 2 - w / 2);
  2396. y = Math.max(0, ph / 2 - h / 2);
  2397. $img.css({
  2398. left: x,
  2399. top: y,
  2400. width: w,
  2401. height: h
  2402. });
  2403. $bg.css({
  2404. left: x,
  2405. top: y,
  2406. width: w,
  2407. height: h
  2408. });
  2409. if (this.cropRect) {
  2410. this.cropRect.setRect({
  2411. x: rect.x * zoom + x,
  2412. y: rect.y * zoom + y,
  2413. w: rect.w * zoom,
  2414. h: rect.h * zoom
  2415. });
  2416. this.cropRect.setClampRect({
  2417. x: x,
  2418. y: y,
  2419. w: w,
  2420. h: h
  2421. });
  2422. this.cropRect.setViewPortRect({
  2423. x: 0,
  2424. y: 0,
  2425. w: pw,
  2426. h: ph
  2427. });
  2428. }
  2429. },
  2430. bindStates: function () {
  2431. var self$$1 = this;
  2432. function setupCropRect(rect) {
  2433. self$$1.cropRect = CropRect(rect, self$$1.state.get('viewRect'), self$$1.state.get('viewRect'), self$$1.getEl(), function () {
  2434. self$$1.fire('crop');
  2435. });
  2436. self$$1.cropRect.on('updateRect', function (e) {
  2437. var rect = e.rect;
  2438. var zoom = self$$1.zoom();
  2439. rect = {
  2440. x: Math.round(rect.x / zoom),
  2441. y: Math.round(rect.y / zoom),
  2442. w: Math.round(rect.w / zoom),
  2443. h: Math.round(rect.h / zoom)
  2444. };
  2445. self$$1.state.set('rect', rect);
  2446. });
  2447. self$$1.on('remove', self$$1.cropRect.destroy);
  2448. }
  2449. self$$1.state.on('change:cropEnabled', function (e) {
  2450. self$$1.cropRect.toggleVisibility(e.value);
  2451. self$$1.repaintImage();
  2452. });
  2453. self$$1.state.on('change:zoom', function () {
  2454. self$$1.repaintImage();
  2455. });
  2456. self$$1.state.on('change:rect', function (e) {
  2457. var rect = e.value;
  2458. if (!self$$1.cropRect) {
  2459. setupCropRect(rect);
  2460. }
  2461. self$$1.cropRect.setRect(rect);
  2462. });
  2463. }
  2464. });
  2465. return new ImagePanel(settings);
  2466. };
  2467. var $_ddvcp3emjkmcwovv = { create: create$2 };
  2468. function createState(blob) {
  2469. return {
  2470. blob: blob,
  2471. url: $_51cs3oedjkmcwov1.createObjectURL(blob)
  2472. };
  2473. }
  2474. function destroyState(state) {
  2475. if (state) {
  2476. $_51cs3oedjkmcwov1.revokeObjectURL(state.url);
  2477. }
  2478. }
  2479. function destroyStates(states) {
  2480. global$1.each(states, destroyState);
  2481. }
  2482. function open(editor, currentState, resolve, reject) {
  2483. var win, undoStack = UndoStack(), mainPanel, filtersPanel, tempState, cropPanel, resizePanel, flipRotatePanel, imagePanel, sidePanel, mainViewContainer, invertPanel, brightnessPanel, huePanel, saturatePanel, contrastPanel, grayscalePanel, sepiaPanel, colorizePanel, sharpenPanel, embossPanel, gammaPanel, exposurePanel, panels, width, height, ratioW, ratioH;
  2484. var reverseIfRtl = function (items) {
  2485. return editor.rtl ? items.reverse() : items;
  2486. };
  2487. function recalcSize(e) {
  2488. var widthCtrl, heightCtrl, newWidth, newHeight;
  2489. widthCtrl = win.find('#w')[0];
  2490. heightCtrl = win.find('#h')[0];
  2491. newWidth = parseInt(widthCtrl.value(), 10);
  2492. newHeight = parseInt(heightCtrl.value(), 10);
  2493. if (win.find('#constrain')[0].checked() && width && height && newWidth && newHeight) {
  2494. if (e.control.settings.name === 'w') {
  2495. newHeight = Math.round(newWidth * ratioW);
  2496. heightCtrl.value(newHeight);
  2497. } else {
  2498. newWidth = Math.round(newHeight * ratioH);
  2499. widthCtrl.value(newWidth);
  2500. }
  2501. }
  2502. width = newWidth;
  2503. height = newHeight;
  2504. }
  2505. function floatToPercent(value) {
  2506. return Math.round(value * 100) + '%';
  2507. }
  2508. function updateButtonUndoStates() {
  2509. win.find('#undo').disabled(!undoStack.canUndo());
  2510. win.find('#redo').disabled(!undoStack.canRedo());
  2511. win.statusbar.find('#save').disabled(!undoStack.canUndo());
  2512. }
  2513. function disableUndoRedo() {
  2514. win.find('#undo').disabled(true);
  2515. win.find('#redo').disabled(true);
  2516. }
  2517. function displayState(state) {
  2518. if (state) {
  2519. imagePanel.imageSrc(state.url);
  2520. }
  2521. }
  2522. function switchPanel(targetPanel) {
  2523. return function () {
  2524. var hidePanels = global$1.grep(panels, function (panel) {
  2525. return panel.settings.name !== targetPanel;
  2526. });
  2527. global$1.each(hidePanels, function (panel) {
  2528. panel.hide();
  2529. });
  2530. targetPanel.show();
  2531. targetPanel.focus();
  2532. };
  2533. }
  2534. function addTempState(blob) {
  2535. tempState = createState(blob);
  2536. displayState(tempState);
  2537. }
  2538. function addBlobState(blob) {
  2539. currentState = createState(blob);
  2540. displayState(currentState);
  2541. destroyStates(undoStack.add(currentState).removed);
  2542. updateButtonUndoStates();
  2543. }
  2544. function crop() {
  2545. var rect = imagePanel.selection();
  2546. $_5w2bq6ecjkmcwov0.blobToImageResult(currentState.blob).then(function (ir) {
  2547. $_5tl1cxe3jkmcwotr.crop(ir, rect.x, rect.y, rect.w, rect.h).then(imageResultToBlob).then(function (blob) {
  2548. addBlobState(blob);
  2549. cancel();
  2550. });
  2551. });
  2552. }
  2553. var tempAction = function (fn) {
  2554. var args = [].slice.call(arguments, 1);
  2555. return function () {
  2556. var state = tempState || currentState;
  2557. $_5w2bq6ecjkmcwov0.blobToImageResult(state.blob).then(function (ir) {
  2558. fn.apply(this, [ir].concat(args)).then(imageResultToBlob).then(addTempState);
  2559. });
  2560. };
  2561. };
  2562. function action(fn) {
  2563. var arg = [];
  2564. for (var _i = 1; _i < arguments.length; _i++) {
  2565. arg[_i - 1] = arguments[_i];
  2566. }
  2567. var args = [].slice.call(arguments, 1);
  2568. return function () {
  2569. $_5w2bq6ecjkmcwov0.blobToImageResult(currentState.blob).then(function (ir) {
  2570. fn.apply(this, [ir].concat(args)).then(imageResultToBlob).then(addBlobState);
  2571. });
  2572. };
  2573. }
  2574. function cancel() {
  2575. displayState(currentState);
  2576. destroyState(tempState);
  2577. switchPanel(mainPanel)();
  2578. updateButtonUndoStates();
  2579. }
  2580. function waitForTempState(times, applyCall) {
  2581. if (tempState) {
  2582. applyCall();
  2583. } else {
  2584. setTimeout(function () {
  2585. if (times-- > 0) {
  2586. waitForTempState(times, applyCall);
  2587. } else {
  2588. editor.windowManager.alert('Error: failed to apply image operation.');
  2589. }
  2590. }, 10);
  2591. }
  2592. }
  2593. function applyTempState() {
  2594. if (tempState) {
  2595. addBlobState(tempState.blob);
  2596. cancel();
  2597. } else {
  2598. waitForTempState(100, applyTempState);
  2599. }
  2600. }
  2601. function zoomIn() {
  2602. var zoom = imagePanel.zoom();
  2603. if (zoom < 2) {
  2604. zoom += 0.1;
  2605. }
  2606. imagePanel.zoom(zoom);
  2607. }
  2608. function zoomOut() {
  2609. var zoom = imagePanel.zoom();
  2610. if (zoom > 0.1) {
  2611. zoom -= 0.1;
  2612. }
  2613. imagePanel.zoom(zoom);
  2614. }
  2615. function undo() {
  2616. currentState = undoStack.undo();
  2617. displayState(currentState);
  2618. updateButtonUndoStates();
  2619. }
  2620. function redo() {
  2621. currentState = undoStack.redo();
  2622. displayState(currentState);
  2623. updateButtonUndoStates();
  2624. }
  2625. function save() {
  2626. resolve(currentState.blob);
  2627. win.close();
  2628. }
  2629. function createPanel(items) {
  2630. return global$6.create('Form', {
  2631. layout: 'flex',
  2632. direction: 'row',
  2633. labelGap: 5,
  2634. border: '0 0 1 0',
  2635. align: 'center',
  2636. pack: 'center',
  2637. padding: '0 10 0 10',
  2638. spacing: 5,
  2639. flex: 0,
  2640. minHeight: 60,
  2641. defaults: {
  2642. classes: 'imagetool',
  2643. type: 'button'
  2644. },
  2645. items: items
  2646. });
  2647. }
  2648. var imageResultToBlob = function (ir) {
  2649. return ir.toBlob();
  2650. };
  2651. function createFilterPanel(title, filter) {
  2652. return createPanel(reverseIfRtl([
  2653. {
  2654. text: 'Back',
  2655. onclick: cancel
  2656. },
  2657. {
  2658. type: 'spacer',
  2659. flex: 1
  2660. },
  2661. {
  2662. text: 'Apply',
  2663. subtype: 'primary',
  2664. onclick: applyTempState
  2665. }
  2666. ])).hide().on('show', function () {
  2667. disableUndoRedo();
  2668. $_5w2bq6ecjkmcwov0.blobToImageResult(currentState.blob).then(function (ir) {
  2669. return filter(ir);
  2670. }).then(imageResultToBlob).then(function (blob) {
  2671. var newTempState = createState(blob);
  2672. displayState(newTempState);
  2673. destroyState(tempState);
  2674. tempState = newTempState;
  2675. });
  2676. });
  2677. }
  2678. function createVariableFilterPanel(title, filter, value, min, max) {
  2679. function update(value) {
  2680. $_5w2bq6ecjkmcwov0.blobToImageResult(currentState.blob).then(function (ir) {
  2681. return filter(ir, value);
  2682. }).then(imageResultToBlob).then(function (blob) {
  2683. var newTempState = createState(blob);
  2684. displayState(newTempState);
  2685. destroyState(tempState);
  2686. tempState = newTempState;
  2687. });
  2688. }
  2689. return createPanel(reverseIfRtl([
  2690. {
  2691. text: 'Back',
  2692. onclick: cancel
  2693. },
  2694. {
  2695. type: 'spacer',
  2696. flex: 1
  2697. },
  2698. {
  2699. type: 'slider',
  2700. flex: 1,
  2701. ondragend: function (e) {
  2702. update(e.value);
  2703. },
  2704. minValue: editor.rtl ? max : min,
  2705. maxValue: editor.rtl ? min : max,
  2706. value: value,
  2707. previewFilter: floatToPercent
  2708. },
  2709. {
  2710. type: 'spacer',
  2711. flex: 1
  2712. },
  2713. {
  2714. text: 'Apply',
  2715. subtype: 'primary',
  2716. onclick: applyTempState
  2717. }
  2718. ])).hide().on('show', function () {
  2719. this.find('slider').value(value);
  2720. disableUndoRedo();
  2721. });
  2722. }
  2723. function createRgbFilterPanel(title, filter) {
  2724. function update() {
  2725. var r, g, b;
  2726. r = win.find('#r')[0].value();
  2727. g = win.find('#g')[0].value();
  2728. b = win.find('#b')[0].value();
  2729. $_5w2bq6ecjkmcwov0.blobToImageResult(currentState.blob).then(function (ir) {
  2730. return filter(ir, r, g, b);
  2731. }).then(imageResultToBlob).then(function (blob) {
  2732. var newTempState = createState(blob);
  2733. displayState(newTempState);
  2734. destroyState(tempState);
  2735. tempState = newTempState;
  2736. });
  2737. }
  2738. var min = editor.rtl ? 2 : 0;
  2739. var max = editor.rtl ? 0 : 2;
  2740. return createPanel(reverseIfRtl([
  2741. {
  2742. text: 'Back',
  2743. onclick: cancel
  2744. },
  2745. {
  2746. type: 'spacer',
  2747. flex: 1
  2748. },
  2749. {
  2750. type: 'slider',
  2751. label: 'R',
  2752. name: 'r',
  2753. minValue: min,
  2754. value: 1,
  2755. maxValue: max,
  2756. ondragend: update,
  2757. previewFilter: floatToPercent
  2758. },
  2759. {
  2760. type: 'slider',
  2761. label: 'G',
  2762. name: 'g',
  2763. minValue: min,
  2764. value: 1,
  2765. maxValue: max,
  2766. ondragend: update,
  2767. previewFilter: floatToPercent
  2768. },
  2769. {
  2770. type: 'slider',
  2771. label: 'B',
  2772. name: 'b',
  2773. minValue: min,
  2774. value: 1,
  2775. maxValue: max,
  2776. ondragend: update,
  2777. previewFilter: floatToPercent
  2778. },
  2779. {
  2780. type: 'spacer',
  2781. flex: 1
  2782. },
  2783. {
  2784. text: 'Apply',
  2785. subtype: 'primary',
  2786. onclick: applyTempState
  2787. }
  2788. ])).hide().on('show', function () {
  2789. win.find('#r,#g,#b').value(1);
  2790. disableUndoRedo();
  2791. });
  2792. }
  2793. cropPanel = createPanel(reverseIfRtl([
  2794. {
  2795. text: 'Back',
  2796. onclick: cancel
  2797. },
  2798. {
  2799. type: 'spacer',
  2800. flex: 1
  2801. },
  2802. {
  2803. text: 'Apply',
  2804. subtype: 'primary',
  2805. onclick: crop
  2806. }
  2807. ])).hide().on('show hide', function (e) {
  2808. imagePanel.toggleCropRect(e.type === 'show');
  2809. }).on('show', disableUndoRedo);
  2810. function toggleConstrain(e) {
  2811. if (e.control.value() === true) {
  2812. ratioW = height / width;
  2813. ratioH = width / height;
  2814. }
  2815. }
  2816. resizePanel = createPanel(reverseIfRtl([
  2817. {
  2818. text: 'Back',
  2819. onclick: cancel
  2820. },
  2821. {
  2822. type: 'spacer',
  2823. flex: 1
  2824. },
  2825. {
  2826. type: 'textbox',
  2827. name: 'w',
  2828. label: 'Width',
  2829. size: 4,
  2830. onkeyup: recalcSize
  2831. },
  2832. {
  2833. type: 'textbox',
  2834. name: 'h',
  2835. label: 'Height',
  2836. size: 4,
  2837. onkeyup: recalcSize
  2838. },
  2839. {
  2840. type: 'checkbox',
  2841. name: 'constrain',
  2842. text: 'Constrain proportions',
  2843. checked: true,
  2844. onchange: toggleConstrain
  2845. },
  2846. {
  2847. type: 'spacer',
  2848. flex: 1
  2849. },
  2850. {
  2851. text: 'Apply',
  2852. subtype: 'primary',
  2853. onclick: 'submit'
  2854. }
  2855. ])).hide().on('submit', function (e) {
  2856. var width = parseInt(win.find('#w').value(), 10), height = parseInt(win.find('#h').value(), 10);
  2857. e.preventDefault();
  2858. action($_5tl1cxe3jkmcwotr.resize, width, height)();
  2859. cancel();
  2860. }).on('show', disableUndoRedo);
  2861. flipRotatePanel = createPanel(reverseIfRtl([
  2862. {
  2863. text: 'Back',
  2864. onclick: cancel
  2865. },
  2866. {
  2867. type: 'spacer',
  2868. flex: 1
  2869. },
  2870. {
  2871. icon: 'fliph',
  2872. tooltip: 'Flip horizontally',
  2873. onclick: tempAction($_5tl1cxe3jkmcwotr.flip, 'h')
  2874. },
  2875. {
  2876. icon: 'flipv',
  2877. tooltip: 'Flip vertically',
  2878. onclick: tempAction($_5tl1cxe3jkmcwotr.flip, 'v')
  2879. },
  2880. {
  2881. icon: 'rotateleft',
  2882. tooltip: 'Rotate counterclockwise',
  2883. onclick: tempAction($_5tl1cxe3jkmcwotr.rotate, -90)
  2884. },
  2885. {
  2886. icon: 'rotateright',
  2887. tooltip: 'Rotate clockwise',
  2888. onclick: tempAction($_5tl1cxe3jkmcwotr.rotate, 90)
  2889. },
  2890. {
  2891. type: 'spacer',
  2892. flex: 1
  2893. },
  2894. {
  2895. text: 'Apply',
  2896. subtype: 'primary',
  2897. onclick: applyTempState
  2898. }
  2899. ])).hide().on('show', disableUndoRedo);
  2900. invertPanel = createFilterPanel('Invert', $_5tl1cxe3jkmcwotr.invert);
  2901. sharpenPanel = createFilterPanel('Sharpen', $_5tl1cxe3jkmcwotr.sharpen);
  2902. embossPanel = createFilterPanel('Emboss', $_5tl1cxe3jkmcwotr.emboss);
  2903. brightnessPanel = createVariableFilterPanel('Brightness', $_5tl1cxe3jkmcwotr.brightness, 0, -1, 1);
  2904. huePanel = createVariableFilterPanel('Hue', $_5tl1cxe3jkmcwotr.hue, 180, 0, 360);
  2905. saturatePanel = createVariableFilterPanel('Saturate', $_5tl1cxe3jkmcwotr.saturate, 0, -1, 1);
  2906. contrastPanel = createVariableFilterPanel('Contrast', $_5tl1cxe3jkmcwotr.contrast, 0, -1, 1);
  2907. grayscalePanel = createVariableFilterPanel('Grayscale', $_5tl1cxe3jkmcwotr.grayscale, 0, 0, 1);
  2908. sepiaPanel = createVariableFilterPanel('Sepia', $_5tl1cxe3jkmcwotr.sepia, 0, 0, 1);
  2909. colorizePanel = createRgbFilterPanel('Colorize', $_5tl1cxe3jkmcwotr.colorize);
  2910. gammaPanel = createVariableFilterPanel('Gamma', $_5tl1cxe3jkmcwotr.gamma, 0, -1, 1);
  2911. exposurePanel = createVariableFilterPanel('Exposure', $_5tl1cxe3jkmcwotr.exposure, 1, 0, 2);
  2912. filtersPanel = createPanel(reverseIfRtl([
  2913. {
  2914. text: 'Back',
  2915. onclick: cancel
  2916. },
  2917. {
  2918. type: 'spacer',
  2919. flex: 1
  2920. },
  2921. {
  2922. text: 'hue',
  2923. icon: 'hue',
  2924. onclick: switchPanel(huePanel)
  2925. },
  2926. {
  2927. text: 'saturate',
  2928. icon: 'saturate',
  2929. onclick: switchPanel(saturatePanel)
  2930. },
  2931. {
  2932. text: 'sepia',
  2933. icon: 'sepia',
  2934. onclick: switchPanel(sepiaPanel)
  2935. },
  2936. {
  2937. text: 'emboss',
  2938. icon: 'emboss',
  2939. onclick: switchPanel(embossPanel)
  2940. },
  2941. {
  2942. text: 'exposure',
  2943. icon: 'exposure',
  2944. onclick: switchPanel(exposurePanel)
  2945. },
  2946. {
  2947. type: 'spacer',
  2948. flex: 1
  2949. }
  2950. ])).hide();
  2951. mainPanel = createPanel(reverseIfRtl([
  2952. {
  2953. tooltip: 'Crop',
  2954. icon: 'crop',
  2955. onclick: switchPanel(cropPanel)
  2956. },
  2957. {
  2958. tooltip: 'Resize',
  2959. icon: 'resize2',
  2960. onclick: switchPanel(resizePanel)
  2961. },
  2962. {
  2963. tooltip: 'Orientation',
  2964. icon: 'orientation',
  2965. onclick: switchPanel(flipRotatePanel)
  2966. },
  2967. {
  2968. tooltip: 'Brightness',
  2969. icon: 'sun',
  2970. onclick: switchPanel(brightnessPanel)
  2971. },
  2972. {
  2973. tooltip: 'Sharpen',
  2974. icon: 'sharpen',
  2975. onclick: switchPanel(sharpenPanel)
  2976. },
  2977. {
  2978. tooltip: 'Contrast',
  2979. icon: 'contrast',
  2980. onclick: switchPanel(contrastPanel)
  2981. },
  2982. {
  2983. tooltip: 'Color levels',
  2984. icon: 'drop',
  2985. onclick: switchPanel(colorizePanel)
  2986. },
  2987. {
  2988. tooltip: 'Gamma',
  2989. icon: 'gamma',
  2990. onclick: switchPanel(gammaPanel)
  2991. },
  2992. {
  2993. tooltip: 'Invert',
  2994. icon: 'invert',
  2995. onclick: switchPanel(invertPanel)
  2996. }
  2997. ]));
  2998. imagePanel = $_ddvcp3emjkmcwovv.create({
  2999. flex: 1,
  3000. imageSrc: currentState.url
  3001. });
  3002. sidePanel = global$6.create('Container', {
  3003. layout: 'flex',
  3004. direction: 'column',
  3005. pack: 'start',
  3006. border: '0 1 0 0',
  3007. padding: 5,
  3008. spacing: 5,
  3009. items: [
  3010. {
  3011. type: 'button',
  3012. icon: 'undo',
  3013. tooltip: 'Undo',
  3014. name: 'undo',
  3015. onclick: undo
  3016. },
  3017. {
  3018. type: 'button',
  3019. icon: 'redo',
  3020. tooltip: 'Redo',
  3021. name: 'redo',
  3022. onclick: redo
  3023. },
  3024. {
  3025. type: 'button',
  3026. icon: 'zoomin',
  3027. tooltip: 'Zoom in',
  3028. onclick: zoomIn
  3029. },
  3030. {
  3031. type: 'button',
  3032. icon: 'zoomout',
  3033. tooltip: 'Zoom out',
  3034. onclick: zoomOut
  3035. }
  3036. ]
  3037. });
  3038. mainViewContainer = global$6.create('Container', {
  3039. type: 'container',
  3040. layout: 'flex',
  3041. direction: 'row',
  3042. align: 'stretch',
  3043. flex: 1,
  3044. items: reverseIfRtl([
  3045. sidePanel,
  3046. imagePanel
  3047. ])
  3048. });
  3049. panels = [
  3050. mainPanel,
  3051. cropPanel,
  3052. resizePanel,
  3053. flipRotatePanel,
  3054. filtersPanel,
  3055. invertPanel,
  3056. brightnessPanel,
  3057. huePanel,
  3058. saturatePanel,
  3059. contrastPanel,
  3060. grayscalePanel,
  3061. sepiaPanel,
  3062. colorizePanel,
  3063. sharpenPanel,
  3064. embossPanel,
  3065. gammaPanel,
  3066. exposurePanel
  3067. ];
  3068. win = editor.windowManager.open({
  3069. layout: 'flex',
  3070. direction: 'column',
  3071. align: 'stretch',
  3072. minWidth: Math.min(global$5.DOM.getViewPort().w, 800),
  3073. minHeight: Math.min(global$5.DOM.getViewPort().h, 650),
  3074. title: 'Edit image',
  3075. items: panels.concat([mainViewContainer]),
  3076. buttons: reverseIfRtl([
  3077. {
  3078. text: 'Save',
  3079. name: 'save',
  3080. subtype: 'primary',
  3081. onclick: save
  3082. },
  3083. {
  3084. text: 'Cancel',
  3085. onclick: 'close'
  3086. }
  3087. ])
  3088. });
  3089. win.on('close', function () {
  3090. reject();
  3091. destroyStates(undoStack.data);
  3092. undoStack = null;
  3093. tempState = null;
  3094. });
  3095. undoStack.add(currentState);
  3096. updateButtonUndoStates();
  3097. imagePanel.on('load', function () {
  3098. width = imagePanel.imageSize().w;
  3099. height = imagePanel.imageSize().h;
  3100. ratioW = height / width;
  3101. ratioH = width / height;
  3102. win.find('#w').value(width);
  3103. win.find('#h').value(height);
  3104. });
  3105. imagePanel.on('crop', crop);
  3106. }
  3107. function edit(editor, imageResult) {
  3108. return new global$3(function (resolve, reject) {
  3109. return imageResult.toBlob().then(function (blob) {
  3110. open(editor, createState(blob), resolve, reject);
  3111. });
  3112. });
  3113. }
  3114. var $_9hzraheijkmcwovc = { edit: edit };
  3115. function getImageSize(img) {
  3116. var width, height;
  3117. function isPxValue(value) {
  3118. return /^[0-9\.]+px$/.test(value);
  3119. }
  3120. width = img.style.width;
  3121. height = img.style.height;
  3122. if (width || height) {
  3123. if (isPxValue(width) && isPxValue(height)) {
  3124. return {
  3125. w: parseInt(width, 10),
  3126. h: parseInt(height, 10)
  3127. };
  3128. }
  3129. return null;
  3130. }
  3131. width = img.width;
  3132. height = img.height;
  3133. if (width && height) {
  3134. return {
  3135. w: parseInt(width, 10),
  3136. h: parseInt(height, 10)
  3137. };
  3138. }
  3139. return null;
  3140. }
  3141. function setImageSize(img, size) {
  3142. var width, height;
  3143. if (size) {
  3144. width = img.style.width;
  3145. height = img.style.height;
  3146. if (width || height) {
  3147. img.style.width = size.w + 'px';
  3148. img.style.height = size.h + 'px';
  3149. img.removeAttribute('data-mce-style');
  3150. }
  3151. width = img.width;
  3152. height = img.height;
  3153. if (width || height) {
  3154. img.setAttribute('width', size.w);
  3155. img.setAttribute('height', size.h);
  3156. }
  3157. }
  3158. }
  3159. function getNaturalImageSize(img) {
  3160. return {
  3161. w: img.naturalWidth,
  3162. h: img.naturalHeight
  3163. };
  3164. }
  3165. var $_9virabeujkmcwowu = {
  3166. getImageSize: getImageSize,
  3167. setImageSize: setImageSize,
  3168. getNaturalImageSize: getNaturalImageSize
  3169. };
  3170. var typeOf = function (x) {
  3171. if (x === null)
  3172. return 'null';
  3173. var t = typeof x;
  3174. if (t === 'object' && Array.prototype.isPrototypeOf(x))
  3175. return 'array';
  3176. if (t === 'object' && String.prototype.isPrototypeOf(x))
  3177. return 'string';
  3178. return t;
  3179. };
  3180. var isType = function (type) {
  3181. return function (value) {
  3182. return typeOf(value) === type;
  3183. };
  3184. };
  3185. var isFunction = isType('function');
  3186. var find = function (xs, pred) {
  3187. for (var i = 0, len = xs.length; i < len; i++) {
  3188. var x = xs[i];
  3189. if (pred(x, i, xs)) {
  3190. return Option.some(x);
  3191. }
  3192. }
  3193. return Option.none();
  3194. };
  3195. var slice = Array.prototype.slice;
  3196. var from$1 = isFunction(Array.from) ? Array.from : function (x) {
  3197. return slice.call(x);
  3198. };
  3199. function XMLHttpRequest$1 () {
  3200. var f = $_901qfodxjkmcwotj.getOrDie('XMLHttpRequest');
  3201. return new f();
  3202. }
  3203. var isValue = function (obj) {
  3204. return obj !== null && obj !== undefined;
  3205. };
  3206. var traverse = function (json, path) {
  3207. var value;
  3208. value = path.reduce(function (result, key) {
  3209. return isValue(result) ? result[key] : undefined;
  3210. }, json);
  3211. return isValue(value) ? value : null;
  3212. };
  3213. var requestUrlAsBlob = function (url, headers, withCredentials) {
  3214. return new global$3(function (resolve) {
  3215. var xhr;
  3216. xhr = new XMLHttpRequest$1();
  3217. xhr.onreadystatechange = function () {
  3218. if (xhr.readyState === 4) {
  3219. resolve({
  3220. status: xhr.status,
  3221. blob: this.response
  3222. });
  3223. }
  3224. };
  3225. xhr.open('GET', url, true);
  3226. xhr.withCredentials = withCredentials;
  3227. global$1.each(headers, function (value, key) {
  3228. xhr.setRequestHeader(key, value);
  3229. });
  3230. xhr.responseType = 'blob';
  3231. xhr.send();
  3232. });
  3233. };
  3234. var readBlob = function (blob) {
  3235. return new global$3(function (resolve) {
  3236. var fr = new FileReader();
  3237. fr.onload = function (e) {
  3238. var data = e.target;
  3239. resolve(data.result);
  3240. };
  3241. fr.readAsText(blob);
  3242. });
  3243. };
  3244. var parseJson = function (text) {
  3245. var json;
  3246. try {
  3247. json = JSON.parse(text);
  3248. } catch (ex) {
  3249. }
  3250. return json;
  3251. };
  3252. var $_5nd4noezjkmcwoxi = {
  3253. traverse: traverse,
  3254. readBlob: readBlob,
  3255. requestUrlAsBlob: requestUrlAsBlob,
  3256. parseJson: parseJson
  3257. };
  3258. var friendlyHttpErrors = [
  3259. {
  3260. code: 404,
  3261. message: 'Could not find Image Proxy'
  3262. },
  3263. {
  3264. code: 403,
  3265. message: 'Rejected request'
  3266. },
  3267. {
  3268. code: 0,
  3269. message: 'Incorrect Image Proxy URL'
  3270. }
  3271. ];
  3272. var friendlyServiceErrors = [
  3273. {
  3274. type: 'key_missing',
  3275. message: 'The request did not include an api key.'
  3276. },
  3277. {
  3278. type: 'key_not_found',
  3279. message: 'The provided api key could not be found.'
  3280. },
  3281. {
  3282. type: 'domain_not_trusted',
  3283. message: 'The api key is not valid for the request origins.'
  3284. }
  3285. ];
  3286. var isServiceErrorCode = function (code) {
  3287. return code === 400 || code === 403 || code === 500;
  3288. };
  3289. var getHttpErrorMsg = function (status) {
  3290. var message = find(friendlyHttpErrors, function (error) {
  3291. return status === error.code;
  3292. }).fold(constant('Unknown ImageProxy error'), function (error) {
  3293. return error.message;
  3294. });
  3295. return 'ImageProxy HTTP error: ' + message;
  3296. };
  3297. var handleHttpError = function (status) {
  3298. var message = getHttpErrorMsg(status);
  3299. return global$3.reject(message);
  3300. };
  3301. var getServiceErrorMsg = function (type) {
  3302. return find(friendlyServiceErrors, function (error) {
  3303. return error.type === type;
  3304. }).fold(constant('Unknown service error'), function (error) {
  3305. return error.message;
  3306. });
  3307. };
  3308. var getServiceError = function (text) {
  3309. var serviceError = $_5nd4noezjkmcwoxi.parseJson(text);
  3310. var errorType = $_5nd4noezjkmcwoxi.traverse(serviceError, [
  3311. 'error',
  3312. 'type'
  3313. ]);
  3314. var errorMsg = errorType ? getServiceErrorMsg(errorType) : 'Invalid JSON in service error message';
  3315. return 'ImageProxy Service error: ' + errorMsg;
  3316. };
  3317. var handleServiceError = function (status, blob) {
  3318. return $_5nd4noezjkmcwoxi.readBlob(blob).then(function (text) {
  3319. var serviceError = getServiceError(text);
  3320. return global$3.reject(serviceError);
  3321. });
  3322. };
  3323. var handleServiceErrorResponse = function (status, blob) {
  3324. return isServiceErrorCode(status) ? handleServiceError(status, blob) : handleHttpError(status);
  3325. };
  3326. var $_5v7jv3ewjkmcwox0 = {
  3327. handleServiceErrorResponse: handleServiceErrorResponse,
  3328. handleHttpError: handleHttpError,
  3329. getHttpErrorMsg: getHttpErrorMsg,
  3330. getServiceErrorMsg: getServiceErrorMsg
  3331. };
  3332. var appendApiKey = function (url, apiKey) {
  3333. var separator = url.indexOf('?') === -1 ? '?' : '&';
  3334. if (/[?&]apiKey=/.test(url) || !apiKey) {
  3335. return url;
  3336. } else {
  3337. return url + separator + 'apiKey=' + encodeURIComponent(apiKey);
  3338. }
  3339. };
  3340. var requestServiceBlob = function (url, apiKey) {
  3341. var headers = {
  3342. 'Content-Type': 'application/json;charset=UTF-8',
  3343. 'tiny-api-key': apiKey
  3344. };
  3345. return $_5nd4noezjkmcwoxi.requestUrlAsBlob(appendApiKey(url, apiKey), headers, false).then(function (result) {
  3346. return result.status < 200 || result.status >= 300 ? $_5v7jv3ewjkmcwox0.handleServiceErrorResponse(result.status, result.blob) : global$3.resolve(result.blob);
  3347. });
  3348. };
  3349. function requestBlob(url, withCredentials) {
  3350. return $_5nd4noezjkmcwoxi.requestUrlAsBlob(url, {}, withCredentials).then(function (result) {
  3351. return result.status < 200 || result.status >= 300 ? $_5v7jv3ewjkmcwox0.handleHttpError(result.status) : global$3.resolve(result.blob);
  3352. });
  3353. }
  3354. var getUrl = function (url, apiKey, withCredentials) {
  3355. return apiKey ? requestServiceBlob(url, apiKey) : requestBlob(url, withCredentials);
  3356. };
  3357. var $_5vq7sbevjkmcwowx = { getUrl: getUrl };
  3358. var count$1 = 0;
  3359. var isEditableImage = function (editor, img) {
  3360. var selectorMatched = editor.dom.is(img, 'img:not([data-mce-object],[data-mce-placeholder])');
  3361. return selectorMatched && (isLocalImage(editor, img) || isCorsImage(editor, img) || editor.settings.imagetools_proxy);
  3362. };
  3363. var displayError = function (editor, error) {
  3364. editor.notificationManager.open({
  3365. text: error,
  3366. type: 'error'
  3367. });
  3368. };
  3369. var getSelectedImage = function (editor) {
  3370. return editor.selection.getNode();
  3371. };
  3372. var extractFilename = function (editor, url) {
  3373. var m = url.match(/\/([^\/\?]+)?\.(?:jpeg|jpg|png|gif)(?:\?|$)/i);
  3374. if (m) {
  3375. return editor.dom.encode(m[1]);
  3376. }
  3377. return null;
  3378. };
  3379. var createId = function () {
  3380. return 'imagetools' + count$1++;
  3381. };
  3382. var isLocalImage = function (editor, img) {
  3383. var url = img.src;
  3384. return url.indexOf('data:') === 0 || url.indexOf('blob:') === 0 || new global$4(url).host === editor.documentBaseURI.host;
  3385. };
  3386. var isCorsImage = function (editor, img) {
  3387. return global$1.inArray(getCorsHosts(editor), new global$4(img.src).host) !== -1;
  3388. };
  3389. var isCorsWithCredentialsImage = function (editor, img) {
  3390. return global$1.inArray(getCredentialsHosts(editor), new global$4(img.src).host) !== -1;
  3391. };
  3392. var imageToBlob$2 = function (editor, img) {
  3393. var src = img.src, apiKey;
  3394. if (isCorsImage(editor, img)) {
  3395. return $_5vq7sbevjkmcwowx.getUrl(img.src, null, isCorsWithCredentialsImage(editor, img));
  3396. }
  3397. if (!isLocalImage(editor, img)) {
  3398. src = getProxyUrl(editor);
  3399. src += (src.indexOf('?') === -1 ? '?' : '&') + 'url=' + encodeURIComponent(img.src);
  3400. apiKey = getApiKey(editor);
  3401. return $_5vq7sbevjkmcwowx.getUrl(src, apiKey, false);
  3402. }
  3403. return $_l0c0gdpjkmcwosd.imageToBlob(img);
  3404. };
  3405. var findSelectedBlob = function (editor) {
  3406. var blobInfo;
  3407. blobInfo = editor.editorUpload.blobCache.getByUri(getSelectedImage(editor).src);
  3408. if (blobInfo) {
  3409. return global$3.resolve(blobInfo.blob());
  3410. }
  3411. return imageToBlob$2(editor, getSelectedImage(editor));
  3412. };
  3413. var startTimedUpload = function (editor, imageUploadTimerState) {
  3414. var imageUploadTimer = global$2.setEditorTimeout(editor, function () {
  3415. editor.editorUpload.uploadImagesAuto();
  3416. }, getUploadTimeout(editor));
  3417. imageUploadTimerState.set(imageUploadTimer);
  3418. };
  3419. var cancelTimedUpload = function (imageUploadTimerState) {
  3420. clearTimeout(imageUploadTimerState.get());
  3421. };
  3422. var updateSelectedImage = function (editor, ir, uploadImmediately, imageUploadTimerState, size) {
  3423. return ir.toBlob().then(function (blob) {
  3424. var uri, name, blobCache, blobInfo, selectedImage;
  3425. blobCache = editor.editorUpload.blobCache;
  3426. selectedImage = getSelectedImage(editor);
  3427. uri = selectedImage.src;
  3428. if (shouldReuseFilename(editor)) {
  3429. blobInfo = blobCache.getByUri(uri);
  3430. if (blobInfo) {
  3431. uri = blobInfo.uri();
  3432. name = blobInfo.name();
  3433. } else {
  3434. name = extractFilename(editor, uri);
  3435. }
  3436. }
  3437. blobInfo = blobCache.create({
  3438. id: createId(),
  3439. blob: blob,
  3440. base64: ir.toBase64(),
  3441. uri: uri,
  3442. name: name
  3443. });
  3444. blobCache.add(blobInfo);
  3445. editor.undoManager.transact(function () {
  3446. function imageLoadedHandler() {
  3447. editor.$(selectedImage).off('load', imageLoadedHandler);
  3448. editor.nodeChanged();
  3449. if (uploadImmediately) {
  3450. editor.editorUpload.uploadImagesAuto();
  3451. } else {
  3452. cancelTimedUpload(imageUploadTimerState);
  3453. startTimedUpload(editor, imageUploadTimerState);
  3454. }
  3455. }
  3456. editor.$(selectedImage).on('load', imageLoadedHandler);
  3457. if (size) {
  3458. editor.$(selectedImage).attr({
  3459. width: size.w,
  3460. height: size.h
  3461. });
  3462. }
  3463. editor.$(selectedImage).attr({ src: blobInfo.blobUri() }).removeAttr('data-mce-src');
  3464. });
  3465. return blobInfo;
  3466. });
  3467. };
  3468. var selectedImageOperation = function (editor, imageUploadTimerState, fn, size) {
  3469. return function () {
  3470. return editor._scanForImages().then(curry(findSelectedBlob, editor)).then($_5w2bq6ecjkmcwov0.blobToImageResult).then(fn).then(function (imageResult) {
  3471. return updateSelectedImage(editor, imageResult, false, imageUploadTimerState, size);
  3472. }, function (error) {
  3473. displayError(editor, error);
  3474. });
  3475. };
  3476. };
  3477. var rotate$2 = function (editor, imageUploadTimerState, angle) {
  3478. return function () {
  3479. var size = $_9virabeujkmcwowu.getImageSize(getSelectedImage(editor));
  3480. var flippedSize = size ? {
  3481. w: size.h,
  3482. h: size.w
  3483. } : null;
  3484. return selectedImageOperation(editor, imageUploadTimerState, function (imageResult) {
  3485. return $_5tl1cxe3jkmcwotr.rotate(imageResult, angle);
  3486. }, flippedSize)();
  3487. };
  3488. };
  3489. var flip$2 = function (editor, imageUploadTimerState, axis) {
  3490. return function () {
  3491. return selectedImageOperation(editor, imageUploadTimerState, function (imageResult) {
  3492. return $_5tl1cxe3jkmcwotr.flip(imageResult, axis);
  3493. })();
  3494. };
  3495. };
  3496. var editImageDialog = function (editor, imageUploadTimerState) {
  3497. return function () {
  3498. var img = getSelectedImage(editor), originalSize = $_9virabeujkmcwowu.getNaturalImageSize(img);
  3499. var handleDialogBlob = function (blob) {
  3500. return new global$3(function (resolve) {
  3501. $_l0c0gdpjkmcwosd.blobToImage(blob).then(function (newImage) {
  3502. var newSize = $_9virabeujkmcwowu.getNaturalImageSize(newImage);
  3503. if (originalSize.w !== newSize.w || originalSize.h !== newSize.h) {
  3504. if ($_9virabeujkmcwowu.getImageSize(img)) {
  3505. $_9virabeujkmcwowu.setImageSize(img, newSize);
  3506. }
  3507. }
  3508. $_51cs3oedjkmcwov1.revokeObjectURL(newImage.src);
  3509. resolve(blob);
  3510. });
  3511. });
  3512. };
  3513. var openDialog = function (editor, imageResult) {
  3514. return $_9hzraheijkmcwovc.edit(editor, imageResult).then(handleDialogBlob).then($_5w2bq6ecjkmcwov0.blobToImageResult).then(function (imageResult) {
  3515. return updateSelectedImage(editor, imageResult, true, imageUploadTimerState);
  3516. }, function () {
  3517. });
  3518. };
  3519. findSelectedBlob(editor).then($_5w2bq6ecjkmcwov0.blobToImageResult).then(curry(openDialog, editor), function (error) {
  3520. displayError(editor, error);
  3521. });
  3522. };
  3523. };
  3524. var $_adcl7edojkmcwory = {
  3525. rotate: rotate$2,
  3526. flip: flip$2,
  3527. editImageDialog: editImageDialog,
  3528. isEditableImage: isEditableImage,
  3529. cancelTimedUpload: cancelTimedUpload
  3530. };
  3531. var register = function (editor, imageUploadTimerState) {
  3532. global$1.each({
  3533. mceImageRotateLeft: $_adcl7edojkmcwory.rotate(editor, imageUploadTimerState, -90),
  3534. mceImageRotateRight: $_adcl7edojkmcwory.rotate(editor, imageUploadTimerState, 90),
  3535. mceImageFlipVertical: $_adcl7edojkmcwory.flip(editor, imageUploadTimerState, 'v'),
  3536. mceImageFlipHorizontal: $_adcl7edojkmcwory.flip(editor, imageUploadTimerState, 'h'),
  3537. mceEditImage: $_adcl7edojkmcwory.editImageDialog(editor, imageUploadTimerState)
  3538. }, function (fn, cmd) {
  3539. editor.addCommand(cmd, fn);
  3540. });
  3541. };
  3542. var $_7980p6dmjkmcworv = { register: register };
  3543. var setup = function (editor, imageUploadTimerState, lastSelectedImageState) {
  3544. editor.on('NodeChange', function (e) {
  3545. var lastSelectedImage = lastSelectedImageState.get();
  3546. if (lastSelectedImage && lastSelectedImage.src !== e.element.src) {
  3547. $_adcl7edojkmcwory.cancelTimedUpload(imageUploadTimerState);
  3548. editor.editorUpload.uploadImagesAuto();
  3549. lastSelectedImageState.set(null);
  3550. }
  3551. if ($_adcl7edojkmcwory.isEditableImage(editor, e.element)) {
  3552. lastSelectedImageState.set(e.element);
  3553. }
  3554. });
  3555. };
  3556. var $_8wbpbqf1jkmcwoxo = { setup: setup };
  3557. var register$1 = function (editor) {
  3558. editor.addButton('rotateleft', {
  3559. title: 'Rotate counterclockwise',
  3560. cmd: 'mceImageRotateLeft'
  3561. });
  3562. editor.addButton('rotateright', {
  3563. title: 'Rotate clockwise',
  3564. cmd: 'mceImageRotateRight'
  3565. });
  3566. editor.addButton('flipv', {
  3567. title: 'Flip vertically',
  3568. cmd: 'mceImageFlipVertical'
  3569. });
  3570. editor.addButton('fliph', {
  3571. title: 'Flip horizontally',
  3572. cmd: 'mceImageFlipHorizontal'
  3573. });
  3574. editor.addButton('editimage', {
  3575. title: 'Edit image',
  3576. cmd: 'mceEditImage'
  3577. });
  3578. editor.addButton('imageoptions', {
  3579. title: 'Image options',
  3580. icon: 'options',
  3581. cmd: 'mceImage'
  3582. });
  3583. };
  3584. var $_4fpq1yf2jkmcwoxp = { register: register$1 };
  3585. var register$2 = function (editor) {
  3586. editor.addContextToolbar(curry($_adcl7edojkmcwory.isEditableImage, editor), getToolbarItems(editor));
  3587. };
  3588. var $_fw0hg1f3jkmcwoxq = { register: register$2 };
  3589. global.add('imagetools', function (editor) {
  3590. var imageUploadTimerState = Cell(0);
  3591. var lastSelectedImageState = Cell(null);
  3592. $_7980p6dmjkmcworv.register(editor, imageUploadTimerState);
  3593. $_4fpq1yf2jkmcwoxp.register(editor);
  3594. $_fw0hg1f3jkmcwoxq.register(editor);
  3595. $_8wbpbqf1jkmcwoxo.setup(editor, imageUploadTimerState, lastSelectedImageState);
  3596. });
  3597. function Plugin () {
  3598. }
  3599. return Plugin;
  3600. }());
  3601. })();