{"version":3,"file":"application.js","mappings":"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","sources":["webpack://app/./node_modules/@rails/actioncable/src/adapters.js","webpack://app/./node_modules/@rails/actioncable/src/logger.js","webpack://app/./node_modules/@rails/actioncable/src/connection_monitor.js","webpack://app/./node_modules/@rails/actioncable/src/internal.js","webpack://app/./node_modules/@rails/actioncable/src/connection.js","webpack://app/./node_modules/@rails/actioncable/src/subscription.js","webpack://app/./node_modules/@rails/actioncable/src/subscription_guarantor.js","webpack://app/./node_modules/@rails/actioncable/src/subscriptions.js","webpack://app/./node_modules/@rails/actioncable/src/consumer.js","webpack://app/./node_modules/@rails/actioncable/src/index.js","webpack://app/./node_modules/fabric/dist/fabric.js","webpack://app/webpack/bootstrap","webpack://app/webpack/runtime/compat get default export","webpack://app/webpack/runtime/define property getters","webpack://app/webpack/runtime/hasOwnProperty shorthand","webpack://app/webpack/runtime/make namespace object","webpack://app/./node_modules/@hotwired/turbo/dist/turbo.es2017-esm.js","webpack://app/./node_modules/@hotwired/turbo-rails/app/javascript/turbo/cable.js","webpack://app/./node_modules/@hotwired/turbo-rails/app/javascript/turbo/snakeize.js","webpack://app/./node_modules/@hotwired/turbo-rails/app/javascript/turbo/cable_stream_source_element.js","webpack://app/./node_modules/@hotwired/turbo-rails/app/javascript/turbo/index.js","webpack://app/./node_modules/@hotwired/turbo-rails/app/javascript/turbo/fetch_requests.js","webpack://app/./node_modules/@hotwired/stimulus/dist/stimulus.js","webpack://app/./app/javascript/controllers/application.js","webpack://app/./app/javascript/controllers/index.js","webpack://app/./app/javascript/controllers/hello_controller.js","webpack://app/./app/javascript/controllers/panier_controller.js","webpack://app/./app/javascript/controllers/pattern_controller.js","webpack://app/./app/javascript/controllers/shape_controller.js","webpack://app/./node_modules/@popperjs/core/lib/enums.js","webpack://app/./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js","webpack://app/./node_modules/@popperjs/core/lib/dom-utils/getWindow.js","webpack://app/./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js","webpack://app/./node_modules/@popperjs/core/lib/modifiers/applyStyles.js","webpack://app/./node_modules/@popperjs/core/lib/utils/getBasePlacement.js","webpack://app/./node_modules/@popperjs/core/lib/utils/math.js","webpack://app/./node_modules/@popperjs/core/lib/utils/userAgent.js","webpack://app/./node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js","webpack://app/./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js","webpack://app/./node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js","webpack://app/./node_modules/@popperjs/core/lib/dom-utils/contains.js","webpack://app/./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js","webpack://app/./node_modules/@popperjs/core/lib/dom-utils/isTableElement.js","webpack://app/./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js","webpack://app/./node_modules/@popperjs/core/lib/dom-utils/getParentNode.js","webpack://app/./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js","webpack://app/./node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js","webpack://app/./node_modules/@popperjs/core/lib/utils/within.js","webpack://app/./node_modules/@popperjs/core/lib/utils/mergePaddingObject.js","webpack://app/./node_modules/@popperjs/core/lib/utils/getFreshSideObject.js","webpack://app/./node_modules/@popperjs/core/lib/utils/expandToHashMap.js","webpack://app/./node_modules/@popperjs/core/lib/modifiers/arrow.js","webpack://app/./node_modules/@popperjs/core/lib/utils/getVariation.js","webpack://app/./node_modules/@popperjs/core/lib/modifiers/computeStyles.js","webpack://app/./node_modules/@popperjs/core/lib/modifiers/eventListeners.js","webpack://app/./node_modules/@popperjs/core/lib/utils/getOppositePlacement.js","webpack://app/./node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js","webpack://app/./node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js","webpack://app/./node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js","webpack://app/./node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js","webpack://app/./node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js","webpack://app/./node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js","webpack://app/./node_modules/@popperjs/core/lib/utils/rectToClientRect.js","webpack://app/./node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js","webpack://app/./node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js","webpack://app/./node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js","webpack://app/./node_modules/@popperjs/core/lib/utils/computeOffsets.js","webpack://app/./node_modules/@popperjs/core/lib/utils/detectOverflow.js","webpack://app/./node_modules/@popperjs/core/lib/modifiers/flip.js","webpack://app/./node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js","webpack://app/./node_modules/@popperjs/core/lib/modifiers/hide.js","webpack://app/./node_modules/@popperjs/core/lib/modifiers/offset.js","webpack://app/./node_modules/@popperjs/core/lib/modifiers/popperOffsets.js","webpack://app/./node_modules/@popperjs/core/lib/modifiers/preventOverflow.js","webpack://app/./node_modules/@popperjs/core/lib/utils/getAltAxis.js","webpack://app/./node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js","webpack://app/./node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js","webpack://app/./node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js","webpack://app/./node_modules/@popperjs/core/lib/utils/orderModifiers.js","webpack://app/./node_modules/@popperjs/core/lib/createPopper.js","webpack://app/./node_modules/@popperjs/core/lib/utils/debounce.js","webpack://app/./node_modules/@popperjs/core/lib/utils/mergeByName.js","webpack://app/./node_modules/@popperjs/core/lib/popper.js","webpack://app/./node_modules/@popperjs/core/lib/popper-lite.js","webpack://app/./node_modules/bootstrap/dist/js/bootstrap.esm.js"],"sourcesContent":["export default {\n logger: self.console,\n WebSocket: self.WebSocket\n}\n","import adapters from \"./adapters\"\n\n// The logger is disabled by default. You can enable it with:\n//\n// ActionCable.logger.enabled = true\n//\n// Example:\n//\n// import * as ActionCable from '@rails/actioncable'\n//\n// ActionCable.logger.enabled = true\n// ActionCable.logger.log('Connection Established.')\n//\n\nexport default {\n log(...messages) {\n if (this.enabled) {\n messages.push(Date.now())\n adapters.logger.log(\"[ActionCable]\", ...messages)\n }\n },\n}\n","import logger from \"./logger\"\n\n// Responsible for ensuring the cable connection is in good health by validating the heartbeat pings sent from the server, and attempting\n// revival reconnections if things go astray. Internal class, not intended for direct user manipulation.\n\nconst now = () => new Date().getTime()\n\nconst secondsSince = time => (now() - time) / 1000\n\nclass ConnectionMonitor {\n constructor(connection) {\n this.visibilityDidChange = this.visibilityDidChange.bind(this)\n this.connection = connection\n this.reconnectAttempts = 0\n }\n\n start() {\n if (!this.isRunning()) {\n this.startedAt = now()\n delete this.stoppedAt\n this.startPolling()\n addEventListener(\"visibilitychange\", this.visibilityDidChange)\n logger.log(`ConnectionMonitor started. stale threshold = ${this.constructor.staleThreshold} s`)\n }\n }\n\n stop() {\n if (this.isRunning()) {\n this.stoppedAt = now()\n this.stopPolling()\n removeEventListener(\"visibilitychange\", this.visibilityDidChange)\n logger.log(\"ConnectionMonitor stopped\")\n }\n }\n\n isRunning() {\n return this.startedAt && !this.stoppedAt\n }\n\n recordPing() {\n this.pingedAt = now()\n }\n\n recordConnect() {\n this.reconnectAttempts = 0\n this.recordPing()\n delete this.disconnectedAt\n logger.log(\"ConnectionMonitor recorded connect\")\n }\n\n recordDisconnect() {\n this.disconnectedAt = now()\n logger.log(\"ConnectionMonitor recorded disconnect\")\n }\n\n // Private\n\n startPolling() {\n this.stopPolling()\n this.poll()\n }\n\n stopPolling() {\n clearTimeout(this.pollTimeout)\n }\n\n poll() {\n this.pollTimeout = setTimeout(() => {\n this.reconnectIfStale()\n this.poll()\n }\n , this.getPollInterval())\n }\n\n getPollInterval() {\n const { staleThreshold, reconnectionBackoffRate } = this.constructor\n const backoff = Math.pow(1 + reconnectionBackoffRate, Math.min(this.reconnectAttempts, 10))\n const jitterMax = this.reconnectAttempts === 0 ? 1.0 : reconnectionBackoffRate\n const jitter = jitterMax * Math.random()\n return staleThreshold * 1000 * backoff * (1 + jitter)\n }\n\n reconnectIfStale() {\n if (this.connectionIsStale()) {\n logger.log(`ConnectionMonitor detected stale connection. reconnectAttempts = ${this.reconnectAttempts}, time stale = ${secondsSince(this.refreshedAt)} s, stale threshold = ${this.constructor.staleThreshold} s`)\n this.reconnectAttempts++\n if (this.disconnectedRecently()) {\n logger.log(`ConnectionMonitor skipping reopening recent disconnect. time disconnected = ${secondsSince(this.disconnectedAt)} s`)\n } else {\n logger.log(\"ConnectionMonitor reopening\")\n this.connection.reopen()\n }\n }\n }\n\n get refreshedAt() {\n return this.pingedAt ? this.pingedAt : this.startedAt\n }\n\n connectionIsStale() {\n return secondsSince(this.refreshedAt) > this.constructor.staleThreshold\n }\n\n disconnectedRecently() {\n return this.disconnectedAt && (secondsSince(this.disconnectedAt) < this.constructor.staleThreshold)\n }\n\n visibilityDidChange() {\n if (document.visibilityState === \"visible\") {\n setTimeout(() => {\n if (this.connectionIsStale() || !this.connection.isOpen()) {\n logger.log(`ConnectionMonitor reopening stale connection on visibilitychange. visibilityState = ${document.visibilityState}`)\n this.connection.reopen()\n }\n }\n , 200)\n }\n }\n\n}\n\nConnectionMonitor.staleThreshold = 6 // Server::Connections::BEAT_INTERVAL * 2 (missed two pings)\nConnectionMonitor.reconnectionBackoffRate = 0.15\n\nexport default ConnectionMonitor\n","export default {\n \"message_types\": {\n \"welcome\": \"welcome\",\n \"disconnect\": \"disconnect\",\n \"ping\": \"ping\",\n \"confirmation\": \"confirm_subscription\",\n \"rejection\": \"reject_subscription\"\n },\n \"disconnect_reasons\": {\n \"unauthorized\": \"unauthorized\",\n \"invalid_request\": \"invalid_request\",\n \"server_restart\": \"server_restart\"\n },\n \"default_mount_path\": \"/cable\",\n \"protocols\": [\n \"actioncable-v1-json\",\n \"actioncable-unsupported\"\n ]\n}\n","import adapters from \"./adapters\"\nimport ConnectionMonitor from \"./connection_monitor\"\nimport INTERNAL from \"./internal\"\nimport logger from \"./logger\"\n\n// Encapsulate the cable connection held by the consumer. This is an internal class not intended for direct user manipulation.\n\nconst {message_types, protocols} = INTERNAL\nconst supportedProtocols = protocols.slice(0, protocols.length - 1)\n\nconst indexOf = [].indexOf\n\nclass Connection {\n constructor(consumer) {\n this.open = this.open.bind(this)\n this.consumer = consumer\n this.subscriptions = this.consumer.subscriptions\n this.monitor = new ConnectionMonitor(this)\n this.disconnected = true\n }\n\n send(data) {\n if (this.isOpen()) {\n this.webSocket.send(JSON.stringify(data))\n return true\n } else {\n return false\n }\n }\n\n open() {\n if (this.isActive()) {\n logger.log(`Attempted to open WebSocket, but existing socket is ${this.getState()}`)\n return false\n } else {\n logger.log(`Opening WebSocket, current state is ${this.getState()}, subprotocols: ${protocols}`)\n if (this.webSocket) { this.uninstallEventHandlers() }\n this.webSocket = new adapters.WebSocket(this.consumer.url, protocols)\n this.installEventHandlers()\n this.monitor.start()\n return true\n }\n }\n\n close({allowReconnect} = {allowReconnect: true}) {\n if (!allowReconnect) { this.monitor.stop() }\n // Avoid closing websockets in a \"connecting\" state due to Safari 15.1+ bug. See: https://github.com/rails/rails/issues/43835#issuecomment-1002288478\n if (this.isOpen()) {\n return this.webSocket.close()\n }\n }\n\n reopen() {\n logger.log(`Reopening WebSocket, current state is ${this.getState()}`)\n if (this.isActive()) {\n try {\n return this.close()\n } catch (error) {\n logger.log(\"Failed to reopen WebSocket\", error)\n }\n finally {\n logger.log(`Reopening WebSocket in ${this.constructor.reopenDelay}ms`)\n setTimeout(this.open, this.constructor.reopenDelay)\n }\n } else {\n return this.open()\n }\n }\n\n getProtocol() {\n if (this.webSocket) {\n return this.webSocket.protocol\n }\n }\n\n isOpen() {\n return this.isState(\"open\")\n }\n\n isActive() {\n return this.isState(\"open\", \"connecting\")\n }\n\n // Private\n\n isProtocolSupported() {\n return indexOf.call(supportedProtocols, this.getProtocol()) >= 0\n }\n\n isState(...states) {\n return indexOf.call(states, this.getState()) >= 0\n }\n\n getState() {\n if (this.webSocket) {\n for (let state in adapters.WebSocket) {\n if (adapters.WebSocket[state] === this.webSocket.readyState) {\n return state.toLowerCase()\n }\n }\n }\n return null\n }\n\n installEventHandlers() {\n for (let eventName in this.events) {\n const handler = this.events[eventName].bind(this)\n this.webSocket[`on${eventName}`] = handler\n }\n }\n\n uninstallEventHandlers() {\n for (let eventName in this.events) {\n this.webSocket[`on${eventName}`] = function() {}\n }\n }\n\n}\n\nConnection.reopenDelay = 500\n\nConnection.prototype.events = {\n message(event) {\n if (!this.isProtocolSupported()) { return }\n const {identifier, message, reason, reconnect, type} = JSON.parse(event.data)\n switch (type) {\n case message_types.welcome:\n this.monitor.recordConnect()\n return this.subscriptions.reload()\n case message_types.disconnect:\n logger.log(`Disconnecting. Reason: ${reason}`)\n return this.close({allowReconnect: reconnect})\n case message_types.ping:\n return this.monitor.recordPing()\n case message_types.confirmation:\n this.subscriptions.confirmSubscription(identifier)\n return this.subscriptions.notify(identifier, \"connected\")\n case message_types.rejection:\n return this.subscriptions.reject(identifier)\n default:\n return this.subscriptions.notify(identifier, \"received\", message)\n }\n },\n\n open() {\n logger.log(`WebSocket onopen event, using '${this.getProtocol()}' subprotocol`)\n this.disconnected = false\n if (!this.isProtocolSupported()) {\n logger.log(\"Protocol is unsupported. Stopping monitor and disconnecting.\")\n return this.close({allowReconnect: false})\n }\n },\n\n close(event) {\n logger.log(\"WebSocket onclose event\")\n if (this.disconnected) { return }\n this.disconnected = true\n this.monitor.recordDisconnect()\n return this.subscriptions.notifyAll(\"disconnected\", {willAttemptReconnect: this.monitor.isRunning()})\n },\n\n error() {\n logger.log(\"WebSocket onerror event\")\n }\n}\n\nexport default Connection\n","// A new subscription is created through the ActionCable.Subscriptions instance available on the consumer.\n// It provides a number of callbacks and a method for calling remote procedure calls on the corresponding\n// Channel instance on the server side.\n//\n// An example demonstrates the basic functionality:\n//\n// App.appearance = App.cable.subscriptions.create(\"AppearanceChannel\", {\n// connected() {\n// // Called once the subscription has been successfully completed\n// },\n//\n// disconnected({ willAttemptReconnect: boolean }) {\n// // Called when the client has disconnected with the server.\n// // The object will have an `willAttemptReconnect` property which\n// // says whether the client has the intention of attempting\n// // to reconnect.\n// },\n//\n// appear() {\n// this.perform('appear', {appearing_on: this.appearingOn()})\n// },\n//\n// away() {\n// this.perform('away')\n// },\n//\n// appearingOn() {\n// $('main').data('appearing-on')\n// }\n// })\n//\n// The methods #appear and #away forward their intent to the remote AppearanceChannel instance on the server\n// by calling the `perform` method with the first parameter being the action (which maps to AppearanceChannel#appear/away).\n// The second parameter is a hash that'll get JSON encoded and made available on the server in the data parameter.\n//\n// This is how the server component would look:\n//\n// class AppearanceChannel < ApplicationActionCable::Channel\n// def subscribed\n// current_user.appear\n// end\n//\n// def unsubscribed\n// current_user.disappear\n// end\n//\n// def appear(data)\n// current_user.appear on: data['appearing_on']\n// end\n//\n// def away\n// current_user.away\n// end\n// end\n//\n// The \"AppearanceChannel\" name is automatically mapped between the client-side subscription creation and the server-side Ruby class name.\n// The AppearanceChannel#appear/away public methods are exposed automatically to client-side invocation through the perform method.\n\nconst extend = function(object, properties) {\n if (properties != null) {\n for (let key in properties) {\n const value = properties[key]\n object[key] = value\n }\n }\n return object\n}\n\nexport default class Subscription {\n constructor(consumer, params = {}, mixin) {\n this.consumer = consumer\n this.identifier = JSON.stringify(params)\n extend(this, mixin)\n }\n\n // Perform a channel action with the optional data passed as an attribute\n perform(action, data = {}) {\n data.action = action\n return this.send(data)\n }\n\n send(data) {\n return this.consumer.send({command: \"message\", identifier: this.identifier, data: JSON.stringify(data)})\n }\n\n unsubscribe() {\n return this.consumer.subscriptions.remove(this)\n }\n}\n","import logger from \"./logger\"\n\n// Responsible for ensuring channel subscribe command is confirmed, retrying until confirmation is received.\n// Internal class, not intended for direct user manipulation.\n\nclass SubscriptionGuarantor {\n constructor(subscriptions) {\n this.subscriptions = subscriptions\n this.pendingSubscriptions = []\n }\n\n guarantee(subscription) {\n if(this.pendingSubscriptions.indexOf(subscription) == -1){ \n logger.log(`SubscriptionGuarantor guaranteeing ${subscription.identifier}`)\n this.pendingSubscriptions.push(subscription) \n }\n else {\n logger.log(`SubscriptionGuarantor already guaranteeing ${subscription.identifier}`)\n }\n this.startGuaranteeing()\n }\n\n forget(subscription) {\n logger.log(`SubscriptionGuarantor forgetting ${subscription.identifier}`)\n this.pendingSubscriptions = (this.pendingSubscriptions.filter((s) => s !== subscription))\n }\n\n startGuaranteeing() {\n this.stopGuaranteeing()\n this.retrySubscribing()\n }\n \n stopGuaranteeing() {\n clearTimeout(this.retryTimeout)\n }\n\n retrySubscribing() {\n this.retryTimeout = setTimeout(() => {\n if (this.subscriptions && typeof(this.subscriptions.subscribe) === \"function\") {\n this.pendingSubscriptions.map((subscription) => {\n logger.log(`SubscriptionGuarantor resubscribing ${subscription.identifier}`)\n this.subscriptions.subscribe(subscription)\n })\n }\n }\n , 500)\n }\n}\n\nexport default SubscriptionGuarantor","import Subscription from \"./subscription\"\nimport SubscriptionGuarantor from \"./subscription_guarantor\"\nimport logger from \"./logger\"\n\n// Collection class for creating (and internally managing) channel subscriptions.\n// The only method intended to be triggered by the user is ActionCable.Subscriptions#create,\n// and it should be called through the consumer like so:\n//\n// App = {}\n// App.cable = ActionCable.createConsumer(\"ws://example.com/accounts/1\")\n// App.appearance = App.cable.subscriptions.create(\"AppearanceChannel\")\n//\n// For more details on how you'd configure an actual channel subscription, see ActionCable.Subscription.\n\nexport default class Subscriptions {\n constructor(consumer) {\n this.consumer = consumer\n this.guarantor = new SubscriptionGuarantor(this)\n this.subscriptions = []\n }\n\n create(channelName, mixin) {\n const channel = channelName\n const params = typeof channel === \"object\" ? channel : {channel}\n const subscription = new Subscription(this.consumer, params, mixin)\n return this.add(subscription)\n }\n\n // Private\n\n add(subscription) {\n this.subscriptions.push(subscription)\n this.consumer.ensureActiveConnection()\n this.notify(subscription, \"initialized\")\n this.subscribe(subscription)\n return subscription\n }\n\n remove(subscription) {\n this.forget(subscription)\n if (!this.findAll(subscription.identifier).length) {\n this.sendCommand(subscription, \"unsubscribe\")\n }\n return subscription\n }\n\n reject(identifier) {\n return this.findAll(identifier).map((subscription) => {\n this.forget(subscription)\n this.notify(subscription, \"rejected\")\n return subscription\n })\n }\n\n forget(subscription) {\n this.guarantor.forget(subscription)\n this.subscriptions = (this.subscriptions.filter((s) => s !== subscription))\n return subscription\n }\n\n findAll(identifier) {\n return this.subscriptions.filter((s) => s.identifier === identifier)\n }\n\n reload() {\n return this.subscriptions.map((subscription) =>\n this.subscribe(subscription))\n }\n\n notifyAll(callbackName, ...args) {\n return this.subscriptions.map((subscription) =>\n this.notify(subscription, callbackName, ...args))\n }\n\n notify(subscription, callbackName, ...args) {\n let subscriptions\n if (typeof subscription === \"string\") {\n subscriptions = this.findAll(subscription)\n } else {\n subscriptions = [subscription]\n }\n\n return subscriptions.map((subscription) =>\n (typeof subscription[callbackName] === \"function\" ? subscription[callbackName](...args) : undefined))\n }\n\n subscribe(subscription) {\n if (this.sendCommand(subscription, \"subscribe\")) {\n this.guarantor.guarantee(subscription)\n }\n }\n\n confirmSubscription(identifier) {\n logger.log(`Subscription confirmed ${identifier}`)\n this.findAll(identifier).map((subscription) =>\n this.guarantor.forget(subscription))\n }\n\n sendCommand(subscription, command) {\n const {identifier} = subscription\n return this.consumer.send({command, identifier})\n }\n}\n","import Connection from \"./connection\"\nimport Subscriptions from \"./subscriptions\"\n\n// The ActionCable.Consumer establishes the connection to a server-side Ruby Connection object. Once established,\n// the ActionCable.ConnectionMonitor will ensure that its properly maintained through heartbeats and checking for stale updates.\n// The Consumer instance is also the gateway to establishing subscriptions to desired channels through the #createSubscription\n// method.\n//\n// The following example shows how this can be set up:\n//\n// App = {}\n// App.cable = ActionCable.createConsumer(\"ws://example.com/accounts/1\")\n// App.appearance = App.cable.subscriptions.create(\"AppearanceChannel\")\n//\n// For more details on how you'd configure an actual channel subscription, see ActionCable.Subscription.\n//\n// When a consumer is created, it automatically connects with the server.\n//\n// To disconnect from the server, call\n//\n// App.cable.disconnect()\n//\n// and to restart the connection:\n//\n// App.cable.connect()\n//\n// Any channel subscriptions which existed prior to disconnecting will\n// automatically resubscribe.\n\nexport default class Consumer {\n constructor(url) {\n this._url = url\n this.subscriptions = new Subscriptions(this)\n this.connection = new Connection(this)\n }\n\n get url() {\n return createWebSocketURL(this._url)\n }\n\n send(data) {\n return this.connection.send(data)\n }\n\n connect() {\n return this.connection.open()\n }\n\n disconnect() {\n return this.connection.close({allowReconnect: false})\n }\n\n ensureActiveConnection() {\n if (!this.connection.isActive()) {\n return this.connection.open()\n }\n }\n}\n\nexport function createWebSocketURL(url) {\n if (typeof url === \"function\") {\n url = url()\n }\n\n if (url && !/^wss?:/i.test(url)) {\n const a = document.createElement(\"a\")\n a.href = url\n // Fix populating Location properties in IE. Otherwise, protocol will be blank.\n a.href = a.href\n a.protocol = a.protocol.replace(\"http\", \"ws\")\n return a.href\n } else {\n return url\n }\n}\n","import Connection from \"./connection\"\nimport ConnectionMonitor from \"./connection_monitor\"\nimport Consumer, { createWebSocketURL } from \"./consumer\"\nimport INTERNAL from \"./internal\"\nimport Subscription from \"./subscription\"\nimport Subscriptions from \"./subscriptions\"\nimport SubscriptionGuarantor from \"./subscription_guarantor\"\nimport adapters from \"./adapters\"\nimport logger from \"./logger\"\n\nexport {\n Connection,\n ConnectionMonitor,\n Consumer,\n INTERNAL,\n Subscription,\n Subscriptions,\n SubscriptionGuarantor,\n adapters,\n createWebSocketURL,\n logger,\n}\n\nexport function createConsumer(url = getConfig(\"url\") || INTERNAL.default_mount_path) {\n return new Consumer(url)\n}\n\nexport function getConfig(name) {\n const element = document.head.querySelector(`meta[name='action-cable-${name}']`)\n if (element) {\n return element.getAttribute(\"content\")\n }\n}\n","/* build: `node build.js modules=ALL exclude=gestures,accessors,erasing requirejs minifier=uglifyjs` */\n/*! Fabric.js Copyright 2008-2015, Printio (Juriy Zaytsev, Maxim Chernyak) */\n\nvar fabric = fabric || { version: '5.2.4' };\nif (typeof exports !== 'undefined') {\n exports.fabric = fabric;\n}\n/* _AMD_START_ */\nelse if (typeof define === 'function' && define.amd) {\n define([], function() { return fabric; });\n}\n/* _AMD_END_ */\nif (typeof document !== 'undefined' && typeof window !== 'undefined') {\n if (document instanceof (typeof HTMLDocument !== 'undefined' ? HTMLDocument : Document)) {\n fabric.document = document;\n }\n else {\n fabric.document = document.implementation.createHTMLDocument('');\n }\n fabric.window = window;\n}\nelse {\n // assume we're running under node.js when document/window are not present\n var jsdom = require('jsdom');\n var virtualWindow = new jsdom.JSDOM(\n decodeURIComponent('%3C!DOCTYPE%20html%3E%3Chtml%3E%3Chead%3E%3C%2Fhead%3E%3Cbody%3E%3C%2Fbody%3E%3C%2Fhtml%3E'),\n {\n features: {\n FetchExternalResources: ['img']\n },\n resources: 'usable'\n }).window;\n fabric.document = virtualWindow.document;\n fabric.jsdomImplForWrapper = require('jsdom/lib/jsdom/living/generated/utils').implForWrapper;\n fabric.nodeCanvas = require('jsdom/lib/jsdom/utils').Canvas;\n fabric.window = virtualWindow;\n DOMParser = fabric.window.DOMParser;\n}\n\n/**\n * True when in environment that supports touch events\n * @type boolean\n */\nfabric.isTouchSupported = 'ontouchstart' in fabric.window || 'ontouchstart' in fabric.document ||\n (fabric.window && fabric.window.navigator && fabric.window.navigator.maxTouchPoints > 0);\n\n/**\n * True when in environment that's probably Node.js\n * @type boolean\n */\nfabric.isLikelyNode = typeof Buffer !== 'undefined' &&\n typeof window === 'undefined';\n\n/* _FROM_SVG_START_ */\n/**\n * Attributes parsed from all SVG elements\n * @type array\n */\nfabric.SHARED_ATTRIBUTES = [\n 'display',\n 'transform',\n 'fill', 'fill-opacity', 'fill-rule',\n 'opacity',\n 'stroke', 'stroke-dasharray', 'stroke-linecap', 'stroke-dashoffset',\n 'stroke-linejoin', 'stroke-miterlimit',\n 'stroke-opacity', 'stroke-width',\n 'id', 'paint-order', 'vector-effect',\n 'instantiated_by_use', 'clip-path',\n];\n/* _FROM_SVG_END_ */\n\n/**\n * Pixel per Inch as a default value set to 96. Can be changed for more realistic conversion.\n */\nfabric.DPI = 96;\nfabric.reNum = '(?:[-+]?(?:\\\\d+|\\\\d*\\\\.\\\\d+)(?:[eE][-+]?\\\\d+)?)';\nfabric.commaWsp = '(?:\\\\s+,?\\\\s*|,\\\\s*)';\nfabric.rePathCommand = /([-+]?((\\d+\\.\\d+)|((\\d+)|(\\.\\d+)))(?:[eE][-+]?\\d+)?)/ig;\nfabric.reNonWord = /[ \\n\\.,;!\\?\\-]/;\nfabric.fontPaths = { };\nfabric.iMatrix = [1, 0, 0, 1, 0, 0];\nfabric.svgNS = 'http://www.w3.org/2000/svg';\n\n/**\n * Pixel limit for cache canvases. 1Mpx , 4Mpx should be fine.\n * @since 1.7.14\n * @type Number\n * @default\n */\nfabric.perfLimitSizeTotal = 2097152;\n\n/**\n * Pixel limit for cache canvases width or height. IE fixes the maximum at 5000\n * @since 1.7.14\n * @type Number\n * @default\n */\nfabric.maxCacheSideLimit = 4096;\n\n/**\n * Lowest pixel limit for cache canvases, set at 256PX\n * @since 1.7.14\n * @type Number\n * @default\n */\nfabric.minCacheSideLimit = 256;\n\n/**\n * Cache Object for widths of chars in text rendering.\n */\nfabric.charWidthsCache = { };\n\n/**\n * if webgl is enabled and available, textureSize will determine the size\n * of the canvas backend\n * @since 2.0.0\n * @type Number\n * @default\n */\nfabric.textureSize = 2048;\n\n/**\n * When 'true', style information is not retained when copy/pasting text, making\n * pasted text use destination style.\n * Defaults to 'false'.\n * @type Boolean\n * @default\n */\nfabric.disableStyleCopyPaste = false;\n\n/**\n * Enable webgl for filtering picture is available\n * A filtering backend will be initialized, this will both take memory and\n * time since a default 2048x2048 canvas will be created for the gl context\n * @since 2.0.0\n * @type Boolean\n * @default\n */\nfabric.enableGLFiltering = true;\n\n/**\n * Device Pixel Ratio\n * @see https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/HTML-canvas-guide/SettingUptheCanvas/SettingUptheCanvas.html\n */\nfabric.devicePixelRatio = fabric.window.devicePixelRatio ||\n fabric.window.webkitDevicePixelRatio ||\n fabric.window.mozDevicePixelRatio ||\n 1;\n/**\n * Browser-specific constant to adjust CanvasRenderingContext2D.shadowBlur value,\n * which is unitless and not rendered equally across browsers.\n *\n * Values that work quite well (as of October 2017) are:\n * - Chrome: 1.5\n * - Edge: 1.75\n * - Firefox: 0.9\n * - Safari: 0.95\n *\n * @since 2.0.0\n * @type Number\n * @default 1\n */\nfabric.browserShadowBlurConstant = 1;\n\n/**\n * This object contains the result of arc to bezier conversion for faster retrieving if the same arc needs to be converted again.\n * It was an internal variable, is accessible since version 2.3.4\n */\nfabric.arcToSegmentsCache = { };\n\n/**\n * This object keeps the results of the boundsOfCurve calculation mapped by the joined arguments necessary to calculate it.\n * It does speed up calculation, if you parse and add always the same paths, but in case of heavy usage of freedrawing\n * you do not get any speed benefit and you get a big object in memory.\n * The object was a private variable before, while now is appended to the lib so that you have access to it and you\n * can eventually clear it.\n * It was an internal variable, is accessible since version 2.3.4\n */\nfabric.boundsOfCurveCache = { };\n\n/**\n * If disabled boundsOfCurveCache is not used. For apps that make heavy usage of pencil drawing probably disabling it is better\n * @default true\n */\nfabric.cachesBoundsOfCurve = true;\n\n/**\n * Skip performance testing of setupGLContext and force the use of putImageData that seems to be the one that works best on\n * Chrome + old hardware. if your users are experiencing empty images after filtering you may try to force this to true\n * this has to be set before instantiating the filtering backend ( before filtering the first image )\n * @type Boolean\n * @default false\n */\nfabric.forceGLPutImageData = false;\n\nfabric.initFilterBackend = function() {\n if (fabric.enableGLFiltering && fabric.isWebglSupported && fabric.isWebglSupported(fabric.textureSize)) {\n console.log('max texture size: ' + fabric.maxTextureSize);\n return (new fabric.WebglFilterBackend({ tileSize: fabric.textureSize }));\n }\n else if (fabric.Canvas2dFilterBackend) {\n return (new fabric.Canvas2dFilterBackend());\n }\n};\n\n\nif (typeof document !== 'undefined' && typeof window !== 'undefined') {\n // ensure globality even if entire library were function wrapped (as in Meteor.js packaging system)\n window.fabric = fabric;\n}\n\n\n(function() {\n\n /**\n * @private\n * @param {String} eventName\n * @param {Function} handler\n */\n function _removeEventListener(eventName, handler) {\n if (!this.__eventListeners[eventName]) {\n return;\n }\n var eventListener = this.__eventListeners[eventName];\n if (handler) {\n eventListener[eventListener.indexOf(handler)] = false;\n }\n else {\n fabric.util.array.fill(eventListener, false);\n }\n }\n\n /**\n * Observes specified event\n * @memberOf fabric.Observable\n * @alias on\n * @param {String|Object} eventName Event name (eg. 'after:render') or object with key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})\n * @param {Function} handler Function that receives a notification when an event of the specified type occurs\n * @return {Self} thisArg\n * @chainable\n */\n function on(eventName, handler) {\n if (!this.__eventListeners) {\n this.__eventListeners = { };\n }\n // one object with key/value pairs was passed\n if (arguments.length === 1) {\n for (var prop in eventName) {\n this.on(prop, eventName[prop]);\n }\n }\n else {\n if (!this.__eventListeners[eventName]) {\n this.__eventListeners[eventName] = [];\n }\n this.__eventListeners[eventName].push(handler);\n }\n return this;\n }\n\n function _once(eventName, handler) {\n var _handler = function () {\n handler.apply(this, arguments);\n this.off(eventName, _handler);\n }.bind(this);\n this.on(eventName, _handler);\n }\n\n function once(eventName, handler) {\n // one object with key/value pairs was passed\n if (arguments.length === 1) {\n for (var prop in eventName) {\n _once.call(this, prop, eventName[prop]);\n }\n }\n else {\n _once.call(this, eventName, handler);\n }\n return this;\n }\n\n /**\n * Stops event observing for a particular event handler. Calling this method\n * without arguments removes all handlers for all events\n * @memberOf fabric.Observable\n * @alias off\n * @param {String|Object} eventName Event name (eg. 'after:render') or object with key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler})\n * @param {Function} handler Function to be deleted from EventListeners\n * @return {Self} thisArg\n * @chainable\n */\n function off(eventName, handler) {\n if (!this.__eventListeners) {\n return this;\n }\n\n // remove all key/value pairs (event name -> event handler)\n if (arguments.length === 0) {\n for (eventName in this.__eventListeners) {\n _removeEventListener.call(this, eventName);\n }\n }\n // one object with key/value pairs was passed\n else if (arguments.length === 1 && typeof arguments[0] === 'object') {\n for (var prop in eventName) {\n _removeEventListener.call(this, prop, eventName[prop]);\n }\n }\n else {\n _removeEventListener.call(this, eventName, handler);\n }\n return this;\n }\n\n /**\n * Fires event with an optional options object\n * @memberOf fabric.Observable\n * @param {String} eventName Event name to fire\n * @param {Object} [options] Options object\n * @return {Self} thisArg\n * @chainable\n */\n function fire(eventName, options) {\n if (!this.__eventListeners) {\n return this;\n }\n\n var listenersForEvent = this.__eventListeners[eventName];\n if (!listenersForEvent) {\n return this;\n }\n\n for (var i = 0, len = listenersForEvent.length; i < len; i++) {\n listenersForEvent[i] && listenersForEvent[i].call(this, options || { });\n }\n this.__eventListeners[eventName] = listenersForEvent.filter(function(value) {\n return value !== false;\n });\n return this;\n }\n\n /**\n * @namespace fabric.Observable\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#events}\n * @see {@link http://fabricjs.com/events|Events demo}\n */\n fabric.Observable = {\n fire: fire,\n on: on,\n once: once,\n off: off,\n };\n})();\n\n\n/**\n * @namespace fabric.Collection\n */\nfabric.Collection = {\n\n _objects: [],\n\n /**\n * Adds objects to collection, Canvas or Group, then renders canvas\n * (if `renderOnAddRemove` is not `false`).\n * in case of Group no changes to bounding box are made.\n * Objects should be instances of (or inherit from) fabric.Object\n * Use of this function is highly discouraged for groups.\n * you can add a bunch of objects with the add method but then you NEED\n * to run a addWithUpdate call for the Group class or position/bbox will be wrong.\n * @param {...fabric.Object} object Zero or more fabric instances\n * @return {Self} thisArg\n * @chainable\n */\n add: function () {\n this._objects.push.apply(this._objects, arguments);\n if (this._onObjectAdded) {\n for (var i = 0, length = arguments.length; i < length; i++) {\n this._onObjectAdded(arguments[i]);\n }\n }\n this.renderOnAddRemove && this.requestRenderAll();\n return this;\n },\n\n /**\n * Inserts an object into collection at specified index, then renders canvas (if `renderOnAddRemove` is not `false`)\n * An object should be an instance of (or inherit from) fabric.Object\n * Use of this function is highly discouraged for groups.\n * you can add a bunch of objects with the insertAt method but then you NEED\n * to run a addWithUpdate call for the Group class or position/bbox will be wrong.\n * @param {Object} object Object to insert\n * @param {Number} index Index to insert object at\n * @param {Boolean} nonSplicing When `true`, no splicing (shifting) of objects occurs\n * @return {Self} thisArg\n * @chainable\n */\n insertAt: function (object, index, nonSplicing) {\n var objects = this._objects;\n if (nonSplicing) {\n objects[index] = object;\n }\n else {\n objects.splice(index, 0, object);\n }\n this._onObjectAdded && this._onObjectAdded(object);\n this.renderOnAddRemove && this.requestRenderAll();\n return this;\n },\n\n /**\n * Removes objects from a collection, then renders canvas (if `renderOnAddRemove` is not `false`)\n * @param {...fabric.Object} object Zero or more fabric instances\n * @return {Self} thisArg\n * @chainable\n */\n remove: function() {\n var objects = this._objects,\n index, somethingRemoved = false;\n\n for (var i = 0, length = arguments.length; i < length; i++) {\n index = objects.indexOf(arguments[i]);\n\n // only call onObjectRemoved if an object was actually removed\n if (index !== -1) {\n somethingRemoved = true;\n objects.splice(index, 1);\n this._onObjectRemoved && this._onObjectRemoved(arguments[i]);\n }\n }\n\n this.renderOnAddRemove && somethingRemoved && this.requestRenderAll();\n return this;\n },\n\n /**\n * Executes given function for each object in this group\n * @param {Function} callback\n * Callback invoked with current object as first argument,\n * index - as second and an array of all objects - as third.\n * Callback is invoked in a context of Global Object (e.g. `window`)\n * when no `context` argument is given\n *\n * @param {Object} context Context (aka thisObject)\n * @return {Self} thisArg\n * @chainable\n */\n forEachObject: function(callback, context) {\n var objects = this.getObjects();\n for (var i = 0, len = objects.length; i < len; i++) {\n callback.call(context, objects[i], i, objects);\n }\n return this;\n },\n\n /**\n * Returns an array of children objects of this instance\n * Type parameter introduced in 1.3.10\n * since 2.3.5 this method return always a COPY of the array;\n * @param {String} [type] When specified, only objects of this type are returned\n * @return {Array}\n */\n getObjects: function(type) {\n if (typeof type === 'undefined') {\n return this._objects.concat();\n }\n return this._objects.filter(function(o) {\n return o.type === type;\n });\n },\n\n /**\n * Returns object at specified index\n * @param {Number} index\n * @return {Self} thisArg\n */\n item: function (index) {\n return this._objects[index];\n },\n\n /**\n * Returns true if collection contains no objects\n * @return {Boolean} true if collection is empty\n */\n isEmpty: function () {\n return this._objects.length === 0;\n },\n\n /**\n * Returns a size of a collection (i.e: length of an array containing its objects)\n * @return {Number} Collection size\n */\n size: function() {\n return this._objects.length;\n },\n\n /**\n * Returns true if collection contains an object\n * @param {Object} object Object to check against\n * @param {Boolean} [deep=false] `true` to check all descendants, `false` to check only `_objects`\n * @return {Boolean} `true` if collection contains an object\n */\n contains: function (object, deep) {\n if (this._objects.indexOf(object) > -1) {\n return true;\n }\n else if (deep) {\n return this._objects.some(function (obj) {\n return typeof obj.contains === 'function' && obj.contains(object, true);\n });\n }\n return false;\n },\n\n /**\n * Returns number representation of a collection complexity\n * @return {Number} complexity\n */\n complexity: function () {\n return this._objects.reduce(function (memo, current) {\n memo += current.complexity ? current.complexity() : 0;\n return memo;\n }, 0);\n }\n};\n\n\n/**\n * @namespace fabric.CommonMethods\n */\nfabric.CommonMethods = {\n\n /**\n * Sets object's properties from options\n * @param {Object} [options] Options object\n */\n _setOptions: function(options) {\n for (var prop in options) {\n this.set(prop, options[prop]);\n }\n },\n\n /**\n * @private\n * @param {Object} [filler] Options object\n * @param {String} [property] property to set the Gradient to\n */\n _initGradient: function(filler, property) {\n if (filler && filler.colorStops && !(filler instanceof fabric.Gradient)) {\n this.set(property, new fabric.Gradient(filler));\n }\n },\n\n /**\n * @private\n * @param {Object} [filler] Options object\n * @param {String} [property] property to set the Pattern to\n * @param {Function} [callback] callback to invoke after pattern load\n */\n _initPattern: function(filler, property, callback) {\n if (filler && filler.source && !(filler instanceof fabric.Pattern)) {\n this.set(property, new fabric.Pattern(filler, callback));\n }\n else {\n callback && callback();\n }\n },\n\n /**\n * @private\n */\n _setObject: function(obj) {\n for (var prop in obj) {\n this._set(prop, obj[prop]);\n }\n },\n\n /**\n * Sets property to a given value. When changing position/dimension -related properties (left, top, scale, angle, etc.) `set` does not update position of object's borders/controls. If you need to update those, call `setCoords()`.\n * @param {String|Object} key Property name or object (if object, iterate over the object properties)\n * @param {Object|Function} value Property value (if function, the value is passed into it and its return value is used as a new one)\n * @return {fabric.Object} thisArg\n * @chainable\n */\n set: function(key, value) {\n if (typeof key === 'object') {\n this._setObject(key);\n }\n else {\n this._set(key, value);\n }\n return this;\n },\n\n _set: function(key, value) {\n this[key] = value;\n },\n\n /**\n * Toggles specified property from `true` to `false` or from `false` to `true`\n * @param {String} property Property to toggle\n * @return {fabric.Object} thisArg\n * @chainable\n */\n toggle: function(property) {\n var value = this.get(property);\n if (typeof value === 'boolean') {\n this.set(property, !value);\n }\n return this;\n },\n\n /**\n * Basic getter\n * @param {String} property Property name\n * @return {*} value of a property\n */\n get: function(property) {\n return this[property];\n }\n};\n\n\n(function(global) {\n\n var sqrt = Math.sqrt,\n atan2 = Math.atan2,\n pow = Math.pow,\n PiBy180 = Math.PI / 180,\n PiBy2 = Math.PI / 2;\n\n /**\n * @namespace fabric.util\n */\n fabric.util = {\n\n /**\n * Calculate the cos of an angle, avoiding returning floats for known results\n * @static\n * @memberOf fabric.util\n * @param {Number} angle the angle in radians or in degree\n * @return {Number}\n */\n cos: function(angle) {\n if (angle === 0) { return 1; }\n if (angle < 0) {\n // cos(a) = cos(-a)\n angle = -angle;\n }\n var angleSlice = angle / PiBy2;\n switch (angleSlice) {\n case 1: case 3: return 0;\n case 2: return -1;\n }\n return Math.cos(angle);\n },\n\n /**\n * Calculate the sin of an angle, avoiding returning floats for known results\n * @static\n * @memberOf fabric.util\n * @param {Number} angle the angle in radians or in degree\n * @return {Number}\n */\n sin: function(angle) {\n if (angle === 0) { return 0; }\n var angleSlice = angle / PiBy2, sign = 1;\n if (angle < 0) {\n // sin(-a) = -sin(a)\n sign = -1;\n }\n switch (angleSlice) {\n case 1: return sign;\n case 2: return 0;\n case 3: return -sign;\n }\n return Math.sin(angle);\n },\n\n /**\n * Removes value from an array.\n * Presence of value (and its position in an array) is determined via `Array.prototype.indexOf`\n * @static\n * @memberOf fabric.util\n * @param {Array} array\n * @param {*} value\n * @return {Array} original array\n */\n removeFromArray: function(array, value) {\n var idx = array.indexOf(value);\n if (idx !== -1) {\n array.splice(idx, 1);\n }\n return array;\n },\n\n /**\n * Returns random number between 2 specified ones.\n * @static\n * @memberOf fabric.util\n * @param {Number} min lower limit\n * @param {Number} max upper limit\n * @return {Number} random value (between min and max)\n */\n getRandomInt: function(min, max) {\n return Math.floor(Math.random() * (max - min + 1)) + min;\n },\n\n /**\n * Transforms degrees to radians.\n * @static\n * @memberOf fabric.util\n * @param {Number} degrees value in degrees\n * @return {Number} value in radians\n */\n degreesToRadians: function(degrees) {\n return degrees * PiBy180;\n },\n\n /**\n * Transforms radians to degrees.\n * @static\n * @memberOf fabric.util\n * @param {Number} radians value in radians\n * @return {Number} value in degrees\n */\n radiansToDegrees: function(radians) {\n return radians / PiBy180;\n },\n\n /**\n * Rotates `point` around `origin` with `radians`\n * @static\n * @memberOf fabric.util\n * @param {fabric.Point} point The point to rotate\n * @param {fabric.Point} origin The origin of the rotation\n * @param {Number} radians The radians of the angle for the rotation\n * @return {fabric.Point} The new rotated point\n */\n rotatePoint: function(point, origin, radians) {\n var newPoint = new fabric.Point(point.x - origin.x, point.y - origin.y),\n v = fabric.util.rotateVector(newPoint, radians);\n return new fabric.Point(v.x, v.y).addEquals(origin);\n },\n\n /**\n * Rotates `vector` with `radians`\n * @static\n * @memberOf fabric.util\n * @param {Object} vector The vector to rotate (x and y)\n * @param {Number} radians The radians of the angle for the rotation\n * @return {Object} The new rotated point\n */\n rotateVector: function(vector, radians) {\n var sin = fabric.util.sin(radians),\n cos = fabric.util.cos(radians),\n rx = vector.x * cos - vector.y * sin,\n ry = vector.x * sin + vector.y * cos;\n return {\n x: rx,\n y: ry\n };\n },\n\n /**\n * Creates a vetor from points represented as a point\n * @static\n * @memberOf fabric.util\n *\n * @typedef {Object} Point\n * @property {number} x\n * @property {number} y\n *\n * @param {Point} from\n * @param {Point} to\n * @returns {Point} vector\n */\n createVector: function (from, to) {\n return new fabric.Point(to.x - from.x, to.y - from.y);\n },\n\n /**\n * Calculates angle between 2 vectors using dot product\n * @static\n * @memberOf fabric.util\n * @param {Point} a\n * @param {Point} b\n * @returns the angle in radian between the vectors\n */\n calcAngleBetweenVectors: function (a, b) {\n return Math.acos((a.x * b.x + a.y * b.y) / (Math.hypot(a.x, a.y) * Math.hypot(b.x, b.y)));\n },\n\n /**\n * @static\n * @memberOf fabric.util\n * @param {Point} v\n * @returns {Point} vector representing the unit vector of pointing to the direction of `v`\n */\n getHatVector: function (v) {\n return new fabric.Point(v.x, v.y).multiply(1 / Math.hypot(v.x, v.y));\n },\n\n /**\n * @static\n * @memberOf fabric.util\n * @param {Point} A\n * @param {Point} B\n * @param {Point} C\n * @returns {{ vector: Point, angle: number }} vector representing the bisector of A and A's angle\n */\n getBisector: function (A, B, C) {\n var AB = fabric.util.createVector(A, B), AC = fabric.util.createVector(A, C);\n var alpha = fabric.util.calcAngleBetweenVectors(AB, AC);\n // check if alpha is relative to AB->BC\n var ro = fabric.util.calcAngleBetweenVectors(fabric.util.rotateVector(AB, alpha), AC);\n var phi = alpha * (ro === 0 ? 1 : -1) / 2;\n return {\n vector: fabric.util.getHatVector(fabric.util.rotateVector(AB, phi)),\n angle: alpha\n };\n },\n\n /**\n * Project stroke width on points returning 2 projections for each point as follows:\n * - `miter`: 2 points corresponding to the outer boundary and the inner boundary of stroke.\n * - `bevel`: 2 points corresponding to the bevel boundaries, tangent to the bisector.\n * - `round`: same as `bevel`\n * Used to calculate object's bounding box\n * @static\n * @memberOf fabric.util\n * @param {Point[]} points\n * @param {Object} options\n * @param {number} options.strokeWidth\n * @param {'miter'|'bevel'|'round'} options.strokeLineJoin\n * @param {number} options.strokeMiterLimit https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-miterlimit\n * @param {boolean} options.strokeUniform\n * @param {number} options.scaleX\n * @param {number} options.scaleY\n * @param {boolean} [openPath] whether the shape is open or not, affects the calculations of the first and last points\n * @returns {fabric.Point[]} array of size 2n/4n of all suspected points\n */\n projectStrokeOnPoints: function (points, options, openPath) {\n var coords = [], s = options.strokeWidth / 2,\n strokeUniformScalar = options.strokeUniform ?\n new fabric.Point(1 / options.scaleX, 1 / options.scaleY) : new fabric.Point(1, 1),\n getStrokeHatVector = function (v) {\n var scalar = s / (Math.hypot(v.x, v.y));\n return new fabric.Point(v.x * scalar * strokeUniformScalar.x, v.y * scalar * strokeUniformScalar.y);\n };\n if (points.length <= 1) {return coords;}\n points.forEach(function (p, index) {\n var A = new fabric.Point(p.x, p.y), B, C;\n if (index === 0) {\n C = points[index + 1];\n B = openPath ? getStrokeHatVector(fabric.util.createVector(C, A)).addEquals(A) : points[points.length - 1];\n }\n else if (index === points.length - 1) {\n B = points[index - 1];\n C = openPath ? getStrokeHatVector(fabric.util.createVector(B, A)).addEquals(A) : points[0];\n }\n else {\n B = points[index - 1];\n C = points[index + 1];\n }\n var bisector = fabric.util.getBisector(A, B, C),\n bisectorVector = bisector.vector,\n alpha = bisector.angle,\n scalar,\n miterVector;\n if (options.strokeLineJoin === 'miter') {\n scalar = -s / Math.sin(alpha / 2);\n miterVector = new fabric.Point(\n bisectorVector.x * scalar * strokeUniformScalar.x,\n bisectorVector.y * scalar * strokeUniformScalar.y\n );\n if (Math.hypot(miterVector.x, miterVector.y) / s <= options.strokeMiterLimit) {\n coords.push(A.add(miterVector));\n coords.push(A.subtract(miterVector));\n return;\n }\n }\n scalar = -s * Math.SQRT2;\n miterVector = new fabric.Point(\n bisectorVector.x * scalar * strokeUniformScalar.x,\n bisectorVector.y * scalar * strokeUniformScalar.y\n );\n coords.push(A.add(miterVector));\n coords.push(A.subtract(miterVector));\n });\n return coords;\n },\n\n /**\n * Apply transform t to point p\n * @static\n * @memberOf fabric.util\n * @param {fabric.Point} p The point to transform\n * @param {Array} t The transform\n * @param {Boolean} [ignoreOffset] Indicates that the offset should not be applied\n * @return {fabric.Point} The transformed point\n */\n transformPoint: function(p, t, ignoreOffset) {\n if (ignoreOffset) {\n return new fabric.Point(\n t[0] * p.x + t[2] * p.y,\n t[1] * p.x + t[3] * p.y\n );\n }\n return new fabric.Point(\n t[0] * p.x + t[2] * p.y + t[4],\n t[1] * p.x + t[3] * p.y + t[5]\n );\n },\n\n /**\n * Returns coordinates of points's bounding rectangle (left, top, width, height)\n * @param {Array} points 4 points array\n * @param {Array} [transform] an array of 6 numbers representing a 2x3 transform matrix\n * @return {Object} Object with left, top, width, height properties\n */\n makeBoundingBoxFromPoints: function(points, transform) {\n if (transform) {\n for (var i = 0; i < points.length; i++) {\n points[i] = fabric.util.transformPoint(points[i], transform);\n }\n }\n var xPoints = [points[0].x, points[1].x, points[2].x, points[3].x],\n minX = fabric.util.array.min(xPoints),\n maxX = fabric.util.array.max(xPoints),\n width = maxX - minX,\n yPoints = [points[0].y, points[1].y, points[2].y, points[3].y],\n minY = fabric.util.array.min(yPoints),\n maxY = fabric.util.array.max(yPoints),\n height = maxY - minY;\n\n return {\n left: minX,\n top: minY,\n width: width,\n height: height\n };\n },\n\n /**\n * Invert transformation t\n * @static\n * @memberOf fabric.util\n * @param {Array} t The transform\n * @return {Array} The inverted transform\n */\n invertTransform: function(t) {\n var a = 1 / (t[0] * t[3] - t[1] * t[2]),\n r = [a * t[3], -a * t[1], -a * t[2], a * t[0]],\n o = fabric.util.transformPoint({ x: t[4], y: t[5] }, r, true);\n r[4] = -o.x;\n r[5] = -o.y;\n return r;\n },\n\n /**\n * A wrapper around Number#toFixed, which contrary to native method returns number, not string.\n * @static\n * @memberOf fabric.util\n * @param {Number|String} number number to operate on\n * @param {Number} fractionDigits number of fraction digits to \"leave\"\n * @return {Number}\n */\n toFixed: function(number, fractionDigits) {\n return parseFloat(Number(number).toFixed(fractionDigits));\n },\n\n /**\n * Converts from attribute value to pixel value if applicable.\n * Returns converted pixels or original value not converted.\n * @param {Number|String} value number to operate on\n * @param {Number} fontSize\n * @return {Number|String}\n */\n parseUnit: function(value, fontSize) {\n var unit = /\\D{0,2}$/.exec(value),\n number = parseFloat(value);\n if (!fontSize) {\n fontSize = fabric.Text.DEFAULT_SVG_FONT_SIZE;\n }\n switch (unit[0]) {\n case 'mm':\n return number * fabric.DPI / 25.4;\n\n case 'cm':\n return number * fabric.DPI / 2.54;\n\n case 'in':\n return number * fabric.DPI;\n\n case 'pt':\n return number * fabric.DPI / 72; // or * 4 / 3\n\n case 'pc':\n return number * fabric.DPI / 72 * 12; // or * 16\n\n case 'em':\n return number * fontSize;\n\n default:\n return number;\n }\n },\n\n /**\n * Function which always returns `false`.\n * @static\n * @memberOf fabric.util\n * @return {Boolean}\n */\n falseFunction: function() {\n return false;\n },\n\n /**\n * Returns klass \"Class\" object of given namespace\n * @memberOf fabric.util\n * @param {String} type Type of object (eg. 'circle')\n * @param {String} namespace Namespace to get klass \"Class\" object from\n * @return {Object} klass \"Class\"\n */\n getKlass: function(type, namespace) {\n // capitalize first letter only\n type = fabric.util.string.camelize(type.charAt(0).toUpperCase() + type.slice(1));\n return fabric.util.resolveNamespace(namespace)[type];\n },\n\n /**\n * Returns array of attributes for given svg that fabric parses\n * @memberOf fabric.util\n * @param {String} type Type of svg element (eg. 'circle')\n * @return {Array} string names of supported attributes\n */\n getSvgAttributes: function(type) {\n var attributes = [\n 'instantiated_by_use',\n 'style',\n 'id',\n 'class'\n ];\n switch (type) {\n case 'linearGradient':\n attributes = attributes.concat(['x1', 'y1', 'x2', 'y2', 'gradientUnits', 'gradientTransform']);\n break;\n case 'radialGradient':\n attributes = attributes.concat(['gradientUnits', 'gradientTransform', 'cx', 'cy', 'r', 'fx', 'fy', 'fr']);\n break;\n case 'stop':\n attributes = attributes.concat(['offset', 'stop-color', 'stop-opacity']);\n break;\n }\n return attributes;\n },\n\n /**\n * Returns object of given namespace\n * @memberOf fabric.util\n * @param {String} namespace Namespace string e.g. 'fabric.Image.filter' or 'fabric'\n * @return {Object} Object for given namespace (default fabric)\n */\n resolveNamespace: function(namespace) {\n if (!namespace) {\n return fabric;\n }\n\n var parts = namespace.split('.'),\n len = parts.length, i,\n obj = global || fabric.window;\n\n for (i = 0; i < len; ++i) {\n obj = obj[parts[i]];\n }\n\n return obj;\n },\n\n /**\n * Loads image element from given url and passes it to a callback\n * @memberOf fabric.util\n * @param {String} url URL representing an image\n * @param {Function} callback Callback; invoked with loaded image\n * @param {*} [context] Context to invoke callback in\n * @param {Object} [crossOrigin] crossOrigin value to set image element to\n */\n loadImage: function(url, callback, context, crossOrigin) {\n if (!url) {\n callback && callback.call(context, url);\n return;\n }\n\n var img = fabric.util.createImage();\n\n /** @ignore */\n var onLoadCallback = function () {\n callback && callback.call(context, img, false);\n img = img.onload = img.onerror = null;\n };\n\n img.onload = onLoadCallback;\n /** @ignore */\n img.onerror = function() {\n fabric.log('Error loading ' + img.src);\n callback && callback.call(context, null, true);\n img = img.onload = img.onerror = null;\n };\n\n // data-urls appear to be buggy with crossOrigin\n // https://github.com/kangax/fabric.js/commit/d0abb90f1cd5c5ef9d2a94d3fb21a22330da3e0a#commitcomment-4513767\n // see https://code.google.com/p/chromium/issues/detail?id=315152\n // https://bugzilla.mozilla.org/show_bug.cgi?id=935069\n // crossOrigin null is the same as not set.\n if (url.indexOf('data') !== 0 &&\n crossOrigin !== undefined &&\n crossOrigin !== null) {\n img.crossOrigin = crossOrigin;\n }\n\n // IE10 / IE11-Fix: SVG contents from data: URI\n // will only be available if the IMG is present\n // in the DOM (and visible)\n if (url.substring(0,14) === 'data:image/svg') {\n img.onload = null;\n fabric.util.loadImageInDom(img, onLoadCallback);\n }\n\n img.src = url;\n },\n\n /**\n * Attaches SVG image with data: URL to the dom\n * @memberOf fabric.util\n * @param {Object} img Image object with data:image/svg src\n * @param {Function} callback Callback; invoked with loaded image\n * @return {Object} DOM element (div containing the SVG image)\n */\n loadImageInDom: function(img, onLoadCallback) {\n var div = fabric.document.createElement('div');\n div.style.width = div.style.height = '1px';\n div.style.left = div.style.top = '-100%';\n div.style.position = 'absolute';\n div.appendChild(img);\n fabric.document.querySelector('body').appendChild(div);\n /**\n * Wrap in function to:\n * 1. Call existing callback\n * 2. Cleanup DOM\n */\n img.onload = function () {\n onLoadCallback();\n div.parentNode.removeChild(div);\n div = null;\n };\n },\n\n /**\n * Creates corresponding fabric instances from their object representations\n * @static\n * @memberOf fabric.util\n * @param {Array} objects Objects to enliven\n * @param {Function} callback Callback to invoke when all objects are created\n * @param {String} namespace Namespace to get klass \"Class\" object from\n * @param {Function} reviver Method for further parsing of object elements,\n * called after each fabric object created.\n */\n enlivenObjects: function(objects, callback, namespace, reviver) {\n objects = objects || [];\n\n var enlivenedObjects = [],\n numLoadedObjects = 0,\n numTotalObjects = objects.length;\n\n function onLoaded() {\n if (++numLoadedObjects === numTotalObjects) {\n callback && callback(enlivenedObjects.filter(function(obj) {\n // filter out undefined objects (objects that gave error)\n return obj;\n }));\n }\n }\n\n if (!numTotalObjects) {\n callback && callback(enlivenedObjects);\n return;\n }\n\n objects.forEach(function (o, index) {\n // if sparse array\n if (!o || !o.type) {\n onLoaded();\n return;\n }\n var klass = fabric.util.getKlass(o.type, namespace);\n klass.fromObject(o, function (obj, error) {\n error || (enlivenedObjects[index] = obj);\n reviver && reviver(o, obj, error);\n onLoaded();\n });\n });\n },\n\n /**\n * Creates corresponding fabric instances residing in an object, e.g. `clipPath`\n * @see {@link fabric.Object.ENLIVEN_PROPS}\n * @param {Object} object\n * @param {Object} [context] assign enlived props to this object (pass null to skip this)\n * @param {(objects:fabric.Object[]) => void} callback\n */\n enlivenObjectEnlivables: function (object, context, callback) {\n var enlivenProps = fabric.Object.ENLIVEN_PROPS.filter(function (key) { return !!object[key]; });\n fabric.util.enlivenObjects(enlivenProps.map(function (key) { return object[key]; }), function (enlivedProps) {\n var objects = {};\n enlivenProps.forEach(function (key, index) {\n objects[key] = enlivedProps[index];\n context && (context[key] = enlivedProps[index]);\n });\n callback && callback(objects);\n });\n },\n\n /**\n * Create and wait for loading of patterns\n * @static\n * @memberOf fabric.util\n * @param {Array} patterns Objects to enliven\n * @param {Function} callback Callback to invoke when all objects are created\n * called after each fabric object created.\n */\n enlivenPatterns: function(patterns, callback) {\n patterns = patterns || [];\n\n function onLoaded() {\n if (++numLoadedPatterns === numPatterns) {\n callback && callback(enlivenedPatterns);\n }\n }\n\n var enlivenedPatterns = [],\n numLoadedPatterns = 0,\n numPatterns = patterns.length;\n\n if (!numPatterns) {\n callback && callback(enlivenedPatterns);\n return;\n }\n\n patterns.forEach(function (p, index) {\n if (p && p.source) {\n new fabric.Pattern(p, function(pattern) {\n enlivenedPatterns[index] = pattern;\n onLoaded();\n });\n }\n else {\n enlivenedPatterns[index] = p;\n onLoaded();\n }\n });\n },\n\n /**\n * Groups SVG elements (usually those retrieved from SVG document)\n * @static\n * @memberOf fabric.util\n * @param {Array} elements SVG elements to group\n * @param {Object} [options] Options object\n * @param {String} path Value to set sourcePath to\n * @return {fabric.Object|fabric.Group}\n */\n groupSVGElements: function(elements, options, path) {\n var object;\n if (elements && elements.length === 1) {\n if (typeof path !== 'undefined') {\n elements[0].sourcePath = path;\n }\n return elements[0];\n }\n if (options) {\n if (options.width && options.height) {\n options.centerPoint = {\n x: options.width / 2,\n y: options.height / 2\n };\n }\n else {\n delete options.width;\n delete options.height;\n }\n }\n object = new fabric.Group(elements, options);\n if (typeof path !== 'undefined') {\n object.sourcePath = path;\n }\n return object;\n },\n\n /**\n * Populates an object with properties of another object\n * @static\n * @memberOf fabric.util\n * @param {Object} source Source object\n * @param {Object} destination Destination object\n * @return {Array} properties Properties names to include\n */\n populateWithProperties: function(source, destination, properties) {\n if (properties && Array.isArray(properties)) {\n for (var i = 0, len = properties.length; i < len; i++) {\n if (properties[i] in source) {\n destination[properties[i]] = source[properties[i]];\n }\n }\n }\n },\n\n /**\n * Creates canvas element\n * @static\n * @memberOf fabric.util\n * @return {CanvasElement} initialized canvas element\n */\n createCanvasElement: function() {\n return fabric.document.createElement('canvas');\n },\n\n /**\n * Creates a canvas element that is a copy of another and is also painted\n * @param {CanvasElement} canvas to copy size and content of\n * @static\n * @memberOf fabric.util\n * @return {CanvasElement} initialized canvas element\n */\n copyCanvasElement: function(canvas) {\n var newCanvas = fabric.util.createCanvasElement();\n newCanvas.width = canvas.width;\n newCanvas.height = canvas.height;\n newCanvas.getContext('2d').drawImage(canvas, 0, 0);\n return newCanvas;\n },\n\n /**\n * since 2.6.0 moved from canvas instance to utility.\n * @param {CanvasElement} canvasEl to copy size and content of\n * @param {String} format 'jpeg' or 'png', in some browsers 'webp' is ok too\n * @param {Number} quality <= 1 and > 0\n * @static\n * @memberOf fabric.util\n * @return {String} data url\n */\n toDataURL: function(canvasEl, format, quality) {\n return canvasEl.toDataURL('image/' + format, quality);\n },\n\n /**\n * Creates image element (works on client and node)\n * @static\n * @memberOf fabric.util\n * @return {HTMLImageElement} HTML image element\n */\n createImage: function() {\n return fabric.document.createElement('img');\n },\n\n /**\n * Multiply matrix A by matrix B to nest transformations\n * @static\n * @memberOf fabric.util\n * @param {Array} a First transformMatrix\n * @param {Array} b Second transformMatrix\n * @param {Boolean} is2x2 flag to multiply matrices as 2x2 matrices\n * @return {Array} The product of the two transform matrices\n */\n multiplyTransformMatrices: function(a, b, is2x2) {\n // Matrix multiply a * b\n return [\n a[0] * b[0] + a[2] * b[1],\n a[1] * b[0] + a[3] * b[1],\n a[0] * b[2] + a[2] * b[3],\n a[1] * b[2] + a[3] * b[3],\n is2x2 ? 0 : a[0] * b[4] + a[2] * b[5] + a[4],\n is2x2 ? 0 : a[1] * b[4] + a[3] * b[5] + a[5]\n ];\n },\n\n /**\n * Decomposes standard 2x3 matrix into transform components\n * @static\n * @memberOf fabric.util\n * @param {Array} a transformMatrix\n * @return {Object} Components of transform\n */\n qrDecompose: function(a) {\n var angle = atan2(a[1], a[0]),\n denom = pow(a[0], 2) + pow(a[1], 2),\n scaleX = sqrt(denom),\n scaleY = (a[0] * a[3] - a[2] * a[1]) / scaleX,\n skewX = atan2(a[0] * a[2] + a[1] * a [3], denom);\n return {\n angle: angle / PiBy180,\n scaleX: scaleX,\n scaleY: scaleY,\n skewX: skewX / PiBy180,\n skewY: 0,\n translateX: a[4],\n translateY: a[5]\n };\n },\n\n /**\n * Returns a transform matrix starting from an object of the same kind of\n * the one returned from qrDecompose, useful also if you want to calculate some\n * transformations from an object that is not enlived yet\n * @static\n * @memberOf fabric.util\n * @param {Object} options\n * @param {Number} [options.angle] angle in degrees\n * @return {Number[]} transform matrix\n */\n calcRotateMatrix: function(options) {\n if (!options.angle) {\n return fabric.iMatrix.concat();\n }\n var theta = fabric.util.degreesToRadians(options.angle),\n cos = fabric.util.cos(theta),\n sin = fabric.util.sin(theta);\n return [cos, sin, -sin, cos, 0, 0];\n },\n\n /**\n * Returns a transform matrix starting from an object of the same kind of\n * the one returned from qrDecompose, useful also if you want to calculate some\n * transformations from an object that is not enlived yet.\n * is called DimensionsTransformMatrix because those properties are the one that influence\n * the size of the resulting box of the object.\n * @static\n * @memberOf fabric.util\n * @param {Object} options\n * @param {Number} [options.scaleX]\n * @param {Number} [options.scaleY]\n * @param {Boolean} [options.flipX]\n * @param {Boolean} [options.flipY]\n * @param {Number} [options.skewX]\n * @param {Number} [options.skewY]\n * @return {Number[]} transform matrix\n */\n calcDimensionsMatrix: function(options) {\n var scaleX = typeof options.scaleX === 'undefined' ? 1 : options.scaleX,\n scaleY = typeof options.scaleY === 'undefined' ? 1 : options.scaleY,\n scaleMatrix = [\n options.flipX ? -scaleX : scaleX,\n 0,\n 0,\n options.flipY ? -scaleY : scaleY,\n 0,\n 0],\n multiply = fabric.util.multiplyTransformMatrices,\n degreesToRadians = fabric.util.degreesToRadians;\n if (options.skewX) {\n scaleMatrix = multiply(\n scaleMatrix,\n [1, 0, Math.tan(degreesToRadians(options.skewX)), 1],\n true);\n }\n if (options.skewY) {\n scaleMatrix = multiply(\n scaleMatrix,\n [1, Math.tan(degreesToRadians(options.skewY)), 0, 1],\n true);\n }\n return scaleMatrix;\n },\n\n /**\n * Returns a transform matrix starting from an object of the same kind of\n * the one returned from qrDecompose, useful also if you want to calculate some\n * transformations from an object that is not enlived yet\n * @static\n * @memberOf fabric.util\n * @param {Object} options\n * @param {Number} [options.angle]\n * @param {Number} [options.scaleX]\n * @param {Number} [options.scaleY]\n * @param {Boolean} [options.flipX]\n * @param {Boolean} [options.flipY]\n * @param {Number} [options.skewX]\n * @param {Number} [options.skewX]\n * @param {Number} [options.translateX]\n * @param {Number} [options.translateY]\n * @return {Number[]} transform matrix\n */\n composeMatrix: function(options) {\n var matrix = [1, 0, 0, 1, options.translateX || 0, options.translateY || 0],\n multiply = fabric.util.multiplyTransformMatrices;\n if (options.angle) {\n matrix = multiply(matrix, fabric.util.calcRotateMatrix(options));\n }\n if (options.scaleX !== 1 || options.scaleY !== 1 ||\n options.skewX || options.skewY || options.flipX || options.flipY) {\n matrix = multiply(matrix, fabric.util.calcDimensionsMatrix(options));\n }\n return matrix;\n },\n\n /**\n * reset an object transform state to neutral. Top and left are not accounted for\n * @static\n * @memberOf fabric.util\n * @param {fabric.Object} target object to transform\n */\n resetObjectTransform: function (target) {\n target.scaleX = 1;\n target.scaleY = 1;\n target.skewX = 0;\n target.skewY = 0;\n target.flipX = false;\n target.flipY = false;\n target.rotate(0);\n },\n\n /**\n * Extract Object transform values\n * @static\n * @memberOf fabric.util\n * @param {fabric.Object} target object to read from\n * @return {Object} Components of transform\n */\n saveObjectTransform: function (target) {\n return {\n scaleX: target.scaleX,\n scaleY: target.scaleY,\n skewX: target.skewX,\n skewY: target.skewY,\n angle: target.angle,\n left: target.left,\n flipX: target.flipX,\n flipY: target.flipY,\n top: target.top\n };\n },\n\n /**\n * Returns true if context has transparent pixel\n * at specified location (taking tolerance into account)\n * @param {CanvasRenderingContext2D} ctx context\n * @param {Number} x x coordinate\n * @param {Number} y y coordinate\n * @param {Number} tolerance Tolerance\n */\n isTransparent: function(ctx, x, y, tolerance) {\n\n // If tolerance is > 0 adjust start coords to take into account.\n // If moves off Canvas fix to 0\n if (tolerance > 0) {\n if (x > tolerance) {\n x -= tolerance;\n }\n else {\n x = 0;\n }\n if (y > tolerance) {\n y -= tolerance;\n }\n else {\n y = 0;\n }\n }\n\n var _isTransparent = true, i, temp,\n imageData = ctx.getImageData(x, y, (tolerance * 2) || 1, (tolerance * 2) || 1),\n l = imageData.data.length;\n\n // Split image data - for tolerance > 1, pixelDataSize = 4;\n for (i = 3; i < l; i += 4) {\n temp = imageData.data[i];\n _isTransparent = temp <= 0;\n if (_isTransparent === false) {\n break; // Stop if colour found\n }\n }\n\n imageData = null;\n\n return _isTransparent;\n },\n\n /**\n * Parse preserveAspectRatio attribute from element\n * @param {string} attribute to be parsed\n * @return {Object} an object containing align and meetOrSlice attribute\n */\n parsePreserveAspectRatioAttribute: function(attribute) {\n var meetOrSlice = 'meet', alignX = 'Mid', alignY = 'Mid',\n aspectRatioAttrs = attribute.split(' '), align;\n\n if (aspectRatioAttrs && aspectRatioAttrs.length) {\n meetOrSlice = aspectRatioAttrs.pop();\n if (meetOrSlice !== 'meet' && meetOrSlice !== 'slice') {\n align = meetOrSlice;\n meetOrSlice = 'meet';\n }\n else if (aspectRatioAttrs.length) {\n align = aspectRatioAttrs.pop();\n }\n }\n //divide align in alignX and alignY\n alignX = align !== 'none' ? align.slice(1, 4) : 'none';\n alignY = align !== 'none' ? align.slice(5, 8) : 'none';\n return {\n meetOrSlice: meetOrSlice,\n alignX: alignX,\n alignY: alignY\n };\n },\n\n /**\n * Clear char widths cache for the given font family or all the cache if no\n * fontFamily is specified.\n * Use it if you know you are loading fonts in a lazy way and you are not waiting\n * for custom fonts to load properly when adding text objects to the canvas.\n * If a text object is added when its own font is not loaded yet, you will get wrong\n * measurement and so wrong bounding boxes.\n * After the font cache is cleared, either change the textObject text content or call\n * initDimensions() to trigger a recalculation\n * @memberOf fabric.util\n * @param {String} [fontFamily] font family to clear\n */\n clearFabricFontCache: function(fontFamily) {\n fontFamily = (fontFamily || '').toLowerCase();\n if (!fontFamily) {\n fabric.charWidthsCache = { };\n }\n else if (fabric.charWidthsCache[fontFamily]) {\n delete fabric.charWidthsCache[fontFamily];\n }\n },\n\n /**\n * Given current aspect ratio, determines the max width and height that can\n * respect the total allowed area for the cache.\n * @memberOf fabric.util\n * @param {Number} ar aspect ratio\n * @param {Number} maximumArea Maximum area you want to achieve\n * @return {Object.x} Limited dimensions by X\n * @return {Object.y} Limited dimensions by Y\n */\n limitDimsByArea: function(ar, maximumArea) {\n var roughWidth = Math.sqrt(maximumArea * ar),\n perfLimitSizeY = Math.floor(maximumArea / roughWidth);\n return { x: Math.floor(roughWidth), y: perfLimitSizeY };\n },\n\n capValue: function(min, value, max) {\n return Math.max(min, Math.min(value, max));\n },\n\n /**\n * Finds the scale for the object source to fit inside the object destination,\n * keeping aspect ratio intact.\n * respect the total allowed area for the cache.\n * @memberOf fabric.util\n * @param {Object | fabric.Object} source\n * @param {Number} source.height natural unscaled height of the object\n * @param {Number} source.width natural unscaled width of the object\n * @param {Object | fabric.Object} destination\n * @param {Number} destination.height natural unscaled height of the object\n * @param {Number} destination.width natural unscaled width of the object\n * @return {Number} scale factor to apply to source to fit into destination\n */\n findScaleToFit: function(source, destination) {\n return Math.min(destination.width / source.width, destination.height / source.height);\n },\n\n /**\n * Finds the scale for the object source to cover entirely the object destination,\n * keeping aspect ratio intact.\n * respect the total allowed area for the cache.\n * @memberOf fabric.util\n * @param {Object | fabric.Object} source\n * @param {Number} source.height natural unscaled height of the object\n * @param {Number} source.width natural unscaled width of the object\n * @param {Object | fabric.Object} destination\n * @param {Number} destination.height natural unscaled height of the object\n * @param {Number} destination.width natural unscaled width of the object\n * @return {Number} scale factor to apply to source to cover destination\n */\n findScaleToCover: function(source, destination) {\n return Math.max(destination.width / source.width, destination.height / source.height);\n },\n\n /**\n * given an array of 6 number returns something like `\"matrix(...numbers)\"`\n * @memberOf fabric.util\n * @param {Array} transform an array with 6 numbers\n * @return {String} transform matrix for svg\n * @return {Object.y} Limited dimensions by Y\n */\n matrixToSVG: function(transform) {\n return 'matrix(' + transform.map(function(value) {\n return fabric.util.toFixed(value, fabric.Object.NUM_FRACTION_DIGITS);\n }).join(' ') + ')';\n },\n\n /**\n * given an object and a transform, apply the inverse transform to the object,\n * this is equivalent to remove from that object that transformation, so that\n * added in a space with the removed transform, the object will be the same as before.\n * Removing from an object a transform that scale by 2 is like scaling it by 1/2.\n * Removing from an object a transfrom that rotate by 30deg is like rotating by 30deg\n * in the opposite direction.\n * This util is used to add objects inside transformed groups or nested groups.\n * @memberOf fabric.util\n * @param {fabric.Object} object the object you want to transform\n * @param {Array} transform the destination transform\n */\n removeTransformFromObject: function(object, transform) {\n var inverted = fabric.util.invertTransform(transform),\n finalTransform = fabric.util.multiplyTransformMatrices(inverted, object.calcOwnMatrix());\n fabric.util.applyTransformToObject(object, finalTransform);\n },\n\n /**\n * given an object and a transform, apply the transform to the object.\n * this is equivalent to change the space where the object is drawn.\n * Adding to an object a transform that scale by 2 is like scaling it by 2.\n * This is used when removing an object from an active selection for example.\n * @memberOf fabric.util\n * @param {fabric.Object} object the object you want to transform\n * @param {Array} transform the destination transform\n */\n addTransformToObject: function(object, transform) {\n fabric.util.applyTransformToObject(\n object,\n fabric.util.multiplyTransformMatrices(transform, object.calcOwnMatrix())\n );\n },\n\n /**\n * discard an object transform state and apply the one from the matrix.\n * @memberOf fabric.util\n * @param {fabric.Object} object the object you want to transform\n * @param {Array} transform the destination transform\n */\n applyTransformToObject: function(object, transform) {\n var options = fabric.util.qrDecompose(transform),\n center = new fabric.Point(options.translateX, options.translateY);\n object.flipX = false;\n object.flipY = false;\n object.set('scaleX', options.scaleX);\n object.set('scaleY', options.scaleY);\n object.skewX = options.skewX;\n object.skewY = options.skewY;\n object.angle = options.angle;\n object.setPositionByOrigin(center, 'center', 'center');\n },\n\n /**\n * given a width and height, return the size of the bounding box\n * that can contains the box with width/height with applied transform\n * described in options.\n * Use to calculate the boxes around objects for controls.\n * @memberOf fabric.util\n * @param {Number} width\n * @param {Number} height\n * @param {Object} options\n * @param {Number} options.scaleX\n * @param {Number} options.scaleY\n * @param {Number} options.skewX\n * @param {Number} options.skewY\n * @return {Object.x} width of containing\n * @return {Object.y} height of containing\n */\n sizeAfterTransform: function(width, height, options) {\n var dimX = width / 2, dimY = height / 2,\n points = [\n {\n x: -dimX,\n y: -dimY\n },\n {\n x: dimX,\n y: -dimY\n },\n {\n x: -dimX,\n y: dimY\n },\n {\n x: dimX,\n y: dimY\n }],\n transformMatrix = fabric.util.calcDimensionsMatrix(options),\n bbox = fabric.util.makeBoundingBoxFromPoints(points, transformMatrix);\n return {\n x: bbox.width,\n y: bbox.height,\n };\n },\n\n /**\n * Merges 2 clip paths into one visually equal clip path\n *\n * **IMPORTANT**:\\\n * Does **NOT** clone the arguments, clone them proir if necessary.\n *\n * Creates a wrapper (group) that contains one clip path and is clipped by the other so content is kept where both overlap.\n * Use this method if both the clip paths may have nested clip paths of their own, so assigning one to the other's clip path property is not possible.\n *\n * In order to handle the `inverted` property we follow logic described in the following cases:\\\n * **(1)** both clip paths are inverted - the clip paths pass the inverted prop to the wrapper and loose it themselves.\\\n * **(2)** one is inverted and the other isn't - the wrapper shouldn't become inverted and the inverted clip path must clip the non inverted one to produce an identical visual effect.\\\n * **(3)** both clip paths are not inverted - wrapper and clip paths remain unchanged.\n *\n * @memberOf fabric.util\n * @param {fabric.Object} c1\n * @param {fabric.Object} c2\n * @returns {fabric.Object} merged clip path\n */\n mergeClipPaths: function (c1, c2) {\n var a = c1, b = c2;\n if (a.inverted && !b.inverted) {\n // case (2)\n a = c2;\n b = c1;\n }\n // `b` becomes `a`'s clip path so we transform `b` to `a` coordinate plane\n fabric.util.applyTransformToObject(\n b,\n fabric.util.multiplyTransformMatrices(\n fabric.util.invertTransform(a.calcTransformMatrix()),\n b.calcTransformMatrix()\n )\n );\n // assign the `inverted` prop to the wrapping group\n var inverted = a.inverted && b.inverted;\n if (inverted) {\n // case (1)\n a.inverted = b.inverted = false;\n }\n return new fabric.Group([a], { clipPath: b, inverted: inverted });\n },\n\n /**\n * @memberOf fabric.util\n * @param {Object} prevStyle first style to compare\n * @param {Object} thisStyle second style to compare\n * @param {boolean} forTextSpans whether to check overline, underline, and line-through properties\n * @return {boolean} true if the style changed\n */\n hasStyleChanged: function(prevStyle, thisStyle, forTextSpans) {\n forTextSpans = forTextSpans || false;\n return (prevStyle.fill !== thisStyle.fill ||\n prevStyle.stroke !== thisStyle.stroke ||\n prevStyle.strokeWidth !== thisStyle.strokeWidth ||\n prevStyle.fontSize !== thisStyle.fontSize ||\n prevStyle.fontFamily !== thisStyle.fontFamily ||\n prevStyle.fontWeight !== thisStyle.fontWeight ||\n prevStyle.fontStyle !== thisStyle.fontStyle ||\n prevStyle.deltaY !== thisStyle.deltaY) ||\n (forTextSpans &&\n (prevStyle.overline !== thisStyle.overline ||\n prevStyle.underline !== thisStyle.underline ||\n prevStyle.linethrough !== thisStyle.linethrough));\n },\n\n /**\n * Returns the array form of a text object's inline styles property with styles grouped in ranges\n * rather than per character. This format is less verbose, and is better suited for storage\n * so it is used in serialization (not during runtime).\n * @memberOf fabric.util\n * @param {object} styles per character styles for a text object\n * @param {String} text the text string that the styles are applied to\n * @return {{start: number, end: number, style: object}[]}\n */\n stylesToArray: function(styles, text) {\n // clone style structure to prevent mutation\n var styles = fabric.util.object.clone(styles, true),\n textLines = text.split('\\n'),\n charIndex = -1, prevStyle = {}, stylesArray = [];\n //loop through each textLine\n for (var i = 0; i < textLines.length; i++) {\n if (!styles[i]) {\n //no styles exist for this line, so add the line's length to the charIndex total\n charIndex += textLines[i].length;\n continue;\n }\n //loop through each character of the current line\n for (var c = 0; c < textLines[i].length; c++) {\n charIndex++;\n var thisStyle = styles[i][c];\n //check if style exists for this character\n if (thisStyle) {\n var styleChanged = fabric.util.hasStyleChanged(prevStyle, thisStyle, true);\n if (styleChanged) {\n stylesArray.push({\n start: charIndex,\n end: charIndex + 1,\n style: thisStyle\n });\n }\n else {\n //if style is the same as previous character, increase end index\n stylesArray[stylesArray.length - 1].end++;\n }\n }\n prevStyle = thisStyle || {};\n }\n }\n return stylesArray;\n },\n\n /**\n * Returns the object form of the styles property with styles that are assigned per\n * character rather than grouped by range. This format is more verbose, and is\n * only used during runtime (not for serialization/storage)\n * @memberOf fabric.util\n * @param {Array} styles the serialized form of a text object's styles\n * @param {String} text the text string that the styles are applied to\n * @return {Object}\n */\n stylesFromArray: function(styles, text) {\n if (!Array.isArray(styles)) {\n return styles;\n }\n var textLines = text.split('\\n'),\n charIndex = -1, styleIndex = 0, stylesObject = {};\n //loop through each textLine\n for (var i = 0; i < textLines.length; i++) {\n //loop through each character of the current line\n for (var c = 0; c < textLines[i].length; c++) {\n charIndex++;\n //check if there's a style collection that includes the current character\n if (styles[styleIndex]\n && styles[styleIndex].start <= charIndex\n && charIndex < styles[styleIndex].end) {\n //create object for line index if it doesn't exist\n stylesObject[i] = stylesObject[i] || {};\n //assign a style at this character's index\n stylesObject[i][c] = Object.assign({}, styles[styleIndex].style);\n //if character is at the end of the current style collection, move to the next\n if (charIndex === styles[styleIndex].end - 1) {\n styleIndex++;\n }\n }\n }\n }\n return stylesObject;\n }\n };\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function() {\n var _join = Array.prototype.join,\n commandLengths = {\n m: 2,\n l: 2,\n h: 1,\n v: 1,\n c: 6,\n s: 4,\n q: 4,\n t: 2,\n a: 7\n },\n repeatedCommands = {\n m: 'l',\n M: 'L'\n };\n function segmentToBezier(th2, th3, cosTh, sinTh, rx, ry, cx1, cy1, mT, fromX, fromY) {\n var costh2 = fabric.util.cos(th2),\n sinth2 = fabric.util.sin(th2),\n costh3 = fabric.util.cos(th3),\n sinth3 = fabric.util.sin(th3),\n toX = cosTh * rx * costh3 - sinTh * ry * sinth3 + cx1,\n toY = sinTh * rx * costh3 + cosTh * ry * sinth3 + cy1,\n cp1X = fromX + mT * ( -cosTh * rx * sinth2 - sinTh * ry * costh2),\n cp1Y = fromY + mT * ( -sinTh * rx * sinth2 + cosTh * ry * costh2),\n cp2X = toX + mT * ( cosTh * rx * sinth3 + sinTh * ry * costh3),\n cp2Y = toY + mT * ( sinTh * rx * sinth3 - cosTh * ry * costh3);\n\n return ['C',\n cp1X, cp1Y,\n cp2X, cp2Y,\n toX, toY\n ];\n }\n\n /* Adapted from http://dxr.mozilla.org/mozilla-central/source/content/svg/content/src/nsSVGPathDataParser.cpp\n * by Andrea Bogazzi code is under MPL. if you don't have a copy of the license you can take it here\n * http://mozilla.org/MPL/2.0/\n */\n function arcToSegments(toX, toY, rx, ry, large, sweep, rotateX) {\n var PI = Math.PI, th = rotateX * PI / 180,\n sinTh = fabric.util.sin(th),\n cosTh = fabric.util.cos(th),\n fromX = 0, fromY = 0;\n\n rx = Math.abs(rx);\n ry = Math.abs(ry);\n\n var px = -cosTh * toX * 0.5 - sinTh * toY * 0.5,\n py = -cosTh * toY * 0.5 + sinTh * toX * 0.5,\n rx2 = rx * rx, ry2 = ry * ry, py2 = py * py, px2 = px * px,\n pl = rx2 * ry2 - rx2 * py2 - ry2 * px2,\n root = 0;\n\n if (pl < 0) {\n var s = Math.sqrt(1 - pl / (rx2 * ry2));\n rx *= s;\n ry *= s;\n }\n else {\n root = (large === sweep ? -1.0 : 1.0) *\n Math.sqrt( pl / (rx2 * py2 + ry2 * px2));\n }\n\n var cx = root * rx * py / ry,\n cy = -root * ry * px / rx,\n cx1 = cosTh * cx - sinTh * cy + toX * 0.5,\n cy1 = sinTh * cx + cosTh * cy + toY * 0.5,\n mTheta = calcVectorAngle(1, 0, (px - cx) / rx, (py - cy) / ry),\n dtheta = calcVectorAngle((px - cx) / rx, (py - cy) / ry, (-px - cx) / rx, (-py - cy) / ry);\n\n if (sweep === 0 && dtheta > 0) {\n dtheta -= 2 * PI;\n }\n else if (sweep === 1 && dtheta < 0) {\n dtheta += 2 * PI;\n }\n\n // Convert into cubic bezier segments <= 90deg\n var segments = Math.ceil(Math.abs(dtheta / PI * 2)),\n result = [], mDelta = dtheta / segments,\n mT = 8 / 3 * Math.sin(mDelta / 4) * Math.sin(mDelta / 4) / Math.sin(mDelta / 2),\n th3 = mTheta + mDelta;\n\n for (var i = 0; i < segments; i++) {\n result[i] = segmentToBezier(mTheta, th3, cosTh, sinTh, rx, ry, cx1, cy1, mT, fromX, fromY);\n fromX = result[i][5];\n fromY = result[i][6];\n mTheta = th3;\n th3 += mDelta;\n }\n return result;\n }\n\n /*\n * Private\n */\n function calcVectorAngle(ux, uy, vx, vy) {\n var ta = Math.atan2(uy, ux),\n tb = Math.atan2(vy, vx);\n if (tb >= ta) {\n return tb - ta;\n }\n else {\n return 2 * Math.PI - (ta - tb);\n }\n }\n\n /**\n * Calculate bounding box of a beziercurve\n * @param {Number} x0 starting point\n * @param {Number} y0\n * @param {Number} x1 first control point\n * @param {Number} y1\n * @param {Number} x2 secondo control point\n * @param {Number} y2\n * @param {Number} x3 end of bezier\n * @param {Number} y3\n */\n // taken from http://jsbin.com/ivomiq/56/edit no credits available for that.\n // TODO: can we normalize this with the starting points set at 0 and then translated the bbox?\n function getBoundsOfCurve(x0, y0, x1, y1, x2, y2, x3, y3) {\n var argsString;\n if (fabric.cachesBoundsOfCurve) {\n argsString = _join.call(arguments);\n if (fabric.boundsOfCurveCache[argsString]) {\n return fabric.boundsOfCurveCache[argsString];\n }\n }\n\n var sqrt = Math.sqrt,\n min = Math.min, max = Math.max,\n abs = Math.abs, tvalues = [],\n bounds = [[], []],\n a, b, c, t, t1, t2, b2ac, sqrtb2ac;\n\n b = 6 * x0 - 12 * x1 + 6 * x2;\n a = -3 * x0 + 9 * x1 - 9 * x2 + 3 * x3;\n c = 3 * x1 - 3 * x0;\n\n for (var i = 0; i < 2; ++i) {\n if (i > 0) {\n b = 6 * y0 - 12 * y1 + 6 * y2;\n a = -3 * y0 + 9 * y1 - 9 * y2 + 3 * y3;\n c = 3 * y1 - 3 * y0;\n }\n\n if (abs(a) < 1e-12) {\n if (abs(b) < 1e-12) {\n continue;\n }\n t = -c / b;\n if (0 < t && t < 1) {\n tvalues.push(t);\n }\n continue;\n }\n b2ac = b * b - 4 * c * a;\n if (b2ac < 0) {\n continue;\n }\n sqrtb2ac = sqrt(b2ac);\n t1 = (-b + sqrtb2ac) / (2 * a);\n if (0 < t1 && t1 < 1) {\n tvalues.push(t1);\n }\n t2 = (-b - sqrtb2ac) / (2 * a);\n if (0 < t2 && t2 < 1) {\n tvalues.push(t2);\n }\n }\n\n var x, y, j = tvalues.length, jlen = j, mt;\n while (j--) {\n t = tvalues[j];\n mt = 1 - t;\n x = (mt * mt * mt * x0) + (3 * mt * mt * t * x1) + (3 * mt * t * t * x2) + (t * t * t * x3);\n bounds[0][j] = x;\n\n y = (mt * mt * mt * y0) + (3 * mt * mt * t * y1) + (3 * mt * t * t * y2) + (t * t * t * y3);\n bounds[1][j] = y;\n }\n\n bounds[0][jlen] = x0;\n bounds[1][jlen] = y0;\n bounds[0][jlen + 1] = x3;\n bounds[1][jlen + 1] = y3;\n var result = [\n {\n x: min.apply(null, bounds[0]),\n y: min.apply(null, bounds[1])\n },\n {\n x: max.apply(null, bounds[0]),\n y: max.apply(null, bounds[1])\n }\n ];\n if (fabric.cachesBoundsOfCurve) {\n fabric.boundsOfCurveCache[argsString] = result;\n }\n return result;\n }\n\n /**\n * Converts arc to a bunch of bezier curves\n * @param {Number} fx starting point x\n * @param {Number} fy starting point y\n * @param {Array} coords Arc command\n */\n function fromArcToBeziers(fx, fy, coords) {\n var rx = coords[1],\n ry = coords[2],\n rot = coords[3],\n large = coords[4],\n sweep = coords[5],\n tx = coords[6],\n ty = coords[7],\n segsNorm = arcToSegments(tx - fx, ty - fy, rx, ry, large, sweep, rot);\n\n for (var i = 0, len = segsNorm.length; i < len; i++) {\n segsNorm[i][1] += fx;\n segsNorm[i][2] += fy;\n segsNorm[i][3] += fx;\n segsNorm[i][4] += fy;\n segsNorm[i][5] += fx;\n segsNorm[i][6] += fy;\n }\n return segsNorm;\n };\n\n /**\n * This function take a parsed SVG path and make it simpler for fabricJS logic.\n * simplification consist of: only UPPERCASE absolute commands ( relative converted to absolute )\n * S converted in C, T converted in Q, A converted in C.\n * @param {Array} path the array of commands of a parsed svg path for fabric.Path\n * @return {Array} the simplified array of commands of a parsed svg path for fabric.Path\n */\n function makePathSimpler(path) {\n // x and y represent the last point of the path. the previous command point.\n // we add them to each relative command to make it an absolute comment.\n // we also swap the v V h H with L, because are easier to transform.\n var x = 0, y = 0, len = path.length,\n // x1 and y1 represent the last point of the subpath. the subpath is started with\n // m or M command. When a z or Z command is drawn, x and y need to be resetted to\n // the last x1 and y1.\n x1 = 0, y1 = 0, current, i, converted,\n // previous will host the letter of the previous command, to handle S and T.\n // controlX and controlY will host the previous reflected control point\n destinationPath = [], previous, controlX, controlY;\n for (i = 0; i < len; ++i) {\n converted = false;\n current = path[i].slice(0);\n switch (current[0]) { // first letter\n case 'l': // lineto, relative\n current[0] = 'L';\n current[1] += x;\n current[2] += y;\n // falls through\n case 'L':\n x = current[1];\n y = current[2];\n break;\n case 'h': // horizontal lineto, relative\n current[1] += x;\n // falls through\n case 'H':\n current[0] = 'L';\n current[2] = y;\n x = current[1];\n break;\n case 'v': // vertical lineto, relative\n current[1] += y;\n // falls through\n case 'V':\n current[0] = 'L';\n y = current[1];\n current[1] = x;\n current[2] = y;\n break;\n case 'm': // moveTo, relative\n current[0] = 'M';\n current[1] += x;\n current[2] += y;\n // falls through\n case 'M':\n x = current[1];\n y = current[2];\n x1 = current[1];\n y1 = current[2];\n break;\n case 'c': // bezierCurveTo, relative\n current[0] = 'C';\n current[1] += x;\n current[2] += y;\n current[3] += x;\n current[4] += y;\n current[5] += x;\n current[6] += y;\n // falls through\n case 'C':\n controlX = current[3];\n controlY = current[4];\n x = current[5];\n y = current[6];\n break;\n case 's': // shorthand cubic bezierCurveTo, relative\n current[0] = 'S';\n current[1] += x;\n current[2] += y;\n current[3] += x;\n current[4] += y;\n // falls through\n case 'S':\n // would be sScC but since we are swapping sSc for C, we check just that.\n if (previous === 'C') {\n // calculate reflection of previous control points\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n }\n else {\n // If there is no previous command or if the previous command was not a C, c, S, or s,\n // the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n x = current[3];\n y = current[4];\n current[0] = 'C';\n current[5] = current[3];\n current[6] = current[4];\n current[3] = current[1];\n current[4] = current[2];\n current[1] = controlX;\n current[2] = controlY;\n // current[3] and current[4] are NOW the second control point.\n // we keep it for the next reflection.\n controlX = current[3];\n controlY = current[4];\n break;\n case 'q': // quadraticCurveTo, relative\n current[0] = 'Q';\n current[1] += x;\n current[2] += y;\n current[3] += x;\n current[4] += y;\n // falls through\n case 'Q':\n controlX = current[1];\n controlY = current[2];\n x = current[3];\n y = current[4];\n break;\n case 't': // shorthand quadraticCurveTo, relative\n current[0] = 'T';\n current[1] += x;\n current[2] += y;\n // falls through\n case 'T':\n if (previous === 'Q') {\n // calculate reflection of previous control point\n controlX = 2 * x - controlX;\n controlY = 2 * y - controlY;\n }\n else {\n // If there is no previous command or if the previous command was not a Q, q, T or t,\n // assume the control point is coincident with the current point\n controlX = x;\n controlY = y;\n }\n current[0] = 'Q';\n x = current[1];\n y = current[2];\n current[1] = controlX;\n current[2] = controlY;\n current[3] = x;\n current[4] = y;\n break;\n case 'a':\n current[0] = 'A';\n current[6] += x;\n current[7] += y;\n // falls through\n case 'A':\n converted = true;\n destinationPath = destinationPath.concat(fromArcToBeziers(x, y, current));\n x = current[6];\n y = current[7];\n break;\n case 'z':\n case 'Z':\n x = x1;\n y = y1;\n break;\n default:\n }\n if (!converted) {\n destinationPath.push(current);\n }\n previous = current[0];\n }\n return destinationPath;\n };\n\n /**\n * Calc length from point x1,y1 to x2,y2\n * @param {Number} x1 starting point x\n * @param {Number} y1 starting point y\n * @param {Number} x2 starting point x\n * @param {Number} y2 starting point y\n * @return {Number} length of segment\n */\n function calcLineLength(x1, y1, x2, y2) {\n return Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));\n }\n\n // functions for the Cubic beizer\n // taken from: https://github.com/konvajs/konva/blob/7.0.5/src/shapes/Path.ts#L350\n function CB1(t) {\n return t * t * t;\n }\n function CB2(t) {\n return 3 * t * t * (1 - t);\n }\n function CB3(t) {\n return 3 * t * (1 - t) * (1 - t);\n }\n function CB4(t) {\n return (1 - t) * (1 - t) * (1 - t);\n }\n\n function getPointOnCubicBezierIterator(p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y) {\n return function(pct) {\n var c1 = CB1(pct), c2 = CB2(pct), c3 = CB3(pct), c4 = CB4(pct);\n return {\n x: p4x * c1 + p3x * c2 + p2x * c3 + p1x * c4,\n y: p4y * c1 + p3y * c2 + p2y * c3 + p1y * c4\n };\n };\n }\n\n function getTangentCubicIterator(p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y) {\n return function (pct) {\n var invT = 1 - pct,\n tangentX = (3 * invT * invT * (p2x - p1x)) + (6 * invT * pct * (p3x - p2x)) +\n (3 * pct * pct * (p4x - p3x)),\n tangentY = (3 * invT * invT * (p2y - p1y)) + (6 * invT * pct * (p3y - p2y)) +\n (3 * pct * pct * (p4y - p3y));\n return Math.atan2(tangentY, tangentX);\n };\n }\n\n function QB1(t) {\n return t * t;\n }\n\n function QB2(t) {\n return 2 * t * (1 - t);\n }\n\n function QB3(t) {\n return (1 - t) * (1 - t);\n }\n\n function getPointOnQuadraticBezierIterator(p1x, p1y, p2x, p2y, p3x, p3y) {\n return function(pct) {\n var c1 = QB1(pct), c2 = QB2(pct), c3 = QB3(pct);\n return {\n x: p3x * c1 + p2x * c2 + p1x * c3,\n y: p3y * c1 + p2y * c2 + p1y * c3\n };\n };\n }\n\n function getTangentQuadraticIterator(p1x, p1y, p2x, p2y, p3x, p3y) {\n return function (pct) {\n var invT = 1 - pct,\n tangentX = (2 * invT * (p2x - p1x)) + (2 * pct * (p3x - p2x)),\n tangentY = (2 * invT * (p2y - p1y)) + (2 * pct * (p3y - p2y));\n return Math.atan2(tangentY, tangentX);\n };\n }\n\n\n // this will run over a path segment ( a cubic or quadratic segment) and approximate it\n // with 100 segemnts. This will good enough to calculate the length of the curve\n function pathIterator(iterator, x1, y1) {\n var tempP = { x: x1, y: y1 }, p, tmpLen = 0, perc;\n for (perc = 1; perc <= 100; perc += 1) {\n p = iterator(perc / 100);\n tmpLen += calcLineLength(tempP.x, tempP.y, p.x, p.y);\n tempP = p;\n }\n return tmpLen;\n }\n\n /**\n * Given a pathInfo, and a distance in pixels, find the percentage from 0 to 1\n * that correspond to that pixels run over the path.\n * The percentage will be then used to find the correct point on the canvas for the path.\n * @param {Array} segInfo fabricJS collection of information on a parsed path\n * @param {Number} distance from starting point, in pixels.\n * @return {Object} info object with x and y ( the point on canvas ) and angle, the tangent on that point;\n */\n function findPercentageForDistance(segInfo, distance) {\n var perc = 0, tmpLen = 0, iterator = segInfo.iterator, tempP = { x: segInfo.x, y: segInfo.y },\n p, nextLen, nextStep = 0.01, angleFinder = segInfo.angleFinder, lastPerc;\n // nextStep > 0.0001 covers 0.00015625 that 1/64th of 1/100\n // the path\n while (tmpLen < distance && nextStep > 0.0001) {\n p = iterator(perc);\n lastPerc = perc;\n nextLen = calcLineLength(tempP.x, tempP.y, p.x, p.y);\n // compare tmpLen each cycle with distance, decide next perc to test.\n if ((nextLen + tmpLen) > distance) {\n // we discard this step and we make smaller steps.\n perc -= nextStep;\n nextStep /= 2;\n }\n else {\n tempP = p;\n perc += nextStep;\n tmpLen += nextLen;\n }\n }\n p.angle = angleFinder(lastPerc);\n return p;\n }\n\n /**\n * Run over a parsed and simplifed path and extrac some informations.\n * informations are length of each command and starting point\n * @param {Array} path fabricJS parsed path commands\n * @return {Array} path commands informations\n */\n function getPathSegmentsInfo(path) {\n var totalLength = 0, len = path.length, current,\n //x2 and y2 are the coords of segment start\n //x1 and y1 are the coords of the current point\n x1 = 0, y1 = 0, x2 = 0, y2 = 0, info = [], iterator, tempInfo, angleFinder;\n for (var i = 0; i < len; i++) {\n current = path[i];\n tempInfo = {\n x: x1,\n y: y1,\n command: current[0],\n };\n switch (current[0]) { //first letter\n case 'M':\n tempInfo.length = 0;\n x2 = x1 = current[1];\n y2 = y1 = current[2];\n break;\n case 'L':\n tempInfo.length = calcLineLength(x1, y1, current[1], current[2]);\n x1 = current[1];\n y1 = current[2];\n break;\n case 'C':\n iterator = getPointOnCubicBezierIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4],\n current[5],\n current[6]\n );\n angleFinder = getTangentCubicIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4],\n current[5],\n current[6]\n );\n tempInfo.iterator = iterator;\n tempInfo.angleFinder = angleFinder;\n tempInfo.length = pathIterator(iterator, x1, y1);\n x1 = current[5];\n y1 = current[6];\n break;\n case 'Q':\n iterator = getPointOnQuadraticBezierIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4]\n );\n angleFinder = getTangentQuadraticIterator(\n x1,\n y1,\n current[1],\n current[2],\n current[3],\n current[4]\n );\n tempInfo.iterator = iterator;\n tempInfo.angleFinder = angleFinder;\n tempInfo.length = pathIterator(iterator, x1, y1);\n x1 = current[3];\n y1 = current[4];\n break;\n case 'Z':\n case 'z':\n // we add those in order to ease calculations later\n tempInfo.destX = x2;\n tempInfo.destY = y2;\n tempInfo.length = calcLineLength(x1, y1, x2, y2);\n x1 = x2;\n y1 = y2;\n break;\n }\n totalLength += tempInfo.length;\n info.push(tempInfo);\n }\n info.push({ length: totalLength, x: x1, y: y1 });\n return info;\n }\n\n function getPointOnPath(path, distance, infos) {\n if (!infos) {\n infos = getPathSegmentsInfo(path);\n }\n var i = 0;\n while ((distance - infos[i].length > 0) && i < (infos.length - 2)) {\n distance -= infos[i].length;\n i++;\n }\n // var distance = infos[infos.length - 1] * perc;\n var segInfo = infos[i], segPercent = distance / segInfo.length,\n command = segInfo.command, segment = path[i], info;\n\n switch (command) {\n case 'M':\n return { x: segInfo.x, y: segInfo.y, angle: 0 };\n case 'Z':\n case 'z':\n info = new fabric.Point(segInfo.x, segInfo.y).lerp(\n new fabric.Point(segInfo.destX, segInfo.destY),\n segPercent\n );\n info.angle = Math.atan2(segInfo.destY - segInfo.y, segInfo.destX - segInfo.x);\n return info;\n case 'L':\n info = new fabric.Point(segInfo.x, segInfo.y).lerp(\n new fabric.Point(segment[1], segment[2]),\n segPercent\n );\n info.angle = Math.atan2(segment[2] - segInfo.y, segment[1] - segInfo.x);\n return info;\n case 'C':\n return findPercentageForDistance(segInfo, distance);\n case 'Q':\n return findPercentageForDistance(segInfo, distance);\n }\n }\n\n /**\n *\n * @param {string} pathString\n * @return {(string|number)[][]} An array of SVG path commands\n * @example Usage\n * parsePath('M 3 4 Q 3 5 2 1 4 0 Q 9 12 2 1 4 0') === [\n * ['M', 3, 4],\n * ['Q', 3, 5, 2, 1, 4, 0],\n * ['Q', 9, 12, 2, 1, 4, 0],\n * ];\n *\n */\n function parsePath(pathString) {\n var result = [],\n coords = [],\n currentPath,\n parsed,\n re = fabric.rePathCommand,\n rNumber = '[-+]?(?:\\\\d*\\\\.\\\\d+|\\\\d+\\\\.?)(?:[eE][-+]?\\\\d+)?\\\\s*',\n rNumberCommaWsp = '(' + rNumber + ')' + fabric.commaWsp,\n rFlagCommaWsp = '([01])' + fabric.commaWsp + '?',\n rArcSeq = rNumberCommaWsp + '?' + rNumberCommaWsp + '?' + rNumberCommaWsp + rFlagCommaWsp + rFlagCommaWsp +\n rNumberCommaWsp + '?(' + rNumber + ')',\n regArcArgumentSequence = new RegExp(rArcSeq, 'g'),\n match,\n coordsStr,\n // one of commands (m,M,l,L,q,Q,c,C,etc.) followed by non-command characters (i.e. command values)\n path;\n if (!pathString || !pathString.match) {\n return result;\n }\n path = pathString.match(/[mzlhvcsqta][^mzlhvcsqta]*/gi);\n\n for (var i = 0, coordsParsed, len = path.length; i < len; i++) {\n currentPath = path[i];\n\n coordsStr = currentPath.slice(1).trim();\n coords.length = 0;\n\n var command = currentPath.charAt(0);\n coordsParsed = [command];\n\n if (command.toLowerCase() === 'a') {\n // arcs have special flags that apparently don't require spaces so handle special\n for (var args; (args = regArcArgumentSequence.exec(coordsStr));) {\n for (var j = 1; j < args.length; j++) {\n coords.push(args[j]);\n }\n }\n }\n else {\n while ((match = re.exec(coordsStr))) {\n coords.push(match[0]);\n }\n }\n\n for (var j = 0, jlen = coords.length; j < jlen; j++) {\n parsed = parseFloat(coords[j]);\n if (!isNaN(parsed)) {\n coordsParsed.push(parsed);\n }\n }\n\n var commandLength = commandLengths[command.toLowerCase()],\n repeatedCommand = repeatedCommands[command] || command;\n\n if (coordsParsed.length - 1 > commandLength) {\n for (var k = 1, klen = coordsParsed.length; k < klen; k += commandLength) {\n result.push([command].concat(coordsParsed.slice(k, k + commandLength)));\n command = repeatedCommand;\n }\n }\n else {\n result.push(coordsParsed);\n }\n }\n\n return result;\n };\n\n /**\n *\n * Converts points to a smooth SVG path\n * @param {{ x: number,y: number }[]} points Array of points\n * @param {number} [correction] Apply a correction to the path (usually we use `width / 1000`). If value is undefined 0 is used as the correction value.\n * @return {(string|number)[][]} An array of SVG path commands\n */\n function getSmoothPathFromPoints(points, correction) {\n var path = [], i,\n p1 = new fabric.Point(points[0].x, points[0].y),\n p2 = new fabric.Point(points[1].x, points[1].y),\n len = points.length, multSignX = 1, multSignY = 0, manyPoints = len > 2;\n correction = correction || 0;\n\n if (manyPoints) {\n multSignX = points[2].x < p2.x ? -1 : points[2].x === p2.x ? 0 : 1;\n multSignY = points[2].y < p2.y ? -1 : points[2].y === p2.y ? 0 : 1;\n }\n path.push(['M', p1.x - multSignX * correction, p1.y - multSignY * correction]);\n for (i = 1; i < len; i++) {\n if (!p1.eq(p2)) {\n var midPoint = p1.midPointFrom(p2);\n // p1 is our bezier control point\n // midpoint is our endpoint\n // start point is p(i-1) value.\n path.push(['Q', p1.x, p1.y, midPoint.x, midPoint.y]);\n }\n p1 = points[i];\n if ((i + 1) < points.length) {\n p2 = points[i + 1];\n }\n }\n if (manyPoints) {\n multSignX = p1.x > points[i - 2].x ? 1 : p1.x === points[i - 2].x ? 0 : -1;\n multSignY = p1.y > points[i - 2].y ? 1 : p1.y === points[i - 2].y ? 0 : -1;\n }\n path.push(['L', p1.x + multSignX * correction, p1.y + multSignY * correction]);\n return path;\n }\n /**\n * Transform a path by transforming each segment.\n * it has to be a simplified path or it won't work.\n * WARNING: this depends from pathOffset for correct operation\n * @param {Array} path fabricJS parsed and simplified path commands\n * @param {Array} transform matrix that represent the transformation\n * @param {Object} [pathOffset] the fabric.Path pathOffset\n * @param {Number} pathOffset.x\n * @param {Number} pathOffset.y\n * @returns {Array} the transformed path\n */\n function transformPath(path, transform, pathOffset) {\n if (pathOffset) {\n transform = fabric.util.multiplyTransformMatrices(\n transform,\n [1, 0, 0, 1, -pathOffset.x, -pathOffset.y]\n );\n }\n return path.map(function(pathSegment) {\n var newSegment = pathSegment.slice(0), point = {};\n for (var i = 1; i < pathSegment.length - 1; i += 2) {\n point.x = pathSegment[i];\n point.y = pathSegment[i + 1];\n point = fabric.util.transformPoint(point, transform);\n newSegment[i] = point.x;\n newSegment[i + 1] = point.y;\n }\n return newSegment;\n });\n }\n\n /**\n * Join path commands to go back to svg format\n * @param {Array} pathData fabricJS parsed path commands\n * @return {String} joined path 'M 0 0 L 20 30'\n */\n fabric.util.joinPath = function(pathData) {\n return pathData.map(function (segment) { return segment.join(' '); }).join(' ');\n };\n fabric.util.parsePath = parsePath;\n fabric.util.makePathSimpler = makePathSimpler;\n fabric.util.getSmoothPathFromPoints = getSmoothPathFromPoints;\n fabric.util.getPathSegmentsInfo = getPathSegmentsInfo;\n fabric.util.getBoundsOfCurve = getBoundsOfCurve;\n fabric.util.getPointOnPath = getPointOnPath;\n fabric.util.transformPath = transformPath;\n})();\n\n\n(function() {\n\n var slice = Array.prototype.slice;\n\n /**\n * Invokes method on all items in a given array\n * @memberOf fabric.util.array\n * @param {Array} array Array to iterate over\n * @param {String} method Name of a method to invoke\n * @return {Array}\n */\n function invoke(array, method) {\n var args = slice.call(arguments, 2), result = [];\n for (var i = 0, len = array.length; i < len; i++) {\n result[i] = args.length ? array[i][method].apply(array[i], args) : array[i][method].call(array[i]);\n }\n return result;\n }\n\n /**\n * Finds maximum value in array (not necessarily \"first\" one)\n * @memberOf fabric.util.array\n * @param {Array} array Array to iterate over\n * @param {String} byProperty\n * @return {*}\n */\n function max(array, byProperty) {\n return find(array, byProperty, function(value1, value2) {\n return value1 >= value2;\n });\n }\n\n /**\n * Finds minimum value in array (not necessarily \"first\" one)\n * @memberOf fabric.util.array\n * @param {Array} array Array to iterate over\n * @param {String} byProperty\n * @return {*}\n */\n function min(array, byProperty) {\n return find(array, byProperty, function(value1, value2) {\n return value1 < value2;\n });\n }\n\n /**\n * @private\n */\n function fill(array, value) {\n var k = array.length;\n while (k--) {\n array[k] = value;\n }\n return array;\n }\n\n /**\n * @private\n */\n function find(array, byProperty, condition) {\n if (!array || array.length === 0) {\n return;\n }\n\n var i = array.length - 1,\n result = byProperty ? array[i][byProperty] : array[i];\n if (byProperty) {\n while (i--) {\n if (condition(array[i][byProperty], result)) {\n result = array[i][byProperty];\n }\n }\n }\n else {\n while (i--) {\n if (condition(array[i], result)) {\n result = array[i];\n }\n }\n }\n return result;\n }\n\n /**\n * @namespace fabric.util.array\n */\n fabric.util.array = {\n fill: fill,\n invoke: invoke,\n min: min,\n max: max\n };\n\n})();\n\n\n(function() {\n /**\n * Copies all enumerable properties of one js object to another\n * this does not and cannot compete with generic utils.\n * Does not clone or extend fabric.Object subclasses.\n * This is mostly for internal use and has extra handling for fabricJS objects\n * it skips the canvas and group properties in deep cloning.\n * @memberOf fabric.util.object\n * @param {Object} destination Where to copy to\n * @param {Object} source Where to copy from\n * @param {Boolean} [deep] Whether to extend nested objects\n * @return {Object}\n */\n\n function extend(destination, source, deep) {\n // JScript DontEnum bug is not taken care of\n // the deep clone is for internal use, is not meant to avoid\n // javascript traps or cloning html element or self referenced objects.\n if (deep) {\n if (!fabric.isLikelyNode && source instanceof Element) {\n // avoid cloning deep images, canvases,\n destination = source;\n }\n else if (source instanceof Array) {\n destination = [];\n for (var i = 0, len = source.length; i < len; i++) {\n destination[i] = extend({ }, source[i], deep);\n }\n }\n else if (source && typeof source === 'object') {\n for (var property in source) {\n if (property === 'canvas' || property === 'group') {\n // we do not want to clone this props at all.\n // we want to keep the keys in the copy\n destination[property] = null;\n }\n else if (source.hasOwnProperty(property)) {\n destination[property] = extend({ }, source[property], deep);\n }\n }\n }\n else {\n // this sounds odd for an extend but is ok for recursive use\n destination = source;\n }\n }\n else {\n for (var property in source) {\n destination[property] = source[property];\n }\n }\n return destination;\n }\n\n /**\n * Creates an empty object and copies all enumerable properties of another object to it\n * This method is mostly for internal use, and not intended for duplicating shapes in canvas. \n * @memberOf fabric.util.object\n * @param {Object} object Object to clone\n * @param {Boolean} [deep] Whether to clone nested objects\n * @return {Object}\n */\n\n //TODO: this function return an empty object if you try to clone null\n function clone(object, deep) {\n return extend({ }, object, deep);\n }\n\n /** @namespace fabric.util.object */\n fabric.util.object = {\n extend: extend,\n clone: clone\n };\n fabric.util.object.extend(fabric.util, fabric.Observable);\n})();\n\n\n(function() {\n\n /**\n * Camelizes a string\n * @memberOf fabric.util.string\n * @param {String} string String to camelize\n * @return {String} Camelized version of a string\n */\n function camelize(string) {\n return string.replace(/-+(.)?/g, function(match, character) {\n return character ? character.toUpperCase() : '';\n });\n }\n\n /**\n * Capitalizes a string\n * @memberOf fabric.util.string\n * @param {String} string String to capitalize\n * @param {Boolean} [firstLetterOnly] If true only first letter is capitalized\n * and other letters stay untouched, if false first letter is capitalized\n * and other letters are converted to lowercase.\n * @return {String} Capitalized version of a string\n */\n function capitalize(string, firstLetterOnly) {\n return string.charAt(0).toUpperCase() +\n (firstLetterOnly ? string.slice(1) : string.slice(1).toLowerCase());\n }\n\n /**\n * Escapes XML in a string\n * @memberOf fabric.util.string\n * @param {String} string String to escape\n * @return {String} Escaped version of a string\n */\n function escapeXml(string) {\n return string.replace(/&/g, '&')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(//g, '>');\n }\n\n /**\n * Divide a string in the user perceived single units\n * @memberOf fabric.util.string\n * @param {String} textstring String to escape\n * @return {Array} array containing the graphemes\n */\n function graphemeSplit(textstring) {\n var i = 0, chr, graphemes = [];\n for (i = 0, chr; i < textstring.length; i++) {\n if ((chr = getWholeChar(textstring, i)) === false) {\n continue;\n }\n graphemes.push(chr);\n }\n return graphemes;\n }\n\n // taken from mdn in the charAt doc page.\n function getWholeChar(str, i) {\n var code = str.charCodeAt(i);\n\n if (isNaN(code)) {\n return ''; // Position not found\n }\n if (code < 0xD800 || code > 0xDFFF) {\n return str.charAt(i);\n }\n\n // High surrogate (could change last hex to 0xDB7F to treat high private\n // surrogates as single characters)\n if (0xD800 <= code && code <= 0xDBFF) {\n if (str.length <= (i + 1)) {\n throw 'High surrogate without following low surrogate';\n }\n var next = str.charCodeAt(i + 1);\n if (0xDC00 > next || next > 0xDFFF) {\n throw 'High surrogate without following low surrogate';\n }\n return str.charAt(i) + str.charAt(i + 1);\n }\n // Low surrogate (0xDC00 <= code && code <= 0xDFFF)\n if (i === 0) {\n throw 'Low surrogate without preceding high surrogate';\n }\n var prev = str.charCodeAt(i - 1);\n\n // (could change last hex to 0xDB7F to treat high private\n // surrogates as single characters)\n if (0xD800 > prev || prev > 0xDBFF) {\n throw 'Low surrogate without preceding high surrogate';\n }\n // We can pass over low surrogates now as the second component\n // in a pair which we have already processed\n return false;\n }\n\n\n /**\n * String utilities\n * @namespace fabric.util.string\n */\n fabric.util.string = {\n camelize: camelize,\n capitalize: capitalize,\n escapeXml: escapeXml,\n graphemeSplit: graphemeSplit\n };\n})();\n\n\n(function() {\n\n var slice = Array.prototype.slice, emptyFunction = function() { },\n\n IS_DONTENUM_BUGGY = (function() {\n for (var p in { toString: 1 }) {\n if (p === 'toString') {\n return false;\n }\n }\n return true;\n })(),\n\n /** @ignore */\n addMethods = function(klass, source, parent) {\n for (var property in source) {\n\n if (property in klass.prototype &&\n typeof klass.prototype[property] === 'function' &&\n (source[property] + '').indexOf('callSuper') > -1) {\n\n klass.prototype[property] = (function(property) {\n return function() {\n\n var superclass = this.constructor.superclass;\n this.constructor.superclass = parent;\n var returnValue = source[property].apply(this, arguments);\n this.constructor.superclass = superclass;\n\n if (property !== 'initialize') {\n return returnValue;\n }\n };\n })(property);\n }\n else {\n klass.prototype[property] = source[property];\n }\n\n if (IS_DONTENUM_BUGGY) {\n if (source.toString !== Object.prototype.toString) {\n klass.prototype.toString = source.toString;\n }\n if (source.valueOf !== Object.prototype.valueOf) {\n klass.prototype.valueOf = source.valueOf;\n }\n }\n }\n };\n\n function Subclass() { }\n\n function callSuper(methodName) {\n var parentMethod = null,\n _this = this;\n\n // climb prototype chain to find method not equal to callee's method\n while (_this.constructor.superclass) {\n var superClassMethod = _this.constructor.superclass.prototype[methodName];\n if (_this[methodName] !== superClassMethod) {\n parentMethod = superClassMethod;\n break;\n }\n // eslint-disable-next-line\n _this = _this.constructor.superclass.prototype;\n }\n\n if (!parentMethod) {\n return console.log('tried to callSuper ' + methodName + ', method not found in prototype chain', this);\n }\n\n return (arguments.length > 1)\n ? parentMethod.apply(this, slice.call(arguments, 1))\n : parentMethod.call(this);\n }\n\n /**\n * Helper for creation of \"classes\".\n * @memberOf fabric.util\n * @param {Function} [parent] optional \"Class\" to inherit from\n * @param {Object} [properties] Properties shared by all instances of this class\n * (be careful modifying objects defined here as this would affect all instances)\n */\n function createClass() {\n var parent = null,\n properties = slice.call(arguments, 0);\n\n if (typeof properties[0] === 'function') {\n parent = properties.shift();\n }\n function klass() {\n this.initialize.apply(this, arguments);\n }\n\n klass.superclass = parent;\n klass.subclasses = [];\n\n if (parent) {\n Subclass.prototype = parent.prototype;\n klass.prototype = new Subclass();\n parent.subclasses.push(klass);\n }\n for (var i = 0, length = properties.length; i < length; i++) {\n addMethods(klass, properties[i], parent);\n }\n if (!klass.prototype.initialize) {\n klass.prototype.initialize = emptyFunction;\n }\n klass.prototype.constructor = klass;\n klass.prototype.callSuper = callSuper;\n return klass;\n }\n\n fabric.util.createClass = createClass;\n})();\n\n\n(function () {\n // since ie11 can use addEventListener but they do not support options, i need to check\n var couldUseAttachEvent = !!fabric.document.createElement('div').attachEvent,\n touchEvents = ['touchstart', 'touchmove', 'touchend'];\n /**\n * Adds an event listener to an element\n * @function\n * @memberOf fabric.util\n * @param {HTMLElement} element\n * @param {String} eventName\n * @param {Function} handler\n */\n fabric.util.addListener = function(element, eventName, handler, options) {\n element && element.addEventListener(eventName, handler, couldUseAttachEvent ? false : options);\n };\n\n /**\n * Removes an event listener from an element\n * @function\n * @memberOf fabric.util\n * @param {HTMLElement} element\n * @param {String} eventName\n * @param {Function} handler\n */\n fabric.util.removeListener = function(element, eventName, handler, options) {\n element && element.removeEventListener(eventName, handler, couldUseAttachEvent ? false : options);\n };\n\n function getTouchInfo(event) {\n var touchProp = event.changedTouches;\n if (touchProp && touchProp[0]) {\n return touchProp[0];\n }\n return event;\n }\n\n fabric.util.getPointer = function(event) {\n var element = event.target,\n scroll = fabric.util.getScrollLeftTop(element),\n _evt = getTouchInfo(event);\n return {\n x: _evt.clientX + scroll.left,\n y: _evt.clientY + scroll.top\n };\n };\n\n fabric.util.isTouchEvent = function(event) {\n return touchEvents.indexOf(event.type) > -1 || event.pointerType === 'touch';\n };\n})();\n\n\n(function () {\n\n /**\n * Cross-browser wrapper for setting element's style\n * @memberOf fabric.util\n * @param {HTMLElement} element\n * @param {Object} styles\n * @return {HTMLElement} Element that was passed as a first argument\n */\n function setStyle(element, styles) {\n var elementStyle = element.style;\n if (!elementStyle) {\n return element;\n }\n if (typeof styles === 'string') {\n element.style.cssText += ';' + styles;\n return styles.indexOf('opacity') > -1\n ? setOpacity(element, styles.match(/opacity:\\s*(\\d?\\.?\\d*)/)[1])\n : element;\n }\n for (var property in styles) {\n if (property === 'opacity') {\n setOpacity(element, styles[property]);\n }\n else {\n var normalizedProperty = (property === 'float' || property === 'cssFloat')\n ? (typeof elementStyle.styleFloat === 'undefined' ? 'cssFloat' : 'styleFloat')\n : property;\n elementStyle.setProperty(normalizedProperty, styles[property]);\n }\n }\n return element;\n }\n\n var parseEl = fabric.document.createElement('div'),\n supportsOpacity = typeof parseEl.style.opacity === 'string',\n supportsFilters = typeof parseEl.style.filter === 'string',\n reOpacity = /alpha\\s*\\(\\s*opacity\\s*=\\s*([^\\)]+)\\)/,\n\n /** @ignore */\n setOpacity = function (element) { return element; };\n\n if (supportsOpacity) {\n /** @ignore */\n setOpacity = function(element, value) {\n element.style.opacity = value;\n return element;\n };\n }\n else if (supportsFilters) {\n /** @ignore */\n setOpacity = function(element, value) {\n var es = element.style;\n if (element.currentStyle && !element.currentStyle.hasLayout) {\n es.zoom = 1;\n }\n if (reOpacity.test(es.filter)) {\n value = value >= 0.9999 ? '' : ('alpha(opacity=' + (value * 100) + ')');\n es.filter = es.filter.replace(reOpacity, value);\n }\n else {\n es.filter += ' alpha(opacity=' + (value * 100) + ')';\n }\n return element;\n };\n }\n\n fabric.util.setStyle = setStyle;\n\n})();\n\n\n(function() {\n\n var _slice = Array.prototype.slice;\n\n /**\n * Takes id and returns an element with that id (if one exists in a document)\n * @memberOf fabric.util\n * @param {String|HTMLElement} id\n * @return {HTMLElement|null}\n */\n function getById(id) {\n return typeof id === 'string' ? fabric.document.getElementById(id) : id;\n }\n\n var sliceCanConvertNodelists,\n /**\n * Converts an array-like object (e.g. arguments or NodeList) to an array\n * @memberOf fabric.util\n * @param {Object} arrayLike\n * @return {Array}\n */\n toArray = function(arrayLike) {\n return _slice.call(arrayLike, 0);\n };\n\n try {\n sliceCanConvertNodelists = toArray(fabric.document.childNodes) instanceof Array;\n }\n catch (err) { }\n\n if (!sliceCanConvertNodelists) {\n toArray = function(arrayLike) {\n var arr = new Array(arrayLike.length), i = arrayLike.length;\n while (i--) {\n arr[i] = arrayLike[i];\n }\n return arr;\n };\n }\n\n /**\n * Creates specified element with specified attributes\n * @memberOf fabric.util\n * @param {String} tagName Type of an element to create\n * @param {Object} [attributes] Attributes to set on an element\n * @return {HTMLElement} Newly created element\n */\n function makeElement(tagName, attributes) {\n var el = fabric.document.createElement(tagName);\n for (var prop in attributes) {\n if (prop === 'class') {\n el.className = attributes[prop];\n }\n else if (prop === 'for') {\n el.htmlFor = attributes[prop];\n }\n else {\n el.setAttribute(prop, attributes[prop]);\n }\n }\n return el;\n }\n\n /**\n * Adds class to an element\n * @memberOf fabric.util\n * @param {HTMLElement} element Element to add class to\n * @param {String} className Class to add to an element\n */\n function addClass(element, className) {\n if (element && (' ' + element.className + ' ').indexOf(' ' + className + ' ') === -1) {\n element.className += (element.className ? ' ' : '') + className;\n }\n }\n\n /**\n * Wraps element with another element\n * @memberOf fabric.util\n * @param {HTMLElement} element Element to wrap\n * @param {HTMLElement|String} wrapper Element to wrap with\n * @param {Object} [attributes] Attributes to set on a wrapper\n * @return {HTMLElement} wrapper\n */\n function wrapElement(element, wrapper, attributes) {\n if (typeof wrapper === 'string') {\n wrapper = makeElement(wrapper, attributes);\n }\n if (element.parentNode) {\n element.parentNode.replaceChild(wrapper, element);\n }\n wrapper.appendChild(element);\n return wrapper;\n }\n\n /**\n * Returns element scroll offsets\n * @memberOf fabric.util\n * @param {HTMLElement} element Element to operate on\n * @return {Object} Object with left/top values\n */\n function getScrollLeftTop(element) {\n\n var left = 0,\n top = 0,\n docElement = fabric.document.documentElement,\n body = fabric.document.body || {\n scrollLeft: 0, scrollTop: 0\n };\n\n // While loop checks (and then sets element to) .parentNode OR .host\n // to account for ShadowDOM. We still want to traverse up out of ShadowDOM,\n // but the .parentNode of a root ShadowDOM node will always be null, instead\n // it should be accessed through .host. See http://stackoverflow.com/a/24765528/4383938\n while (element && (element.parentNode || element.host)) {\n\n // Set element to element parent, or 'host' in case of ShadowDOM\n element = element.parentNode || element.host;\n\n if (element === fabric.document) {\n left = body.scrollLeft || docElement.scrollLeft || 0;\n top = body.scrollTop || docElement.scrollTop || 0;\n }\n else {\n left += element.scrollLeft || 0;\n top += element.scrollTop || 0;\n }\n\n if (element.nodeType === 1 && element.style.position === 'fixed') {\n break;\n }\n }\n\n return { left: left, top: top };\n }\n\n /**\n * Returns offset for a given element\n * @function\n * @memberOf fabric.util\n * @param {HTMLElement} element Element to get offset for\n * @return {Object} Object with \"left\" and \"top\" properties\n */\n function getElementOffset(element) {\n var docElem,\n doc = element && element.ownerDocument,\n box = { left: 0, top: 0 },\n offset = { left: 0, top: 0 },\n scrollLeftTop,\n offsetAttributes = {\n borderLeftWidth: 'left',\n borderTopWidth: 'top',\n paddingLeft: 'left',\n paddingTop: 'top'\n };\n\n if (!doc) {\n return offset;\n }\n\n for (var attr in offsetAttributes) {\n offset[offsetAttributes[attr]] += parseInt(getElementStyle(element, attr), 10) || 0;\n }\n\n docElem = doc.documentElement;\n if ( typeof element.getBoundingClientRect !== 'undefined' ) {\n box = element.getBoundingClientRect();\n }\n\n scrollLeftTop = getScrollLeftTop(element);\n\n return {\n left: box.left + scrollLeftTop.left - (docElem.clientLeft || 0) + offset.left,\n top: box.top + scrollLeftTop.top - (docElem.clientTop || 0) + offset.top\n };\n }\n\n /**\n * Returns style attribute value of a given element\n * @memberOf fabric.util\n * @param {HTMLElement} element Element to get style attribute for\n * @param {String} attr Style attribute to get for element\n * @return {String} Style attribute value of the given element.\n */\n var getElementStyle;\n if (fabric.document.defaultView && fabric.document.defaultView.getComputedStyle) {\n getElementStyle = function(element, attr) {\n var style = fabric.document.defaultView.getComputedStyle(element, null);\n return style ? style[attr] : undefined;\n };\n }\n else {\n getElementStyle = function(element, attr) {\n var value = element.style[attr];\n if (!value && element.currentStyle) {\n value = element.currentStyle[attr];\n }\n return value;\n };\n }\n\n (function () {\n var style = fabric.document.documentElement.style,\n selectProp = 'userSelect' in style\n ? 'userSelect'\n : 'MozUserSelect' in style\n ? 'MozUserSelect'\n : 'WebkitUserSelect' in style\n ? 'WebkitUserSelect'\n : 'KhtmlUserSelect' in style\n ? 'KhtmlUserSelect'\n : '';\n\n /**\n * Makes element unselectable\n * @memberOf fabric.util\n * @param {HTMLElement} element Element to make unselectable\n * @return {HTMLElement} Element that was passed in\n */\n function makeElementUnselectable(element) {\n if (typeof element.onselectstart !== 'undefined') {\n element.onselectstart = fabric.util.falseFunction;\n }\n if (selectProp) {\n element.style[selectProp] = 'none';\n }\n else if (typeof element.unselectable === 'string') {\n element.unselectable = 'on';\n }\n return element;\n }\n\n /**\n * Makes element selectable\n * @memberOf fabric.util\n * @param {HTMLElement} element Element to make selectable\n * @return {HTMLElement} Element that was passed in\n */\n function makeElementSelectable(element) {\n if (typeof element.onselectstart !== 'undefined') {\n element.onselectstart = null;\n }\n if (selectProp) {\n element.style[selectProp] = '';\n }\n else if (typeof element.unselectable === 'string') {\n element.unselectable = '';\n }\n return element;\n }\n\n fabric.util.makeElementUnselectable = makeElementUnselectable;\n fabric.util.makeElementSelectable = makeElementSelectable;\n })();\n\n function getNodeCanvas(element) {\n var impl = fabric.jsdomImplForWrapper(element);\n return impl._canvas || impl._image;\n };\n\n function cleanUpJsdomNode(element) {\n if (!fabric.isLikelyNode) {\n return;\n }\n var impl = fabric.jsdomImplForWrapper(element);\n if (impl) {\n impl._image = null;\n impl._canvas = null;\n // unsure if necessary\n impl._currentSrc = null;\n impl._attributes = null;\n impl._classList = null;\n }\n }\n\n function setImageSmoothing(ctx, value) {\n ctx.imageSmoothingEnabled = ctx.imageSmoothingEnabled || ctx.webkitImageSmoothingEnabled\n || ctx.mozImageSmoothingEnabled || ctx.msImageSmoothingEnabled || ctx.oImageSmoothingEnabled;\n ctx.imageSmoothingEnabled = value;\n }\n\n /**\n * setImageSmoothing sets the context imageSmoothingEnabled property.\n * Used by canvas and by ImageObject.\n * @memberOf fabric.util\n * @since 4.0.0\n * @param {HTMLRenderingContext2D} ctx to set on\n * @param {Boolean} value true or false\n */\n fabric.util.setImageSmoothing = setImageSmoothing;\n fabric.util.getById = getById;\n fabric.util.toArray = toArray;\n fabric.util.addClass = addClass;\n fabric.util.makeElement = makeElement;\n fabric.util.wrapElement = wrapElement;\n fabric.util.getScrollLeftTop = getScrollLeftTop;\n fabric.util.getElementOffset = getElementOffset;\n fabric.util.getNodeCanvas = getNodeCanvas;\n fabric.util.cleanUpJsdomNode = cleanUpJsdomNode;\n\n})();\n\n\n(function() {\n\n function addParamToUrl(url, param) {\n return url + (/\\?/.test(url) ? '&' : '?') + param;\n }\n\n function emptyFn() { }\n\n /**\n * Cross-browser abstraction for sending XMLHttpRequest\n * @memberOf fabric.util\n * @param {String} url URL to send XMLHttpRequest to\n * @param {Object} [options] Options object\n * @param {String} [options.method=\"GET\"]\n * @param {String} [options.parameters] parameters to append to url in GET or in body\n * @param {String} [options.body] body to send with POST or PUT request\n * @param {Function} options.onComplete Callback to invoke when request is completed\n * @return {XMLHttpRequest} request\n */\n function request(url, options) {\n options || (options = { });\n\n var method = options.method ? options.method.toUpperCase() : 'GET',\n onComplete = options.onComplete || function() { },\n xhr = new fabric.window.XMLHttpRequest(),\n body = options.body || options.parameters;\n\n /** @ignore */\n xhr.onreadystatechange = function() {\n if (xhr.readyState === 4) {\n onComplete(xhr);\n xhr.onreadystatechange = emptyFn;\n }\n };\n\n if (method === 'GET') {\n body = null;\n if (typeof options.parameters === 'string') {\n url = addParamToUrl(url, options.parameters);\n }\n }\n\n xhr.open(method, url, true);\n\n if (method === 'POST' || method === 'PUT') {\n xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\n }\n\n xhr.send(body);\n return xhr;\n }\n\n fabric.util.request = request;\n})();\n\n\n/**\n * Wrapper around `console.log` (when available)\n * @param {*} [values] Values to log\n */\nfabric.log = console.log;\n\n/**\n * Wrapper around `console.warn` (when available)\n * @param {*} [values] Values to log as a warning\n */\nfabric.warn = console.warn;\n\n\n(function () {\n\n var extend = fabric.util.object.extend,\n clone = fabric.util.object.clone;\n\n /**\n * @typedef {Object} AnimationOptions\n * Animation of a value or list of values.\n * When using lists, think of something like this:\n * fabric.util.animate({\n * startValue: [1, 2, 3],\n * endValue: [2, 4, 6],\n * onChange: function([a, b, c]) {\n * canvas.zoomToPoint({x: b, y: c}, a)\n * canvas.renderAll()\n * }\n * });\n * @example\n * @property {Function} [onChange] Callback; invoked on every value change\n * @property {Function} [onComplete] Callback; invoked when value change is completed\n * @example\n * // Note: startValue, endValue, and byValue must match the type\n * var animationOptions = { startValue: 0, endValue: 1, byValue: 0.25 }\n * var animationOptions = { startValue: [0, 1], endValue: [1, 2], byValue: [0.25, 0.25] }\n * @property {number | number[]} [startValue=0] Starting value\n * @property {number | number[]} [endValue=100] Ending value\n * @property {number | number[]} [byValue=100] Value to modify the property by\n * @property {Function} [easing] Easing function\n * @property {Number} [duration=500] Duration of change (in ms)\n * @property {Function} [abort] Additional function with logic. If returns true, animation aborts.\n *\n * @typedef {() => void} CancelFunction\n *\n * @typedef {Object} AnimationCurrentState\n * @property {number | number[]} currentValue value in range [`startValue`, `endValue`]\n * @property {number} completionRate value in range [0, 1]\n * @property {number} durationRate value in range [0, 1]\n *\n * @typedef {(AnimationOptions & AnimationCurrentState & { cancel: CancelFunction }} AnimationContext\n */\n\n /**\n * Array holding all running animations\n * @memberof fabric\n * @type {AnimationContext[]}\n */\n var RUNNING_ANIMATIONS = [];\n fabric.util.object.extend(RUNNING_ANIMATIONS, {\n\n /**\n * cancel all running animations at the next requestAnimFrame\n * @returns {AnimationContext[]}\n */\n cancelAll: function () {\n var animations = this.splice(0);\n animations.forEach(function (animation) {\n animation.cancel();\n });\n return animations;\n },\n\n /**\n * cancel all running animations attached to canvas at the next requestAnimFrame\n * @param {fabric.Canvas} canvas\n * @returns {AnimationContext[]}\n */\n cancelByCanvas: function (canvas) {\n if (!canvas) {\n return [];\n }\n var cancelled = this.filter(function (animation) {\n return typeof animation.target === 'object' && animation.target.canvas === canvas;\n });\n cancelled.forEach(function (animation) {\n animation.cancel();\n });\n return cancelled;\n },\n\n /**\n * cancel all running animations for target at the next requestAnimFrame\n * @param {*} target\n * @returns {AnimationContext[]}\n */\n cancelByTarget: function (target) {\n var cancelled = this.findAnimationsByTarget(target);\n cancelled.forEach(function (animation) {\n animation.cancel();\n });\n return cancelled;\n },\n\n /**\n *\n * @param {CancelFunction} cancelFunc the function returned by animate\n * @returns {number}\n */\n findAnimationIndex: function (cancelFunc) {\n return this.indexOf(this.findAnimation(cancelFunc));\n },\n\n /**\n *\n * @param {CancelFunction} cancelFunc the function returned by animate\n * @returns {AnimationContext | undefined} animation's options object\n */\n findAnimation: function (cancelFunc) {\n return this.find(function (animation) {\n return animation.cancel === cancelFunc;\n });\n },\n\n /**\n *\n * @param {*} target the object that is assigned to the target property of the animation context\n * @returns {AnimationContext[]} array of animation options object associated with target\n */\n findAnimationsByTarget: function (target) {\n if (!target) {\n return [];\n }\n return this.filter(function (animation) {\n return animation.target === target;\n });\n }\n });\n\n function noop() {\n return false;\n }\n\n function defaultEasing(t, b, c, d) {\n return -c * Math.cos(t / d * (Math.PI / 2)) + c + b;\n }\n\n /**\n * Changes value from one to another within certain period of time, invoking callbacks as value is being changed.\n * @memberOf fabric.util\n * @param {AnimationOptions} [options] Animation options\n * @example\n * // Note: startValue, endValue, and byValue must match the type\n * fabric.util.animate({ startValue: 0, endValue: 1, byValue: 0.25 })\n * fabric.util.animate({ startValue: [0, 1], endValue: [1, 2], byValue: [0.25, 0.25] })\n * @returns {CancelFunction} cancel function\n */\n function animate(options) {\n options || (options = {});\n var cancel = false,\n context,\n removeFromRegistry = function () {\n var index = fabric.runningAnimations.indexOf(context);\n return index > -1 && fabric.runningAnimations.splice(index, 1)[0];\n };\n\n context = extend(clone(options), {\n cancel: function () {\n cancel = true;\n return removeFromRegistry();\n },\n currentValue: 'startValue' in options ? options.startValue : 0,\n completionRate: 0,\n durationRate: 0\n });\n fabric.runningAnimations.push(context);\n\n requestAnimFrame(function(timestamp) {\n var start = timestamp || +new Date(),\n duration = options.duration || 500,\n finish = start + duration, time,\n onChange = options.onChange || noop,\n abort = options.abort || noop,\n onComplete = options.onComplete || noop,\n easing = options.easing || defaultEasing,\n isMany = 'startValue' in options ? options.startValue.length > 0 : false,\n startValue = 'startValue' in options ? options.startValue : 0,\n endValue = 'endValue' in options ? options.endValue : 100,\n byValue = options.byValue || (isMany ? startValue.map(function(value, i) {\n return endValue[i] - startValue[i];\n }) : endValue - startValue);\n\n options.onStart && options.onStart();\n\n (function tick(ticktime) {\n time = ticktime || +new Date();\n var currentTime = time > finish ? duration : (time - start),\n timePerc = currentTime / duration,\n current = isMany ? startValue.map(function(_value, i) {\n return easing(currentTime, startValue[i], byValue[i], duration);\n }) : easing(currentTime, startValue, byValue, duration),\n valuePerc = isMany ? Math.abs((current[0] - startValue[0]) / byValue[0])\n : Math.abs((current - startValue) / byValue);\n // update context\n context.currentValue = isMany ? current.slice() : current;\n context.completionRate = valuePerc;\n context.durationRate = timePerc;\n if (cancel) {\n return;\n }\n if (abort(current, valuePerc, timePerc)) {\n removeFromRegistry();\n return;\n }\n if (time > finish) {\n // update context\n context.currentValue = isMany ? endValue.slice() : endValue;\n context.completionRate = 1;\n context.durationRate = 1;\n // execute callbacks\n onChange(isMany ? endValue.slice() : endValue, 1, 1);\n onComplete(endValue, 1, 1);\n removeFromRegistry();\n return;\n }\n else {\n onChange(current, valuePerc, timePerc);\n requestAnimFrame(tick);\n }\n })(start);\n });\n\n return context.cancel;\n }\n\n var _requestAnimFrame = fabric.window.requestAnimationFrame ||\n fabric.window.webkitRequestAnimationFrame ||\n fabric.window.mozRequestAnimationFrame ||\n fabric.window.oRequestAnimationFrame ||\n fabric.window.msRequestAnimationFrame ||\n function(callback) {\n return fabric.window.setTimeout(callback, 1000 / 60);\n };\n\n var _cancelAnimFrame = fabric.window.cancelAnimationFrame || fabric.window.clearTimeout;\n\n /**\n * requestAnimationFrame polyfill based on http://paulirish.com/2011/requestanimationframe-for-smart-animating/\n * In order to get a precise start time, `requestAnimFrame` should be called as an entry into the method\n * @memberOf fabric.util\n * @param {Function} callback Callback to invoke\n * @param {DOMElement} element optional Element to associate with animation\n */\n function requestAnimFrame() {\n return _requestAnimFrame.apply(fabric.window, arguments);\n }\n\n function cancelAnimFrame() {\n return _cancelAnimFrame.apply(fabric.window, arguments);\n }\n\n fabric.util.animate = animate;\n fabric.util.requestAnimFrame = requestAnimFrame;\n fabric.util.cancelAnimFrame = cancelAnimFrame;\n fabric.runningAnimations = RUNNING_ANIMATIONS;\n})();\n\n\n(function() {\n // Calculate an in-between color. Returns a \"rgba()\" string.\n // Credit: Edwin Martin \n // http://www.bitstorm.org/jquery/color-animation/jquery.animate-colors.js\n function calculateColor(begin, end, pos) {\n var color = 'rgba('\n + parseInt((begin[0] + pos * (end[0] - begin[0])), 10) + ','\n + parseInt((begin[1] + pos * (end[1] - begin[1])), 10) + ','\n + parseInt((begin[2] + pos * (end[2] - begin[2])), 10);\n\n color += ',' + (begin && end ? parseFloat(begin[3] + pos * (end[3] - begin[3])) : 1);\n color += ')';\n return color;\n }\n\n /**\n * Changes the color from one to another within certain period of time, invoking callbacks as value is being changed.\n * @memberOf fabric.util\n * @param {String} fromColor The starting color in hex or rgb(a) format.\n * @param {String} toColor The starting color in hex or rgb(a) format.\n * @param {Number} [duration] Duration of change (in ms).\n * @param {Object} [options] Animation options\n * @param {Function} [options.onChange] Callback; invoked on every value change\n * @param {Function} [options.onComplete] Callback; invoked when value change is completed\n * @param {Function} [options.colorEasing] Easing function. Note that this function only take two arguments (currentTime, duration). Thus the regular animation easing functions cannot be used.\n * @param {Function} [options.abort] Additional function with logic. If returns true, onComplete is called.\n * @returns {Function} abort function\n */\n function animateColor(fromColor, toColor, duration, options) {\n var startColor = new fabric.Color(fromColor).getSource(),\n endColor = new fabric.Color(toColor).getSource(),\n originalOnComplete = options.onComplete,\n originalOnChange = options.onChange;\n options = options || {};\n\n return fabric.util.animate(fabric.util.object.extend(options, {\n duration: duration || 500,\n startValue: startColor,\n endValue: endColor,\n byValue: endColor,\n easing: function (currentTime, startValue, byValue, duration) {\n var posValue = options.colorEasing\n ? options.colorEasing(currentTime, duration)\n : 1 - Math.cos(currentTime / duration * (Math.PI / 2));\n return calculateColor(startValue, byValue, posValue);\n },\n // has to take in account for color restoring;\n onComplete: function(current, valuePerc, timePerc) {\n if (originalOnComplete) {\n return originalOnComplete(\n calculateColor(endColor, endColor, 0),\n valuePerc,\n timePerc\n );\n }\n },\n onChange: function(current, valuePerc, timePerc) {\n if (originalOnChange) {\n if (Array.isArray(current)) {\n return originalOnChange(\n calculateColor(current, current, 0),\n valuePerc,\n timePerc\n );\n }\n originalOnChange(current, valuePerc, timePerc);\n }\n }\n }));\n }\n\n fabric.util.animateColor = animateColor;\n\n})();\n\n\n(function() {\n\n function normalize(a, c, p, s) {\n if (a < Math.abs(c)) {\n a = c;\n s = p / 4;\n }\n else {\n //handle the 0/0 case:\n if (c === 0 && a === 0) {\n s = p / (2 * Math.PI) * Math.asin(1);\n }\n else {\n s = p / (2 * Math.PI) * Math.asin(c / a);\n }\n }\n return { a: a, c: c, p: p, s: s };\n }\n\n function elastic(opts, t, d) {\n return opts.a *\n Math.pow(2, 10 * (t -= 1)) *\n Math.sin( (t * d - opts.s) * (2 * Math.PI) / opts.p );\n }\n\n /**\n * Cubic easing out\n * @memberOf fabric.util.ease\n */\n function easeOutCubic(t, b, c, d) {\n return c * ((t = t / d - 1) * t * t + 1) + b;\n }\n\n /**\n * Cubic easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutCubic(t, b, c, d) {\n t /= d / 2;\n if (t < 1) {\n return c / 2 * t * t * t + b;\n }\n return c / 2 * ((t -= 2) * t * t + 2) + b;\n }\n\n /**\n * Quartic easing in\n * @memberOf fabric.util.ease\n */\n function easeInQuart(t, b, c, d) {\n return c * (t /= d) * t * t * t + b;\n }\n\n /**\n * Quartic easing out\n * @memberOf fabric.util.ease\n */\n function easeOutQuart(t, b, c, d) {\n return -c * ((t = t / d - 1) * t * t * t - 1) + b;\n }\n\n /**\n * Quartic easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutQuart(t, b, c, d) {\n t /= d / 2;\n if (t < 1) {\n return c / 2 * t * t * t * t + b;\n }\n return -c / 2 * ((t -= 2) * t * t * t - 2) + b;\n }\n\n /**\n * Quintic easing in\n * @memberOf fabric.util.ease\n */\n function easeInQuint(t, b, c, d) {\n return c * (t /= d) * t * t * t * t + b;\n }\n\n /**\n * Quintic easing out\n * @memberOf fabric.util.ease\n */\n function easeOutQuint(t, b, c, d) {\n return c * ((t = t / d - 1) * t * t * t * t + 1) + b;\n }\n\n /**\n * Quintic easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutQuint(t, b, c, d) {\n t /= d / 2;\n if (t < 1) {\n return c / 2 * t * t * t * t * t + b;\n }\n return c / 2 * ((t -= 2) * t * t * t * t + 2) + b;\n }\n\n /**\n * Sinusoidal easing in\n * @memberOf fabric.util.ease\n */\n function easeInSine(t, b, c, d) {\n return -c * Math.cos(t / d * (Math.PI / 2)) + c + b;\n }\n\n /**\n * Sinusoidal easing out\n * @memberOf fabric.util.ease\n */\n function easeOutSine(t, b, c, d) {\n return c * Math.sin(t / d * (Math.PI / 2)) + b;\n }\n\n /**\n * Sinusoidal easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutSine(t, b, c, d) {\n return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b;\n }\n\n /**\n * Exponential easing in\n * @memberOf fabric.util.ease\n */\n function easeInExpo(t, b, c, d) {\n return (t === 0) ? b : c * Math.pow(2, 10 * (t / d - 1)) + b;\n }\n\n /**\n * Exponential easing out\n * @memberOf fabric.util.ease\n */\n function easeOutExpo(t, b, c, d) {\n return (t === d) ? b + c : c * (-Math.pow(2, -10 * t / d) + 1) + b;\n }\n\n /**\n * Exponential easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutExpo(t, b, c, d) {\n if (t === 0) {\n return b;\n }\n if (t === d) {\n return b + c;\n }\n t /= d / 2;\n if (t < 1) {\n return c / 2 * Math.pow(2, 10 * (t - 1)) + b;\n }\n return c / 2 * (-Math.pow(2, -10 * --t) + 2) + b;\n }\n\n /**\n * Circular easing in\n * @memberOf fabric.util.ease\n */\n function easeInCirc(t, b, c, d) {\n return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b;\n }\n\n /**\n * Circular easing out\n * @memberOf fabric.util.ease\n */\n function easeOutCirc(t, b, c, d) {\n return c * Math.sqrt(1 - (t = t / d - 1) * t) + b;\n }\n\n /**\n * Circular easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutCirc(t, b, c, d) {\n t /= d / 2;\n if (t < 1) {\n return -c / 2 * (Math.sqrt(1 - t * t) - 1) + b;\n }\n return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b;\n }\n\n /**\n * Elastic easing in\n * @memberOf fabric.util.ease\n */\n function easeInElastic(t, b, c, d) {\n var s = 1.70158, p = 0, a = c;\n if (t === 0) {\n return b;\n }\n t /= d;\n if (t === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n var opts = normalize(a, c, p, s);\n return -elastic(opts, t, d) + b;\n }\n\n /**\n * Elastic easing out\n * @memberOf fabric.util.ease\n */\n function easeOutElastic(t, b, c, d) {\n var s = 1.70158, p = 0, a = c;\n if (t === 0) {\n return b;\n }\n t /= d;\n if (t === 1) {\n return b + c;\n }\n if (!p) {\n p = d * 0.3;\n }\n var opts = normalize(a, c, p, s);\n return opts.a * Math.pow(2, -10 * t) * Math.sin((t * d - opts.s) * (2 * Math.PI) / opts.p ) + opts.c + b;\n }\n\n /**\n * Elastic easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutElastic(t, b, c, d) {\n var s = 1.70158, p = 0, a = c;\n if (t === 0) {\n return b;\n }\n t /= d / 2;\n if (t === 2) {\n return b + c;\n }\n if (!p) {\n p = d * (0.3 * 1.5);\n }\n var opts = normalize(a, c, p, s);\n if (t < 1) {\n return -0.5 * elastic(opts, t, d) + b;\n }\n return opts.a * Math.pow(2, -10 * (t -= 1)) *\n Math.sin((t * d - opts.s) * (2 * Math.PI) / opts.p ) * 0.5 + opts.c + b;\n }\n\n /**\n * Backwards easing in\n * @memberOf fabric.util.ease\n */\n function easeInBack(t, b, c, d, s) {\n if (s === undefined) {\n s = 1.70158;\n }\n return c * (t /= d) * t * ((s + 1) * t - s) + b;\n }\n\n /**\n * Backwards easing out\n * @memberOf fabric.util.ease\n */\n function easeOutBack(t, b, c, d, s) {\n if (s === undefined) {\n s = 1.70158;\n }\n return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;\n }\n\n /**\n * Backwards easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutBack(t, b, c, d, s) {\n if (s === undefined) {\n s = 1.70158;\n }\n t /= d / 2;\n if (t < 1) {\n return c / 2 * (t * t * (((s *= (1.525)) + 1) * t - s)) + b;\n }\n return c / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2) + b;\n }\n\n /**\n * Bouncing easing in\n * @memberOf fabric.util.ease\n */\n function easeInBounce(t, b, c, d) {\n return c - easeOutBounce (d - t, 0, c, d) + b;\n }\n\n /**\n * Bouncing easing out\n * @memberOf fabric.util.ease\n */\n function easeOutBounce(t, b, c, d) {\n if ((t /= d) < (1 / 2.75)) {\n return c * (7.5625 * t * t) + b;\n }\n else if (t < (2 / 2.75)) {\n return c * (7.5625 * (t -= (1.5 / 2.75)) * t + 0.75) + b;\n }\n else if (t < (2.5 / 2.75)) {\n return c * (7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375) + b;\n }\n else {\n return c * (7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375) + b;\n }\n }\n\n /**\n * Bouncing easing in and out\n * @memberOf fabric.util.ease\n */\n function easeInOutBounce(t, b, c, d) {\n if (t < d / 2) {\n return easeInBounce (t * 2, 0, c, d) * 0.5 + b;\n }\n return easeOutBounce(t * 2 - d, 0, c, d) * 0.5 + c * 0.5 + b;\n }\n\n /**\n * Easing functions\n * See Easing Equations by Robert Penner\n * @namespace fabric.util.ease\n */\n fabric.util.ease = {\n\n /**\n * Quadratic easing in\n * @memberOf fabric.util.ease\n */\n easeInQuad: function(t, b, c, d) {\n return c * (t /= d) * t + b;\n },\n\n /**\n * Quadratic easing out\n * @memberOf fabric.util.ease\n */\n easeOutQuad: function(t, b, c, d) {\n return -c * (t /= d) * (t - 2) + b;\n },\n\n /**\n * Quadratic easing in and out\n * @memberOf fabric.util.ease\n */\n easeInOutQuad: function(t, b, c, d) {\n t /= (d / 2);\n if (t < 1) {\n return c / 2 * t * t + b;\n }\n return -c / 2 * ((--t) * (t - 2) - 1) + b;\n },\n\n /**\n * Cubic easing in\n * @memberOf fabric.util.ease\n */\n easeInCubic: function(t, b, c, d) {\n return c * (t /= d) * t * t + b;\n },\n\n easeOutCubic: easeOutCubic,\n easeInOutCubic: easeInOutCubic,\n easeInQuart: easeInQuart,\n easeOutQuart: easeOutQuart,\n easeInOutQuart: easeInOutQuart,\n easeInQuint: easeInQuint,\n easeOutQuint: easeOutQuint,\n easeInOutQuint: easeInOutQuint,\n easeInSine: easeInSine,\n easeOutSine: easeOutSine,\n easeInOutSine: easeInOutSine,\n easeInExpo: easeInExpo,\n easeOutExpo: easeOutExpo,\n easeInOutExpo: easeInOutExpo,\n easeInCirc: easeInCirc,\n easeOutCirc: easeOutCirc,\n easeInOutCirc: easeInOutCirc,\n easeInElastic: easeInElastic,\n easeOutElastic: easeOutElastic,\n easeInOutElastic: easeInOutElastic,\n easeInBack: easeInBack,\n easeOutBack: easeOutBack,\n easeInOutBack: easeInOutBack,\n easeInBounce: easeInBounce,\n easeOutBounce: easeOutBounce,\n easeInOutBounce: easeInOutBounce\n };\n\n})();\n\n\n(function(global) {\n\n 'use strict';\n\n /**\n * @name fabric\n * @namespace\n */\n\n var fabric = global.fabric || (global.fabric = { }),\n extend = fabric.util.object.extend,\n clone = fabric.util.object.clone,\n toFixed = fabric.util.toFixed,\n parseUnit = fabric.util.parseUnit,\n multiplyTransformMatrices = fabric.util.multiplyTransformMatrices,\n\n svgValidTagNames = ['path', 'circle', 'polygon', 'polyline', 'ellipse', 'rect', 'line',\n 'image', 'text'],\n svgViewBoxElements = ['symbol', 'image', 'marker', 'pattern', 'view', 'svg'],\n svgInvalidAncestors = ['pattern', 'defs', 'symbol', 'metadata', 'clipPath', 'mask', 'desc'],\n svgValidParents = ['symbol', 'g', 'a', 'svg', 'clipPath', 'defs'],\n\n attributesMap = {\n cx: 'left',\n x: 'left',\n r: 'radius',\n cy: 'top',\n y: 'top',\n display: 'visible',\n visibility: 'visible',\n transform: 'transformMatrix',\n 'fill-opacity': 'fillOpacity',\n 'fill-rule': 'fillRule',\n 'font-family': 'fontFamily',\n 'font-size': 'fontSize',\n 'font-style': 'fontStyle',\n 'font-weight': 'fontWeight',\n 'letter-spacing': 'charSpacing',\n 'paint-order': 'paintFirst',\n 'stroke-dasharray': 'strokeDashArray',\n 'stroke-dashoffset': 'strokeDashOffset',\n 'stroke-linecap': 'strokeLineCap',\n 'stroke-linejoin': 'strokeLineJoin',\n 'stroke-miterlimit': 'strokeMiterLimit',\n 'stroke-opacity': 'strokeOpacity',\n 'stroke-width': 'strokeWidth',\n 'text-decoration': 'textDecoration',\n 'text-anchor': 'textAnchor',\n opacity: 'opacity',\n 'clip-path': 'clipPath',\n 'clip-rule': 'clipRule',\n 'vector-effect': 'strokeUniform',\n 'image-rendering': 'imageSmoothing',\n },\n\n colorAttributes = {\n stroke: 'strokeOpacity',\n fill: 'fillOpacity'\n },\n\n fSize = 'font-size', cPath = 'clip-path';\n\n fabric.svgValidTagNamesRegEx = getSvgRegex(svgValidTagNames);\n fabric.svgViewBoxElementsRegEx = getSvgRegex(svgViewBoxElements);\n fabric.svgInvalidAncestorsRegEx = getSvgRegex(svgInvalidAncestors);\n fabric.svgValidParentsRegEx = getSvgRegex(svgValidParents);\n\n fabric.cssRules = { };\n fabric.gradientDefs = { };\n fabric.clipPaths = { };\n\n function normalizeAttr(attr) {\n // transform attribute names\n if (attr in attributesMap) {\n return attributesMap[attr];\n }\n return attr;\n }\n\n function normalizeValue(attr, value, parentAttributes, fontSize) {\n var isArray = Array.isArray(value), parsed;\n\n if ((attr === 'fill' || attr === 'stroke') && value === 'none') {\n value = '';\n }\n else if (attr === 'strokeUniform') {\n return (value === 'non-scaling-stroke');\n }\n else if (attr === 'strokeDashArray') {\n if (value === 'none') {\n value = null;\n }\n else {\n value = value.replace(/,/g, ' ').split(/\\s+/).map(parseFloat);\n }\n }\n else if (attr === 'transformMatrix') {\n if (parentAttributes && parentAttributes.transformMatrix) {\n value = multiplyTransformMatrices(\n parentAttributes.transformMatrix, fabric.parseTransformAttribute(value));\n }\n else {\n value = fabric.parseTransformAttribute(value);\n }\n }\n else if (attr === 'visible') {\n value = value !== 'none' && value !== 'hidden';\n // display=none on parent element always takes precedence over child element\n if (parentAttributes && parentAttributes.visible === false) {\n value = false;\n }\n }\n else if (attr === 'opacity') {\n value = parseFloat(value);\n if (parentAttributes && typeof parentAttributes.opacity !== 'undefined') {\n value *= parentAttributes.opacity;\n }\n }\n else if (attr === 'textAnchor' /* text-anchor */) {\n value = value === 'start' ? 'left' : value === 'end' ? 'right' : 'center';\n }\n else if (attr === 'charSpacing') {\n // parseUnit returns px and we convert it to em\n parsed = parseUnit(value, fontSize) / fontSize * 1000;\n }\n else if (attr === 'paintFirst') {\n var fillIndex = value.indexOf('fill');\n var strokeIndex = value.indexOf('stroke');\n var value = 'fill';\n if (fillIndex > -1 && strokeIndex > -1 && strokeIndex < fillIndex) {\n value = 'stroke';\n }\n else if (fillIndex === -1 && strokeIndex > -1) {\n value = 'stroke';\n }\n }\n else if (attr === 'href' || attr === 'xlink:href' || attr === 'font') {\n return value;\n }\n else if (attr === 'imageSmoothing') {\n return (value === 'optimizeQuality');\n }\n else {\n parsed = isArray ? value.map(parseUnit) : parseUnit(value, fontSize);\n }\n\n return (!isArray && isNaN(parsed) ? value : parsed);\n }\n\n /**\n * @private\n */\n function getSvgRegex(arr) {\n return new RegExp('^(' + arr.join('|') + ')\\\\b', 'i');\n }\n\n /**\n * @private\n * @param {Object} attributes Array of attributes to parse\n */\n function _setStrokeFillOpacity(attributes) {\n for (var attr in colorAttributes) {\n\n if (typeof attributes[colorAttributes[attr]] === 'undefined' || attributes[attr] === '') {\n continue;\n }\n\n if (typeof attributes[attr] === 'undefined') {\n if (!fabric.Object.prototype[attr]) {\n continue;\n }\n attributes[attr] = fabric.Object.prototype[attr];\n }\n\n if (attributes[attr].indexOf('url(') === 0) {\n continue;\n }\n\n var color = new fabric.Color(attributes[attr]);\n attributes[attr] = color.setAlpha(toFixed(color.getAlpha() * attributes[colorAttributes[attr]], 2)).toRgba();\n }\n return attributes;\n }\n\n /**\n * @private\n */\n function _getMultipleNodes(doc, nodeNames) {\n var nodeName, nodeArray = [], nodeList, i, len;\n for (i = 0, len = nodeNames.length; i < len; i++) {\n nodeName = nodeNames[i];\n nodeList = doc.getElementsByTagName(nodeName);\n nodeArray = nodeArray.concat(Array.prototype.slice.call(nodeList));\n }\n return nodeArray;\n }\n\n /**\n * Parses \"transform\" attribute, returning an array of values\n * @static\n * @function\n * @memberOf fabric\n * @param {String} attributeValue String containing attribute value\n * @return {Array} Array of 6 elements representing transformation matrix\n */\n fabric.parseTransformAttribute = (function() {\n function rotateMatrix(matrix, args) {\n var cos = fabric.util.cos(args[0]), sin = fabric.util.sin(args[0]),\n x = 0, y = 0;\n if (args.length === 3) {\n x = args[1];\n y = args[2];\n }\n\n matrix[0] = cos;\n matrix[1] = sin;\n matrix[2] = -sin;\n matrix[3] = cos;\n matrix[4] = x - (cos * x - sin * y);\n matrix[5] = y - (sin * x + cos * y);\n }\n\n function scaleMatrix(matrix, args) {\n var multiplierX = args[0],\n multiplierY = (args.length === 2) ? args[1] : args[0];\n\n matrix[0] = multiplierX;\n matrix[3] = multiplierY;\n }\n\n function skewMatrix(matrix, args, pos) {\n matrix[pos] = Math.tan(fabric.util.degreesToRadians(args[0]));\n }\n\n function translateMatrix(matrix, args) {\n matrix[4] = args[0];\n if (args.length === 2) {\n matrix[5] = args[1];\n }\n }\n\n // identity matrix\n var iMatrix = fabric.iMatrix,\n\n // == begin transform regexp\n number = fabric.reNum,\n\n commaWsp = fabric.commaWsp,\n\n skewX = '(?:(skewX)\\\\s*\\\\(\\\\s*(' + number + ')\\\\s*\\\\))',\n\n skewY = '(?:(skewY)\\\\s*\\\\(\\\\s*(' + number + ')\\\\s*\\\\))',\n\n rotate = '(?:(rotate)\\\\s*\\\\(\\\\s*(' + number + ')(?:' +\n commaWsp + '(' + number + ')' +\n commaWsp + '(' + number + '))?\\\\s*\\\\))',\n\n scale = '(?:(scale)\\\\s*\\\\(\\\\s*(' + number + ')(?:' +\n commaWsp + '(' + number + '))?\\\\s*\\\\))',\n\n translate = '(?:(translate)\\\\s*\\\\(\\\\s*(' + number + ')(?:' +\n commaWsp + '(' + number + '))?\\\\s*\\\\))',\n\n matrix = '(?:(matrix)\\\\s*\\\\(\\\\s*' +\n '(' + number + ')' + commaWsp +\n '(' + number + ')' + commaWsp +\n '(' + number + ')' + commaWsp +\n '(' + number + ')' + commaWsp +\n '(' + number + ')' + commaWsp +\n '(' + number + ')' +\n '\\\\s*\\\\))',\n\n transform = '(?:' +\n matrix + '|' +\n translate + '|' +\n scale + '|' +\n rotate + '|' +\n skewX + '|' +\n skewY +\n ')',\n\n transforms = '(?:' + transform + '(?:' + commaWsp + '*' + transform + ')*' + ')',\n\n transformList = '^\\\\s*(?:' + transforms + '?)\\\\s*$',\n\n // http://www.w3.org/TR/SVG/coords.html#TransformAttribute\n reTransformList = new RegExp(transformList),\n // == end transform regexp\n\n reTransform = new RegExp(transform, 'g');\n\n return function(attributeValue) {\n\n // start with identity matrix\n var matrix = iMatrix.concat(),\n matrices = [];\n\n // return if no argument was given or\n // an argument does not match transform attribute regexp\n if (!attributeValue || (attributeValue && !reTransformList.test(attributeValue))) {\n return matrix;\n }\n\n attributeValue.replace(reTransform, function(match) {\n\n var m = new RegExp(transform).exec(match).filter(function (match) {\n // match !== '' && match != null\n return (!!match);\n }),\n operation = m[1],\n args = m.slice(2).map(parseFloat);\n\n switch (operation) {\n case 'translate':\n translateMatrix(matrix, args);\n break;\n case 'rotate':\n args[0] = fabric.util.degreesToRadians(args[0]);\n rotateMatrix(matrix, args);\n break;\n case 'scale':\n scaleMatrix(matrix, args);\n break;\n case 'skewX':\n skewMatrix(matrix, args, 2);\n break;\n case 'skewY':\n skewMatrix(matrix, args, 1);\n break;\n case 'matrix':\n matrix = args;\n break;\n }\n\n // snapshot current matrix into matrices array\n matrices.push(matrix.concat());\n // reset\n matrix = iMatrix.concat();\n });\n\n var combinedMatrix = matrices[0];\n while (matrices.length > 1) {\n matrices.shift();\n combinedMatrix = fabric.util.multiplyTransformMatrices(combinedMatrix, matrices[0]);\n }\n return combinedMatrix;\n };\n })();\n\n /**\n * @private\n */\n function parseStyleString(style, oStyle) {\n var attr, value;\n style.replace(/;\\s*$/, '').split(';').forEach(function (chunk) {\n var pair = chunk.split(':');\n\n attr = pair[0].trim().toLowerCase();\n value = pair[1].trim();\n\n oStyle[attr] = value;\n });\n }\n\n /**\n * @private\n */\n function parseStyleObject(style, oStyle) {\n var attr, value;\n for (var prop in style) {\n if (typeof style[prop] === 'undefined') {\n continue;\n }\n\n attr = prop.toLowerCase();\n value = style[prop];\n\n oStyle[attr] = value;\n }\n }\n\n /**\n * @private\n */\n function getGlobalStylesForElement(element, svgUid) {\n var styles = { };\n for (var rule in fabric.cssRules[svgUid]) {\n if (elementMatchesRule(element, rule.split(' '))) {\n for (var property in fabric.cssRules[svgUid][rule]) {\n styles[property] = fabric.cssRules[svgUid][rule][property];\n }\n }\n }\n return styles;\n }\n\n /**\n * @private\n */\n function elementMatchesRule(element, selectors) {\n var firstMatching, parentMatching = true;\n //start from rightmost selector.\n firstMatching = selectorMatches(element, selectors.pop());\n if (firstMatching && selectors.length) {\n parentMatching = doesSomeParentMatch(element, selectors);\n }\n return firstMatching && parentMatching && (selectors.length === 0);\n }\n\n function doesSomeParentMatch(element, selectors) {\n var selector, parentMatching = true;\n while (element.parentNode && element.parentNode.nodeType === 1 && selectors.length) {\n if (parentMatching) {\n selector = selectors.pop();\n }\n element = element.parentNode;\n parentMatching = selectorMatches(element, selector);\n }\n return selectors.length === 0;\n }\n\n /**\n * @private\n */\n function selectorMatches(element, selector) {\n var nodeName = element.nodeName,\n classNames = element.getAttribute('class'),\n id = element.getAttribute('id'), matcher, i;\n // i check if a selector matches slicing away part from it.\n // if i get empty string i should match\n matcher = new RegExp('^' + nodeName, 'i');\n selector = selector.replace(matcher, '');\n if (id && selector.length) {\n matcher = new RegExp('#' + id + '(?![a-zA-Z\\\\-]+)', 'i');\n selector = selector.replace(matcher, '');\n }\n if (classNames && selector.length) {\n classNames = classNames.split(' ');\n for (i = classNames.length; i--;) {\n matcher = new RegExp('\\\\.' + classNames[i] + '(?![a-zA-Z\\\\-]+)', 'i');\n selector = selector.replace(matcher, '');\n }\n }\n return selector.length === 0;\n }\n\n /**\n * @private\n * to support IE8 missing getElementById on SVGdocument and on node xmlDOM\n */\n function elementById(doc, id) {\n var el;\n doc.getElementById && (el = doc.getElementById(id));\n if (el) {\n return el;\n }\n var node, i, len, nodelist = doc.getElementsByTagName('*');\n for (i = 0, len = nodelist.length; i < len; i++) {\n node = nodelist[i];\n if (id === node.getAttribute('id')) {\n return node;\n }\n }\n }\n\n /**\n * @private\n */\n function parseUseDirectives(doc) {\n var nodelist = _getMultipleNodes(doc, ['use', 'svg:use']), i = 0;\n while (nodelist.length && i < nodelist.length) {\n var el = nodelist[i],\n xlinkAttribute = el.getAttribute('xlink:href') || el.getAttribute('href');\n\n if (xlinkAttribute === null) {\n return;\n }\n\n var xlink = xlinkAttribute.slice(1),\n x = el.getAttribute('x') || 0,\n y = el.getAttribute('y') || 0,\n el2 = elementById(doc, xlink).cloneNode(true),\n currentTrans = (el2.getAttribute('transform') || '') + ' translate(' + x + ', ' + y + ')',\n parentNode,\n oldLength = nodelist.length, attr,\n j,\n attrs,\n len,\n namespace = fabric.svgNS;\n\n applyViewboxTransform(el2);\n if (/^svg$/i.test(el2.nodeName)) {\n var el3 = el2.ownerDocument.createElementNS(namespace, 'g');\n for (j = 0, attrs = el2.attributes, len = attrs.length; j < len; j++) {\n attr = attrs.item(j);\n el3.setAttributeNS(namespace, attr.nodeName, attr.nodeValue);\n }\n // el2.firstChild != null\n while (el2.firstChild) {\n el3.appendChild(el2.firstChild);\n }\n el2 = el3;\n }\n\n for (j = 0, attrs = el.attributes, len = attrs.length; j < len; j++) {\n attr = attrs.item(j);\n if (attr.nodeName === 'x' || attr.nodeName === 'y' ||\n attr.nodeName === 'xlink:href' || attr.nodeName === 'href') {\n continue;\n }\n\n if (attr.nodeName === 'transform') {\n currentTrans = attr.nodeValue + ' ' + currentTrans;\n }\n else {\n el2.setAttribute(attr.nodeName, attr.nodeValue);\n }\n }\n\n el2.setAttribute('transform', currentTrans);\n el2.setAttribute('instantiated_by_use', '1');\n el2.removeAttribute('id');\n parentNode = el.parentNode;\n parentNode.replaceChild(el2, el);\n // some browsers do not shorten nodelist after replaceChild (IE8)\n if (nodelist.length === oldLength) {\n i++;\n }\n }\n }\n\n // http://www.w3.org/TR/SVG/coords.html#ViewBoxAttribute\n // matches, e.g.: +14.56e-12, etc.\n var reViewBoxAttrValue = new RegExp(\n '^' +\n '\\\\s*(' + fabric.reNum + '+)\\\\s*,?' +\n '\\\\s*(' + fabric.reNum + '+)\\\\s*,?' +\n '\\\\s*(' + fabric.reNum + '+)\\\\s*,?' +\n '\\\\s*(' + fabric.reNum + '+)\\\\s*' +\n '$'\n );\n\n /**\n * Add a element that envelop all child elements and makes the viewbox transformMatrix descend on all elements\n */\n function applyViewboxTransform(element) {\n if (!fabric.svgViewBoxElementsRegEx.test(element.nodeName)) {\n return {};\n }\n var viewBoxAttr = element.getAttribute('viewBox'),\n scaleX = 1,\n scaleY = 1,\n minX = 0,\n minY = 0,\n viewBoxWidth, viewBoxHeight, matrix, el,\n widthAttr = element.getAttribute('width'),\n heightAttr = element.getAttribute('height'),\n x = element.getAttribute('x') || 0,\n y = element.getAttribute('y') || 0,\n preserveAspectRatio = element.getAttribute('preserveAspectRatio') || '',\n missingViewBox = (!viewBoxAttr || !(viewBoxAttr = viewBoxAttr.match(reViewBoxAttrValue))),\n missingDimAttr = (!widthAttr || !heightAttr || widthAttr === '100%' || heightAttr === '100%'),\n toBeParsed = missingViewBox && missingDimAttr,\n parsedDim = { }, translateMatrix = '', widthDiff = 0, heightDiff = 0;\n\n parsedDim.width = 0;\n parsedDim.height = 0;\n parsedDim.toBeParsed = toBeParsed;\n\n if (missingViewBox) {\n if (((x || y) && element.parentNode && element.parentNode.nodeName !== '#document')) {\n translateMatrix = ' translate(' + parseUnit(x) + ' ' + parseUnit(y) + ') ';\n matrix = (element.getAttribute('transform') || '') + translateMatrix;\n element.setAttribute('transform', matrix);\n element.removeAttribute('x');\n element.removeAttribute('y');\n }\n }\n\n if (toBeParsed) {\n return parsedDim;\n }\n\n if (missingViewBox) {\n parsedDim.width = parseUnit(widthAttr);\n parsedDim.height = parseUnit(heightAttr);\n // set a transform for elements that have x y and are inner(only) SVGs\n return parsedDim;\n }\n minX = -parseFloat(viewBoxAttr[1]);\n minY = -parseFloat(viewBoxAttr[2]);\n viewBoxWidth = parseFloat(viewBoxAttr[3]);\n viewBoxHeight = parseFloat(viewBoxAttr[4]);\n parsedDim.minX = minX;\n parsedDim.minY = minY;\n parsedDim.viewBoxWidth = viewBoxWidth;\n parsedDim.viewBoxHeight = viewBoxHeight;\n if (!missingDimAttr) {\n parsedDim.width = parseUnit(widthAttr);\n parsedDim.height = parseUnit(heightAttr);\n scaleX = parsedDim.width / viewBoxWidth;\n scaleY = parsedDim.height / viewBoxHeight;\n }\n else {\n parsedDim.width = viewBoxWidth;\n parsedDim.height = viewBoxHeight;\n }\n\n // default is to preserve aspect ratio\n preserveAspectRatio = fabric.util.parsePreserveAspectRatioAttribute(preserveAspectRatio);\n if (preserveAspectRatio.alignX !== 'none') {\n //translate all container for the effect of Mid, Min, Max\n if (preserveAspectRatio.meetOrSlice === 'meet') {\n scaleY = scaleX = (scaleX > scaleY ? scaleY : scaleX);\n // calculate additional translation to move the viewbox\n }\n if (preserveAspectRatio.meetOrSlice === 'slice') {\n scaleY = scaleX = (scaleX > scaleY ? scaleX : scaleY);\n // calculate additional translation to move the viewbox\n }\n widthDiff = parsedDim.width - viewBoxWidth * scaleX;\n heightDiff = parsedDim.height - viewBoxHeight * scaleX;\n if (preserveAspectRatio.alignX === 'Mid') {\n widthDiff /= 2;\n }\n if (preserveAspectRatio.alignY === 'Mid') {\n heightDiff /= 2;\n }\n if (preserveAspectRatio.alignX === 'Min') {\n widthDiff = 0;\n }\n if (preserveAspectRatio.alignY === 'Min') {\n heightDiff = 0;\n }\n }\n\n if (scaleX === 1 && scaleY === 1 && minX === 0 && minY === 0 && x === 0 && y === 0) {\n return parsedDim;\n }\n if ((x || y) && element.parentNode.nodeName !== '#document') {\n translateMatrix = ' translate(' + parseUnit(x) + ' ' + parseUnit(y) + ') ';\n }\n\n matrix = translateMatrix + ' matrix(' + scaleX +\n ' 0' +\n ' 0 ' +\n scaleY + ' ' +\n (minX * scaleX + widthDiff) + ' ' +\n (minY * scaleY + heightDiff) + ') ';\n // seems unused.\n // parsedDim.viewboxTransform = fabric.parseTransformAttribute(matrix);\n if (element.nodeName === 'svg') {\n el = element.ownerDocument.createElementNS(fabric.svgNS, 'g');\n // element.firstChild != null\n while (element.firstChild) {\n el.appendChild(element.firstChild);\n }\n element.appendChild(el);\n }\n else {\n el = element;\n el.removeAttribute('x');\n el.removeAttribute('y');\n matrix = el.getAttribute('transform') + matrix;\n }\n el.setAttribute('transform', matrix);\n return parsedDim;\n }\n\n function hasAncestorWithNodeName(element, nodeName) {\n while (element && (element = element.parentNode)) {\n if (element.nodeName && nodeName.test(element.nodeName.replace('svg:', ''))\n && !element.getAttribute('instantiated_by_use')) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Parses an SVG document, converts it to an array of corresponding fabric.* instances and passes them to a callback\n * @static\n * @function\n * @memberOf fabric\n * @param {SVGDocument} doc SVG document to parse\n * @param {Function} callback Callback to call when parsing is finished;\n * It's being passed an array of elements (parsed from a document).\n * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created.\n * @param {Object} [parsingOptions] options for parsing document\n * @param {String} [parsingOptions.crossOrigin] crossOrigin settings\n */\n fabric.parseSVGDocument = function(doc, callback, reviver, parsingOptions) {\n if (!doc) {\n return;\n }\n\n parseUseDirectives(doc);\n\n var svgUid = fabric.Object.__uid++, i, len,\n options = applyViewboxTransform(doc),\n descendants = fabric.util.toArray(doc.getElementsByTagName('*'));\n options.crossOrigin = parsingOptions && parsingOptions.crossOrigin;\n options.svgUid = svgUid;\n\n if (descendants.length === 0 && fabric.isLikelyNode) {\n // we're likely in node, where \"o3-xml\" library fails to gEBTN(\"*\")\n // https://github.com/ajaxorg/node-o3-xml/issues/21\n descendants = doc.selectNodes('//*[name(.)!=\"svg\"]');\n var arr = [];\n for (i = 0, len = descendants.length; i < len; i++) {\n arr[i] = descendants[i];\n }\n descendants = arr;\n }\n\n var elements = descendants.filter(function(el) {\n applyViewboxTransform(el);\n return fabric.svgValidTagNamesRegEx.test(el.nodeName.replace('svg:', '')) &&\n !hasAncestorWithNodeName(el, fabric.svgInvalidAncestorsRegEx); // http://www.w3.org/TR/SVG/struct.html#DefsElement\n });\n if (!elements || (elements && !elements.length)) {\n callback && callback([], {});\n return;\n }\n var clipPaths = { };\n descendants.filter(function(el) {\n return el.nodeName.replace('svg:', '') === 'clipPath';\n }).forEach(function(el) {\n var id = el.getAttribute('id');\n clipPaths[id] = fabric.util.toArray(el.getElementsByTagName('*')).filter(function(el) {\n return fabric.svgValidTagNamesRegEx.test(el.nodeName.replace('svg:', ''));\n });\n });\n fabric.gradientDefs[svgUid] = fabric.getGradientDefs(doc);\n fabric.cssRules[svgUid] = fabric.getCSSRules(doc);\n fabric.clipPaths[svgUid] = clipPaths;\n // Precedence of rules: style > class > attribute\n fabric.parseElements(elements, function(instances, elements) {\n if (callback) {\n callback(instances, options, elements, descendants);\n delete fabric.gradientDefs[svgUid];\n delete fabric.cssRules[svgUid];\n delete fabric.clipPaths[svgUid];\n }\n }, clone(options), reviver, parsingOptions);\n };\n\n function recursivelyParseGradientsXlink(doc, gradient) {\n var gradientsAttrs = ['gradientTransform', 'x1', 'x2', 'y1', 'y2', 'gradientUnits', 'cx', 'cy', 'r', 'fx', 'fy'],\n xlinkAttr = 'xlink:href',\n xLink = gradient.getAttribute(xlinkAttr).slice(1),\n referencedGradient = elementById(doc, xLink);\n if (referencedGradient && referencedGradient.getAttribute(xlinkAttr)) {\n recursivelyParseGradientsXlink(doc, referencedGradient);\n }\n gradientsAttrs.forEach(function(attr) {\n if (referencedGradient && !gradient.hasAttribute(attr) && referencedGradient.hasAttribute(attr)) {\n gradient.setAttribute(attr, referencedGradient.getAttribute(attr));\n }\n });\n if (!gradient.children.length) {\n var referenceClone = referencedGradient.cloneNode(true);\n while (referenceClone.firstChild) {\n gradient.appendChild(referenceClone.firstChild);\n }\n }\n gradient.removeAttribute(xlinkAttr);\n }\n\n var reFontDeclaration = new RegExp(\n '(normal|italic)?\\\\s*(normal|small-caps)?\\\\s*' +\n '(normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900)?\\\\s*(' +\n fabric.reNum +\n '(?:px|cm|mm|em|pt|pc|in)*)(?:\\\\/(normal|' + fabric.reNum + '))?\\\\s+(.*)');\n\n extend(fabric, {\n /**\n * Parses a short font declaration, building adding its properties to a style object\n * @static\n * @function\n * @memberOf fabric\n * @param {String} value font declaration\n * @param {Object} oStyle definition\n */\n parseFontDeclaration: function(value, oStyle) {\n var match = value.match(reFontDeclaration);\n\n if (!match) {\n return;\n }\n var fontStyle = match[1],\n // font variant is not used\n // fontVariant = match[2],\n fontWeight = match[3],\n fontSize = match[4],\n lineHeight = match[5],\n fontFamily = match[6];\n\n if (fontStyle) {\n oStyle.fontStyle = fontStyle;\n }\n if (fontWeight) {\n oStyle.fontWeight = isNaN(parseFloat(fontWeight)) ? fontWeight : parseFloat(fontWeight);\n }\n if (fontSize) {\n oStyle.fontSize = parseUnit(fontSize);\n }\n if (fontFamily) {\n oStyle.fontFamily = fontFamily;\n }\n if (lineHeight) {\n oStyle.lineHeight = lineHeight === 'normal' ? 1 : lineHeight;\n }\n },\n\n /**\n * Parses an SVG document, returning all of the gradient declarations found in it\n * @static\n * @function\n * @memberOf fabric\n * @param {SVGDocument} doc SVG document to parse\n * @return {Object} Gradient definitions; key corresponds to element id, value -- to gradient definition element\n */\n getGradientDefs: function(doc) {\n var tagArray = [\n 'linearGradient',\n 'radialGradient',\n 'svg:linearGradient',\n 'svg:radialGradient'],\n elList = _getMultipleNodes(doc, tagArray),\n el, j = 0, gradientDefs = { };\n j = elList.length;\n while (j--) {\n el = elList[j];\n if (el.getAttribute('xlink:href')) {\n recursivelyParseGradientsXlink(doc, el);\n }\n gradientDefs[el.getAttribute('id')] = el;\n }\n return gradientDefs;\n },\n\n /**\n * Returns an object of attributes' name/value, given element and an array of attribute names;\n * Parses parent \"g\" nodes recursively upwards.\n * @static\n * @memberOf fabric\n * @param {DOMElement} element Element to parse\n * @param {Array} attributes Array of attributes to parse\n * @return {Object} object containing parsed attributes' names/values\n */\n parseAttributes: function(element, attributes, svgUid) {\n\n if (!element) {\n return;\n }\n\n var value,\n parentAttributes = { },\n fontSize, parentFontSize;\n\n if (typeof svgUid === 'undefined') {\n svgUid = element.getAttribute('svgUid');\n }\n // if there's a parent container (`g` or `a` or `symbol` node), parse its attributes recursively upwards\n if (element.parentNode && fabric.svgValidParentsRegEx.test(element.parentNode.nodeName)) {\n parentAttributes = fabric.parseAttributes(element.parentNode, attributes, svgUid);\n }\n\n var ownAttributes = attributes.reduce(function(memo, attr) {\n value = element.getAttribute(attr);\n if (value) { // eslint-disable-line\n memo[attr] = value;\n }\n return memo;\n }, { });\n // add values parsed from style, which take precedence over attributes\n // (see: http://www.w3.org/TR/SVG/styling.html#UsingPresentationAttributes)\n var cssAttrs = extend(\n getGlobalStylesForElement(element, svgUid),\n fabric.parseStyleAttribute(element)\n );\n ownAttributes = extend(\n ownAttributes,\n cssAttrs\n );\n if (cssAttrs[cPath]) {\n element.setAttribute(cPath, cssAttrs[cPath]);\n }\n fontSize = parentFontSize = parentAttributes.fontSize || fabric.Text.DEFAULT_SVG_FONT_SIZE;\n if (ownAttributes[fSize]) {\n // looks like the minimum should be 9px when dealing with ems. this is what looks like in browsers.\n ownAttributes[fSize] = fontSize = parseUnit(ownAttributes[fSize], parentFontSize);\n }\n\n var normalizedAttr, normalizedValue, normalizedStyle = {};\n for (var attr in ownAttributes) {\n normalizedAttr = normalizeAttr(attr);\n normalizedValue = normalizeValue(normalizedAttr, ownAttributes[attr], parentAttributes, fontSize);\n normalizedStyle[normalizedAttr] = normalizedValue;\n }\n if (normalizedStyle && normalizedStyle.font) {\n fabric.parseFontDeclaration(normalizedStyle.font, normalizedStyle);\n }\n var mergedAttrs = extend(parentAttributes, normalizedStyle);\n return fabric.svgValidParentsRegEx.test(element.nodeName) ? mergedAttrs : _setStrokeFillOpacity(mergedAttrs);\n },\n\n /**\n * Transforms an array of svg elements to corresponding fabric.* instances\n * @static\n * @memberOf fabric\n * @param {Array} elements Array of elements to parse\n * @param {Function} callback Being passed an array of fabric instances (transformed from SVG elements)\n * @param {Object} [options] Options object\n * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created.\n */\n parseElements: function(elements, callback, options, reviver, parsingOptions) {\n new fabric.ElementsParser(elements, callback, options, reviver, parsingOptions).parse();\n },\n\n /**\n * Parses \"style\" attribute, retuning an object with values\n * @static\n * @memberOf fabric\n * @param {SVGElement} element Element to parse\n * @return {Object} Objects with values parsed from style attribute of an element\n */\n parseStyleAttribute: function(element) {\n var oStyle = { },\n style = element.getAttribute('style');\n\n if (!style) {\n return oStyle;\n }\n\n if (typeof style === 'string') {\n parseStyleString(style, oStyle);\n }\n else {\n parseStyleObject(style, oStyle);\n }\n\n return oStyle;\n },\n\n /**\n * Parses \"points\" attribute, returning an array of values\n * @static\n * @memberOf fabric\n * @param {String} points points attribute string\n * @return {Array} array of points\n */\n parsePointsAttribute: function(points) {\n\n // points attribute is required and must not be empty\n if (!points) {\n return null;\n }\n\n // replace commas with whitespace and remove bookending whitespace\n points = points.replace(/,/g, ' ').trim();\n\n points = points.split(/\\s+/);\n var parsedPoints = [], i, len;\n\n for (i = 0, len = points.length; i < len; i += 2) {\n parsedPoints.push({\n x: parseFloat(points[i]),\n y: parseFloat(points[i + 1])\n });\n }\n\n // odd number of points is an error\n // if (parsedPoints.length % 2 !== 0) {\n // return null;\n // }\n\n return parsedPoints;\n },\n\n /**\n * Returns CSS rules for a given SVG document\n * @static\n * @function\n * @memberOf fabric\n * @param {SVGDocument} doc SVG document to parse\n * @return {Object} CSS rules of this document\n */\n getCSSRules: function(doc) {\n var styles = doc.getElementsByTagName('style'), i, len,\n allRules = { }, rules;\n\n // very crude parsing of style contents\n for (i = 0, len = styles.length; i < len; i++) {\n var styleContents = styles[i].textContent;\n\n // remove comments\n styleContents = styleContents.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '');\n if (styleContents.trim() === '') {\n continue;\n }\n // recovers all the rule in this form `body { style code... }`\n // rules = styleContents.match(/[^{]*\\{[\\s\\S]*?\\}/g);\n rules = styleContents.split('}');\n // remove empty rules.\n rules = rules.filter(function(rule) { return rule.trim(); });\n // at this point we have hopefully an array of rules `body { style code... `\n // eslint-disable-next-line no-loop-func\n rules.forEach(function(rule) {\n\n var match = rule.split('{'),\n ruleObj = { }, declaration = match[1].trim(),\n propertyValuePairs = declaration.split(';').filter(function(pair) { return pair.trim(); });\n\n for (i = 0, len = propertyValuePairs.length; i < len; i++) {\n var pair = propertyValuePairs[i].split(':'),\n property = pair[0].trim(),\n value = pair[1].trim();\n ruleObj[property] = value;\n }\n rule = match[0].trim();\n rule.split(',').forEach(function(_rule) {\n _rule = _rule.replace(/^svg/i, '').trim();\n if (_rule === '') {\n return;\n }\n if (allRules[_rule]) {\n fabric.util.object.extend(allRules[_rule], ruleObj);\n }\n else {\n allRules[_rule] = fabric.util.object.clone(ruleObj);\n }\n });\n });\n }\n return allRules;\n },\n\n /**\n * Takes url corresponding to an SVG document, and parses it into a set of fabric objects.\n * Note that SVG is fetched via XMLHttpRequest, so it needs to conform to SOP (Same Origin Policy)\n * @memberOf fabric\n * @param {String} url\n * @param {Function} callback\n * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created.\n * @param {Object} [options] Object containing options for parsing\n * @param {String} [options.crossOrigin] crossOrigin crossOrigin setting to use for external resources\n */\n loadSVGFromURL: function(url, callback, reviver, options) {\n\n url = url.replace(/^\\n\\s*/, '').trim();\n new fabric.util.request(url, {\n method: 'get',\n onComplete: onComplete\n });\n\n function onComplete(r) {\n\n var xml = r.responseXML;\n if (!xml || !xml.documentElement) {\n callback && callback(null);\n return false;\n }\n\n fabric.parseSVGDocument(xml.documentElement, function (results, _options, elements, allElements) {\n callback && callback(results, _options, elements, allElements);\n }, reviver, options);\n }\n },\n\n /**\n * Takes string corresponding to an SVG document, and parses it into a set of fabric objects\n * @memberOf fabric\n * @param {String} string\n * @param {Function} callback\n * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created.\n * @param {Object} [options] Object containing options for parsing\n * @param {String} [options.crossOrigin] crossOrigin crossOrigin setting to use for external resources\n */\n loadSVGFromString: function(string, callback, reviver, options) {\n var parser = new fabric.window.DOMParser(),\n doc = parser.parseFromString(string.trim(), 'text/xml');\n fabric.parseSVGDocument(doc.documentElement, function (results, _options, elements, allElements) {\n callback(results, _options, elements, allElements);\n }, reviver, options);\n }\n });\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\nfabric.ElementsParser = function(elements, callback, options, reviver, parsingOptions, doc) {\n this.elements = elements;\n this.callback = callback;\n this.options = options;\n this.reviver = reviver;\n this.svgUid = (options && options.svgUid) || 0;\n this.parsingOptions = parsingOptions;\n this.regexUrl = /^url\\(['\"]?#([^'\"]+)['\"]?\\)/g;\n this.doc = doc;\n};\n\n(function(proto) {\n proto.parse = function() {\n this.instances = new Array(this.elements.length);\n this.numElements = this.elements.length;\n this.createObjects();\n };\n\n proto.createObjects = function() {\n var _this = this;\n this.elements.forEach(function(element, i) {\n element.setAttribute('svgUid', _this.svgUid);\n _this.createObject(element, i);\n });\n };\n\n proto.findTag = function(el) {\n return fabric[fabric.util.string.capitalize(el.tagName.replace('svg:', ''))];\n };\n\n proto.createObject = function(el, index) {\n var klass = this.findTag(el);\n if (klass && klass.fromElement) {\n try {\n klass.fromElement(el, this.createCallback(index, el), this.options);\n }\n catch (err) {\n fabric.log(err);\n }\n }\n else {\n this.checkIfDone();\n }\n };\n\n proto.createCallback = function(index, el) {\n var _this = this;\n return function(obj) {\n var _options;\n _this.resolveGradient(obj, el, 'fill');\n _this.resolveGradient(obj, el, 'stroke');\n if (obj instanceof fabric.Image && obj._originalElement) {\n _options = obj.parsePreserveAspectRatioAttribute(el);\n }\n obj._removeTransformMatrix(_options);\n _this.resolveClipPath(obj, el);\n _this.reviver && _this.reviver(el, obj);\n _this.instances[index] = obj;\n _this.checkIfDone();\n };\n };\n\n proto.extractPropertyDefinition = function(obj, property, storage) {\n var value = obj[property], regex = this.regexUrl;\n if (!regex.test(value)) {\n return;\n }\n regex.lastIndex = 0;\n var id = regex.exec(value)[1];\n regex.lastIndex = 0;\n return fabric[storage][this.svgUid][id];\n };\n\n proto.resolveGradient = function(obj, el, property) {\n var gradientDef = this.extractPropertyDefinition(obj, property, 'gradientDefs');\n if (gradientDef) {\n var opacityAttr = el.getAttribute(property + '-opacity');\n var gradient = fabric.Gradient.fromElement(gradientDef, obj, opacityAttr, this.options);\n obj.set(property, gradient);\n }\n };\n\n proto.createClipPathCallback = function(obj, container) {\n return function(_newObj) {\n _newObj._removeTransformMatrix();\n _newObj.fillRule = _newObj.clipRule;\n container.push(_newObj);\n };\n };\n\n proto.resolveClipPath = function(obj, usingElement) {\n var clipPath = this.extractPropertyDefinition(obj, 'clipPath', 'clipPaths'),\n element, klass, objTransformInv, container, gTransform, options;\n if (clipPath) {\n container = [];\n objTransformInv = fabric.util.invertTransform(obj.calcTransformMatrix());\n // move the clipPath tag as sibling to the real element that is using it\n var clipPathTag = clipPath[0].parentNode;\n var clipPathOwner = usingElement;\n while (clipPathOwner.parentNode && clipPathOwner.getAttribute('clip-path') !== obj.clipPath) {\n clipPathOwner = clipPathOwner.parentNode;\n }\n clipPathOwner.parentNode.appendChild(clipPathTag);\n for (var i = 0; i < clipPath.length; i++) {\n element = clipPath[i];\n klass = this.findTag(element);\n klass.fromElement(\n element,\n this.createClipPathCallback(obj, container),\n this.options\n );\n }\n if (container.length === 1) {\n clipPath = container[0];\n }\n else {\n clipPath = new fabric.Group(container);\n }\n gTransform = fabric.util.multiplyTransformMatrices(\n objTransformInv,\n clipPath.calcTransformMatrix()\n );\n if (clipPath.clipPath) {\n this.resolveClipPath(clipPath, clipPathOwner);\n }\n var options = fabric.util.qrDecompose(gTransform);\n clipPath.flipX = false;\n clipPath.flipY = false;\n clipPath.set('scaleX', options.scaleX);\n clipPath.set('scaleY', options.scaleY);\n clipPath.angle = options.angle;\n clipPath.skewX = options.skewX;\n clipPath.skewY = 0;\n clipPath.setPositionByOrigin({ x: options.translateX, y: options.translateY }, 'center', 'center');\n obj.clipPath = clipPath;\n }\n else {\n // if clip-path does not resolve to any element, delete the property.\n delete obj.clipPath;\n }\n };\n\n proto.checkIfDone = function() {\n if (--this.numElements === 0) {\n this.instances = this.instances.filter(function(el) {\n // eslint-disable-next-line no-eq-null, eqeqeq\n return el != null;\n });\n this.callback(this.instances, this.elements);\n }\n };\n})(fabric.ElementsParser.prototype);\n\n\n(function(global) {\n\n 'use strict';\n\n /* Adaptation of work of Kevin Lindsey (kevin@kevlindev.com) */\n\n var fabric = global.fabric || (global.fabric = { });\n\n if (fabric.Point) {\n fabric.warn('fabric.Point is already defined');\n return;\n }\n\n fabric.Point = Point;\n\n /**\n * Point class\n * @class fabric.Point\n * @memberOf fabric\n * @constructor\n * @param {Number} x\n * @param {Number} y\n * @return {fabric.Point} thisArg\n */\n function Point(x, y) {\n this.x = x;\n this.y = y;\n }\n\n Point.prototype = /** @lends fabric.Point.prototype */ {\n\n type: 'point',\n\n constructor: Point,\n\n /**\n * Adds another point to this one and returns another one\n * @param {fabric.Point} that\n * @return {fabric.Point} new Point instance with added values\n */\n add: function (that) {\n return new Point(this.x + that.x, this.y + that.y);\n },\n\n /**\n * Adds another point to this one\n * @param {fabric.Point} that\n * @return {fabric.Point} thisArg\n * @chainable\n */\n addEquals: function (that) {\n this.x += that.x;\n this.y += that.y;\n return this;\n },\n\n /**\n * Adds value to this point and returns a new one\n * @param {Number} scalar\n * @return {fabric.Point} new Point with added value\n */\n scalarAdd: function (scalar) {\n return new Point(this.x + scalar, this.y + scalar);\n },\n\n /**\n * Adds value to this point\n * @param {Number} scalar\n * @return {fabric.Point} thisArg\n * @chainable\n */\n scalarAddEquals: function (scalar) {\n this.x += scalar;\n this.y += scalar;\n return this;\n },\n\n /**\n * Subtracts another point from this point and returns a new one\n * @param {fabric.Point} that\n * @return {fabric.Point} new Point object with subtracted values\n */\n subtract: function (that) {\n return new Point(this.x - that.x, this.y - that.y);\n },\n\n /**\n * Subtracts another point from this point\n * @param {fabric.Point} that\n * @return {fabric.Point} thisArg\n * @chainable\n */\n subtractEquals: function (that) {\n this.x -= that.x;\n this.y -= that.y;\n return this;\n },\n\n /**\n * Subtracts value from this point and returns a new one\n * @param {Number} scalar\n * @return {fabric.Point}\n */\n scalarSubtract: function (scalar) {\n return new Point(this.x - scalar, this.y - scalar);\n },\n\n /**\n * Subtracts value from this point\n * @param {Number} scalar\n * @return {fabric.Point} thisArg\n * @chainable\n */\n scalarSubtractEquals: function (scalar) {\n this.x -= scalar;\n this.y -= scalar;\n return this;\n },\n\n /**\n * Multiplies this point by a value and returns a new one\n * TODO: rename in scalarMultiply in 2.0\n * @param {Number} scalar\n * @return {fabric.Point}\n */\n multiply: function (scalar) {\n return new Point(this.x * scalar, this.y * scalar);\n },\n\n /**\n * Multiplies this point by a value\n * TODO: rename in scalarMultiplyEquals in 2.0\n * @param {Number} scalar\n * @return {fabric.Point} thisArg\n * @chainable\n */\n multiplyEquals: function (scalar) {\n this.x *= scalar;\n this.y *= scalar;\n return this;\n },\n\n /**\n * Divides this point by a value and returns a new one\n * TODO: rename in scalarDivide in 2.0\n * @param {Number} scalar\n * @return {fabric.Point}\n */\n divide: function (scalar) {\n return new Point(this.x / scalar, this.y / scalar);\n },\n\n /**\n * Divides this point by a value\n * TODO: rename in scalarDivideEquals in 2.0\n * @param {Number} scalar\n * @return {fabric.Point} thisArg\n * @chainable\n */\n divideEquals: function (scalar) {\n this.x /= scalar;\n this.y /= scalar;\n return this;\n },\n\n /**\n * Returns true if this point is equal to another one\n * @param {fabric.Point} that\n * @return {Boolean}\n */\n eq: function (that) {\n return (this.x === that.x && this.y === that.y);\n },\n\n /**\n * Returns true if this point is less than another one\n * @param {fabric.Point} that\n * @return {Boolean}\n */\n lt: function (that) {\n return (this.x < that.x && this.y < that.y);\n },\n\n /**\n * Returns true if this point is less than or equal to another one\n * @param {fabric.Point} that\n * @return {Boolean}\n */\n lte: function (that) {\n return (this.x <= that.x && this.y <= that.y);\n },\n\n /**\n\n * Returns true if this point is greater another one\n * @param {fabric.Point} that\n * @return {Boolean}\n */\n gt: function (that) {\n return (this.x > that.x && this.y > that.y);\n },\n\n /**\n * Returns true if this point is greater than or equal to another one\n * @param {fabric.Point} that\n * @return {Boolean}\n */\n gte: function (that) {\n return (this.x >= that.x && this.y >= that.y);\n },\n\n /**\n * Returns new point which is the result of linear interpolation with this one and another one\n * @param {fabric.Point} that\n * @param {Number} t , position of interpolation, between 0 and 1 default 0.5\n * @return {fabric.Point}\n */\n lerp: function (that, t) {\n if (typeof t === 'undefined') {\n t = 0.5;\n }\n t = Math.max(Math.min(1, t), 0);\n return new Point(this.x + (that.x - this.x) * t, this.y + (that.y - this.y) * t);\n },\n\n /**\n * Returns distance from this point and another one\n * @param {fabric.Point} that\n * @return {Number}\n */\n distanceFrom: function (that) {\n var dx = this.x - that.x,\n dy = this.y - that.y;\n return Math.sqrt(dx * dx + dy * dy);\n },\n\n /**\n * Returns the point between this point and another one\n * @param {fabric.Point} that\n * @return {fabric.Point}\n */\n midPointFrom: function (that) {\n return this.lerp(that);\n },\n\n /**\n * Returns a new point which is the min of this and another one\n * @param {fabric.Point} that\n * @return {fabric.Point}\n */\n min: function (that) {\n return new Point(Math.min(this.x, that.x), Math.min(this.y, that.y));\n },\n\n /**\n * Returns a new point which is the max of this and another one\n * @param {fabric.Point} that\n * @return {fabric.Point}\n */\n max: function (that) {\n return new Point(Math.max(this.x, that.x), Math.max(this.y, that.y));\n },\n\n /**\n * Returns string representation of this point\n * @return {String}\n */\n toString: function () {\n return this.x + ',' + this.y;\n },\n\n /**\n * Sets x/y of this point\n * @param {Number} x\n * @param {Number} y\n * @chainable\n */\n setXY: function (x, y) {\n this.x = x;\n this.y = y;\n return this;\n },\n\n /**\n * Sets x of this point\n * @param {Number} x\n * @chainable\n */\n setX: function (x) {\n this.x = x;\n return this;\n },\n\n /**\n * Sets y of this point\n * @param {Number} y\n * @chainable\n */\n setY: function (y) {\n this.y = y;\n return this;\n },\n\n /**\n * Sets x/y of this point from another point\n * @param {fabric.Point} that\n * @chainable\n */\n setFromPoint: function (that) {\n this.x = that.x;\n this.y = that.y;\n return this;\n },\n\n /**\n * Swaps x/y of this point and another point\n * @param {fabric.Point} that\n */\n swap: function (that) {\n var x = this.x,\n y = this.y;\n this.x = that.x;\n this.y = that.y;\n that.x = x;\n that.y = y;\n },\n\n /**\n * return a cloned instance of the point\n * @return {fabric.Point}\n */\n clone: function () {\n return new Point(this.x, this.y);\n }\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n /* Adaptation of work of Kevin Lindsey (kevin@kevlindev.com) */\n var fabric = global.fabric || (global.fabric = { });\n\n if (fabric.Intersection) {\n fabric.warn('fabric.Intersection is already defined');\n return;\n }\n\n /**\n * Intersection class\n * @class fabric.Intersection\n * @memberOf fabric\n * @constructor\n */\n function Intersection(status) {\n this.status = status;\n this.points = [];\n }\n\n fabric.Intersection = Intersection;\n\n fabric.Intersection.prototype = /** @lends fabric.Intersection.prototype */ {\n\n constructor: Intersection,\n\n /**\n * Appends a point to intersection\n * @param {fabric.Point} point\n * @return {fabric.Intersection} thisArg\n * @chainable\n */\n appendPoint: function (point) {\n this.points.push(point);\n return this;\n },\n\n /**\n * Appends points to intersection\n * @param {Array} points\n * @return {fabric.Intersection} thisArg\n * @chainable\n */\n appendPoints: function (points) {\n this.points = this.points.concat(points);\n return this;\n }\n };\n\n /**\n * Checks if one line intersects another\n * TODO: rename in intersectSegmentSegment\n * @static\n * @param {fabric.Point} a1\n * @param {fabric.Point} a2\n * @param {fabric.Point} b1\n * @param {fabric.Point} b2\n * @return {fabric.Intersection}\n */\n fabric.Intersection.intersectLineLine = function (a1, a2, b1, b2) {\n var result,\n uaT = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x),\n ubT = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x),\n uB = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y);\n if (uB !== 0) {\n var ua = uaT / uB,\n ub = ubT / uB;\n if (0 <= ua && ua <= 1 && 0 <= ub && ub <= 1) {\n result = new Intersection('Intersection');\n result.appendPoint(new fabric.Point(a1.x + ua * (a2.x - a1.x), a1.y + ua * (a2.y - a1.y)));\n }\n else {\n result = new Intersection();\n }\n }\n else {\n if (uaT === 0 || ubT === 0) {\n result = new Intersection('Coincident');\n }\n else {\n result = new Intersection('Parallel');\n }\n }\n return result;\n };\n\n /**\n * Checks if line intersects polygon\n * TODO: rename in intersectSegmentPolygon\n * fix detection of coincident\n * @static\n * @param {fabric.Point} a1\n * @param {fabric.Point} a2\n * @param {Array} points\n * @return {fabric.Intersection}\n */\n fabric.Intersection.intersectLinePolygon = function(a1, a2, points) {\n var result = new Intersection(),\n length = points.length,\n b1, b2, inter, i;\n\n for (i = 0; i < length; i++) {\n b1 = points[i];\n b2 = points[(i + 1) % length];\n inter = Intersection.intersectLineLine(a1, a2, b1, b2);\n\n result.appendPoints(inter.points);\n }\n if (result.points.length > 0) {\n result.status = 'Intersection';\n }\n return result;\n };\n\n /**\n * Checks if polygon intersects another polygon\n * @static\n * @param {Array} points1\n * @param {Array} points2\n * @return {fabric.Intersection}\n */\n fabric.Intersection.intersectPolygonPolygon = function (points1, points2) {\n var result = new Intersection(),\n length = points1.length, i;\n\n for (i = 0; i < length; i++) {\n var a1 = points1[i],\n a2 = points1[(i + 1) % length],\n inter = Intersection.intersectLinePolygon(a1, a2, points2);\n\n result.appendPoints(inter.points);\n }\n if (result.points.length > 0) {\n result.status = 'Intersection';\n }\n return result;\n };\n\n /**\n * Checks if polygon intersects rectangle\n * @static\n * @param {Array} points\n * @param {fabric.Point} r1\n * @param {fabric.Point} r2\n * @return {fabric.Intersection}\n */\n fabric.Intersection.intersectPolygonRectangle = function (points, r1, r2) {\n var min = r1.min(r2),\n max = r1.max(r2),\n topRight = new fabric.Point(max.x, min.y),\n bottomLeft = new fabric.Point(min.x, max.y),\n inter1 = Intersection.intersectLinePolygon(min, topRight, points),\n inter2 = Intersection.intersectLinePolygon(topRight, max, points),\n inter3 = Intersection.intersectLinePolygon(max, bottomLeft, points),\n inter4 = Intersection.intersectLinePolygon(bottomLeft, min, points),\n result = new Intersection();\n\n result.appendPoints(inter1.points);\n result.appendPoints(inter2.points);\n result.appendPoints(inter3.points);\n result.appendPoints(inter4.points);\n\n if (result.points.length > 0) {\n result.status = 'Intersection';\n }\n return result;\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { });\n\n if (fabric.Color) {\n fabric.warn('fabric.Color is already defined.');\n return;\n }\n\n /**\n * Color class\n * The purpose of {@link fabric.Color} is to abstract and encapsulate common color operations;\n * {@link fabric.Color} is a constructor and creates instances of {@link fabric.Color} objects.\n *\n * @class fabric.Color\n * @param {String} color optional in hex or rgb(a) or hsl format or from known color list\n * @return {fabric.Color} thisArg\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2/#colors}\n */\n function Color(color) {\n if (!color) {\n this.setSource([0, 0, 0, 1]);\n }\n else {\n this._tryParsingColor(color);\n }\n }\n\n fabric.Color = Color;\n\n fabric.Color.prototype = /** @lends fabric.Color.prototype */ {\n\n /**\n * @private\n * @param {String|Array} color Color value to parse\n */\n _tryParsingColor: function(color) {\n var source;\n\n if (color in Color.colorNameMap) {\n color = Color.colorNameMap[color];\n }\n\n if (color === 'transparent') {\n source = [255, 255, 255, 0];\n }\n\n if (!source) {\n source = Color.sourceFromHex(color);\n }\n if (!source) {\n source = Color.sourceFromRgb(color);\n }\n if (!source) {\n source = Color.sourceFromHsl(color);\n }\n if (!source) {\n //if color is not recognize let's make black as canvas does\n source = [0, 0, 0, 1];\n }\n if (source) {\n this.setSource(source);\n }\n },\n\n /**\n * Adapted from https://github.com/mjijackson\n * @private\n * @param {Number} r Red color value\n * @param {Number} g Green color value\n * @param {Number} b Blue color value\n * @return {Array} Hsl color\n */\n _rgbToHsl: function(r, g, b) {\n r /= 255; g /= 255; b /= 255;\n\n var h, s, l,\n max = fabric.util.array.max([r, g, b]),\n min = fabric.util.array.min([r, g, b]);\n\n l = (max + min) / 2;\n\n if (max === min) {\n h = s = 0; // achromatic\n }\n else {\n var d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n h /= 6;\n }\n\n return [\n Math.round(h * 360),\n Math.round(s * 100),\n Math.round(l * 100)\n ];\n },\n\n /**\n * Returns source of this color (where source is an array representation; ex: [200, 200, 100, 1])\n * @return {Array}\n */\n getSource: function() {\n return this._source;\n },\n\n /**\n * Sets source of this color (where source is an array representation; ex: [200, 200, 100, 1])\n * @param {Array} source\n */\n setSource: function(source) {\n this._source = source;\n },\n\n /**\n * Returns color representation in RGB format\n * @return {String} ex: rgb(0-255,0-255,0-255)\n */\n toRgb: function() {\n var source = this.getSource();\n return 'rgb(' + source[0] + ',' + source[1] + ',' + source[2] + ')';\n },\n\n /**\n * Returns color representation in RGBA format\n * @return {String} ex: rgba(0-255,0-255,0-255,0-1)\n */\n toRgba: function() {\n var source = this.getSource();\n return 'rgba(' + source[0] + ',' + source[1] + ',' + source[2] + ',' + source[3] + ')';\n },\n\n /**\n * Returns color representation in HSL format\n * @return {String} ex: hsl(0-360,0%-100%,0%-100%)\n */\n toHsl: function() {\n var source = this.getSource(),\n hsl = this._rgbToHsl(source[0], source[1], source[2]);\n\n return 'hsl(' + hsl[0] + ',' + hsl[1] + '%,' + hsl[2] + '%)';\n },\n\n /**\n * Returns color representation in HSLA format\n * @return {String} ex: hsla(0-360,0%-100%,0%-100%,0-1)\n */\n toHsla: function() {\n var source = this.getSource(),\n hsl = this._rgbToHsl(source[0], source[1], source[2]);\n\n return 'hsla(' + hsl[0] + ',' + hsl[1] + '%,' + hsl[2] + '%,' + source[3] + ')';\n },\n\n /**\n * Returns color representation in HEX format\n * @return {String} ex: FF5555\n */\n toHex: function() {\n var source = this.getSource(), r, g, b;\n\n r = source[0].toString(16);\n r = (r.length === 1) ? ('0' + r) : r;\n\n g = source[1].toString(16);\n g = (g.length === 1) ? ('0' + g) : g;\n\n b = source[2].toString(16);\n b = (b.length === 1) ? ('0' + b) : b;\n\n return r.toUpperCase() + g.toUpperCase() + b.toUpperCase();\n },\n\n /**\n * Returns color representation in HEXA format\n * @return {String} ex: FF5555CC\n */\n toHexa: function() {\n var source = this.getSource(), a;\n\n a = Math.round(source[3] * 255);\n a = a.toString(16);\n a = (a.length === 1) ? ('0' + a) : a;\n\n return this.toHex() + a.toUpperCase();\n },\n\n /**\n * Gets value of alpha channel for this color\n * @return {Number} 0-1\n */\n getAlpha: function() {\n return this.getSource()[3];\n },\n\n /**\n * Sets value of alpha channel for this color\n * @param {Number} alpha Alpha value 0-1\n * @return {fabric.Color} thisArg\n */\n setAlpha: function(alpha) {\n var source = this.getSource();\n source[3] = alpha;\n this.setSource(source);\n return this;\n },\n\n /**\n * Transforms color to its grayscale representation\n * @return {fabric.Color} thisArg\n */\n toGrayscale: function() {\n var source = this.getSource(),\n average = parseInt((source[0] * 0.3 + source[1] * 0.59 + source[2] * 0.11).toFixed(0), 10),\n currentAlpha = source[3];\n this.setSource([average, average, average, currentAlpha]);\n return this;\n },\n\n /**\n * Transforms color to its black and white representation\n * @param {Number} threshold\n * @return {fabric.Color} thisArg\n */\n toBlackWhite: function(threshold) {\n var source = this.getSource(),\n average = (source[0] * 0.3 + source[1] * 0.59 + source[2] * 0.11).toFixed(0),\n currentAlpha = source[3];\n\n threshold = threshold || 127;\n\n average = (Number(average) < Number(threshold)) ? 0 : 255;\n this.setSource([average, average, average, currentAlpha]);\n return this;\n },\n\n /**\n * Overlays color with another color\n * @param {String|fabric.Color} otherColor\n * @return {fabric.Color} thisArg\n */\n overlayWith: function(otherColor) {\n if (!(otherColor instanceof Color)) {\n otherColor = new Color(otherColor);\n }\n\n var result = [],\n alpha = this.getAlpha(),\n otherAlpha = 0.5,\n source = this.getSource(),\n otherSource = otherColor.getSource(), i;\n\n for (i = 0; i < 3; i++) {\n result.push(Math.round((source[i] * (1 - otherAlpha)) + (otherSource[i] * otherAlpha)));\n }\n\n result[3] = alpha;\n this.setSource(result);\n return this;\n }\n };\n\n /**\n * Regex matching color in RGB or RGBA formats (ex: rgb(0, 0, 0), rgba(255, 100, 10, 0.5), rgba( 255 , 100 , 10 , 0.5 ), rgb(1,1,1), rgba(100%, 60%, 10%, 0.5))\n * @static\n * @field\n * @memberOf fabric.Color\n */\n // eslint-disable-next-line max-len\n fabric.Color.reRGBa = /^rgba?\\(\\s*(\\d{1,3}(?:\\.\\d+)?\\%?)\\s*,\\s*(\\d{1,3}(?:\\.\\d+)?\\%?)\\s*,\\s*(\\d{1,3}(?:\\.\\d+)?\\%?)\\s*(?:\\s*,\\s*((?:\\d*\\.?\\d+)?)\\s*)?\\)$/i;\n\n /**\n * Regex matching color in HSL or HSLA formats (ex: hsl(200, 80%, 10%), hsla(300, 50%, 80%, 0.5), hsla( 300 , 50% , 80% , 0.5 ))\n * @static\n * @field\n * @memberOf fabric.Color\n */\n fabric.Color.reHSLa = /^hsla?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3}\\%)\\s*,\\s*(\\d{1,3}\\%)\\s*(?:\\s*,\\s*(\\d+(?:\\.\\d+)?)\\s*)?\\)$/i;\n\n /**\n * Regex matching color in HEX format (ex: #FF5544CC, #FF5555, 010155, aff)\n * @static\n * @field\n * @memberOf fabric.Color\n */\n fabric.Color.reHex = /^#?([0-9a-f]{8}|[0-9a-f]{6}|[0-9a-f]{4}|[0-9a-f]{3})$/i;\n\n /**\n * Map of the 148 color names with HEX code\n * @static\n * @field\n * @memberOf fabric.Color\n * @see: https://www.w3.org/TR/css3-color/#svg-color\n */\n fabric.Color.colorNameMap = {\n aliceblue: '#F0F8FF',\n antiquewhite: '#FAEBD7',\n aqua: '#00FFFF',\n aquamarine: '#7FFFD4',\n azure: '#F0FFFF',\n beige: '#F5F5DC',\n bisque: '#FFE4C4',\n black: '#000000',\n blanchedalmond: '#FFEBCD',\n blue: '#0000FF',\n blueviolet: '#8A2BE2',\n brown: '#A52A2A',\n burlywood: '#DEB887',\n cadetblue: '#5F9EA0',\n chartreuse: '#7FFF00',\n chocolate: '#D2691E',\n coral: '#FF7F50',\n cornflowerblue: '#6495ED',\n cornsilk: '#FFF8DC',\n crimson: '#DC143C',\n cyan: '#00FFFF',\n darkblue: '#00008B',\n darkcyan: '#008B8B',\n darkgoldenrod: '#B8860B',\n darkgray: '#A9A9A9',\n darkgrey: '#A9A9A9',\n darkgreen: '#006400',\n darkkhaki: '#BDB76B',\n darkmagenta: '#8B008B',\n darkolivegreen: '#556B2F',\n darkorange: '#FF8C00',\n darkorchid: '#9932CC',\n darkred: '#8B0000',\n darksalmon: '#E9967A',\n darkseagreen: '#8FBC8F',\n darkslateblue: '#483D8B',\n darkslategray: '#2F4F4F',\n darkslategrey: '#2F4F4F',\n darkturquoise: '#00CED1',\n darkviolet: '#9400D3',\n deeppink: '#FF1493',\n deepskyblue: '#00BFFF',\n dimgray: '#696969',\n dimgrey: '#696969',\n dodgerblue: '#1E90FF',\n firebrick: '#B22222',\n floralwhite: '#FFFAF0',\n forestgreen: '#228B22',\n fuchsia: '#FF00FF',\n gainsboro: '#DCDCDC',\n ghostwhite: '#F8F8FF',\n gold: '#FFD700',\n goldenrod: '#DAA520',\n gray: '#808080',\n grey: '#808080',\n green: '#008000',\n greenyellow: '#ADFF2F',\n honeydew: '#F0FFF0',\n hotpink: '#FF69B4',\n indianred: '#CD5C5C',\n indigo: '#4B0082',\n ivory: '#FFFFF0',\n khaki: '#F0E68C',\n lavender: '#E6E6FA',\n lavenderblush: '#FFF0F5',\n lawngreen: '#7CFC00',\n lemonchiffon: '#FFFACD',\n lightblue: '#ADD8E6',\n lightcoral: '#F08080',\n lightcyan: '#E0FFFF',\n lightgoldenrodyellow: '#FAFAD2',\n lightgray: '#D3D3D3',\n lightgrey: '#D3D3D3',\n lightgreen: '#90EE90',\n lightpink: '#FFB6C1',\n lightsalmon: '#FFA07A',\n lightseagreen: '#20B2AA',\n lightskyblue: '#87CEFA',\n lightslategray: '#778899',\n lightslategrey: '#778899',\n lightsteelblue: '#B0C4DE',\n lightyellow: '#FFFFE0',\n lime: '#00FF00',\n limegreen: '#32CD32',\n linen: '#FAF0E6',\n magenta: '#FF00FF',\n maroon: '#800000',\n mediumaquamarine: '#66CDAA',\n mediumblue: '#0000CD',\n mediumorchid: '#BA55D3',\n mediumpurple: '#9370DB',\n mediumseagreen: '#3CB371',\n mediumslateblue: '#7B68EE',\n mediumspringgreen: '#00FA9A',\n mediumturquoise: '#48D1CC',\n mediumvioletred: '#C71585',\n midnightblue: '#191970',\n mintcream: '#F5FFFA',\n mistyrose: '#FFE4E1',\n moccasin: '#FFE4B5',\n navajowhite: '#FFDEAD',\n navy: '#000080',\n oldlace: '#FDF5E6',\n olive: '#808000',\n olivedrab: '#6B8E23',\n orange: '#FFA500',\n orangered: '#FF4500',\n orchid: '#DA70D6',\n palegoldenrod: '#EEE8AA',\n palegreen: '#98FB98',\n paleturquoise: '#AFEEEE',\n palevioletred: '#DB7093',\n papayawhip: '#FFEFD5',\n peachpuff: '#FFDAB9',\n peru: '#CD853F',\n pink: '#FFC0CB',\n plum: '#DDA0DD',\n powderblue: '#B0E0E6',\n purple: '#800080',\n rebeccapurple: '#663399',\n red: '#FF0000',\n rosybrown: '#BC8F8F',\n royalblue: '#4169E1',\n saddlebrown: '#8B4513',\n salmon: '#FA8072',\n sandybrown: '#F4A460',\n seagreen: '#2E8B57',\n seashell: '#FFF5EE',\n sienna: '#A0522D',\n silver: '#C0C0C0',\n skyblue: '#87CEEB',\n slateblue: '#6A5ACD',\n slategray: '#708090',\n slategrey: '#708090',\n snow: '#FFFAFA',\n springgreen: '#00FF7F',\n steelblue: '#4682B4',\n tan: '#D2B48C',\n teal: '#008080',\n thistle: '#D8BFD8',\n tomato: '#FF6347',\n turquoise: '#40E0D0',\n violet: '#EE82EE',\n wheat: '#F5DEB3',\n white: '#FFFFFF',\n whitesmoke: '#F5F5F5',\n yellow: '#FFFF00',\n yellowgreen: '#9ACD32'\n };\n\n /**\n * @private\n * @param {Number} p\n * @param {Number} q\n * @param {Number} t\n * @return {Number}\n */\n function hue2rgb(p, q, t) {\n if (t < 0) {\n t += 1;\n }\n if (t > 1) {\n t -= 1;\n }\n if (t < 1 / 6) {\n return p + (q - p) * 6 * t;\n }\n if (t < 1 / 2) {\n return q;\n }\n if (t < 2 / 3) {\n return p + (q - p) * (2 / 3 - t) * 6;\n }\n return p;\n }\n\n /**\n * Returns new color object, when given a color in RGB format\n * @memberOf fabric.Color\n * @param {String} color Color value ex: rgb(0-255,0-255,0-255)\n * @return {fabric.Color}\n */\n fabric.Color.fromRgb = function(color) {\n return Color.fromSource(Color.sourceFromRgb(color));\n };\n\n /**\n * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in RGB or RGBA format\n * @memberOf fabric.Color\n * @param {String} color Color value ex: rgb(0-255,0-255,0-255), rgb(0%-100%,0%-100%,0%-100%)\n * @return {Array} source\n */\n fabric.Color.sourceFromRgb = function(color) {\n var match = color.match(Color.reRGBa);\n if (match) {\n var r = parseInt(match[1], 10) / (/%$/.test(match[1]) ? 100 : 1) * (/%$/.test(match[1]) ? 255 : 1),\n g = parseInt(match[2], 10) / (/%$/.test(match[2]) ? 100 : 1) * (/%$/.test(match[2]) ? 255 : 1),\n b = parseInt(match[3], 10) / (/%$/.test(match[3]) ? 100 : 1) * (/%$/.test(match[3]) ? 255 : 1);\n\n return [\n parseInt(r, 10),\n parseInt(g, 10),\n parseInt(b, 10),\n match[4] ? parseFloat(match[4]) : 1\n ];\n }\n };\n\n /**\n * Returns new color object, when given a color in RGBA format\n * @static\n * @function\n * @memberOf fabric.Color\n * @param {String} color\n * @return {fabric.Color}\n */\n fabric.Color.fromRgba = Color.fromRgb;\n\n /**\n * Returns new color object, when given a color in HSL format\n * @param {String} color Color value ex: hsl(0-260,0%-100%,0%-100%)\n * @memberOf fabric.Color\n * @return {fabric.Color}\n */\n fabric.Color.fromHsl = function(color) {\n return Color.fromSource(Color.sourceFromHsl(color));\n };\n\n /**\n * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in HSL or HSLA format.\n * Adapted from https://github.com/mjijackson\n * @memberOf fabric.Color\n * @param {String} color Color value ex: hsl(0-360,0%-100%,0%-100%) or hsla(0-360,0%-100%,0%-100%, 0-1)\n * @return {Array} source\n * @see http://http://www.w3.org/TR/css3-color/#hsl-color\n */\n fabric.Color.sourceFromHsl = function(color) {\n var match = color.match(Color.reHSLa);\n if (!match) {\n return;\n }\n\n var h = (((parseFloat(match[1]) % 360) + 360) % 360) / 360,\n s = parseFloat(match[2]) / (/%$/.test(match[2]) ? 100 : 1),\n l = parseFloat(match[3]) / (/%$/.test(match[3]) ? 100 : 1),\n r, g, b;\n\n if (s === 0) {\n r = g = b = l;\n }\n else {\n var q = l <= 0.5 ? l * (s + 1) : l + s - l * s,\n p = l * 2 - q;\n\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n\n return [\n Math.round(r * 255),\n Math.round(g * 255),\n Math.round(b * 255),\n match[4] ? parseFloat(match[4]) : 1\n ];\n };\n\n /**\n * Returns new color object, when given a color in HSLA format\n * @static\n * @function\n * @memberOf fabric.Color\n * @param {String} color\n * @return {fabric.Color}\n */\n fabric.Color.fromHsla = Color.fromHsl;\n\n /**\n * Returns new color object, when given a color in HEX format\n * @static\n * @memberOf fabric.Color\n * @param {String} color Color value ex: FF5555\n * @return {fabric.Color}\n */\n fabric.Color.fromHex = function(color) {\n return Color.fromSource(Color.sourceFromHex(color));\n };\n\n /**\n * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in HEX format\n * @static\n * @memberOf fabric.Color\n * @param {String} color ex: FF5555 or FF5544CC (RGBa)\n * @return {Array} source\n */\n fabric.Color.sourceFromHex = function(color) {\n if (color.match(Color.reHex)) {\n var value = color.slice(color.indexOf('#') + 1),\n isShortNotation = (value.length === 3 || value.length === 4),\n isRGBa = (value.length === 8 || value.length === 4),\n r = isShortNotation ? (value.charAt(0) + value.charAt(0)) : value.substring(0, 2),\n g = isShortNotation ? (value.charAt(1) + value.charAt(1)) : value.substring(2, 4),\n b = isShortNotation ? (value.charAt(2) + value.charAt(2)) : value.substring(4, 6),\n a = isRGBa ? (isShortNotation ? (value.charAt(3) + value.charAt(3)) : value.substring(6, 8)) : 'FF';\n\n return [\n parseInt(r, 16),\n parseInt(g, 16),\n parseInt(b, 16),\n parseFloat((parseInt(a, 16) / 255).toFixed(2))\n ];\n }\n };\n\n /**\n * Returns new color object, when given color in array representation (ex: [200, 100, 100, 0.5])\n * @static\n * @memberOf fabric.Color\n * @param {Array} source\n * @return {fabric.Color}\n */\n fabric.Color.fromSource = function(source) {\n var oColor = new Color();\n oColor.setSource(source);\n return oColor;\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n scaleMap = ['e', 'se', 's', 'sw', 'w', 'nw', 'n', 'ne', 'e'],\n skewMap = ['ns', 'nesw', 'ew', 'nwse'],\n controls = {},\n LEFT = 'left', TOP = 'top', RIGHT = 'right', BOTTOM = 'bottom', CENTER = 'center',\n opposite = {\n top: BOTTOM,\n bottom: TOP,\n left: RIGHT,\n right: LEFT,\n center: CENTER,\n }, radiansToDegrees = fabric.util.radiansToDegrees,\n sign = (Math.sign || function(x) { return ((x > 0) - (x < 0)) || +x; });\n\n /**\n * Combine control position and object angle to find the control direction compared\n * to the object center.\n * @param {fabric.Object} fabricObject the fabric object for which we are rendering controls\n * @param {fabric.Control} control the control class\n * @return {Number} 0 - 7 a quadrant number\n */\n function findCornerQuadrant(fabricObject, control) {\n var cornerAngle = fabricObject.angle + radiansToDegrees(Math.atan2(control.y, control.x)) + 360;\n return Math.round((cornerAngle % 360) / 45);\n }\n\n function fireEvent(eventName, options) {\n var target = options.transform.target,\n canvas = target.canvas,\n canvasOptions = fabric.util.object.clone(options);\n canvasOptions.target = target;\n canvas && canvas.fire('object:' + eventName, canvasOptions);\n target.fire(eventName, options);\n }\n\n /**\n * Inspect event and fabricObject properties to understand if the scaling action\n * @param {Event} eventData from the user action\n * @param {fabric.Object} fabricObject the fabric object about to scale\n * @return {Boolean} true if scale is proportional\n */\n function scaleIsProportional(eventData, fabricObject) {\n var canvas = fabricObject.canvas, uniScaleKey = canvas.uniScaleKey,\n uniformIsToggled = eventData[uniScaleKey];\n return (canvas.uniformScaling && !uniformIsToggled) ||\n (!canvas.uniformScaling && uniformIsToggled);\n }\n\n /**\n * Checks if transform is centered\n * @param {Object} transform transform data\n * @return {Boolean} true if transform is centered\n */\n function isTransformCentered(transform) {\n return transform.originX === CENTER && transform.originY === CENTER;\n }\n\n /**\n * Inspect fabricObject to understand if the current scaling action is allowed\n * @param {fabric.Object} fabricObject the fabric object about to scale\n * @param {String} by 'x' or 'y' or ''\n * @param {Boolean} scaleProportionally true if we are trying to scale proportionally\n * @return {Boolean} true if scaling is not allowed at current conditions\n */\n function scalingIsForbidden(fabricObject, by, scaleProportionally) {\n var lockX = fabricObject.lockScalingX, lockY = fabricObject.lockScalingY;\n if (lockX && lockY) {\n return true;\n }\n if (!by && (lockX || lockY) && scaleProportionally) {\n return true;\n }\n if (lockX && by === 'x') {\n return true;\n }\n if (lockY && by === 'y') {\n return true;\n }\n return false;\n }\n\n /**\n * return the correct cursor style for the scale action\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {fabric.Control} control the control that is interested in the action\n * @param {fabric.Object} fabricObject the fabric object that is interested in the action\n * @return {String} a valid css string for the cursor\n */\n function scaleCursorStyleHandler(eventData, control, fabricObject) {\n var notAllowed = 'not-allowed',\n scaleProportionally = scaleIsProportional(eventData, fabricObject),\n by = '';\n if (control.x !== 0 && control.y === 0) {\n by = 'x';\n }\n else if (control.x === 0 && control.y !== 0) {\n by = 'y';\n }\n if (scalingIsForbidden(fabricObject, by, scaleProportionally)) {\n return notAllowed;\n }\n var n = findCornerQuadrant(fabricObject, control);\n return scaleMap[n] + '-resize';\n }\n\n /**\n * return the correct cursor style for the skew action\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {fabric.Control} control the control that is interested in the action\n * @param {fabric.Object} fabricObject the fabric object that is interested in the action\n * @return {String} a valid css string for the cursor\n */\n function skewCursorStyleHandler(eventData, control, fabricObject) {\n var notAllowed = 'not-allowed';\n if (control.x !== 0 && fabricObject.lockSkewingY) {\n return notAllowed;\n }\n if (control.y !== 0 && fabricObject.lockSkewingX) {\n return notAllowed;\n }\n var n = findCornerQuadrant(fabricObject, control) % 4;\n return skewMap[n] + '-resize';\n }\n\n /**\n * Combine skew and scale style handlers to cover fabric standard use case\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {fabric.Control} control the control that is interested in the action\n * @param {fabric.Object} fabricObject the fabric object that is interested in the action\n * @return {String} a valid css string for the cursor\n */\n function scaleSkewCursorStyleHandler(eventData, control, fabricObject) {\n if (eventData[fabricObject.canvas.altActionKey]) {\n return controls.skewCursorStyleHandler(eventData, control, fabricObject);\n }\n return controls.scaleCursorStyleHandler(eventData, control, fabricObject);\n }\n\n /**\n * Inspect event, control and fabricObject to return the correct action name\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {fabric.Control} control the control that is interested in the action\n * @param {fabric.Object} fabricObject the fabric object that is interested in the action\n * @return {String} an action name\n */\n function scaleOrSkewActionName(eventData, control, fabricObject) {\n var isAlternative = eventData[fabricObject.canvas.altActionKey];\n if (control.x === 0) {\n // then is scaleY or skewX\n return isAlternative ? 'skewX' : 'scaleY';\n }\n if (control.y === 0) {\n // then is scaleY or skewX\n return isAlternative ? 'skewY' : 'scaleX';\n }\n }\n\n /**\n * Find the correct style for the control that is used for rotation.\n * this function is very simple and it just take care of not-allowed or standard cursor\n * @param {Event} eventData the javascript event that is causing the scale\n * @param {fabric.Control} control the control that is interested in the action\n * @param {fabric.Object} fabricObject the fabric object that is interested in the action\n * @return {String} a valid css string for the cursor\n */\n function rotationStyleHandler(eventData, control, fabricObject) {\n if (fabricObject.lockRotation) {\n return 'not-allowed';\n }\n return control.cursorStyle;\n }\n\n function commonEventInfo(eventData, transform, x, y) {\n return {\n e: eventData,\n transform: transform,\n pointer: {\n x: x,\n y: y,\n }\n };\n }\n\n /**\n * Wrap an action handler with saving/restoring object position on the transform.\n * this is the code that permits to objects to keep their position while transforming.\n * @param {Function} actionHandler the function to wrap\n * @return {Function} a function with an action handler signature\n */\n function wrapWithFixedAnchor(actionHandler) {\n return function(eventData, transform, x, y) {\n var target = transform.target, centerPoint = target.getCenterPoint(),\n constraint = target.translateToOriginPoint(centerPoint, transform.originX, transform.originY),\n actionPerformed = actionHandler(eventData, transform, x, y);\n target.setPositionByOrigin(constraint, transform.originX, transform.originY);\n return actionPerformed;\n };\n }\n\n /**\n * Wrap an action handler with firing an event if the action is performed\n * @param {Function} actionHandler the function to wrap\n * @return {Function} a function with an action handler signature\n */\n function wrapWithFireEvent(eventName, actionHandler) {\n return function(eventData, transform, x, y) {\n var actionPerformed = actionHandler(eventData, transform, x, y);\n if (actionPerformed) {\n fireEvent(eventName, commonEventInfo(eventData, transform, x, y));\n }\n return actionPerformed;\n };\n }\n\n /**\n * Transforms a point described by x and y in a distance from the top left corner of the object\n * bounding box.\n * @param {Object} transform\n * @param {String} originX\n * @param {String} originY\n * @param {number} x\n * @param {number} y\n * @return {Fabric.Point} the normalized point\n */\n function getLocalPoint(transform, originX, originY, x, y) {\n var target = transform.target,\n control = target.controls[transform.corner],\n zoom = target.canvas.getZoom(),\n padding = target.padding / zoom,\n localPoint = target.toLocalPoint(new fabric.Point(x, y), originX, originY);\n if (localPoint.x >= padding) {\n localPoint.x -= padding;\n }\n if (localPoint.x <= -padding) {\n localPoint.x += padding;\n }\n if (localPoint.y >= padding) {\n localPoint.y -= padding;\n }\n if (localPoint.y <= padding) {\n localPoint.y += padding;\n }\n localPoint.x -= control.offsetX;\n localPoint.y -= control.offsetY;\n return localPoint;\n }\n\n /**\n * Detect if the fabric object is flipped on one side.\n * @param {fabric.Object} target\n * @return {Boolean} true if one flip, but not two.\n */\n function targetHasOneFlip(target) {\n return target.flipX !== target.flipY;\n }\n\n /**\n * Utility function to compensate the scale factor when skew is applied on both axes\n * @private\n */\n function compensateScaleForSkew(target, oppositeSkew, scaleToCompensate, axis, reference) {\n if (target[oppositeSkew] !== 0) {\n var newDim = target._getTransformedDimensions()[axis];\n var newValue = reference / newDim * target[scaleToCompensate];\n target.set(scaleToCompensate, newValue);\n }\n }\n\n /**\n * Action handler for skewing on the X axis\n * @private\n */\n function skewObjectX(eventData, transform, x, y) {\n var target = transform.target,\n // find how big the object would be, if there was no skewX. takes in account scaling\n dimNoSkew = target._getTransformedDimensions(0, target.skewY),\n localPoint = getLocalPoint(transform, transform.originX, transform.originY, x, y),\n // the mouse is in the center of the object, and we want it to stay there.\n // so the object will grow twice as much as the mouse.\n // this makes the skew growth to localPoint * 2 - dimNoSkew.\n totalSkewSize = Math.abs(localPoint.x * 2) - dimNoSkew.x,\n currentSkew = target.skewX, newSkew;\n if (totalSkewSize < 2) {\n // let's make it easy to go back to position 0.\n newSkew = 0;\n }\n else {\n newSkew = radiansToDegrees(\n Math.atan2((totalSkewSize / target.scaleX), (dimNoSkew.y / target.scaleY))\n );\n // now we have to find the sign of the skew.\n // it mostly depend on the origin of transformation.\n if (transform.originX === LEFT && transform.originY === BOTTOM) {\n newSkew = -newSkew;\n }\n if (transform.originX === RIGHT && transform.originY === TOP) {\n newSkew = -newSkew;\n }\n if (targetHasOneFlip(target)) {\n newSkew = -newSkew;\n }\n }\n var hasSkewed = currentSkew !== newSkew;\n if (hasSkewed) {\n var dimBeforeSkewing = target._getTransformedDimensions().y;\n target.set('skewX', newSkew);\n compensateScaleForSkew(target, 'skewY', 'scaleY', 'y', dimBeforeSkewing);\n }\n return hasSkewed;\n }\n\n /**\n * Action handler for skewing on the Y axis\n * @private\n */\n function skewObjectY(eventData, transform, x, y) {\n var target = transform.target,\n // find how big the object would be, if there was no skewX. takes in account scaling\n dimNoSkew = target._getTransformedDimensions(target.skewX, 0),\n localPoint = getLocalPoint(transform, transform.originX, transform.originY, x, y),\n // the mouse is in the center of the object, and we want it to stay there.\n // so the object will grow twice as much as the mouse.\n // this makes the skew growth to localPoint * 2 - dimNoSkew.\n totalSkewSize = Math.abs(localPoint.y * 2) - dimNoSkew.y,\n currentSkew = target.skewY, newSkew;\n if (totalSkewSize < 2) {\n // let's make it easy to go back to position 0.\n newSkew = 0;\n }\n else {\n newSkew = radiansToDegrees(\n Math.atan2((totalSkewSize / target.scaleY), (dimNoSkew.x / target.scaleX))\n );\n // now we have to find the sign of the skew.\n // it mostly depend on the origin of transformation.\n if (transform.originX === LEFT && transform.originY === BOTTOM) {\n newSkew = -newSkew;\n }\n if (transform.originX === RIGHT && transform.originY === TOP) {\n newSkew = -newSkew;\n }\n if (targetHasOneFlip(target)) {\n newSkew = -newSkew;\n }\n }\n var hasSkewed = currentSkew !== newSkew;\n if (hasSkewed) {\n var dimBeforeSkewing = target._getTransformedDimensions().x;\n target.set('skewY', newSkew);\n compensateScaleForSkew(target, 'skewX', 'scaleX', 'x', dimBeforeSkewing);\n }\n return hasSkewed;\n }\n\n /**\n * Wrapped Action handler for skewing on the Y axis, takes care of the\n * skew direction and determine the correct transform origin for the anchor point\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\n function skewHandlerX(eventData, transform, x, y) {\n // step1 figure out and change transform origin.\n // if skewX > 0 and originY bottom we anchor on right\n // if skewX > 0 and originY top we anchor on left\n // if skewX < 0 and originY bottom we anchor on left\n // if skewX < 0 and originY top we anchor on right\n // if skewX is 0, we look for mouse position to understand where are we going.\n var target = transform.target, currentSkew = target.skewX, originX, originY = transform.originY;\n if (target.lockSkewingX) {\n return false;\n }\n if (currentSkew === 0) {\n var localPointFromCenter = getLocalPoint(transform, CENTER, CENTER, x, y);\n if (localPointFromCenter.x > 0) {\n // we are pulling right, anchor left;\n originX = LEFT;\n }\n else {\n // we are pulling right, anchor right\n originX = RIGHT;\n }\n }\n else {\n if (currentSkew > 0) {\n originX = originY === TOP ? LEFT : RIGHT;\n }\n if (currentSkew < 0) {\n originX = originY === TOP ? RIGHT : LEFT;\n }\n // is the object flipped on one side only? swap the origin.\n if (targetHasOneFlip(target)) {\n originX = originX === LEFT ? RIGHT : LEFT;\n }\n }\n\n // once we have the origin, we find the anchor point\n transform.originX = originX;\n var finalHandler = wrapWithFireEvent('skewing', wrapWithFixedAnchor(skewObjectX));\n return finalHandler(eventData, transform, x, y);\n }\n\n /**\n * Wrapped Action handler for skewing on the Y axis, takes care of the\n * skew direction and determine the correct transform origin for the anchor point\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\n function skewHandlerY(eventData, transform, x, y) {\n // step1 figure out and change transform origin.\n // if skewY > 0 and originX left we anchor on top\n // if skewY > 0 and originX right we anchor on bottom\n // if skewY < 0 and originX left we anchor on bottom\n // if skewY < 0 and originX right we anchor on top\n // if skewY is 0, we look for mouse position to understand where are we going.\n var target = transform.target, currentSkew = target.skewY, originY, originX = transform.originX;\n if (target.lockSkewingY) {\n return false;\n }\n if (currentSkew === 0) {\n var localPointFromCenter = getLocalPoint(transform, CENTER, CENTER, x, y);\n if (localPointFromCenter.y > 0) {\n // we are pulling down, anchor up;\n originY = TOP;\n }\n else {\n // we are pulling up, anchor down\n originY = BOTTOM;\n }\n }\n else {\n if (currentSkew > 0) {\n originY = originX === LEFT ? TOP : BOTTOM;\n }\n if (currentSkew < 0) {\n originY = originX === LEFT ? BOTTOM : TOP;\n }\n // is the object flipped on one side only? swap the origin.\n if (targetHasOneFlip(target)) {\n originY = originY === TOP ? BOTTOM : TOP;\n }\n }\n\n // once we have the origin, we find the anchor point\n transform.originY = originY;\n var finalHandler = wrapWithFireEvent('skewing', wrapWithFixedAnchor(skewObjectY));\n return finalHandler(eventData, transform, x, y);\n }\n\n /**\n * Action handler for rotation and snapping, without anchor point.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n * @private\n */\n function rotationWithSnapping(eventData, transform, x, y) {\n var t = transform,\n target = t.target,\n pivotPoint = target.translateToOriginPoint(target.getCenterPoint(), t.originX, t.originY);\n\n if (target.lockRotation) {\n return false;\n }\n\n var lastAngle = Math.atan2(t.ey - pivotPoint.y, t.ex - pivotPoint.x),\n curAngle = Math.atan2(y - pivotPoint.y, x - pivotPoint.x),\n angle = radiansToDegrees(curAngle - lastAngle + t.theta),\n hasRotated = true;\n\n if (target.snapAngle > 0) {\n var snapAngle = target.snapAngle,\n snapThreshold = target.snapThreshold || snapAngle,\n rightAngleLocked = Math.ceil(angle / snapAngle) * snapAngle,\n leftAngleLocked = Math.floor(angle / snapAngle) * snapAngle;\n\n if (Math.abs(angle - leftAngleLocked) < snapThreshold) {\n angle = leftAngleLocked;\n }\n else if (Math.abs(angle - rightAngleLocked) < snapThreshold) {\n angle = rightAngleLocked;\n }\n }\n\n // normalize angle to positive value\n if (angle < 0) {\n angle = 360 + angle;\n }\n angle %= 360;\n\n hasRotated = target.angle !== angle;\n target.angle = angle;\n return hasRotated;\n }\n\n /**\n * Basic scaling logic, reused with different constrain for scaling X,Y, freely or equally.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @param {Object} options additional information for scaling\n * @param {String} options.by 'x', 'y', 'equally' or '' to indicate type of scaling\n * @return {Boolean} true if some change happened\n * @private\n */\n function scaleObject(eventData, transform, x, y, options) {\n options = options || {};\n var target = transform.target,\n lockScalingX = target.lockScalingX, lockScalingY = target.lockScalingY,\n by = options.by, newPoint, scaleX, scaleY, dim,\n scaleProportionally = scaleIsProportional(eventData, target),\n forbidScaling = scalingIsForbidden(target, by, scaleProportionally),\n signX, signY, gestureScale = transform.gestureScale;\n\n if (forbidScaling) {\n return false;\n }\n if (gestureScale) {\n scaleX = transform.scaleX * gestureScale;\n scaleY = transform.scaleY * gestureScale;\n }\n else {\n newPoint = getLocalPoint(transform, transform.originX, transform.originY, x, y);\n // use of sign: We use sign to detect change of direction of an action. sign usually change when\n // we cross the origin point with the mouse. So a scale flip for example. There is an issue when scaling\n // by center and scaling using one middle control ( default: mr, mt, ml, mb), the mouse movement can easily\n // cross many time the origin point and flip the object. so we need a way to filter out the noise.\n // This ternary here should be ok to filter out X scaling when we want Y only and vice versa.\n signX = by !== 'y' ? sign(newPoint.x) : 1;\n signY = by !== 'x' ? sign(newPoint.y) : 1;\n if (!transform.signX) {\n transform.signX = signX;\n }\n if (!transform.signY) {\n transform.signY = signY;\n }\n\n if (target.lockScalingFlip &&\n (transform.signX !== signX || transform.signY !== signY)\n ) {\n return false;\n }\n\n dim = target._getTransformedDimensions();\n // missing detection of flip and logic to switch the origin\n if (scaleProportionally && !by) {\n // uniform scaling\n var distance = Math.abs(newPoint.x) + Math.abs(newPoint.y),\n original = transform.original,\n originalDistance = Math.abs(dim.x * original.scaleX / target.scaleX) +\n Math.abs(dim.y * original.scaleY / target.scaleY),\n scale = distance / originalDistance;\n scaleX = original.scaleX * scale;\n scaleY = original.scaleY * scale;\n }\n else {\n scaleX = Math.abs(newPoint.x * target.scaleX / dim.x);\n scaleY = Math.abs(newPoint.y * target.scaleY / dim.y);\n }\n // if we are scaling by center, we need to double the scale\n if (isTransformCentered(transform)) {\n scaleX *= 2;\n scaleY *= 2;\n }\n if (transform.signX !== signX && by !== 'y') {\n transform.originX = opposite[transform.originX];\n scaleX *= -1;\n transform.signX = signX;\n }\n if (transform.signY !== signY && by !== 'x') {\n transform.originY = opposite[transform.originY];\n scaleY *= -1;\n transform.signY = signY;\n }\n }\n // minScale is taken are in the setter.\n var oldScaleX = target.scaleX, oldScaleY = target.scaleY;\n if (!by) {\n !lockScalingX && target.set('scaleX', scaleX);\n !lockScalingY && target.set('scaleY', scaleY);\n }\n else {\n // forbidden cases already handled on top here.\n by === 'x' && target.set('scaleX', scaleX);\n by === 'y' && target.set('scaleY', scaleY);\n }\n return oldScaleX !== target.scaleX || oldScaleY !== target.scaleY;\n }\n\n /**\n * Generic scaling logic, to scale from corners either equally or freely.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\n function scaleObjectFromCorner(eventData, transform, x, y) {\n return scaleObject(eventData, transform, x, y);\n }\n\n /**\n * Scaling logic for the X axis.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\n function scaleObjectX(eventData, transform, x, y) {\n return scaleObject(eventData, transform, x, y , { by: 'x' });\n }\n\n /**\n * Scaling logic for the Y axis.\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\n function scaleObjectY(eventData, transform, x, y) {\n return scaleObject(eventData, transform, x, y , { by: 'y' });\n }\n\n /**\n * Composed action handler to either scale Y or skew X\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\n function scalingYOrSkewingX(eventData, transform, x, y) {\n // ok some safety needed here.\n if (eventData[transform.target.canvas.altActionKey]) {\n return controls.skewHandlerX(eventData, transform, x, y);\n }\n return controls.scalingY(eventData, transform, x, y);\n }\n\n /**\n * Composed action handler to either scale X or skew Y\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\n function scalingXOrSkewingY(eventData, transform, x, y) {\n // ok some safety needed here.\n if (eventData[transform.target.canvas.altActionKey]) {\n return controls.skewHandlerY(eventData, transform, x, y);\n }\n return controls.scalingX(eventData, transform, x, y);\n }\n\n /**\n * Action handler to change textbox width\n * Needs to be wrapped with `wrapWithFixedAnchor` to be effective\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if some change happened\n */\n function changeWidth(eventData, transform, x, y) {\n var target = transform.target, localPoint = getLocalPoint(transform, transform.originX, transform.originY, x, y),\n strokePadding = target.strokeWidth / (target.strokeUniform ? target.scaleX : 1),\n multiplier = isTransformCentered(transform) ? 2 : 1,\n oldWidth = target.width,\n newWidth = Math.abs(localPoint.x * multiplier / target.scaleX) - strokePadding;\n target.set('width', Math.max(newWidth, 0));\n return oldWidth !== newWidth;\n }\n\n /**\n * Action handler\n * @private\n * @param {Event} eventData javascript event that is doing the transform\n * @param {Object} transform javascript object containing a series of information around the current transform\n * @param {number} x current mouse x position, canvas normalized\n * @param {number} y current mouse y position, canvas normalized\n * @return {Boolean} true if the translation occurred\n */\n function dragHandler(eventData, transform, x, y) {\n var target = transform.target,\n newLeft = x - transform.offsetX,\n newTop = y - transform.offsetY,\n moveX = !target.get('lockMovementX') && target.left !== newLeft,\n moveY = !target.get('lockMovementY') && target.top !== newTop;\n moveX && target.set('left', newLeft);\n moveY && target.set('top', newTop);\n if (moveX || moveY) {\n fireEvent('moving', commonEventInfo(eventData, transform, x, y));\n }\n return moveX || moveY;\n }\n\n controls.scaleCursorStyleHandler = scaleCursorStyleHandler;\n controls.skewCursorStyleHandler = skewCursorStyleHandler;\n controls.scaleSkewCursorStyleHandler = scaleSkewCursorStyleHandler;\n controls.rotationWithSnapping = wrapWithFireEvent('rotating', wrapWithFixedAnchor(rotationWithSnapping));\n controls.scalingEqually = wrapWithFireEvent('scaling', wrapWithFixedAnchor( scaleObjectFromCorner));\n controls.scalingX = wrapWithFireEvent('scaling', wrapWithFixedAnchor(scaleObjectX));\n controls.scalingY = wrapWithFireEvent('scaling', wrapWithFixedAnchor(scaleObjectY));\n controls.scalingYOrSkewingX = scalingYOrSkewingX;\n controls.scalingXOrSkewingY = scalingXOrSkewingY;\n controls.changeWidth = wrapWithFireEvent('resizing', wrapWithFixedAnchor(changeWidth));\n controls.skewHandlerX = skewHandlerX;\n controls.skewHandlerY = skewHandlerY;\n controls.dragHandler = dragHandler;\n controls.scaleOrSkewActionName = scaleOrSkewActionName;\n controls.rotationStyleHandler = rotationStyleHandler;\n controls.fireEvent = fireEvent;\n controls.wrapWithFixedAnchor = wrapWithFixedAnchor;\n controls.wrapWithFireEvent = wrapWithFireEvent;\n controls.getLocalPoint = getLocalPoint;\n fabric.controlsUtils = controls;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n degreesToRadians = fabric.util.degreesToRadians,\n controls = fabric.controlsUtils;\n\n /**\n * Render a round control, as per fabric features.\n * This function is written to respect object properties like transparentCorners, cornerSize\n * cornerColor, cornerStrokeColor\n * plus the addition of offsetY and offsetX.\n * @param {CanvasRenderingContext2D} ctx context to render on\n * @param {Number} left x coordinate where the control center should be\n * @param {Number} top y coordinate where the control center should be\n * @param {Object} styleOverride override for fabric.Object controls style\n * @param {fabric.Object} fabricObject the fabric object for which we are rendering controls\n */\n function renderCircleControl (ctx, left, top, styleOverride, fabricObject) {\n styleOverride = styleOverride || {};\n var xSize = this.sizeX || styleOverride.cornerSize || fabricObject.cornerSize,\n ySize = this.sizeY || styleOverride.cornerSize || fabricObject.cornerSize,\n transparentCorners = typeof styleOverride.transparentCorners !== 'undefined' ?\n styleOverride.transparentCorners : fabricObject.transparentCorners,\n methodName = transparentCorners ? 'stroke' : 'fill',\n stroke = !transparentCorners && (styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor),\n myLeft = left,\n myTop = top, size;\n ctx.save();\n ctx.fillStyle = styleOverride.cornerColor || fabricObject.cornerColor;\n ctx.strokeStyle = styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor;\n // as soon as fabric react v5, remove ie11, use proper ellipse code.\n if (xSize > ySize) {\n size = xSize;\n ctx.scale(1.0, ySize / xSize);\n myTop = top * xSize / ySize;\n }\n else if (ySize > xSize) {\n size = ySize;\n ctx.scale(xSize / ySize, 1.0);\n myLeft = left * ySize / xSize;\n }\n else {\n size = xSize;\n }\n // this is still wrong\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.arc(myLeft, myTop, size / 2, 0, 2 * Math.PI, false);\n ctx[methodName]();\n if (stroke) {\n ctx.stroke();\n }\n ctx.restore();\n }\n\n /**\n * Render a square control, as per fabric features.\n * This function is written to respect object properties like transparentCorners, cornerSize\n * cornerColor, cornerStrokeColor\n * plus the addition of offsetY and offsetX.\n * @param {CanvasRenderingContext2D} ctx context to render on\n * @param {Number} left x coordinate where the control center should be\n * @param {Number} top y coordinate where the control center should be\n * @param {Object} styleOverride override for fabric.Object controls style\n * @param {fabric.Object} fabricObject the fabric object for which we are rendering controls\n */\n function renderSquareControl(ctx, left, top, styleOverride, fabricObject) {\n styleOverride = styleOverride || {};\n var xSize = this.sizeX || styleOverride.cornerSize || fabricObject.cornerSize,\n ySize = this.sizeY || styleOverride.cornerSize || fabricObject.cornerSize,\n transparentCorners = typeof styleOverride.transparentCorners !== 'undefined' ?\n styleOverride.transparentCorners : fabricObject.transparentCorners,\n methodName = transparentCorners ? 'stroke' : 'fill',\n stroke = !transparentCorners && (\n styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor\n ), xSizeBy2 = xSize / 2, ySizeBy2 = ySize / 2;\n ctx.save();\n ctx.fillStyle = styleOverride.cornerColor || fabricObject.cornerColor;\n ctx.strokeStyle = styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor;\n // this is still wrong\n ctx.lineWidth = 1;\n ctx.translate(left, top);\n ctx.rotate(degreesToRadians(fabricObject.angle));\n // this does not work, and fixed with ( && ) does not make sense.\n // to have real transparent corners we need the controls on upperCanvas\n // transparentCorners || ctx.clearRect(-xSizeBy2, -ySizeBy2, xSize, ySize);\n ctx[methodName + 'Rect'](-xSizeBy2, -ySizeBy2, xSize, ySize);\n if (stroke) {\n ctx.strokeRect(-xSizeBy2, -ySizeBy2, xSize, ySize);\n }\n ctx.restore();\n }\n\n controls.renderCircleControl = renderCircleControl;\n controls.renderSquareControl = renderSquareControl;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { });\n\n function Control(options) {\n for (var i in options) {\n this[i] = options[i];\n }\n }\n\n fabric.Control = Control;\n\n fabric.Control.prototype = /** @lends fabric.Control.prototype */ {\n\n /**\n * keep track of control visibility.\n * mainly for backward compatibility.\n * if you do not want to see a control, you can remove it\n * from the controlset.\n * @type {Boolean}\n * @default true\n */\n visible: true,\n\n /**\n * Name of the action that the control will likely execute.\n * This is optional. FabricJS uses to identify what the user is doing for some\n * extra optimizations. If you are writing a custom control and you want to know\n * somewhere else in the code what is going on, you can use this string here.\n * you can also provide a custom getActionName if your control run multiple actions\n * depending on some external state.\n * default to scale since is the most common, used on 4 corners by default\n * @type {String}\n * @default 'scale'\n */\n actionName: 'scale',\n\n /**\n * Drawing angle of the control.\n * NOT used for now, but name marked as needed for internal logic\n * example: to reuse the same drawing function for different rotated controls\n * @type {Number}\n * @default 0\n */\n angle: 0,\n\n /**\n * Relative position of the control. X\n * 0,0 is the center of the Object, while -0.5 (left) or 0.5 (right) are the extremities\n * of the bounding box.\n * @type {Number}\n * @default 0\n */\n x: 0,\n\n /**\n * Relative position of the control. Y\n * 0,0 is the center of the Object, while -0.5 (top) or 0.5 (bottom) are the extremities\n * of the bounding box.\n * @type {Number}\n * @default 0\n */\n y: 0,\n\n /**\n * Horizontal offset of the control from the defined position. In pixels\n * Positive offset moves the control to the right, negative to the left.\n * It used when you want to have position of control that does not scale with\n * the bounding box. Example: rotation control is placed at x:0, y: 0.5 on\n * the boundindbox, with an offset of 30 pixels vertically. Those 30 pixels will\n * stay 30 pixels no matter how the object is big. Another example is having 2\n * controls in the corner, that stay in the same position when the object scale.\n * of the bounding box.\n * @type {Number}\n * @default 0\n */\n offsetX: 0,\n\n /**\n * Vertical offset of the control from the defined position. In pixels\n * Positive offset moves the control to the bottom, negative to the top.\n * @type {Number}\n * @default 0\n */\n offsetY: 0,\n\n /**\n * Sets the length of the control. If null, defaults to object's cornerSize.\n * Expects both sizeX and sizeY to be set when set.\n * @type {?Number}\n * @default null\n */\n sizeX: null,\n\n /**\n * Sets the height of the control. If null, defaults to object's cornerSize.\n * Expects both sizeX and sizeY to be set when set.\n * @type {?Number}\n * @default null\n */\n sizeY: null,\n\n /**\n * Sets the length of the touch area of the control. If null, defaults to object's touchCornerSize.\n * Expects both touchSizeX and touchSizeY to be set when set.\n * @type {?Number}\n * @default null\n */\n touchSizeX: null,\n\n /**\n * Sets the height of the touch area of the control. If null, defaults to object's touchCornerSize.\n * Expects both touchSizeX and touchSizeY to be set when set.\n * @type {?Number}\n * @default null\n */\n touchSizeY: null,\n\n /**\n * Css cursor style to display when the control is hovered.\n * if the method `cursorStyleHandler` is provided, this property is ignored.\n * @type {String}\n * @default 'crosshair'\n */\n cursorStyle: 'crosshair',\n\n /**\n * If controls has an offsetY or offsetX, draw a line that connects\n * the control to the bounding box\n * @type {Boolean}\n * @default false\n */\n withConnection: false,\n\n /**\n * The control actionHandler, provide one to handle action ( control being moved )\n * @param {Event} eventData the native mouse event\n * @param {Object} transformData properties of the current transform\n * @param {Number} x x position of the cursor\n * @param {Number} y y position of the cursor\n * @return {Boolean} true if the action/event modified the object\n */\n actionHandler: function(/* eventData, transformData, x, y */) { },\n\n /**\n * The control handler for mouse down, provide one to handle mouse down on control\n * @param {Event} eventData the native mouse event\n * @param {Object} transformData properties of the current transform\n * @param {Number} x x position of the cursor\n * @param {Number} y y position of the cursor\n * @return {Boolean} true if the action/event modified the object\n */\n mouseDownHandler: function(/* eventData, transformData, x, y */) { },\n\n /**\n * The control mouseUpHandler, provide one to handle an effect on mouse up.\n * @param {Event} eventData the native mouse event\n * @param {Object} transformData properties of the current transform\n * @param {Number} x x position of the cursor\n * @param {Number} y y position of the cursor\n * @return {Boolean} true if the action/event modified the object\n */\n mouseUpHandler: function(/* eventData, transformData, x, y */) { },\n\n /**\n * Returns control actionHandler\n * @param {Event} eventData the native mouse event\n * @param {fabric.Object} fabricObject on which the control is displayed\n * @param {fabric.Control} control control for which the action handler is being asked\n * @return {Function} the action handler\n */\n getActionHandler: function(/* eventData, fabricObject, control */) {\n return this.actionHandler;\n },\n\n /**\n * Returns control mouseDown handler\n * @param {Event} eventData the native mouse event\n * @param {fabric.Object} fabricObject on which the control is displayed\n * @param {fabric.Control} control control for which the action handler is being asked\n * @return {Function} the action handler\n */\n getMouseDownHandler: function(/* eventData, fabricObject, control */) {\n return this.mouseDownHandler;\n },\n\n /**\n * Returns control mouseUp handler\n * @param {Event} eventData the native mouse event\n * @param {fabric.Object} fabricObject on which the control is displayed\n * @param {fabric.Control} control control for which the action handler is being asked\n * @return {Function} the action handler\n */\n getMouseUpHandler: function(/* eventData, fabricObject, control */) {\n return this.mouseUpHandler;\n },\n\n /**\n * Returns control cursorStyle for css using cursorStyle. If you need a more elaborate\n * function you can pass one in the constructor\n * the cursorStyle property\n * @param {Event} eventData the native mouse event\n * @param {fabric.Control} control the current control ( likely this)\n * @param {fabric.Object} object on which the control is displayed\n * @return {String}\n */\n cursorStyleHandler: function(eventData, control /* fabricObject */) {\n return control.cursorStyle;\n },\n\n /**\n * Returns the action name. The basic implementation just return the actionName property.\n * @param {Event} eventData the native mouse event\n * @param {fabric.Control} control the current control ( likely this)\n * @param {fabric.Object} object on which the control is displayed\n * @return {String}\n */\n getActionName: function(eventData, control /* fabricObject */) {\n return control.actionName;\n },\n\n /**\n * Returns controls visibility\n * @param {fabric.Object} object on which the control is displayed\n * @param {String} controlKey key where the control is memorized on the\n * @return {Boolean}\n */\n getVisibility: function(fabricObject, controlKey) {\n var objectVisibility = fabricObject._controlsVisibility;\n if (objectVisibility && typeof objectVisibility[controlKey] !== 'undefined') {\n return objectVisibility[controlKey];\n }\n return this.visible;\n },\n\n /**\n * Sets controls visibility\n * @param {Boolean} visibility for the object\n * @return {Void}\n */\n setVisibility: function(visibility /* name, fabricObject */) {\n this.visible = visibility;\n },\n\n\n positionHandler: function(dim, finalMatrix /*, fabricObject, currentControl */) {\n var point = fabric.util.transformPoint({\n x: this.x * dim.x + this.offsetX,\n y: this.y * dim.y + this.offsetY }, finalMatrix);\n return point;\n },\n\n /**\n * Returns the coords for this control based on object values.\n * @param {Number} objectAngle angle from the fabric object holding the control\n * @param {Number} objectCornerSize cornerSize from the fabric object holding the control (or touchCornerSize if\n * isTouch is true)\n * @param {Number} centerX x coordinate where the control center should be\n * @param {Number} centerY y coordinate where the control center should be\n * @param {boolean} isTouch true if touch corner, false if normal corner\n */\n calcCornerCoords: function(objectAngle, objectCornerSize, centerX, centerY, isTouch) {\n var cosHalfOffset,\n sinHalfOffset,\n cosHalfOffsetComp,\n sinHalfOffsetComp,\n xSize = (isTouch) ? this.touchSizeX : this.sizeX,\n ySize = (isTouch) ? this.touchSizeY : this.sizeY;\n if (xSize && ySize && xSize !== ySize) {\n // handle rectangular corners\n var controlTriangleAngle = Math.atan2(ySize, xSize);\n var cornerHypotenuse = Math.sqrt(xSize * xSize + ySize * ySize) / 2;\n var newTheta = controlTriangleAngle - fabric.util.degreesToRadians(objectAngle);\n var newThetaComp = Math.PI / 2 - controlTriangleAngle - fabric.util.degreesToRadians(objectAngle);\n cosHalfOffset = cornerHypotenuse * fabric.util.cos(newTheta);\n sinHalfOffset = cornerHypotenuse * fabric.util.sin(newTheta);\n // use complementary angle for two corners\n cosHalfOffsetComp = cornerHypotenuse * fabric.util.cos(newThetaComp);\n sinHalfOffsetComp = cornerHypotenuse * fabric.util.sin(newThetaComp);\n }\n else {\n // handle square corners\n // use default object corner size unless size is defined\n var cornerSize = (xSize && ySize) ? xSize : objectCornerSize;\n /* 0.7071067812 stands for sqrt(2)/2 */\n cornerHypotenuse = cornerSize * 0.7071067812;\n // complementary angles are equal since they're both 45 degrees\n var newTheta = fabric.util.degreesToRadians(45 - objectAngle);\n cosHalfOffset = cosHalfOffsetComp = cornerHypotenuse * fabric.util.cos(newTheta);\n sinHalfOffset = sinHalfOffsetComp = cornerHypotenuse * fabric.util.sin(newTheta);\n }\n\n return {\n tl: {\n x: centerX - sinHalfOffsetComp,\n y: centerY - cosHalfOffsetComp,\n },\n tr: {\n x: centerX + cosHalfOffset,\n y: centerY - sinHalfOffset,\n },\n bl: {\n x: centerX - cosHalfOffset,\n y: centerY + sinHalfOffset,\n },\n br: {\n x: centerX + sinHalfOffsetComp,\n y: centerY + cosHalfOffsetComp,\n },\n };\n },\n\n /**\n * Render function for the control.\n * When this function runs the context is unscaled. unrotate. Just retina scaled.\n * all the functions will have to translate to the point left,top before starting Drawing\n * if they want to draw a control where the position is detected.\n * left and top are the result of the positionHandler function\n * @param {RenderingContext2D} ctx the context where the control will be drawn\n * @param {Number} left position of the canvas where we are about to render the control.\n * @param {Number} top position of the canvas where we are about to render the control.\n * @param {Object} styleOverride\n * @param {fabric.Object} fabricObject the object where the control is about to be rendered\n */\n render: function(ctx, left, top, styleOverride, fabricObject) {\n styleOverride = styleOverride || {};\n switch (styleOverride.cornerStyle || fabricObject.cornerStyle) {\n case 'circle':\n fabric.controlsUtils.renderCircleControl.call(this, ctx, left, top, styleOverride, fabricObject);\n break;\n default:\n fabric.controlsUtils.renderSquareControl.call(this, ctx, left, top, styleOverride, fabricObject);\n }\n },\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function() {\n\n /* _FROM_SVG_START_ */\n function getColorStop(el, multiplier) {\n var style = el.getAttribute('style'),\n offset = el.getAttribute('offset') || 0,\n color, colorAlpha, opacity, i;\n\n // convert percents to absolute values\n offset = parseFloat(offset) / (/%$/.test(offset) ? 100 : 1);\n offset = offset < 0 ? 0 : offset > 1 ? 1 : offset;\n if (style) {\n var keyValuePairs = style.split(/\\s*;\\s*/);\n\n if (keyValuePairs[keyValuePairs.length - 1] === '') {\n keyValuePairs.pop();\n }\n\n for (i = keyValuePairs.length; i--; ) {\n\n var split = keyValuePairs[i].split(/\\s*:\\s*/),\n key = split[0].trim(),\n value = split[1].trim();\n\n if (key === 'stop-color') {\n color = value;\n }\n else if (key === 'stop-opacity') {\n opacity = value;\n }\n }\n }\n\n if (!color) {\n color = el.getAttribute('stop-color') || 'rgb(0,0,0)';\n }\n if (!opacity) {\n opacity = el.getAttribute('stop-opacity');\n }\n\n color = new fabric.Color(color);\n colorAlpha = color.getAlpha();\n opacity = isNaN(parseFloat(opacity)) ? 1 : parseFloat(opacity);\n opacity *= colorAlpha * multiplier;\n\n return {\n offset: offset,\n color: color.toRgb(),\n opacity: opacity\n };\n }\n\n function getLinearCoords(el) {\n return {\n x1: el.getAttribute('x1') || 0,\n y1: el.getAttribute('y1') || 0,\n x2: el.getAttribute('x2') || '100%',\n y2: el.getAttribute('y2') || 0\n };\n }\n\n function getRadialCoords(el) {\n return {\n x1: el.getAttribute('fx') || el.getAttribute('cx') || '50%',\n y1: el.getAttribute('fy') || el.getAttribute('cy') || '50%',\n r1: 0,\n x2: el.getAttribute('cx') || '50%',\n y2: el.getAttribute('cy') || '50%',\n r2: el.getAttribute('r') || '50%'\n };\n }\n /* _FROM_SVG_END_ */\n\n var clone = fabric.util.object.clone;\n\n /**\n * Gradient class\n * @class fabric.Gradient\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#gradients}\n * @see {@link fabric.Gradient#initialize} for constructor definition\n */\n fabric.Gradient = fabric.util.createClass(/** @lends fabric.Gradient.prototype */ {\n\n /**\n * Horizontal offset for aligning gradients coming from SVG when outside pathgroups\n * @type Number\n * @default 0\n */\n offsetX: 0,\n\n /**\n * Vertical offset for aligning gradients coming from SVG when outside pathgroups\n * @type Number\n * @default 0\n */\n offsetY: 0,\n\n /**\n * A transform matrix to apply to the gradient before painting.\n * Imported from svg gradients, is not applied with the current transform in the center.\n * Before this transform is applied, the origin point is at the top left corner of the object\n * plus the addition of offsetY and offsetX.\n * @type Number[]\n * @default null\n */\n gradientTransform: null,\n\n /**\n * coordinates units for coords.\n * If `pixels`, the number of coords are in the same unit of width / height.\n * If set as `percentage` the coords are still a number, but 1 means 100% of width\n * for the X and 100% of the height for the y. It can be bigger than 1 and negative.\n * allowed values pixels or percentage.\n * @type String\n * @default 'pixels'\n */\n gradientUnits: 'pixels',\n\n /**\n * Gradient type linear or radial\n * @type String\n * @default 'pixels'\n */\n type: 'linear',\n\n /**\n * Constructor\n * @param {Object} options Options object with type, coords, gradientUnits and colorStops\n * @param {Object} [options.type] gradient type linear or radial\n * @param {Object} [options.gradientUnits] gradient units\n * @param {Object} [options.offsetX] SVG import compatibility\n * @param {Object} [options.offsetY] SVG import compatibility\n * @param {Object[]} options.colorStops contains the colorstops.\n * @param {Object} options.coords contains the coords of the gradient\n * @param {Number} [options.coords.x1] X coordiante of the first point for linear or of the focal point for radial\n * @param {Number} [options.coords.y1] Y coordiante of the first point for linear or of the focal point for radial\n * @param {Number} [options.coords.x2] X coordiante of the second point for linear or of the center point for radial\n * @param {Number} [options.coords.y2] Y coordiante of the second point for linear or of the center point for radial\n * @param {Number} [options.coords.r1] only for radial gradient, radius of the inner circle\n * @param {Number} [options.coords.r2] only for radial gradient, radius of the external circle\n * @return {fabric.Gradient} thisArg\n */\n initialize: function(options) {\n options || (options = { });\n options.coords || (options.coords = { });\n\n var coords, _this = this;\n\n // sets everything, then coords and colorstops get sets again\n Object.keys(options).forEach(function(option) {\n _this[option] = options[option];\n });\n\n if (this.id) {\n this.id += '_' + fabric.Object.__uid++;\n }\n else {\n this.id = fabric.Object.__uid++;\n }\n\n coords = {\n x1: options.coords.x1 || 0,\n y1: options.coords.y1 || 0,\n x2: options.coords.x2 || 0,\n y2: options.coords.y2 || 0\n };\n\n if (this.type === 'radial') {\n coords.r1 = options.coords.r1 || 0;\n coords.r2 = options.coords.r2 || 0;\n }\n\n this.coords = coords;\n this.colorStops = options.colorStops.slice();\n },\n\n /**\n * Adds another colorStop\n * @param {Object} colorStop Object with offset and color\n * @return {fabric.Gradient} thisArg\n */\n addColorStop: function(colorStops) {\n for (var position in colorStops) {\n var color = new fabric.Color(colorStops[position]);\n this.colorStops.push({\n offset: parseFloat(position),\n color: color.toRgb(),\n opacity: color.getAlpha()\n });\n }\n return this;\n },\n\n /**\n * Returns object representation of a gradient\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object}\n */\n toObject: function(propertiesToInclude) {\n var object = {\n type: this.type,\n coords: this.coords,\n colorStops: this.colorStops,\n offsetX: this.offsetX,\n offsetY: this.offsetY,\n gradientUnits: this.gradientUnits,\n gradientTransform: this.gradientTransform ? this.gradientTransform.concat() : this.gradientTransform\n };\n fabric.util.populateWithProperties(this, object, propertiesToInclude);\n\n return object;\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns SVG representation of an gradient\n * @param {Object} object Object to create a gradient for\n * @return {String} SVG representation of an gradient (linear/radial)\n */\n toSVG: function(object, options) {\n var coords = clone(this.coords, true), i, len, options = options || {},\n markup, commonAttributes, colorStops = clone(this.colorStops, true),\n needsSwap = coords.r1 > coords.r2,\n transform = this.gradientTransform ? this.gradientTransform.concat() : fabric.iMatrix.concat(),\n offsetX = -this.offsetX, offsetY = -this.offsetY,\n withViewport = !!options.additionalTransform,\n gradientUnits = this.gradientUnits === 'pixels' ? 'userSpaceOnUse' : 'objectBoundingBox';\n // colorStops must be sorted ascending\n colorStops.sort(function(a, b) {\n return a.offset - b.offset;\n });\n\n if (gradientUnits === 'objectBoundingBox') {\n offsetX /= object.width;\n offsetY /= object.height;\n }\n else {\n offsetX += object.width / 2;\n offsetY += object.height / 2;\n }\n if (object.type === 'path' && this.gradientUnits !== 'percentage') {\n offsetX -= object.pathOffset.x;\n offsetY -= object.pathOffset.y;\n }\n\n\n transform[4] -= offsetX;\n transform[5] -= offsetY;\n\n commonAttributes = 'id=\"SVGID_' + this.id +\n '\" gradientUnits=\"' + gradientUnits + '\"';\n commonAttributes += ' gradientTransform=\"' + (withViewport ?\n options.additionalTransform + ' ' : '') + fabric.util.matrixToSVG(transform) + '\" ';\n\n if (this.type === 'linear') {\n markup = [\n '\\n'\n ];\n }\n else if (this.type === 'radial') {\n // svg radial gradient has just 1 radius. the biggest.\n markup = [\n '\\n'\n ];\n }\n\n if (this.type === 'radial') {\n if (needsSwap) {\n // svg goes from internal to external radius. if radius are inverted, swap color stops.\n colorStops = colorStops.concat();\n colorStops.reverse();\n for (i = 0, len = colorStops.length; i < len; i++) {\n colorStops[i].offset = 1 - colorStops[i].offset;\n }\n }\n var minRadius = Math.min(coords.r1, coords.r2);\n if (minRadius > 0) {\n // i have to shift all colorStops and add new one in 0.\n var maxRadius = Math.max(coords.r1, coords.r2),\n percentageShift = minRadius / maxRadius;\n for (i = 0, len = colorStops.length; i < len; i++) {\n colorStops[i].offset += percentageShift * (1 - colorStops[i].offset);\n }\n }\n }\n\n for (i = 0, len = colorStops.length; i < len; i++) {\n var colorStop = colorStops[i];\n markup.push(\n '\\n'\n );\n }\n\n markup.push((this.type === 'linear' ? '\\n' : '\\n'));\n\n return markup.join('');\n },\n /* _TO_SVG_END_ */\n\n /**\n * Returns an instance of CanvasGradient\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @return {CanvasGradient}\n */\n toLive: function(ctx) {\n var gradient, coords = fabric.util.object.clone(this.coords), i, len;\n\n if (!this.type) {\n return;\n }\n\n if (this.type === 'linear') {\n gradient = ctx.createLinearGradient(\n coords.x1, coords.y1, coords.x2, coords.y2);\n }\n else if (this.type === 'radial') {\n gradient = ctx.createRadialGradient(\n coords.x1, coords.y1, coords.r1, coords.x2, coords.y2, coords.r2);\n }\n\n for (i = 0, len = this.colorStops.length; i < len; i++) {\n var color = this.colorStops[i].color,\n opacity = this.colorStops[i].opacity,\n offset = this.colorStops[i].offset;\n\n if (typeof opacity !== 'undefined') {\n color = new fabric.Color(color).setAlpha(opacity).toRgba();\n }\n gradient.addColorStop(offset, color);\n }\n\n return gradient;\n }\n });\n\n fabric.util.object.extend(fabric.Gradient, {\n\n /* _FROM_SVG_START_ */\n /**\n * Returns {@link fabric.Gradient} instance from an SVG element\n * @static\n * @memberOf fabric.Gradient\n * @param {SVGGradientElement} el SVG gradient element\n * @param {fabric.Object} instance\n * @param {String} opacityAttr A fill-opacity or stroke-opacity attribute to multiply to each stop's opacity.\n * @param {Object} svgOptions an object containing the size of the SVG in order to parse correctly gradients\n * that uses gradientUnits as 'userSpaceOnUse' and percentages.\n * @param {Object.number} viewBoxWidth width part of the viewBox attribute on svg\n * @param {Object.number} viewBoxHeight height part of the viewBox attribute on svg\n * @param {Object.number} width width part of the svg tag if viewBox is not specified\n * @param {Object.number} height height part of the svg tag if viewBox is not specified\n * @return {fabric.Gradient} Gradient instance\n * @see http://www.w3.org/TR/SVG/pservers.html#LinearGradientElement\n * @see http://www.w3.org/TR/SVG/pservers.html#RadialGradientElement\n */\n fromElement: function(el, instance, opacityAttr, svgOptions) {\n /**\n * @example:\n *\n * \n * \n * \n * \n *\n * OR\n *\n * \n * \n * \n * \n *\n * OR\n *\n * \n * \n * \n * \n * \n *\n * OR\n *\n * \n * \n * \n * \n * \n *\n */\n\n var multiplier = parseFloat(opacityAttr) / (/%$/.test(opacityAttr) ? 100 : 1);\n multiplier = multiplier < 0 ? 0 : multiplier > 1 ? 1 : multiplier;\n if (isNaN(multiplier)) {\n multiplier = 1;\n }\n\n var colorStopEls = el.getElementsByTagName('stop'),\n type,\n gradientUnits = el.getAttribute('gradientUnits') === 'userSpaceOnUse' ?\n 'pixels' : 'percentage',\n gradientTransform = el.getAttribute('gradientTransform') || '',\n colorStops = [],\n coords, i, offsetX = 0, offsetY = 0,\n transformMatrix;\n if (el.nodeName === 'linearGradient' || el.nodeName === 'LINEARGRADIENT') {\n type = 'linear';\n coords = getLinearCoords(el);\n }\n else {\n type = 'radial';\n coords = getRadialCoords(el);\n }\n\n for (i = colorStopEls.length; i--; ) {\n colorStops.push(getColorStop(colorStopEls[i], multiplier));\n }\n\n transformMatrix = fabric.parseTransformAttribute(gradientTransform);\n\n __convertPercentUnitsToValues(instance, coords, svgOptions, gradientUnits);\n\n if (gradientUnits === 'pixels') {\n offsetX = -instance.left;\n offsetY = -instance.top;\n }\n\n var gradient = new fabric.Gradient({\n id: el.getAttribute('id'),\n type: type,\n coords: coords,\n colorStops: colorStops,\n gradientUnits: gradientUnits,\n gradientTransform: transformMatrix,\n offsetX: offsetX,\n offsetY: offsetY,\n });\n\n return gradient;\n }\n /* _FROM_SVG_END_ */\n });\n\n /**\n * @private\n */\n function __convertPercentUnitsToValues(instance, options, svgOptions, gradientUnits) {\n var propValue, finalValue;\n Object.keys(options).forEach(function(prop) {\n propValue = options[prop];\n if (propValue === 'Infinity') {\n finalValue = 1;\n }\n else if (propValue === '-Infinity') {\n finalValue = 0;\n }\n else {\n finalValue = parseFloat(options[prop], 10);\n if (typeof propValue === 'string' && /^(\\d+\\.\\d+)%|(\\d+)%$/.test(propValue)) {\n finalValue *= 0.01;\n if (gradientUnits === 'pixels') {\n // then we need to fix those percentages here in svg parsing\n if (prop === 'x1' || prop === 'x2' || prop === 'r2') {\n finalValue *= svgOptions.viewBoxWidth || svgOptions.width;\n }\n if (prop === 'y1' || prop === 'y2') {\n finalValue *= svgOptions.viewBoxHeight || svgOptions.height;\n }\n }\n }\n }\n options[prop] = finalValue;\n });\n }\n})();\n\n\n(function() {\n\n 'use strict';\n\n var toFixed = fabric.util.toFixed;\n\n /**\n * Pattern class\n * @class fabric.Pattern\n * @see {@link http://fabricjs.com/patterns|Pattern demo}\n * @see {@link http://fabricjs.com/dynamic-patterns|DynamicPattern demo}\n * @see {@link fabric.Pattern#initialize} for constructor definition\n */\n\n\n fabric.Pattern = fabric.util.createClass(/** @lends fabric.Pattern.prototype */ {\n\n /**\n * Repeat property of a pattern (one of repeat, repeat-x, repeat-y or no-repeat)\n * @type String\n * @default\n */\n repeat: 'repeat',\n\n /**\n * Pattern horizontal offset from object's left/top corner\n * @type Number\n * @default\n */\n offsetX: 0,\n\n /**\n * Pattern vertical offset from object's left/top corner\n * @type Number\n * @default\n */\n offsetY: 0,\n\n /**\n * crossOrigin value (one of \"\", \"anonymous\", \"use-credentials\")\n * @see https://developer.mozilla.org/en-US/docs/HTML/CORS_settings_attributes\n * @type String\n * @default\n */\n crossOrigin: '',\n\n /**\n * transform matrix to change the pattern, imported from svgs.\n * @type Array\n * @default\n */\n patternTransform: null,\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n * @param {Function} [callback] function to invoke after callback init.\n * @return {fabric.Pattern} thisArg\n */\n initialize: function(options, callback) {\n options || (options = { });\n\n this.id = fabric.Object.__uid++;\n this.setOptions(options);\n if (!options.source || (options.source && typeof options.source !== 'string')) {\n callback && callback(this);\n return;\n }\n else {\n // img src string\n var _this = this;\n this.source = fabric.util.createImage();\n fabric.util.loadImage(options.source, function(img, isError) {\n _this.source = img;\n callback && callback(_this, isError);\n }, null, this.crossOrigin);\n }\n },\n\n /**\n * Returns object representation of a pattern\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of a pattern instance\n */\n toObject: function(propertiesToInclude) {\n var NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS,\n source, object;\n\n // element\n if (typeof this.source.src === 'string') {\n source = this.source.src;\n }\n // element\n else if (typeof this.source === 'object' && this.source.toDataURL) {\n source = this.source.toDataURL();\n }\n\n object = {\n type: 'pattern',\n source: source,\n repeat: this.repeat,\n crossOrigin: this.crossOrigin,\n offsetX: toFixed(this.offsetX, NUM_FRACTION_DIGITS),\n offsetY: toFixed(this.offsetY, NUM_FRACTION_DIGITS),\n patternTransform: this.patternTransform ? this.patternTransform.concat() : null\n };\n fabric.util.populateWithProperties(this, object, propertiesToInclude);\n\n return object;\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns SVG representation of a pattern\n * @param {fabric.Object} object\n * @return {String} SVG representation of a pattern\n */\n toSVG: function(object) {\n var patternSource = typeof this.source === 'function' ? this.source() : this.source,\n patternWidth = patternSource.width / object.width,\n patternHeight = patternSource.height / object.height,\n patternOffsetX = this.offsetX / object.width,\n patternOffsetY = this.offsetY / object.height,\n patternImgSrc = '';\n if (this.repeat === 'repeat-x' || this.repeat === 'no-repeat') {\n patternHeight = 1;\n if (patternOffsetY) {\n patternHeight += Math.abs(patternOffsetY);\n }\n }\n if (this.repeat === 'repeat-y' || this.repeat === 'no-repeat') {\n patternWidth = 1;\n if (patternOffsetX) {\n patternWidth += Math.abs(patternOffsetX);\n }\n\n }\n if (patternSource.src) {\n patternImgSrc = patternSource.src;\n }\n else if (patternSource.toDataURL) {\n patternImgSrc = patternSource.toDataURL();\n }\n\n return '\\n' +\n '\\n' +\n '\\n';\n },\n /* _TO_SVG_END_ */\n\n setOptions: function(options) {\n for (var prop in options) {\n this[prop] = options[prop];\n }\n },\n\n /**\n * Returns an instance of CanvasPattern\n * @param {CanvasRenderingContext2D} ctx Context to create pattern\n * @return {CanvasPattern}\n */\n toLive: function(ctx) {\n var source = this.source;\n // if the image failed to load, return, and allow rest to continue loading\n if (!source) {\n return '';\n }\n\n // if an image\n if (typeof source.src !== 'undefined') {\n if (!source.complete) {\n return '';\n }\n if (source.naturalWidth === 0 || source.naturalHeight === 0) {\n return '';\n }\n }\n return ctx.createPattern(source, this.repeat);\n }\n });\n})();\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n toFixed = fabric.util.toFixed;\n\n if (fabric.Shadow) {\n fabric.warn('fabric.Shadow is already defined.');\n return;\n }\n\n /**\n * Shadow class\n * @class fabric.Shadow\n * @see {@link http://fabricjs.com/shadows|Shadow demo}\n * @see {@link fabric.Shadow#initialize} for constructor definition\n */\n fabric.Shadow = fabric.util.createClass(/** @lends fabric.Shadow.prototype */ {\n\n /**\n * Shadow color\n * @type String\n * @default\n */\n color: 'rgb(0,0,0)',\n\n /**\n * Shadow blur\n * @type Number\n */\n blur: 0,\n\n /**\n * Shadow horizontal offset\n * @type Number\n * @default\n */\n offsetX: 0,\n\n /**\n * Shadow vertical offset\n * @type Number\n * @default\n */\n offsetY: 0,\n\n /**\n * Whether the shadow should affect stroke operations\n * @type Boolean\n * @default\n */\n affectStroke: false,\n\n /**\n * Indicates whether toObject should include default values\n * @type Boolean\n * @default\n */\n includeDefaultValues: true,\n\n /**\n * When `false`, the shadow will scale with the object.\n * When `true`, the shadow's offsetX, offsetY, and blur will not be affected by the object's scale.\n * default to false\n * @type Boolean\n * @default\n */\n nonScaling: false,\n\n /**\n * Constructor\n * @param {Object|String} [options] Options object with any of color, blur, offsetX, offsetY properties or string (e.g. \"rgba(0,0,0,0.2) 2px 2px 10px\")\n * @return {fabric.Shadow} thisArg\n */\n initialize: function(options) {\n\n if (typeof options === 'string') {\n options = this._parseShadow(options);\n }\n\n for (var prop in options) {\n this[prop] = options[prop];\n }\n\n this.id = fabric.Object.__uid++;\n },\n\n /**\n * @private\n * @param {String} shadow Shadow value to parse\n * @return {Object} Shadow object with color, offsetX, offsetY and blur\n */\n _parseShadow: function(shadow) {\n var shadowStr = shadow.trim(),\n offsetsAndBlur = fabric.Shadow.reOffsetsAndBlur.exec(shadowStr) || [],\n color = shadowStr.replace(fabric.Shadow.reOffsetsAndBlur, '') || 'rgb(0,0,0)';\n\n return {\n color: color.trim(),\n offsetX: parseFloat(offsetsAndBlur[1], 10) || 0,\n offsetY: parseFloat(offsetsAndBlur[2], 10) || 0,\n blur: parseFloat(offsetsAndBlur[3], 10) || 0\n };\n },\n\n /**\n * Returns a string representation of an instance\n * @see http://www.w3.org/TR/css-text-decor-3/#text-shadow\n * @return {String} Returns CSS3 text-shadow declaration\n */\n toString: function() {\n return [this.offsetX, this.offsetY, this.blur, this.color].join('px ');\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns SVG representation of a shadow\n * @param {fabric.Object} object\n * @return {String} SVG representation of a shadow\n */\n toSVG: function(object) {\n var fBoxX = 40, fBoxY = 40, NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS,\n offset = fabric.util.rotateVector(\n { x: this.offsetX, y: this.offsetY },\n fabric.util.degreesToRadians(-object.angle)),\n BLUR_BOX = 20, color = new fabric.Color(this.color);\n\n if (object.width && object.height) {\n //http://www.w3.org/TR/SVG/filters.html#FilterEffectsRegion\n // we add some extra space to filter box to contain the blur ( 20 )\n fBoxX = toFixed((Math.abs(offset.x) + this.blur) / object.width, NUM_FRACTION_DIGITS) * 100 + BLUR_BOX;\n fBoxY = toFixed((Math.abs(offset.y) + this.blur) / object.height, NUM_FRACTION_DIGITS) * 100 + BLUR_BOX;\n }\n if (object.flipX) {\n offset.x *= -1;\n }\n if (object.flipY) {\n offset.y *= -1;\n }\n\n return (\n '\\n' +\n '\\t\\n' +\n '\\t\\n' +\n '\\t\\n' +\n '\\t\\n' +\n '\\t\\n' +\n '\\t\\t\\n' +\n '\\t\\t\\n' +\n '\\t\\n' +\n '\\n');\n },\n /* _TO_SVG_END_ */\n\n /**\n * Returns object representation of a shadow\n * @return {Object} Object representation of a shadow instance\n */\n toObject: function() {\n if (this.includeDefaultValues) {\n return {\n color: this.color,\n blur: this.blur,\n offsetX: this.offsetX,\n offsetY: this.offsetY,\n affectStroke: this.affectStroke,\n nonScaling: this.nonScaling\n };\n }\n var obj = { }, proto = fabric.Shadow.prototype;\n\n ['color', 'blur', 'offsetX', 'offsetY', 'affectStroke', 'nonScaling'].forEach(function(prop) {\n if (this[prop] !== proto[prop]) {\n obj[prop] = this[prop];\n }\n }, this);\n\n return obj;\n }\n });\n\n /**\n * Regex matching shadow offsetX, offsetY and blur (ex: \"2px 2px 10px rgba(0,0,0,0.2)\", \"rgb(0,255,0) 2px 2px\")\n * @static\n * @field\n * @memberOf fabric.Shadow\n */\n // eslint-disable-next-line max-len\n fabric.Shadow.reOffsetsAndBlur = /(?:\\s|^)(-?\\d+(?:\\.\\d*)?(?:px)?(?:\\s?|$))?(-?\\d+(?:\\.\\d*)?(?:px)?(?:\\s?|$))?(\\d+(?:\\.\\d*)?(?:px)?)?(?:\\s?|$)(?:$|\\s)/;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function () {\n\n 'use strict';\n\n if (fabric.StaticCanvas) {\n fabric.warn('fabric.StaticCanvas is already defined.');\n return;\n }\n\n // aliases for faster resolution\n var extend = fabric.util.object.extend,\n getElementOffset = fabric.util.getElementOffset,\n removeFromArray = fabric.util.removeFromArray,\n toFixed = fabric.util.toFixed,\n transformPoint = fabric.util.transformPoint,\n invertTransform = fabric.util.invertTransform,\n getNodeCanvas = fabric.util.getNodeCanvas,\n createCanvasElement = fabric.util.createCanvasElement,\n\n CANVAS_INIT_ERROR = new Error('Could not initialize `canvas` element');\n\n /**\n * Static canvas class\n * @class fabric.StaticCanvas\n * @mixes fabric.Collection\n * @mixes fabric.Observable\n * @see {@link http://fabricjs.com/static_canvas|StaticCanvas demo}\n * @see {@link fabric.StaticCanvas#initialize} for constructor definition\n * @fires before:render\n * @fires after:render\n * @fires canvas:cleared\n * @fires object:added\n * @fires object:removed\n */\n fabric.StaticCanvas = fabric.util.createClass(fabric.CommonMethods, /** @lends fabric.StaticCanvas.prototype */ {\n\n /**\n * Constructor\n * @param {HTMLElement | String} el <canvas> element to initialize instance on\n * @param {Object} [options] Options object\n * @return {Object} thisArg\n */\n initialize: function(el, options) {\n options || (options = { });\n this.renderAndResetBound = this.renderAndReset.bind(this);\n this.requestRenderAllBound = this.requestRenderAll.bind(this);\n this._initStatic(el, options);\n },\n\n /**\n * Background color of canvas instance.\n * Should be set via {@link fabric.StaticCanvas#setBackgroundColor}.\n * @type {(String|fabric.Pattern)}\n * @default\n */\n backgroundColor: '',\n\n /**\n * Background image of canvas instance.\n * since 2.4.0 image caching is active, please when putting an image as background, add to the\n * canvas property a reference to the canvas it is on. Otherwise the image cannot detect the zoom\n * vale. As an alternative you can disable image objectCaching\n * @type fabric.Image\n * @default\n */\n backgroundImage: null,\n\n /**\n * Overlay color of canvas instance.\n * Should be set via {@link fabric.StaticCanvas#setOverlayColor}\n * @since 1.3.9\n * @type {(String|fabric.Pattern)}\n * @default\n */\n overlayColor: '',\n\n /**\n * Overlay image of canvas instance.\n * since 2.4.0 image caching is active, please when putting an image as overlay, add to the\n * canvas property a reference to the canvas it is on. Otherwise the image cannot detect the zoom\n * vale. As an alternative you can disable image objectCaching\n * @type fabric.Image\n * @default\n */\n overlayImage: null,\n\n /**\n * Indicates whether toObject/toDatalessObject should include default values\n * if set to false, takes precedence over the object value.\n * @type Boolean\n * @default\n */\n includeDefaultValues: true,\n\n /**\n * Indicates whether objects' state should be saved\n * @type Boolean\n * @default\n */\n stateful: false,\n\n /**\n * Indicates whether {@link fabric.Collection.add}, {@link fabric.Collection.insertAt} and {@link fabric.Collection.remove},\n * {@link fabric.StaticCanvas.moveTo}, {@link fabric.StaticCanvas.clear} and many more, should also re-render canvas.\n * Disabling this option will not give a performance boost when adding/removing a lot of objects to/from canvas at once\n * since the renders are quequed and executed one per frame.\n * Disabling is suggested anyway and managing the renders of the app manually is not a big effort ( canvas.requestRenderAll() )\n * Left default to true to do not break documentation and old app, fiddles.\n * @type Boolean\n * @default\n */\n renderOnAddRemove: true,\n\n /**\n * Indicates whether object controls (borders/controls) are rendered above overlay image\n * @type Boolean\n * @default\n */\n controlsAboveOverlay: false,\n\n /**\n * Indicates whether the browser can be scrolled when using a touchscreen and dragging on the canvas\n * @type Boolean\n * @default\n */\n allowTouchScrolling: false,\n\n /**\n * Indicates whether this canvas will use image smoothing, this is on by default in browsers\n * @type Boolean\n * @default\n */\n imageSmoothingEnabled: true,\n\n /**\n * The transformation (a Canvas 2D API transform matrix) which focuses the viewport\n * @type Array\n * @example Default transform\n * canvas.viewportTransform = [1, 0, 0, 1, 0, 0];\n * @example Scale by 70% and translate toward bottom-right by 50, without skewing\n * canvas.viewportTransform = [0.7, 0, 0, 0.7, 50, 50];\n * @default\n */\n viewportTransform: fabric.iMatrix.concat(),\n\n /**\n * if set to false background image is not affected by viewport transform\n * @since 1.6.3\n * @type Boolean\n * @default\n */\n backgroundVpt: true,\n\n /**\n * if set to false overlya image is not affected by viewport transform\n * @since 1.6.3\n * @type Boolean\n * @default\n */\n overlayVpt: true,\n\n /**\n * When true, canvas is scaled by devicePixelRatio for better rendering on retina screens\n * @type Boolean\n * @default\n */\n enableRetinaScaling: true,\n\n /**\n * Describe canvas element extension over design\n * properties are tl,tr,bl,br.\n * if canvas is not zoomed/panned those points are the four corner of canvas\n * if canvas is viewportTransformed you those points indicate the extension\n * of canvas element in plain untrasformed coordinates\n * The coordinates get updated with @method calcViewportBoundaries.\n * @memberOf fabric.StaticCanvas.prototype\n */\n vptCoords: { },\n\n /**\n * Based on vptCoords and object.aCoords, skip rendering of objects that\n * are not included in current viewport.\n * May greatly help in applications with crowded canvas and use of zoom/pan\n * If One of the corner of the bounding box of the object is on the canvas\n * the objects get rendered.\n * @memberOf fabric.StaticCanvas.prototype\n * @type Boolean\n * @default\n */\n skipOffscreen: true,\n\n /**\n * a fabricObject that, without stroke define a clipping area with their shape. filled in black\n * the clipPath object gets used when the canvas has rendered, and the context is placed in the\n * top left corner of the canvas.\n * clipPath will clip away controls, if you do not want this to happen use controlsAboveOverlay = true\n * @type fabric.Object\n */\n clipPath: undefined,\n\n /**\n * @private\n * @param {HTMLElement | String} el <canvas> element to initialize instance on\n * @param {Object} [options] Options object\n */\n _initStatic: function(el, options) {\n var cb = this.requestRenderAllBound;\n this._objects = [];\n this._createLowerCanvas(el);\n this._initOptions(options);\n // only initialize retina scaling once\n if (!this.interactive) {\n this._initRetinaScaling();\n }\n\n if (options.overlayImage) {\n this.setOverlayImage(options.overlayImage, cb);\n }\n if (options.backgroundImage) {\n this.setBackgroundImage(options.backgroundImage, cb);\n }\n if (options.backgroundColor) {\n this.setBackgroundColor(options.backgroundColor, cb);\n }\n if (options.overlayColor) {\n this.setOverlayColor(options.overlayColor, cb);\n }\n this.calcOffset();\n },\n\n /**\n * @private\n */\n _isRetinaScaling: function() {\n return (fabric.devicePixelRatio > 1 && this.enableRetinaScaling);\n },\n\n /**\n * @private\n * @return {Number} retinaScaling if applied, otherwise 1;\n */\n getRetinaScaling: function() {\n return this._isRetinaScaling() ? Math.max(1, fabric.devicePixelRatio) : 1;\n },\n\n /**\n * @private\n */\n _initRetinaScaling: function() {\n if (!this._isRetinaScaling()) {\n return;\n }\n var scaleRatio = fabric.devicePixelRatio;\n this.__initRetinaScaling(scaleRatio, this.lowerCanvasEl, this.contextContainer);\n if (this.upperCanvasEl) {\n this.__initRetinaScaling(scaleRatio, this.upperCanvasEl, this.contextTop);\n }\n },\n\n __initRetinaScaling: function(scaleRatio, canvas, context) {\n canvas.setAttribute('width', this.width * scaleRatio);\n canvas.setAttribute('height', this.height * scaleRatio);\n context.scale(scaleRatio, scaleRatio);\n },\n\n\n /**\n * Calculates canvas element offset relative to the document\n * This method is also attached as \"resize\" event handler of window\n * @return {fabric.Canvas} instance\n * @chainable\n */\n calcOffset: function () {\n this._offset = getElementOffset(this.lowerCanvasEl);\n return this;\n },\n\n /**\n * Sets {@link fabric.StaticCanvas#overlayImage|overlay image} for this canvas\n * @param {(fabric.Image|String)} image fabric.Image instance or URL of an image to set overlay to\n * @param {Function} callback callback to invoke when image is loaded and set as an overlay\n * @param {Object} [options] Optional options to set for the {@link fabric.Image|overlay image}.\n * @return {fabric.Canvas} thisArg\n * @chainable\n * @see {@link http://jsfiddle.net/fabricjs/MnzHT/|jsFiddle demo}\n * @example Normal overlayImage with left/top = 0\n * canvas.setOverlayImage('http://fabricjs.com/assets/jail_cell_bars.png', canvas.renderAll.bind(canvas), {\n * // Needed to position overlayImage at 0/0\n * originX: 'left',\n * originY: 'top'\n * });\n * @example overlayImage with different properties\n * canvas.setOverlayImage('http://fabricjs.com/assets/jail_cell_bars.png', canvas.renderAll.bind(canvas), {\n * opacity: 0.5,\n * angle: 45,\n * left: 400,\n * top: 400,\n * originX: 'left',\n * originY: 'top'\n * });\n * @example Stretched overlayImage #1 - width/height correspond to canvas width/height\n * fabric.Image.fromURL('http://fabricjs.com/assets/jail_cell_bars.png', function(img, isError) {\n * img.set({width: canvas.width, height: canvas.height, originX: 'left', originY: 'top'});\n * canvas.setOverlayImage(img, canvas.renderAll.bind(canvas));\n * });\n * @example Stretched overlayImage #2 - width/height correspond to canvas width/height\n * canvas.setOverlayImage('http://fabricjs.com/assets/jail_cell_bars.png', canvas.renderAll.bind(canvas), {\n * width: canvas.width,\n * height: canvas.height,\n * // Needed to position overlayImage at 0/0\n * originX: 'left',\n * originY: 'top'\n * });\n * @example overlayImage loaded from cross-origin\n * canvas.setOverlayImage('http://fabricjs.com/assets/jail_cell_bars.png', canvas.renderAll.bind(canvas), {\n * opacity: 0.5,\n * angle: 45,\n * left: 400,\n * top: 400,\n * originX: 'left',\n * originY: 'top',\n * crossOrigin: 'anonymous'\n * });\n */\n setOverlayImage: function (image, callback, options) {\n return this.__setBgOverlayImage('overlayImage', image, callback, options);\n },\n\n /**\n * Sets {@link fabric.StaticCanvas#backgroundImage|background image} for this canvas\n * @param {(fabric.Image|String)} image fabric.Image instance or URL of an image to set background to\n * @param {Function} callback Callback to invoke when image is loaded and set as background\n * @param {Object} [options] Optional options to set for the {@link fabric.Image|background image}.\n * @return {fabric.Canvas} thisArg\n * @chainable\n * @see {@link http://jsfiddle.net/djnr8o7a/28/|jsFiddle demo}\n * @example Normal backgroundImage with left/top = 0\n * canvas.setBackgroundImage('http://fabricjs.com/assets/honey_im_subtle.png', canvas.renderAll.bind(canvas), {\n * // Needed to position backgroundImage at 0/0\n * originX: 'left',\n * originY: 'top'\n * });\n * @example backgroundImage with different properties\n * canvas.setBackgroundImage('http://fabricjs.com/assets/honey_im_subtle.png', canvas.renderAll.bind(canvas), {\n * opacity: 0.5,\n * angle: 45,\n * left: 400,\n * top: 400,\n * originX: 'left',\n * originY: 'top'\n * });\n * @example Stretched backgroundImage #1 - width/height correspond to canvas width/height\n * fabric.Image.fromURL('http://fabricjs.com/assets/honey_im_subtle.png', function(img, isError) {\n * img.set({width: canvas.width, height: canvas.height, originX: 'left', originY: 'top'});\n * canvas.setBackgroundImage(img, canvas.renderAll.bind(canvas));\n * });\n * @example Stretched backgroundImage #2 - width/height correspond to canvas width/height\n * canvas.setBackgroundImage('http://fabricjs.com/assets/honey_im_subtle.png', canvas.renderAll.bind(canvas), {\n * width: canvas.width,\n * height: canvas.height,\n * // Needed to position backgroundImage at 0/0\n * originX: 'left',\n * originY: 'top'\n * });\n * @example backgroundImage loaded from cross-origin\n * canvas.setBackgroundImage('http://fabricjs.com/assets/honey_im_subtle.png', canvas.renderAll.bind(canvas), {\n * opacity: 0.5,\n * angle: 45,\n * left: 400,\n * top: 400,\n * originX: 'left',\n * originY: 'top',\n * crossOrigin: 'anonymous'\n * });\n */\n // TODO: fix stretched examples\n setBackgroundImage: function (image, callback, options) {\n return this.__setBgOverlayImage('backgroundImage', image, callback, options);\n },\n\n /**\n * Sets {@link fabric.StaticCanvas#overlayColor|foreground color} for this canvas\n * @param {(String|fabric.Pattern)} overlayColor Color or pattern to set foreground color to\n * @param {Function} callback Callback to invoke when foreground color is set\n * @return {fabric.Canvas} thisArg\n * @chainable\n * @see {@link http://jsfiddle.net/fabricjs/pB55h/|jsFiddle demo}\n * @example Normal overlayColor - color value\n * canvas.setOverlayColor('rgba(255, 73, 64, 0.6)', canvas.renderAll.bind(canvas));\n * @example fabric.Pattern used as overlayColor\n * canvas.setOverlayColor({\n * source: 'http://fabricjs.com/assets/escheresque_ste.png'\n * }, canvas.renderAll.bind(canvas));\n * @example fabric.Pattern used as overlayColor with repeat and offset\n * canvas.setOverlayColor({\n * source: 'http://fabricjs.com/assets/escheresque_ste.png',\n * repeat: 'repeat',\n * offsetX: 200,\n * offsetY: 100\n * }, canvas.renderAll.bind(canvas));\n */\n setOverlayColor: function(overlayColor, callback) {\n return this.__setBgOverlayColor('overlayColor', overlayColor, callback);\n },\n\n /**\n * Sets {@link fabric.StaticCanvas#backgroundColor|background color} for this canvas\n * @param {(String|fabric.Pattern)} backgroundColor Color or pattern to set background color to\n * @param {Function} callback Callback to invoke when background color is set\n * @return {fabric.Canvas} thisArg\n * @chainable\n * @see {@link http://jsfiddle.net/fabricjs/hXzvk/|jsFiddle demo}\n * @example Normal backgroundColor - color value\n * canvas.setBackgroundColor('rgba(255, 73, 64, 0.6)', canvas.renderAll.bind(canvas));\n * @example fabric.Pattern used as backgroundColor\n * canvas.setBackgroundColor({\n * source: 'http://fabricjs.com/assets/escheresque_ste.png'\n * }, canvas.renderAll.bind(canvas));\n * @example fabric.Pattern used as backgroundColor with repeat and offset\n * canvas.setBackgroundColor({\n * source: 'http://fabricjs.com/assets/escheresque_ste.png',\n * repeat: 'repeat',\n * offsetX: 200,\n * offsetY: 100\n * }, canvas.renderAll.bind(canvas));\n */\n setBackgroundColor: function(backgroundColor, callback) {\n return this.__setBgOverlayColor('backgroundColor', backgroundColor, callback);\n },\n\n /**\n * @private\n * @param {String} property Property to set ({@link fabric.StaticCanvas#backgroundImage|backgroundImage}\n * or {@link fabric.StaticCanvas#overlayImage|overlayImage})\n * @param {(fabric.Image|String|null)} image fabric.Image instance, URL of an image or null to set background or overlay to\n * @param {Function} callback Callback to invoke when image is loaded and set as background or overlay. The first argument is the created image, the second argument is a flag indicating whether an error occurred or not.\n * @param {Object} [options] Optional options to set for the {@link fabric.Image|image}.\n */\n __setBgOverlayImage: function(property, image, callback, options) {\n if (typeof image === 'string') {\n fabric.util.loadImage(image, function(img, isError) {\n if (img) {\n var instance = new fabric.Image(img, options);\n this[property] = instance;\n instance.canvas = this;\n }\n callback && callback(img, isError);\n }, this, options && options.crossOrigin);\n }\n else {\n options && image.setOptions(options);\n this[property] = image;\n image && (image.canvas = this);\n callback && callback(image, false);\n }\n\n return this;\n },\n\n /**\n * @private\n * @param {String} property Property to set ({@link fabric.StaticCanvas#backgroundColor|backgroundColor}\n * or {@link fabric.StaticCanvas#overlayColor|overlayColor})\n * @param {(Object|String|null)} color Object with pattern information, color value or null\n * @param {Function} [callback] Callback is invoked when color is set\n */\n __setBgOverlayColor: function(property, color, callback) {\n this[property] = color;\n this._initGradient(color, property);\n this._initPattern(color, property, callback);\n return this;\n },\n\n /**\n * @private\n */\n _createCanvasElement: function() {\n var element = createCanvasElement();\n if (!element) {\n throw CANVAS_INIT_ERROR;\n }\n if (!element.style) {\n element.style = { };\n }\n if (typeof element.getContext === 'undefined') {\n throw CANVAS_INIT_ERROR;\n }\n return element;\n },\n\n /**\n * @private\n * @param {Object} [options] Options object\n */\n _initOptions: function (options) {\n var lowerCanvasEl = this.lowerCanvasEl;\n this._setOptions(options);\n\n this.width = this.width || parseInt(lowerCanvasEl.width, 10) || 0;\n this.height = this.height || parseInt(lowerCanvasEl.height, 10) || 0;\n\n if (!this.lowerCanvasEl.style) {\n return;\n }\n\n lowerCanvasEl.width = this.width;\n lowerCanvasEl.height = this.height;\n\n lowerCanvasEl.style.width = this.width + 'px';\n lowerCanvasEl.style.height = this.height + 'px';\n\n this.viewportTransform = this.viewportTransform.slice();\n },\n\n /**\n * Creates a bottom canvas\n * @private\n * @param {HTMLElement} [canvasEl]\n */\n _createLowerCanvas: function (canvasEl) {\n // canvasEl === 'HTMLCanvasElement' does not work on jsdom/node\n if (canvasEl && canvasEl.getContext) {\n this.lowerCanvasEl = canvasEl;\n }\n else {\n this.lowerCanvasEl = fabric.util.getById(canvasEl) || this._createCanvasElement();\n }\n\n fabric.util.addClass(this.lowerCanvasEl, 'lower-canvas');\n this._originalCanvasStyle = this.lowerCanvasEl.style;\n if (this.interactive) {\n this._applyCanvasStyle(this.lowerCanvasEl);\n }\n\n this.contextContainer = this.lowerCanvasEl.getContext('2d');\n },\n\n /**\n * Returns canvas width (in px)\n * @return {Number}\n */\n getWidth: function () {\n return this.width;\n },\n\n /**\n * Returns canvas height (in px)\n * @return {Number}\n */\n getHeight: function () {\n return this.height;\n },\n\n /**\n * Sets width of this canvas instance\n * @param {Number|String} value Value to set width to\n * @param {Object} [options] Options object\n * @param {Boolean} [options.backstoreOnly=false] Set the given dimensions only as canvas backstore dimensions\n * @param {Boolean} [options.cssOnly=false] Set the given dimensions only as css dimensions\n * @return {fabric.Canvas} instance\n * @chainable true\n */\n setWidth: function (value, options) {\n return this.setDimensions({ width: value }, options);\n },\n\n /**\n * Sets height of this canvas instance\n * @param {Number|String} value Value to set height to\n * @param {Object} [options] Options object\n * @param {Boolean} [options.backstoreOnly=false] Set the given dimensions only as canvas backstore dimensions\n * @param {Boolean} [options.cssOnly=false] Set the given dimensions only as css dimensions\n * @return {fabric.Canvas} instance\n * @chainable true\n */\n setHeight: function (value, options) {\n return this.setDimensions({ height: value }, options);\n },\n\n /**\n * Sets dimensions (width, height) of this canvas instance. when options.cssOnly flag active you should also supply the unit of measure (px/%/em)\n * @param {Object} dimensions Object with width/height properties\n * @param {Number|String} [dimensions.width] Width of canvas element\n * @param {Number|String} [dimensions.height] Height of canvas element\n * @param {Object} [options] Options object\n * @param {Boolean} [options.backstoreOnly=false] Set the given dimensions only as canvas backstore dimensions\n * @param {Boolean} [options.cssOnly=false] Set the given dimensions only as css dimensions\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n setDimensions: function (dimensions, options) {\n var cssValue;\n\n options = options || {};\n\n for (var prop in dimensions) {\n cssValue = dimensions[prop];\n\n if (!options.cssOnly) {\n this._setBackstoreDimension(prop, dimensions[prop]);\n cssValue += 'px';\n this.hasLostContext = true;\n }\n\n if (!options.backstoreOnly) {\n this._setCssDimension(prop, cssValue);\n }\n }\n if (this._isCurrentlyDrawing) {\n this.freeDrawingBrush && this.freeDrawingBrush._setBrushStyles(this.contextTop);\n }\n this._initRetinaScaling();\n this.calcOffset();\n\n if (!options.cssOnly) {\n this.requestRenderAll();\n }\n\n return this;\n },\n\n /**\n * Helper for setting width/height\n * @private\n * @param {String} prop property (width|height)\n * @param {Number} value value to set property to\n * @return {fabric.Canvas} instance\n * @chainable true\n */\n _setBackstoreDimension: function (prop, value) {\n this.lowerCanvasEl[prop] = value;\n\n if (this.upperCanvasEl) {\n this.upperCanvasEl[prop] = value;\n }\n\n if (this.cacheCanvasEl) {\n this.cacheCanvasEl[prop] = value;\n }\n\n this[prop] = value;\n\n return this;\n },\n\n /**\n * Helper for setting css width/height\n * @private\n * @param {String} prop property (width|height)\n * @param {String} value value to set property to\n * @return {fabric.Canvas} instance\n * @chainable true\n */\n _setCssDimension: function (prop, value) {\n this.lowerCanvasEl.style[prop] = value;\n\n if (this.upperCanvasEl) {\n this.upperCanvasEl.style[prop] = value;\n }\n\n if (this.wrapperEl) {\n this.wrapperEl.style[prop] = value;\n }\n\n return this;\n },\n\n /**\n * Returns canvas zoom level\n * @return {Number}\n */\n getZoom: function () {\n return this.viewportTransform[0];\n },\n\n /**\n * Sets viewport transformation of this canvas instance\n * @param {Array} vpt a Canvas 2D API transform matrix\n * @return {fabric.Canvas} instance\n * @chainable true\n */\n setViewportTransform: function (vpt) {\n var activeObject = this._activeObject,\n backgroundObject = this.backgroundImage,\n overlayObject = this.overlayImage,\n object, i, len;\n this.viewportTransform = vpt;\n for (i = 0, len = this._objects.length; i < len; i++) {\n object = this._objects[i];\n object.group || object.setCoords(true);\n }\n if (activeObject) {\n activeObject.setCoords();\n }\n if (backgroundObject) {\n backgroundObject.setCoords(true);\n }\n if (overlayObject) {\n overlayObject.setCoords(true);\n }\n this.calcViewportBoundaries();\n this.renderOnAddRemove && this.requestRenderAll();\n return this;\n },\n\n /**\n * Sets zoom level of this canvas instance, the zoom centered around point\n * meaning that following zoom to point with the same point will have the visual\n * effect of the zoom originating from that point. The point won't move.\n * It has nothing to do with canvas center or visual center of the viewport.\n * @param {fabric.Point} point to zoom with respect to\n * @param {Number} value to set zoom to, less than 1 zooms out\n * @return {fabric.Canvas} instance\n * @chainable true\n */\n zoomToPoint: function (point, value) {\n // TODO: just change the scale, preserve other transformations\n var before = point, vpt = this.viewportTransform.slice(0);\n point = transformPoint(point, invertTransform(this.viewportTransform));\n vpt[0] = value;\n vpt[3] = value;\n var after = transformPoint(point, vpt);\n vpt[4] += before.x - after.x;\n vpt[5] += before.y - after.y;\n return this.setViewportTransform(vpt);\n },\n\n /**\n * Sets zoom level of this canvas instance\n * @param {Number} value to set zoom to, less than 1 zooms out\n * @return {fabric.Canvas} instance\n * @chainable true\n */\n setZoom: function (value) {\n this.zoomToPoint(new fabric.Point(0, 0), value);\n return this;\n },\n\n /**\n * Pan viewport so as to place point at top left corner of canvas\n * @param {fabric.Point} point to move to\n * @return {fabric.Canvas} instance\n * @chainable true\n */\n absolutePan: function (point) {\n var vpt = this.viewportTransform.slice(0);\n vpt[4] = -point.x;\n vpt[5] = -point.y;\n return this.setViewportTransform(vpt);\n },\n\n /**\n * Pans viewpoint relatively\n * @param {fabric.Point} point (position vector) to move by\n * @return {fabric.Canvas} instance\n * @chainable true\n */\n relativePan: function (point) {\n return this.absolutePan(new fabric.Point(\n -point.x - this.viewportTransform[4],\n -point.y - this.viewportTransform[5]\n ));\n },\n\n /**\n * Returns <canvas> element corresponding to this instance\n * @return {HTMLCanvasElement}\n */\n getElement: function () {\n return this.lowerCanvasEl;\n },\n\n /**\n * @private\n * @param {fabric.Object} obj Object that was added\n */\n _onObjectAdded: function(obj) {\n this.stateful && obj.setupState();\n obj._set('canvas', this);\n obj.setCoords();\n this.fire('object:added', { target: obj });\n obj.fire('added');\n },\n\n /**\n * @private\n * @param {fabric.Object} obj Object that was removed\n */\n _onObjectRemoved: function(obj) {\n this.fire('object:removed', { target: obj });\n obj.fire('removed');\n delete obj.canvas;\n },\n\n /**\n * Clears specified context of canvas element\n * @param {CanvasRenderingContext2D} ctx Context to clear\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n clearContext: function(ctx) {\n ctx.clearRect(0, 0, this.width, this.height);\n return this;\n },\n\n /**\n * Returns context of canvas where objects are drawn\n * @return {CanvasRenderingContext2D}\n */\n getContext: function () {\n return this.contextContainer;\n },\n\n /**\n * Clears all contexts (background, main, top) of an instance\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n clear: function () {\n this.remove.apply(this, this.getObjects());\n this.backgroundImage = null;\n this.overlayImage = null;\n this.backgroundColor = '';\n this.overlayColor = '';\n if (this._hasITextHandlers) {\n this.off('mouse:up', this._mouseUpITextHandler);\n this._iTextInstances = null;\n this._hasITextHandlers = false;\n }\n this.clearContext(this.contextContainer);\n this.fire('canvas:cleared');\n this.renderOnAddRemove && this.requestRenderAll();\n return this;\n },\n\n /**\n * Renders the canvas\n * @return {fabric.Canvas} instance\n * @chainable\n */\n renderAll: function () {\n var canvasToDrawOn = this.contextContainer;\n this.renderCanvas(canvasToDrawOn, this._objects);\n return this;\n },\n\n /**\n * Function created to be instance bound at initialization\n * used in requestAnimationFrame rendering\n * Let the fabricJS call it. If you call it manually you could have more\n * animationFrame stacking on to of each other\n * for an imperative rendering, use canvas.renderAll\n * @private\n * @return {fabric.Canvas} instance\n * @chainable\n */\n renderAndReset: function() {\n this.isRendering = 0;\n this.renderAll();\n },\n\n /**\n * Append a renderAll request to next animation frame.\n * unless one is already in progress, in that case nothing is done\n * a boolean flag will avoid appending more.\n * @return {fabric.Canvas} instance\n * @chainable\n */\n requestRenderAll: function () {\n if (!this.isRendering) {\n this.isRendering = fabric.util.requestAnimFrame(this.renderAndResetBound);\n }\n return this;\n },\n\n /**\n * Calculate the position of the 4 corner of canvas with current viewportTransform.\n * helps to determinate when an object is in the current rendering viewport using\n * object absolute coordinates ( aCoords )\n * @return {Object} points.tl\n * @chainable\n */\n calcViewportBoundaries: function() {\n var points = { }, width = this.width, height = this.height,\n iVpt = invertTransform(this.viewportTransform);\n points.tl = transformPoint({ x: 0, y: 0 }, iVpt);\n points.br = transformPoint({ x: width, y: height }, iVpt);\n points.tr = new fabric.Point(points.br.x, points.tl.y);\n points.bl = new fabric.Point(points.tl.x, points.br.y);\n this.vptCoords = points;\n return points;\n },\n\n cancelRequestedRender: function() {\n if (this.isRendering) {\n fabric.util.cancelAnimFrame(this.isRendering);\n this.isRendering = 0;\n }\n },\n\n /**\n * Renders background, objects, overlay and controls.\n * @param {CanvasRenderingContext2D} ctx\n * @param {Array} objects to render\n * @return {fabric.Canvas} instance\n * @chainable\n */\n renderCanvas: function(ctx, objects) {\n var v = this.viewportTransform, path = this.clipPath;\n this.cancelRequestedRender();\n this.calcViewportBoundaries();\n this.clearContext(ctx);\n fabric.util.setImageSmoothing(ctx, this.imageSmoothingEnabled);\n this.fire('before:render', { ctx: ctx, });\n this._renderBackground(ctx);\n\n ctx.save();\n //apply viewport transform once for all rendering process\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n this._renderObjects(ctx, objects);\n ctx.restore();\n if (!this.controlsAboveOverlay && this.interactive) {\n this.drawControls(ctx);\n }\n if (path) {\n path.canvas = this;\n // needed to setup a couple of variables\n path.shouldCache();\n path._transformDone = true;\n path.renderCache({ forClipping: true });\n this.drawClipPathOnCanvas(ctx);\n }\n this._renderOverlay(ctx);\n if (this.controlsAboveOverlay && this.interactive) {\n this.drawControls(ctx);\n }\n this.fire('after:render', { ctx: ctx, });\n },\n\n /**\n * Paint the cached clipPath on the lowerCanvasEl\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawClipPathOnCanvas: function(ctx) {\n var v = this.viewportTransform, path = this.clipPath;\n ctx.save();\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n // DEBUG: uncomment this line, comment the following\n // ctx.globalAlpha = 0.4;\n ctx.globalCompositeOperation = 'destination-in';\n path.transform(ctx);\n ctx.scale(1 / path.zoomX, 1 / path.zoomY);\n ctx.drawImage(path._cacheCanvas, -path.cacheTranslationX, -path.cacheTranslationY);\n ctx.restore();\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Array} objects to render\n */\n _renderObjects: function(ctx, objects) {\n var i, len;\n for (i = 0, len = objects.length; i < len; ++i) {\n objects[i] && objects[i].render(ctx);\n }\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {string} property 'background' or 'overlay'\n */\n _renderBackgroundOrOverlay: function(ctx, property) {\n var fill = this[property + 'Color'], object = this[property + 'Image'],\n v = this.viewportTransform, needsVpt = this[property + 'Vpt'];\n if (!fill && !object) {\n return;\n }\n if (fill) {\n ctx.save();\n ctx.beginPath();\n ctx.moveTo(0, 0);\n ctx.lineTo(this.width, 0);\n ctx.lineTo(this.width, this.height);\n ctx.lineTo(0, this.height);\n ctx.closePath();\n ctx.fillStyle = fill.toLive\n ? fill.toLive(ctx, this)\n : fill;\n if (needsVpt) {\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n }\n ctx.transform(1, 0, 0, 1, fill.offsetX || 0, fill.offsetY || 0);\n var m = fill.gradientTransform || fill.patternTransform;\n m && ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n ctx.fill();\n ctx.restore();\n }\n if (object) {\n ctx.save();\n if (needsVpt) {\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n }\n object.render(ctx);\n ctx.restore();\n }\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderBackground: function(ctx) {\n this._renderBackgroundOrOverlay(ctx, 'background');\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderOverlay: function(ctx) {\n this._renderBackgroundOrOverlay(ctx, 'overlay');\n },\n\n /**\n * Returns coordinates of a center of canvas.\n * Returned value is an object with top and left properties\n * @return {Object} object with \"top\" and \"left\" number values\n * @deprecated migrate to `getCenterPoint`\n */\n getCenter: function () {\n return {\n top: this.height / 2,\n left: this.width / 2\n };\n },\n\n /**\n * Returns coordinates of a center of canvas.\n * @return {fabric.Point} \n */\n getCenterPoint: function () {\n return new fabric.Point(this.width / 2, this.height / 2);\n },\n\n /**\n * Centers object horizontally in the canvas\n * @param {fabric.Object} object Object to center horizontally\n * @return {fabric.Canvas} thisArg\n */\n centerObjectH: function (object) {\n return this._centerObject(object, new fabric.Point(this.getCenterPoint().x, object.getCenterPoint().y));\n },\n\n /**\n * Centers object vertically in the canvas\n * @param {fabric.Object} object Object to center vertically\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n centerObjectV: function (object) {\n return this._centerObject(object, new fabric.Point(object.getCenterPoint().x, this.getCenterPoint().y));\n },\n\n /**\n * Centers object vertically and horizontally in the canvas\n * @param {fabric.Object} object Object to center vertically and horizontally\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n centerObject: function(object) {\n var center = this.getCenterPoint();\n return this._centerObject(object, center);\n },\n\n /**\n * Centers object vertically and horizontally in the viewport\n * @param {fabric.Object} object Object to center vertically and horizontally\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n viewportCenterObject: function(object) {\n var vpCenter = this.getVpCenter();\n return this._centerObject(object, vpCenter);\n },\n\n /**\n * Centers object horizontally in the viewport, object.top is unchanged\n * @param {fabric.Object} object Object to center vertically and horizontally\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n viewportCenterObjectH: function(object) {\n var vpCenter = this.getVpCenter();\n this._centerObject(object, new fabric.Point(vpCenter.x, object.getCenterPoint().y));\n return this;\n },\n\n /**\n * Centers object Vertically in the viewport, object.top is unchanged\n * @param {fabric.Object} object Object to center vertically and horizontally\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n viewportCenterObjectV: function(object) {\n var vpCenter = this.getVpCenter();\n\n return this._centerObject(object, new fabric.Point(object.getCenterPoint().x, vpCenter.y));\n },\n\n /**\n * Calculate the point in canvas that correspond to the center of actual viewport.\n * @return {fabric.Point} vpCenter, viewport center\n * @chainable\n */\n getVpCenter: function() {\n var center = this.getCenterPoint(),\n iVpt = invertTransform(this.viewportTransform);\n return transformPoint(center, iVpt);\n },\n\n /**\n * @private\n * @param {fabric.Object} object Object to center\n * @param {fabric.Point} center Center point\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n _centerObject: function(object, center) {\n object.setPositionByOrigin(center, 'center', 'center');\n object.setCoords();\n this.renderOnAddRemove && this.requestRenderAll();\n return this;\n },\n\n /**\n * Returns dataless JSON representation of canvas\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {String} json string\n */\n toDatalessJSON: function (propertiesToInclude) {\n return this.toDatalessObject(propertiesToInclude);\n },\n\n /**\n * Returns object representation of canvas\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject: function (propertiesToInclude) {\n return this._toObjectMethod('toObject', propertiesToInclude);\n },\n\n /**\n * Returns dataless object representation of canvas\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toDatalessObject: function (propertiesToInclude) {\n return this._toObjectMethod('toDatalessObject', propertiesToInclude);\n },\n\n /**\n * @private\n */\n _toObjectMethod: function (methodName, propertiesToInclude) {\n\n var clipPath = this.clipPath, data = {\n version: fabric.version,\n objects: this._toObjects(methodName, propertiesToInclude),\n };\n if (clipPath && !clipPath.excludeFromExport) {\n data.clipPath = this._toObject(this.clipPath, methodName, propertiesToInclude);\n }\n extend(data, this.__serializeBgOverlay(methodName, propertiesToInclude));\n\n fabric.util.populateWithProperties(this, data, propertiesToInclude);\n\n return data;\n },\n\n /**\n * @private\n */\n _toObjects: function(methodName, propertiesToInclude) {\n return this._objects.filter(function(object) {\n return !object.excludeFromExport;\n }).map(function(instance) {\n return this._toObject(instance, methodName, propertiesToInclude);\n }, this);\n },\n\n /**\n * @private\n */\n _toObject: function(instance, methodName, propertiesToInclude) {\n var originalValue;\n\n if (!this.includeDefaultValues) {\n originalValue = instance.includeDefaultValues;\n instance.includeDefaultValues = false;\n }\n\n var object = instance[methodName](propertiesToInclude);\n if (!this.includeDefaultValues) {\n instance.includeDefaultValues = originalValue;\n }\n return object;\n },\n\n /**\n * @private\n */\n __serializeBgOverlay: function(methodName, propertiesToInclude) {\n var data = {}, bgImage = this.backgroundImage, overlayImage = this.overlayImage,\n bgColor = this.backgroundColor, overlayColor = this.overlayColor;\n\n if (bgColor && bgColor.toObject) {\n if (!bgColor.excludeFromExport) {\n data.background = bgColor.toObject(propertiesToInclude);\n }\n }\n else if (bgColor) {\n data.background = bgColor;\n }\n\n if (overlayColor && overlayColor.toObject) {\n if (!overlayColor.excludeFromExport) {\n data.overlay = overlayColor.toObject(propertiesToInclude);\n }\n }\n else if (overlayColor) {\n data.overlay = overlayColor;\n }\n\n if (bgImage && !bgImage.excludeFromExport) {\n data.backgroundImage = this._toObject(bgImage, methodName, propertiesToInclude);\n }\n if (overlayImage && !overlayImage.excludeFromExport) {\n data.overlayImage = this._toObject(overlayImage, methodName, propertiesToInclude);\n }\n\n return data;\n },\n\n /* _TO_SVG_START_ */\n /**\n * When true, getSvgTransform() will apply the StaticCanvas.viewportTransform to the SVG transformation. When true,\n * a zoomed canvas will then produce zoomed SVG output.\n * @type Boolean\n * @default\n */\n svgViewportTransformation: true,\n\n /**\n * Returns SVG representation of canvas\n * @function\n * @param {Object} [options] Options object for SVG output\n * @param {Boolean} [options.suppressPreamble=false] If true xml tag is not included\n * @param {Object} [options.viewBox] SVG viewbox object\n * @param {Number} [options.viewBox.x] x-coordinate of viewbox\n * @param {Number} [options.viewBox.y] y-coordinate of viewbox\n * @param {Number} [options.viewBox.width] Width of viewbox\n * @param {Number} [options.viewBox.height] Height of viewbox\n * @param {String} [options.encoding=UTF-8] Encoding of SVG output\n * @param {String} [options.width] desired width of svg with or without units\n * @param {String} [options.height] desired height of svg with or without units\n * @param {Function} [reviver] Method for further parsing of svg elements, called after each fabric object converted into svg representation.\n * @return {String} SVG string\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#serialization}\n * @see {@link http://jsfiddle.net/fabricjs/jQ3ZZ/|jsFiddle demo}\n * @example Normal SVG output\n * var svg = canvas.toSVG();\n * @example SVG output without preamble (without <?xml ../>)\n * var svg = canvas.toSVG({suppressPreamble: true});\n * @example SVG output with viewBox attribute\n * var svg = canvas.toSVG({\n * viewBox: {\n * x: 100,\n * y: 100,\n * width: 200,\n * height: 300\n * }\n * });\n * @example SVG output with different encoding (default: UTF-8)\n * var svg = canvas.toSVG({encoding: 'ISO-8859-1'});\n * @example Modify SVG output with reviver function\n * var svg = canvas.toSVG(null, function(svg) {\n * return svg.replace('stroke-dasharray: ; stroke-linecap: butt; stroke-linejoin: miter; stroke-miterlimit: 10; ', '');\n * });\n */\n toSVG: function(options, reviver) {\n options || (options = { });\n options.reviver = reviver;\n var markup = [];\n\n this._setSVGPreamble(markup, options);\n this._setSVGHeader(markup, options);\n if (this.clipPath) {\n markup.push('\\n');\n }\n this._setSVGBgOverlayColor(markup, 'background');\n this._setSVGBgOverlayImage(markup, 'backgroundImage', reviver);\n this._setSVGObjects(markup, reviver);\n if (this.clipPath) {\n markup.push('\\n');\n }\n this._setSVGBgOverlayColor(markup, 'overlay');\n this._setSVGBgOverlayImage(markup, 'overlayImage', reviver);\n\n markup.push('');\n\n return markup.join('');\n },\n\n /**\n * @private\n */\n _setSVGPreamble: function(markup, options) {\n if (options.suppressPreamble) {\n return;\n }\n markup.push(\n '\\n',\n '\\n'\n );\n },\n\n /**\n * @private\n */\n _setSVGHeader: function(markup, options) {\n var width = options.width || this.width,\n height = options.height || this.height,\n vpt, viewBox = 'viewBox=\"0 0 ' + this.width + ' ' + this.height + '\" ',\n NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS;\n\n if (options.viewBox) {\n viewBox = 'viewBox=\"' +\n options.viewBox.x + ' ' +\n options.viewBox.y + ' ' +\n options.viewBox.width + ' ' +\n options.viewBox.height + '\" ';\n }\n else {\n if (this.svgViewportTransformation) {\n vpt = this.viewportTransform;\n viewBox = 'viewBox=\"' +\n toFixed(-vpt[4] / vpt[0], NUM_FRACTION_DIGITS) + ' ' +\n toFixed(-vpt[5] / vpt[3], NUM_FRACTION_DIGITS) + ' ' +\n toFixed(this.width / vpt[0], NUM_FRACTION_DIGITS) + ' ' +\n toFixed(this.height / vpt[3], NUM_FRACTION_DIGITS) + '\" ';\n }\n }\n\n markup.push(\n '\\n',\n 'Created with Fabric.js ', fabric.version, '\\n',\n '\\n',\n this.createSVGFontFacesMarkup(),\n this.createSVGRefElementsMarkup(),\n this.createSVGClipPathMarkup(options),\n '\\n'\n );\n },\n\n createSVGClipPathMarkup: function(options) {\n var clipPath = this.clipPath;\n if (clipPath) {\n clipPath.clipPathId = 'CLIPPATH_' + fabric.Object.__uid++;\n return '\\n' +\n this.clipPath.toClipPathSVG(options.reviver) +\n '\\n';\n }\n return '';\n },\n\n /**\n * Creates markup containing SVG referenced elements like patterns, gradients etc.\n * @return {String}\n */\n createSVGRefElementsMarkup: function() {\n var _this = this,\n markup = ['background', 'overlay'].map(function(prop) {\n var fill = _this[prop + 'Color'];\n if (fill && fill.toLive) {\n var shouldTransform = _this[prop + 'Vpt'], vpt = _this.viewportTransform,\n object = {\n width: _this.width / (shouldTransform ? vpt[0] : 1),\n height: _this.height / (shouldTransform ? vpt[3] : 1)\n };\n return fill.toSVG(\n object,\n { additionalTransform: shouldTransform ? fabric.util.matrixToSVG(vpt) : '' }\n );\n }\n });\n return markup.join('');\n },\n\n /**\n * Creates markup containing SVG font faces,\n * font URLs for font faces must be collected by developers\n * and are not extracted from the DOM by fabricjs\n * @param {Array} objects Array of fabric objects\n * @return {String}\n */\n createSVGFontFacesMarkup: function() {\n var markup = '', fontList = { }, obj, fontFamily,\n style, row, rowIndex, _char, charIndex, i, len,\n fontPaths = fabric.fontPaths, objects = [];\n\n this._objects.forEach(function add(object) {\n objects.push(object);\n if (object._objects) {\n object._objects.forEach(add);\n }\n });\n\n for (i = 0, len = objects.length; i < len; i++) {\n obj = objects[i];\n fontFamily = obj.fontFamily;\n if (obj.type.indexOf('text') === -1 || fontList[fontFamily] || !fontPaths[fontFamily]) {\n continue;\n }\n fontList[fontFamily] = true;\n if (!obj.styles) {\n continue;\n }\n style = obj.styles;\n for (rowIndex in style) {\n row = style[rowIndex];\n for (charIndex in row) {\n _char = row[charIndex];\n fontFamily = _char.fontFamily;\n if (!fontList[fontFamily] && fontPaths[fontFamily]) {\n fontList[fontFamily] = true;\n }\n }\n }\n }\n\n for (var j in fontList) {\n markup += [\n '\\t\\t@font-face {\\n',\n '\\t\\t\\tfont-family: \\'', j, '\\';\\n',\n '\\t\\t\\tsrc: url(\\'', fontPaths[j], '\\');\\n',\n '\\t\\t}\\n'\n ].join('');\n }\n\n if (markup) {\n markup = [\n '\\t\\n'\n ].join('');\n }\n\n return markup;\n },\n\n /**\n * @private\n */\n _setSVGObjects: function(markup, reviver) {\n var instance, i, len, objects = this._objects;\n for (i = 0, len = objects.length; i < len; i++) {\n instance = objects[i];\n if (instance.excludeFromExport) {\n continue;\n }\n this._setSVGObject(markup, instance, reviver);\n }\n },\n\n /**\n * @private\n */\n _setSVGObject: function(markup, instance, reviver) {\n markup.push(instance.toSVG(reviver));\n },\n\n /**\n * @private\n */\n _setSVGBgOverlayImage: function(markup, property, reviver) {\n if (this[property] && !this[property].excludeFromExport && this[property].toSVG) {\n markup.push(this[property].toSVG(reviver));\n }\n },\n\n /**\n * @private\n */\n _setSVGBgOverlayColor: function(markup, property) {\n var filler = this[property + 'Color'], vpt = this.viewportTransform, finalWidth = this.width,\n finalHeight = this.height;\n if (!filler) {\n return;\n }\n if (filler.toLive) {\n var repeat = filler.repeat, iVpt = fabric.util.invertTransform(vpt), shouldInvert = this[property + 'Vpt'],\n additionalTransform = shouldInvert ? fabric.util.matrixToSVG(iVpt) : '';\n markup.push(\n '\\n'\n );\n }\n else {\n markup.push(\n '\\n'\n );\n }\n },\n /* _TO_SVG_END_ */\n\n /**\n * Moves an object or the objects of a multiple selection\n * to the bottom of the stack of drawn objects\n * @param {fabric.Object} object Object to send to back\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n sendToBack: function (object) {\n if (!object) {\n return this;\n }\n var activeSelection = this._activeObject,\n i, obj, objs;\n if (object === activeSelection && object.type === 'activeSelection') {\n objs = activeSelection._objects;\n for (i = objs.length; i--;) {\n obj = objs[i];\n removeFromArray(this._objects, obj);\n this._objects.unshift(obj);\n }\n }\n else {\n removeFromArray(this._objects, object);\n this._objects.unshift(object);\n }\n this.renderOnAddRemove && this.requestRenderAll();\n return this;\n },\n\n /**\n * Moves an object or the objects of a multiple selection\n * to the top of the stack of drawn objects\n * @param {fabric.Object} object Object to send\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n bringToFront: function (object) {\n if (!object) {\n return this;\n }\n var activeSelection = this._activeObject,\n i, obj, objs;\n if (object === activeSelection && object.type === 'activeSelection') {\n objs = activeSelection._objects;\n for (i = 0; i < objs.length; i++) {\n obj = objs[i];\n removeFromArray(this._objects, obj);\n this._objects.push(obj);\n }\n }\n else {\n removeFromArray(this._objects, object);\n this._objects.push(object);\n }\n this.renderOnAddRemove && this.requestRenderAll();\n return this;\n },\n\n /**\n * Moves an object or a selection down in stack of drawn objects\n * An optional parameter, intersecting allows to move the object in behind\n * the first intersecting object. Where intersection is calculated with\n * bounding box. If no intersection is found, there will not be change in the\n * stack.\n * @param {fabric.Object} object Object to send\n * @param {Boolean} [intersecting] If `true`, send object behind next lower intersecting object\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n sendBackwards: function (object, intersecting) {\n if (!object) {\n return this;\n }\n var activeSelection = this._activeObject,\n i, obj, idx, newIdx, objs, objsMoved = 0;\n\n if (object === activeSelection && object.type === 'activeSelection') {\n objs = activeSelection._objects;\n for (i = 0; i < objs.length; i++) {\n obj = objs[i];\n idx = this._objects.indexOf(obj);\n if (idx > 0 + objsMoved) {\n newIdx = idx - 1;\n removeFromArray(this._objects, obj);\n this._objects.splice(newIdx, 0, obj);\n }\n objsMoved++;\n }\n }\n else {\n idx = this._objects.indexOf(object);\n if (idx !== 0) {\n // if object is not on the bottom of stack\n newIdx = this._findNewLowerIndex(object, idx, intersecting);\n removeFromArray(this._objects, object);\n this._objects.splice(newIdx, 0, object);\n }\n }\n this.renderOnAddRemove && this.requestRenderAll();\n return this;\n },\n\n /**\n * @private\n */\n _findNewLowerIndex: function(object, idx, intersecting) {\n var newIdx, i;\n\n if (intersecting) {\n newIdx = idx;\n\n // traverse down the stack looking for the nearest intersecting object\n for (i = idx - 1; i >= 0; --i) {\n\n var isIntersecting = object.intersectsWithObject(this._objects[i]) ||\n object.isContainedWithinObject(this._objects[i]) ||\n this._objects[i].isContainedWithinObject(object);\n\n if (isIntersecting) {\n newIdx = i;\n break;\n }\n }\n }\n else {\n newIdx = idx - 1;\n }\n\n return newIdx;\n },\n\n /**\n * Moves an object or a selection up in stack of drawn objects\n * An optional parameter, intersecting allows to move the object in front\n * of the first intersecting object. Where intersection is calculated with\n * bounding box. If no intersection is found, there will not be change in the\n * stack.\n * @param {fabric.Object} object Object to send\n * @param {Boolean} [intersecting] If `true`, send object in front of next upper intersecting object\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n bringForward: function (object, intersecting) {\n if (!object) {\n return this;\n }\n var activeSelection = this._activeObject,\n i, obj, idx, newIdx, objs, objsMoved = 0;\n\n if (object === activeSelection && object.type === 'activeSelection') {\n objs = activeSelection._objects;\n for (i = objs.length; i--;) {\n obj = objs[i];\n idx = this._objects.indexOf(obj);\n if (idx < this._objects.length - 1 - objsMoved) {\n newIdx = idx + 1;\n removeFromArray(this._objects, obj);\n this._objects.splice(newIdx, 0, obj);\n }\n objsMoved++;\n }\n }\n else {\n idx = this._objects.indexOf(object);\n if (idx !== this._objects.length - 1) {\n // if object is not on top of stack (last item in an array)\n newIdx = this._findNewUpperIndex(object, idx, intersecting);\n removeFromArray(this._objects, object);\n this._objects.splice(newIdx, 0, object);\n }\n }\n this.renderOnAddRemove && this.requestRenderAll();\n return this;\n },\n\n /**\n * @private\n */\n _findNewUpperIndex: function(object, idx, intersecting) {\n var newIdx, i, len;\n\n if (intersecting) {\n newIdx = idx;\n\n // traverse up the stack looking for the nearest intersecting object\n for (i = idx + 1, len = this._objects.length; i < len; ++i) {\n\n var isIntersecting = object.intersectsWithObject(this._objects[i]) ||\n object.isContainedWithinObject(this._objects[i]) ||\n this._objects[i].isContainedWithinObject(object);\n\n if (isIntersecting) {\n newIdx = i;\n break;\n }\n }\n }\n else {\n newIdx = idx + 1;\n }\n\n return newIdx;\n },\n\n /**\n * Moves an object to specified level in stack of drawn objects\n * @param {fabric.Object} object Object to send\n * @param {Number} index Position to move to\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n moveTo: function (object, index) {\n removeFromArray(this._objects, object);\n this._objects.splice(index, 0, object);\n return this.renderOnAddRemove && this.requestRenderAll();\n },\n\n /**\n * Clears a canvas element and dispose objects\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n dispose: function () {\n // cancel eventually ongoing renders\n if (this.isRendering) {\n fabric.util.cancelAnimFrame(this.isRendering);\n this.isRendering = 0;\n }\n this.forEachObject(function(object) {\n object.dispose && object.dispose();\n });\n this._objects = [];\n if (this.backgroundImage && this.backgroundImage.dispose) {\n this.backgroundImage.dispose();\n }\n this.backgroundImage = null;\n if (this.overlayImage && this.overlayImage.dispose) {\n this.overlayImage.dispose();\n }\n this.overlayImage = null;\n this._iTextInstances = null;\n this.contextContainer = null;\n // restore canvas style\n this.lowerCanvasEl.classList.remove('lower-canvas');\n fabric.util.setStyle(this.lowerCanvasEl, this._originalCanvasStyle);\n delete this._originalCanvasStyle;\n // restore canvas size to original size in case retina scaling was applied\n this.lowerCanvasEl.setAttribute('width', this.width);\n this.lowerCanvasEl.setAttribute('height', this.height);\n fabric.util.cleanUpJsdomNode(this.lowerCanvasEl);\n this.lowerCanvasEl = undefined;\n return this;\n },\n\n /**\n * Returns a string representation of an instance\n * @return {String} string representation of an instance\n */\n toString: function () {\n return '#';\n }\n });\n\n extend(fabric.StaticCanvas.prototype, fabric.Observable);\n extend(fabric.StaticCanvas.prototype, fabric.Collection);\n extend(fabric.StaticCanvas.prototype, fabric.DataURLExporter);\n\n extend(fabric.StaticCanvas, /** @lends fabric.StaticCanvas */ {\n\n /**\n * @static\n * @type String\n * @default\n */\n EMPTY_JSON: '{\"objects\": [], \"background\": \"white\"}',\n\n /**\n * Provides a way to check support of some of the canvas methods\n * (either those of HTMLCanvasElement itself, or rendering context)\n *\n * @param {String} methodName Method to check support for;\n * Could be one of \"setLineDash\"\n * @return {Boolean | null} `true` if method is supported (or at least exists),\n * `null` if canvas element or context can not be initialized\n */\n supports: function (methodName) {\n var el = createCanvasElement();\n\n if (!el || !el.getContext) {\n return null;\n }\n\n var ctx = el.getContext('2d');\n if (!ctx) {\n return null;\n }\n\n switch (methodName) {\n\n case 'setLineDash':\n return typeof ctx.setLineDash !== 'undefined';\n\n default:\n return null;\n }\n }\n });\n\n /**\n * Returns Object representation of canvas\n * this alias is provided because if you call JSON.stringify on an instance,\n * the toJSON object will be invoked if it exists.\n * Having a toJSON method means you can do JSON.stringify(myCanvas)\n * @function\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} JSON compatible object\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#serialization}\n * @see {@link http://jsfiddle.net/fabricjs/pec86/|jsFiddle demo}\n * @example JSON without additional properties\n * var json = canvas.toJSON();\n * @example JSON with additional properties included\n * var json = canvas.toJSON(['lockMovementX', 'lockMovementY', 'lockRotation', 'lockScalingX', 'lockScalingY']);\n * @example JSON without default values\n * canvas.includeDefaultValues = false;\n * var json = canvas.toJSON();\n */\n fabric.StaticCanvas.prototype.toJSON = fabric.StaticCanvas.prototype.toObject;\n\n if (fabric.isLikelyNode) {\n fabric.StaticCanvas.prototype.createPNGStream = function() {\n var impl = getNodeCanvas(this.lowerCanvasEl);\n return impl && impl.createPNGStream();\n };\n fabric.StaticCanvas.prototype.createJPEGStream = function(opts) {\n var impl = getNodeCanvas(this.lowerCanvasEl);\n return impl && impl.createJPEGStream(opts);\n };\n }\n})();\n\n\n/**\n * BaseBrush class\n * @class fabric.BaseBrush\n * @see {@link http://fabricjs.com/freedrawing|Freedrawing demo}\n */\nfabric.BaseBrush = fabric.util.createClass(/** @lends fabric.BaseBrush.prototype */ {\n\n /**\n * Color of a brush\n * @type String\n * @default\n */\n color: 'rgb(0, 0, 0)',\n\n /**\n * Width of a brush, has to be a Number, no string literals\n * @type Number\n * @default\n */\n width: 1,\n\n /**\n * Shadow object representing shadow of this shape.\n * Backwards incompatibility note: This property replaces \"shadowColor\" (String), \"shadowOffsetX\" (Number),\n * \"shadowOffsetY\" (Number) and \"shadowBlur\" (Number) since v1.2.12\n * @type fabric.Shadow\n * @default\n */\n shadow: null,\n\n /**\n * Line endings style of a brush (one of \"butt\", \"round\", \"square\")\n * @type String\n * @default\n */\n strokeLineCap: 'round',\n\n /**\n * Corner style of a brush (one of \"bevel\", \"round\", \"miter\")\n * @type String\n * @default\n */\n strokeLineJoin: 'round',\n\n /**\n * Maximum miter length (used for strokeLineJoin = \"miter\") of a brush's\n * @type Number\n * @default\n */\n strokeMiterLimit: 10,\n\n /**\n * Stroke Dash Array.\n * @type Array\n * @default\n */\n strokeDashArray: null,\n\n /**\n * When `true`, the free drawing is limited to the whiteboard size. Default to false.\n * @type Boolean\n * @default false\n */\n\n limitedToCanvasSize: false,\n\n\n /**\n * Sets brush styles\n * @private\n * @param {CanvasRenderingContext2D} ctx\n */\n _setBrushStyles: function (ctx) {\n ctx.strokeStyle = this.color;\n ctx.lineWidth = this.width;\n ctx.lineCap = this.strokeLineCap;\n ctx.miterLimit = this.strokeMiterLimit;\n ctx.lineJoin = this.strokeLineJoin;\n ctx.setLineDash(this.strokeDashArray || []);\n },\n\n /**\n * Sets the transformation on given context\n * @param {RenderingContext2d} ctx context to render on\n * @private\n */\n _saveAndTransform: function(ctx) {\n var v = this.canvas.viewportTransform;\n ctx.save();\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n },\n\n /**\n * Sets brush shadow styles\n * @private\n */\n _setShadow: function() {\n if (!this.shadow) {\n return;\n }\n\n var canvas = this.canvas,\n shadow = this.shadow,\n ctx = canvas.contextTop,\n zoom = canvas.getZoom();\n if (canvas && canvas._isRetinaScaling()) {\n zoom *= fabric.devicePixelRatio;\n }\n\n ctx.shadowColor = shadow.color;\n ctx.shadowBlur = shadow.blur * zoom;\n ctx.shadowOffsetX = shadow.offsetX * zoom;\n ctx.shadowOffsetY = shadow.offsetY * zoom;\n },\n\n needsFullRender: function() {\n var color = new fabric.Color(this.color);\n return color.getAlpha() < 1 || !!this.shadow;\n },\n\n /**\n * Removes brush shadow styles\n * @private\n */\n _resetShadow: function() {\n var ctx = this.canvas.contextTop;\n\n ctx.shadowColor = '';\n ctx.shadowBlur = ctx.shadowOffsetX = ctx.shadowOffsetY = 0;\n },\n\n /**\n * Check is pointer is outside canvas boundaries\n * @param {Object} pointer\n * @private\n */\n _isOutSideCanvas: function(pointer) {\n return pointer.x < 0 || pointer.x > this.canvas.getWidth() || pointer.y < 0 || pointer.y > this.canvas.getHeight();\n }\n});\n\n\n(function() {\n /**\n * PencilBrush class\n * @class fabric.PencilBrush\n * @extends fabric.BaseBrush\n */\n fabric.PencilBrush = fabric.util.createClass(fabric.BaseBrush, /** @lends fabric.PencilBrush.prototype */ {\n\n /**\n * Discard points that are less than `decimate` pixel distant from each other\n * @type Number\n * @default 0.4\n */\n decimate: 0.4,\n\n /**\n * Draws a straight line between last recorded point to current pointer\n * Used for `shift` functionality\n *\n * @type boolean\n * @default false\n */\n drawStraightLine: false,\n\n /**\n * The event modifier key that makes the brush draw a straight line.\n * If `null` or 'none' or any other string that is not a modifier key the feature is disabled.\n * @type {'altKey' | 'shiftKey' | 'ctrlKey' | 'none' | undefined | null}\n */\n straightLineKey: 'shiftKey',\n\n /**\n * Constructor\n * @param {fabric.Canvas} canvas\n * @return {fabric.PencilBrush} Instance of a pencil brush\n */\n initialize: function(canvas) {\n this.canvas = canvas;\n this._points = [];\n },\n\n needsFullRender: function () {\n return this.callSuper('needsFullRender') || this._hasStraightLine;\n },\n\n /**\n * Invoked inside on mouse down and mouse move\n * @param {Object} pointer\n */\n _drawSegment: function (ctx, p1, p2) {\n var midPoint = p1.midPointFrom(p2);\n ctx.quadraticCurveTo(p1.x, p1.y, midPoint.x, midPoint.y);\n return midPoint;\n },\n\n /**\n * Invoked on mouse down\n * @param {Object} pointer\n */\n onMouseDown: function(pointer, options) {\n if (!this.canvas._isMainEvent(options.e)) {\n return;\n }\n this.drawStraightLine = options.e[this.straightLineKey];\n this._prepareForDrawing(pointer);\n // capture coordinates immediately\n // this allows to draw dots (when movement never occurs)\n this._captureDrawingPath(pointer);\n this._render();\n },\n\n /**\n * Invoked on mouse move\n * @param {Object} pointer\n */\n onMouseMove: function(pointer, options) {\n if (!this.canvas._isMainEvent(options.e)) {\n return;\n }\n this.drawStraightLine = options.e[this.straightLineKey];\n if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) {\n return;\n }\n if (this._captureDrawingPath(pointer) && this._points.length > 1) {\n if (this.needsFullRender()) {\n // redraw curve\n // clear top canvas\n this.canvas.clearContext(this.canvas.contextTop);\n this._render();\n }\n else {\n var points = this._points, length = points.length, ctx = this.canvas.contextTop;\n // draw the curve update\n this._saveAndTransform(ctx);\n if (this.oldEnd) {\n ctx.beginPath();\n ctx.moveTo(this.oldEnd.x, this.oldEnd.y);\n }\n this.oldEnd = this._drawSegment(ctx, points[length - 2], points[length - 1], true);\n ctx.stroke();\n ctx.restore();\n }\n }\n },\n\n /**\n * Invoked on mouse up\n */\n onMouseUp: function(options) {\n if (!this.canvas._isMainEvent(options.e)) {\n return true;\n }\n this.drawStraightLine = false;\n this.oldEnd = undefined;\n this._finalizeAndAddPath();\n return false;\n },\n\n /**\n * @private\n * @param {Object} pointer Actual mouse position related to the canvas.\n */\n _prepareForDrawing: function(pointer) {\n\n var p = new fabric.Point(pointer.x, pointer.y);\n\n this._reset();\n this._addPoint(p);\n this.canvas.contextTop.moveTo(p.x, p.y);\n },\n\n /**\n * @private\n * @param {fabric.Point} point Point to be added to points array\n */\n _addPoint: function(point) {\n if (this._points.length > 1 && point.eq(this._points[this._points.length - 1])) {\n return false;\n }\n if (this.drawStraightLine && this._points.length > 1) {\n this._hasStraightLine = true;\n this._points.pop();\n }\n this._points.push(point);\n return true;\n },\n\n /**\n * Clear points array and set contextTop canvas style.\n * @private\n */\n _reset: function() {\n this._points = [];\n this._setBrushStyles(this.canvas.contextTop);\n this._setShadow();\n this._hasStraightLine = false;\n },\n\n /**\n * @private\n * @param {Object} pointer Actual mouse position related to the canvas.\n */\n _captureDrawingPath: function(pointer) {\n var pointerPoint = new fabric.Point(pointer.x, pointer.y);\n return this._addPoint(pointerPoint);\n },\n\n /**\n * Draw a smooth path on the topCanvas using quadraticCurveTo\n * @private\n * @param {CanvasRenderingContext2D} [ctx]\n */\n _render: function(ctx) {\n var i, len,\n p1 = this._points[0],\n p2 = this._points[1];\n ctx = ctx || this.canvas.contextTop;\n this._saveAndTransform(ctx);\n ctx.beginPath();\n //if we only have 2 points in the path and they are the same\n //it means that the user only clicked the canvas without moving the mouse\n //then we should be drawing a dot. A path isn't drawn between two identical dots\n //that's why we set them apart a bit\n if (this._points.length === 2 && p1.x === p2.x && p1.y === p2.y) {\n var width = this.width / 1000;\n p1 = new fabric.Point(p1.x, p1.y);\n p2 = new fabric.Point(p2.x, p2.y);\n p1.x -= width;\n p2.x += width;\n }\n ctx.moveTo(p1.x, p1.y);\n\n for (i = 1, len = this._points.length; i < len; i++) {\n // we pick the point between pi + 1 & pi + 2 as the\n // end point and p1 as our control point.\n this._drawSegment(ctx, p1, p2);\n p1 = this._points[i];\n p2 = this._points[i + 1];\n }\n // Draw last line as a straight line while\n // we wait for the next point to be able to calculate\n // the bezier control point\n ctx.lineTo(p1.x, p1.y);\n ctx.stroke();\n ctx.restore();\n },\n\n /**\n * Converts points to SVG path\n * @param {Array} points Array of points\n * @return {(string|number)[][]} SVG path commands\n */\n convertPointsToSVGPath: function (points) {\n var correction = this.width / 1000;\n return fabric.util.getSmoothPathFromPoints(points, correction);\n },\n\n /**\n * @private\n * @param {(string|number)[][]} pathData SVG path commands\n * @returns {boolean}\n */\n _isEmptySVGPath: function (pathData) {\n var pathString = fabric.util.joinPath(pathData);\n return pathString === 'M 0 0 Q 0 0 0 0 L 0 0';\n },\n\n /**\n * Creates fabric.Path object to add on canvas\n * @param {(string|number)[][]} pathData Path data\n * @return {fabric.Path} Path to add on canvas\n */\n createPath: function(pathData) {\n var path = new fabric.Path(pathData, {\n fill: null,\n stroke: this.color,\n strokeWidth: this.width,\n strokeLineCap: this.strokeLineCap,\n strokeMiterLimit: this.strokeMiterLimit,\n strokeLineJoin: this.strokeLineJoin,\n strokeDashArray: this.strokeDashArray,\n });\n if (this.shadow) {\n this.shadow.affectStroke = true;\n path.shadow = new fabric.Shadow(this.shadow);\n }\n\n return path;\n },\n\n /**\n * Decimate points array with the decimate value\n */\n decimatePoints: function(points, distance) {\n if (points.length <= 2) {\n return points;\n }\n var zoom = this.canvas.getZoom(), adjustedDistance = Math.pow(distance / zoom, 2),\n i, l = points.length - 1, lastPoint = points[0], newPoints = [lastPoint],\n cDistance;\n for (i = 1; i < l - 1; i++) {\n cDistance = Math.pow(lastPoint.x - points[i].x, 2) + Math.pow(lastPoint.y - points[i].y, 2);\n if (cDistance >= adjustedDistance) {\n lastPoint = points[i];\n newPoints.push(lastPoint);\n }\n }\n /**\n * Add the last point from the original line to the end of the array.\n * This ensures decimate doesn't delete the last point on the line, and ensures the line is > 1 point.\n */\n newPoints.push(points[l]);\n return newPoints;\n },\n\n /**\n * On mouseup after drawing the path on contextTop canvas\n * we use the points captured to create an new fabric path object\n * and add it to the fabric canvas.\n */\n _finalizeAndAddPath: function() {\n var ctx = this.canvas.contextTop;\n ctx.closePath();\n if (this.decimate) {\n this._points = this.decimatePoints(this._points, this.decimate);\n }\n var pathData = this.convertPointsToSVGPath(this._points);\n if (this._isEmptySVGPath(pathData)) {\n // do not create 0 width/height paths, as they are\n // rendered inconsistently across browsers\n // Firefox 4, for example, renders a dot,\n // whereas Chrome 10 renders nothing\n this.canvas.requestRenderAll();\n return;\n }\n\n var path = this.createPath(pathData);\n this.canvas.clearContext(this.canvas.contextTop);\n this.canvas.fire('before:path:created', { path: path });\n this.canvas.add(path);\n this.canvas.requestRenderAll();\n path.setCoords();\n this._resetShadow();\n\n\n // fire event 'path' created\n this.canvas.fire('path:created', { path: path });\n }\n });\n})();\n\n\n/**\n * CircleBrush class\n * @class fabric.CircleBrush\n */\nfabric.CircleBrush = fabric.util.createClass(fabric.BaseBrush, /** @lends fabric.CircleBrush.prototype */ {\n\n /**\n * Width of a brush\n * @type Number\n * @default\n */\n width: 10,\n\n /**\n * Constructor\n * @param {fabric.Canvas} canvas\n * @return {fabric.CircleBrush} Instance of a circle brush\n */\n initialize: function(canvas) {\n this.canvas = canvas;\n this.points = [];\n },\n\n /**\n * Invoked inside on mouse down and mouse move\n * @param {Object} pointer\n */\n drawDot: function(pointer) {\n var point = this.addPoint(pointer),\n ctx = this.canvas.contextTop;\n this._saveAndTransform(ctx);\n this.dot(ctx, point);\n ctx.restore();\n },\n\n dot: function(ctx, point) {\n ctx.fillStyle = point.fill;\n ctx.beginPath();\n ctx.arc(point.x, point.y, point.radius, 0, Math.PI * 2, false);\n ctx.closePath();\n ctx.fill();\n },\n\n /**\n * Invoked on mouse down\n */\n onMouseDown: function(pointer) {\n this.points.length = 0;\n this.canvas.clearContext(this.canvas.contextTop);\n this._setShadow();\n this.drawDot(pointer);\n },\n\n /**\n * Render the full state of the brush\n * @private\n */\n _render: function() {\n var ctx = this.canvas.contextTop, i, len,\n points = this.points;\n this._saveAndTransform(ctx);\n for (i = 0, len = points.length; i < len; i++) {\n this.dot(ctx, points[i]);\n }\n ctx.restore();\n },\n\n /**\n * Invoked on mouse move\n * @param {Object} pointer\n */\n onMouseMove: function(pointer) {\n if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) {\n return;\n }\n if (this.needsFullRender()) {\n this.canvas.clearContext(this.canvas.contextTop);\n this.addPoint(pointer);\n this._render();\n }\n else {\n this.drawDot(pointer);\n }\n },\n\n /**\n * Invoked on mouse up\n */\n onMouseUp: function() {\n var originalRenderOnAddRemove = this.canvas.renderOnAddRemove, i, len;\n this.canvas.renderOnAddRemove = false;\n\n var circles = [];\n\n for (i = 0, len = this.points.length; i < len; i++) {\n var point = this.points[i],\n circle = new fabric.Circle({\n radius: point.radius,\n left: point.x,\n top: point.y,\n originX: 'center',\n originY: 'center',\n fill: point.fill\n });\n\n this.shadow && (circle.shadow = new fabric.Shadow(this.shadow));\n\n circles.push(circle);\n }\n var group = new fabric.Group(circles);\n group.canvas = this.canvas;\n\n this.canvas.fire('before:path:created', { path: group });\n this.canvas.add(group);\n this.canvas.fire('path:created', { path: group });\n\n this.canvas.clearContext(this.canvas.contextTop);\n this._resetShadow();\n this.canvas.renderOnAddRemove = originalRenderOnAddRemove;\n this.canvas.requestRenderAll();\n },\n\n /**\n * @param {Object} pointer\n * @return {fabric.Point} Just added pointer point\n */\n addPoint: function(pointer) {\n var pointerPoint = new fabric.Point(pointer.x, pointer.y),\n\n circleRadius = fabric.util.getRandomInt(\n Math.max(0, this.width - 20), this.width + 20) / 2,\n\n circleColor = new fabric.Color(this.color)\n .setAlpha(fabric.util.getRandomInt(0, 100) / 100)\n .toRgba();\n\n pointerPoint.radius = circleRadius;\n pointerPoint.fill = circleColor;\n\n this.points.push(pointerPoint);\n\n return pointerPoint;\n }\n});\n\n\n/**\n * SprayBrush class\n * @class fabric.SprayBrush\n */\nfabric.SprayBrush = fabric.util.createClass( fabric.BaseBrush, /** @lends fabric.SprayBrush.prototype */ {\n\n /**\n * Width of a spray\n * @type Number\n * @default\n */\n width: 10,\n\n /**\n * Density of a spray (number of dots per chunk)\n * @type Number\n * @default\n */\n density: 20,\n\n /**\n * Width of spray dots\n * @type Number\n * @default\n */\n dotWidth: 1,\n\n /**\n * Width variance of spray dots\n * @type Number\n * @default\n */\n dotWidthVariance: 1,\n\n /**\n * Whether opacity of a dot should be random\n * @type Boolean\n * @default\n */\n randomOpacity: false,\n\n /**\n * Whether overlapping dots (rectangles) should be removed (for performance reasons)\n * @type Boolean\n * @default\n */\n optimizeOverlapping: true,\n\n /**\n * Constructor\n * @param {fabric.Canvas} canvas\n * @return {fabric.SprayBrush} Instance of a spray brush\n */\n initialize: function(canvas) {\n this.canvas = canvas;\n this.sprayChunks = [];\n },\n\n /**\n * Invoked on mouse down\n * @param {Object} pointer\n */\n onMouseDown: function(pointer) {\n this.sprayChunks.length = 0;\n this.canvas.clearContext(this.canvas.contextTop);\n this._setShadow();\n\n this.addSprayChunk(pointer);\n this.render(this.sprayChunkPoints);\n },\n\n /**\n * Invoked on mouse move\n * @param {Object} pointer\n */\n onMouseMove: function(pointer) {\n if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) {\n return;\n }\n this.addSprayChunk(pointer);\n this.render(this.sprayChunkPoints);\n },\n\n /**\n * Invoked on mouse up\n */\n onMouseUp: function() {\n var originalRenderOnAddRemove = this.canvas.renderOnAddRemove;\n this.canvas.renderOnAddRemove = false;\n\n var rects = [];\n\n for (var i = 0, ilen = this.sprayChunks.length; i < ilen; i++) {\n var sprayChunk = this.sprayChunks[i];\n\n for (var j = 0, jlen = sprayChunk.length; j < jlen; j++) {\n\n var rect = new fabric.Rect({\n width: sprayChunk[j].width,\n height: sprayChunk[j].width,\n left: sprayChunk[j].x + 1,\n top: sprayChunk[j].y + 1,\n originX: 'center',\n originY: 'center',\n fill: this.color\n });\n rects.push(rect);\n }\n }\n\n if (this.optimizeOverlapping) {\n rects = this._getOptimizedRects(rects);\n }\n\n var group = new fabric.Group(rects);\n this.shadow && group.set('shadow', new fabric.Shadow(this.shadow));\n this.canvas.fire('before:path:created', { path: group });\n this.canvas.add(group);\n this.canvas.fire('path:created', { path: group });\n\n this.canvas.clearContext(this.canvas.contextTop);\n this._resetShadow();\n this.canvas.renderOnAddRemove = originalRenderOnAddRemove;\n this.canvas.requestRenderAll();\n },\n\n /**\n * @private\n * @param {Array} rects\n */\n _getOptimizedRects: function(rects) {\n\n // avoid creating duplicate rects at the same coordinates\n var uniqueRects = { }, key, i, len;\n\n for (i = 0, len = rects.length; i < len; i++) {\n key = rects[i].left + '' + rects[i].top;\n if (!uniqueRects[key]) {\n uniqueRects[key] = rects[i];\n }\n }\n var uniqueRectsArray = [];\n for (key in uniqueRects) {\n uniqueRectsArray.push(uniqueRects[key]);\n }\n\n return uniqueRectsArray;\n },\n\n /**\n * Render new chunk of spray brush\n */\n render: function(sprayChunk) {\n var ctx = this.canvas.contextTop, i, len;\n ctx.fillStyle = this.color;\n\n this._saveAndTransform(ctx);\n\n for (i = 0, len = sprayChunk.length; i < len; i++) {\n var point = sprayChunk[i];\n if (typeof point.opacity !== 'undefined') {\n ctx.globalAlpha = point.opacity;\n }\n ctx.fillRect(point.x, point.y, point.width, point.width);\n }\n ctx.restore();\n },\n\n /**\n * Render all spray chunks\n */\n _render: function() {\n var ctx = this.canvas.contextTop, i, ilen;\n ctx.fillStyle = this.color;\n\n this._saveAndTransform(ctx);\n\n for (i = 0, ilen = this.sprayChunks.length; i < ilen; i++) {\n this.render(this.sprayChunks[i]);\n }\n ctx.restore();\n },\n\n /**\n * @param {Object} pointer\n */\n addSprayChunk: function(pointer) {\n this.sprayChunkPoints = [];\n\n var x, y, width, radius = this.width / 2, i;\n\n for (i = 0; i < this.density; i++) {\n\n x = fabric.util.getRandomInt(pointer.x - radius, pointer.x + radius);\n y = fabric.util.getRandomInt(pointer.y - radius, pointer.y + radius);\n\n if (this.dotWidthVariance) {\n width = fabric.util.getRandomInt(\n // bottom clamp width to 1\n Math.max(1, this.dotWidth - this.dotWidthVariance),\n this.dotWidth + this.dotWidthVariance);\n }\n else {\n width = this.dotWidth;\n }\n\n var point = new fabric.Point(x, y);\n point.width = width;\n\n if (this.randomOpacity) {\n point.opacity = fabric.util.getRandomInt(0, 100) / 100;\n }\n\n this.sprayChunkPoints.push(point);\n }\n\n this.sprayChunks.push(this.sprayChunkPoints);\n }\n});\n\n\n/**\n * PatternBrush class\n * @class fabric.PatternBrush\n * @extends fabric.BaseBrush\n */\nfabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fabric.PatternBrush.prototype */ {\n\n getPatternSrc: function() {\n\n var dotWidth = 20,\n dotDistance = 5,\n patternCanvas = fabric.util.createCanvasElement(),\n patternCtx = patternCanvas.getContext('2d');\n\n patternCanvas.width = patternCanvas.height = dotWidth + dotDistance;\n\n patternCtx.fillStyle = this.color;\n patternCtx.beginPath();\n patternCtx.arc(dotWidth / 2, dotWidth / 2, dotWidth / 2, 0, Math.PI * 2, false);\n patternCtx.closePath();\n patternCtx.fill();\n\n return patternCanvas;\n },\n\n getPatternSrcFunction: function() {\n return String(this.getPatternSrc).replace('this.color', '\"' + this.color + '\"');\n },\n\n /**\n * Creates \"pattern\" instance property\n * @param {CanvasRenderingContext2D} ctx\n */\n getPattern: function(ctx) {\n return ctx.createPattern(this.source || this.getPatternSrc(), 'repeat');\n },\n\n /**\n * Sets brush styles\n * @param {CanvasRenderingContext2D} ctx\n */\n _setBrushStyles: function(ctx) {\n this.callSuper('_setBrushStyles', ctx);\n ctx.strokeStyle = this.getPattern(ctx);\n },\n\n /**\n * Creates path\n */\n createPath: function(pathData) {\n var path = this.callSuper('createPath', pathData),\n topLeft = path._getLeftTopCoords().scalarAdd(path.strokeWidth / 2);\n\n path.stroke = new fabric.Pattern({\n source: this.source || this.getPatternSrcFunction(),\n offsetX: -topLeft.x,\n offsetY: -topLeft.y\n });\n return path;\n }\n});\n\n\n(function() {\n\n var getPointer = fabric.util.getPointer,\n degreesToRadians = fabric.util.degreesToRadians,\n isTouchEvent = fabric.util.isTouchEvent;\n\n /**\n * Canvas class\n * @class fabric.Canvas\n * @extends fabric.StaticCanvas\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#canvas}\n * @see {@link fabric.Canvas#initialize} for constructor definition\n *\n * @fires object:modified at the end of a transform or any change when statefull is true\n * @fires object:rotating while an object is being rotated from the control\n * @fires object:scaling while an object is being scaled by controls\n * @fires object:moving while an object is being dragged\n * @fires object:skewing while an object is being skewed from the controls\n *\n * @fires before:transform before a transform is is started\n * @fires before:selection:cleared\n * @fires selection:cleared\n * @fires selection:updated\n * @fires selection:created\n *\n * @fires path:created after a drawing operation ends and the path is added\n * @fires mouse:down\n * @fires mouse:move\n * @fires mouse:up\n * @fires mouse:down:before on mouse down, before the inner fabric logic runs\n * @fires mouse:move:before on mouse move, before the inner fabric logic runs\n * @fires mouse:up:before on mouse up, before the inner fabric logic runs\n * @fires mouse:over\n * @fires mouse:out\n * @fires mouse:dblclick whenever a native dbl click event fires on the canvas.\n *\n * @fires dragover\n * @fires dragenter\n * @fires dragleave\n * @fires drop:before before drop event. same native event. This is added to handle edge cases\n * @fires drop\n * @fires after:render at the end of the render process, receives the context in the callback\n * @fires before:render at start the render process, receives the context in the callback\n *\n */\n fabric.Canvas = fabric.util.createClass(fabric.StaticCanvas, /** @lends fabric.Canvas.prototype */ {\n\n /**\n * Constructor\n * @param {HTMLElement | String} el <canvas> element to initialize instance on\n * @param {Object} [options] Options object\n * @return {Object} thisArg\n */\n initialize: function(el, options) {\n options || (options = { });\n this.renderAndResetBound = this.renderAndReset.bind(this);\n this.requestRenderAllBound = this.requestRenderAll.bind(this);\n this._initStatic(el, options);\n this._initInteractive();\n this._createCacheCanvas();\n },\n\n /**\n * When true, objects can be transformed by one side (unproportionally)\n * when dragged on the corners that normally would not do that.\n * @type Boolean\n * @default\n * @since fabric 4.0 // changed name and default value\n */\n uniformScaling: true,\n\n /**\n * Indicates which key switches uniform scaling.\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled.\n * totally wrong named. this sounds like `uniform scaling`\n * if Canvas.uniformScaling is true, pressing this will set it to false\n * and viceversa.\n * @since 1.6.2\n * @type String\n * @default\n */\n uniScaleKey: 'shiftKey',\n\n /**\n * When true, objects use center point as the origin of scale transformation.\n * Backwards incompatibility note: This property replaces \"centerTransform\" (Boolean).\n * @since 1.3.4\n * @type Boolean\n * @default\n */\n centeredScaling: false,\n\n /**\n * When true, objects use center point as the origin of rotate transformation.\n * Backwards incompatibility note: This property replaces \"centerTransform\" (Boolean).\n * @since 1.3.4\n * @type Boolean\n * @default\n */\n centeredRotation: false,\n\n /**\n * Indicates which key enable centered Transform\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled feature disabled.\n * @since 1.6.2\n * @type String\n * @default\n */\n centeredKey: 'altKey',\n\n /**\n * Indicates which key enable alternate action on corner\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled feature disabled.\n * @since 1.6.2\n * @type String\n * @default\n */\n altActionKey: 'shiftKey',\n\n /**\n * Indicates that canvas is interactive. This property should not be changed.\n * @type Boolean\n * @default\n */\n interactive: true,\n\n /**\n * Indicates whether group selection should be enabled\n * @type Boolean\n * @default\n */\n selection: true,\n\n /**\n * Indicates which key or keys enable multiple click selection\n * Pass value as a string or array of strings\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * If `null` or empty or containing any other string that is not a modifier key\n * feature is disabled.\n * @since 1.6.2\n * @type String|Array\n * @default\n */\n selectionKey: 'shiftKey',\n\n /**\n * Indicates which key enable alternative selection\n * in case of target overlapping with active object\n * values: 'altKey', 'shiftKey', 'ctrlKey'.\n * For a series of reason that come from the general expectations on how\n * things should work, this feature works only for preserveObjectStacking true.\n * If `null` or 'none' or any other string that is not a modifier key\n * feature is disabled.\n * @since 1.6.5\n * @type null|String\n * @default\n */\n altSelectionKey: null,\n\n /**\n * Color of selection\n * @type String\n * @default\n */\n selectionColor: 'rgba(100, 100, 255, 0.3)', // blue\n\n /**\n * Default dash array pattern\n * If not empty the selection border is dashed\n * @type Array\n */\n selectionDashArray: [],\n\n /**\n * Color of the border of selection (usually slightly darker than color of selection itself)\n * @type String\n * @default\n */\n selectionBorderColor: 'rgba(255, 255, 255, 0.3)',\n\n /**\n * Width of a line used in object/group selection\n * @type Number\n * @default\n */\n selectionLineWidth: 1,\n\n /**\n * Select only shapes that are fully contained in the dragged selection rectangle.\n * @type Boolean\n * @default\n */\n selectionFullyContained: false,\n\n /**\n * Default cursor value used when hovering over an object on canvas\n * @type String\n * @default\n */\n hoverCursor: 'move',\n\n /**\n * Default cursor value used when moving an object on canvas\n * @type String\n * @default\n */\n moveCursor: 'move',\n\n /**\n * Default cursor value used for the entire canvas\n * @type String\n * @default\n */\n defaultCursor: 'default',\n\n /**\n * Cursor value used during free drawing\n * @type String\n * @default\n */\n freeDrawingCursor: 'crosshair',\n\n /**\n * Cursor value used for disabled elements ( corners with disabled action )\n * @type String\n * @since 2.0.0\n * @default\n */\n notAllowedCursor: 'not-allowed',\n\n /**\n * Default element class that's given to wrapper (div) element of canvas\n * @type String\n * @default\n */\n containerClass: 'canvas-container',\n\n /**\n * When true, object detection happens on per-pixel basis rather than on per-bounding-box\n * @type Boolean\n * @default\n */\n perPixelTargetFind: false,\n\n /**\n * Number of pixels around target pixel to tolerate (consider active) during object detection\n * @type Number\n * @default\n */\n targetFindTolerance: 0,\n\n /**\n * When true, target detection is skipped. Target detection will return always undefined.\n * click selection won't work anymore, events will fire with no targets.\n * if something is selected before setting it to true, it will be deselected at the first click.\n * area selection will still work. check the `selection` property too.\n * if you deactivate both, you should look into staticCanvas.\n * @type Boolean\n * @default\n */\n skipTargetFind: false,\n\n /**\n * When true, mouse events on canvas (mousedown/mousemove/mouseup) result in free drawing.\n * After mousedown, mousemove creates a shape,\n * and then mouseup finalizes it and adds an instance of `fabric.Path` onto canvas.\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-4#free_drawing}\n * @type Boolean\n * @default\n */\n isDrawingMode: false,\n\n /**\n * Indicates whether objects should remain in current stack position when selected.\n * When false objects are brought to top and rendered as part of the selection group\n * @type Boolean\n * @default\n */\n preserveObjectStacking: false,\n\n /**\n * Indicates the angle that an object will lock to while rotating.\n * @type Number\n * @since 1.6.7\n * @default\n */\n snapAngle: 0,\n\n /**\n * Indicates the distance from the snapAngle the rotation will lock to the snapAngle.\n * When `null`, the snapThreshold will default to the snapAngle.\n * @type null|Number\n * @since 1.6.7\n * @default\n */\n snapThreshold: null,\n\n /**\n * Indicates if the right click on canvas can output the context menu or not\n * @type Boolean\n * @since 1.6.5\n * @default\n */\n stopContextMenu: false,\n\n /**\n * Indicates if the canvas can fire right click events\n * @type Boolean\n * @since 1.6.5\n * @default\n */\n fireRightClick: false,\n\n /**\n * Indicates if the canvas can fire middle click events\n * @type Boolean\n * @since 1.7.8\n * @default\n */\n fireMiddleClick: false,\n\n /**\n * Keep track of the subTargets for Mouse Events\n * @type fabric.Object[]\n */\n targets: [],\n\n /**\n * When the option is enabled, PointerEvent is used instead of MouseEvent.\n * @type Boolean\n * @default\n */\n enablePointerEvents: false,\n\n /**\n * Keep track of the hovered target\n * @type fabric.Object\n * @private\n */\n _hoveredTarget: null,\n\n /**\n * hold the list of nested targets hovered\n * @type fabric.Object[]\n * @private\n */\n _hoveredTargets: [],\n\n /**\n * @private\n */\n _initInteractive: function() {\n this._currentTransform = null;\n this._groupSelector = null;\n this._initWrapperElement();\n this._createUpperCanvas();\n this._initEventListeners();\n\n this._initRetinaScaling();\n\n this.freeDrawingBrush = fabric.PencilBrush && new fabric.PencilBrush(this);\n\n this.calcOffset();\n },\n\n /**\n * Divides objects in two groups, one to render immediately\n * and one to render as activeGroup.\n * @return {Array} objects to render immediately and pushes the other in the activeGroup.\n */\n _chooseObjectsToRender: function() {\n var activeObjects = this.getActiveObjects(),\n object, objsToRender, activeGroupObjects;\n\n if (activeObjects.length > 0 && !this.preserveObjectStacking) {\n objsToRender = [];\n activeGroupObjects = [];\n for (var i = 0, length = this._objects.length; i < length; i++) {\n object = this._objects[i];\n if (activeObjects.indexOf(object) === -1 ) {\n objsToRender.push(object);\n }\n else {\n activeGroupObjects.push(object);\n }\n }\n if (activeObjects.length > 1) {\n this._activeObject._objects = activeGroupObjects;\n }\n objsToRender.push.apply(objsToRender, activeGroupObjects);\n }\n else {\n objsToRender = this._objects;\n }\n return objsToRender;\n },\n\n /**\n * Renders both the top canvas and the secondary container canvas.\n * @return {fabric.Canvas} instance\n * @chainable\n */\n renderAll: function () {\n if (this.contextTopDirty && !this._groupSelector && !this.isDrawingMode) {\n this.clearContext(this.contextTop);\n this.contextTopDirty = false;\n }\n if (this.hasLostContext) {\n this.renderTopLayer(this.contextTop);\n this.hasLostContext = false;\n }\n var canvasToDrawOn = this.contextContainer;\n this.renderCanvas(canvasToDrawOn, this._chooseObjectsToRender());\n return this;\n },\n\n renderTopLayer: function(ctx) {\n ctx.save();\n if (this.isDrawingMode && this._isCurrentlyDrawing) {\n this.freeDrawingBrush && this.freeDrawingBrush._render();\n this.contextTopDirty = true;\n }\n // we render the top context - last object\n if (this.selection && this._groupSelector) {\n this._drawSelection(ctx);\n this.contextTopDirty = true;\n }\n ctx.restore();\n },\n\n /**\n * Method to render only the top canvas.\n * Also used to render the group selection box.\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n renderTop: function () {\n var ctx = this.contextTop;\n this.clearContext(ctx);\n this.renderTopLayer(ctx);\n this.fire('after:render');\n return this;\n },\n\n /**\n * @private\n */\n _normalizePointer: function (object, pointer) {\n var m = object.calcTransformMatrix(),\n invertedM = fabric.util.invertTransform(m),\n vptPointer = this.restorePointerVpt(pointer);\n return fabric.util.transformPoint(vptPointer, invertedM);\n },\n\n /**\n * Returns true if object is transparent at a certain location\n * @param {fabric.Object} target Object to check\n * @param {Number} x Left coordinate\n * @param {Number} y Top coordinate\n * @return {Boolean}\n */\n isTargetTransparent: function (target, x, y) {\n // in case the target is the activeObject, we cannot execute this optimization\n // because we need to draw controls too.\n if (target.shouldCache() && target._cacheCanvas && target !== this._activeObject) {\n var normalizedPointer = this._normalizePointer(target, {x: x, y: y}),\n targetRelativeX = Math.max(target.cacheTranslationX + (normalizedPointer.x * target.zoomX), 0),\n targetRelativeY = Math.max(target.cacheTranslationY + (normalizedPointer.y * target.zoomY), 0);\n\n var isTransparent = fabric.util.isTransparent(\n target._cacheContext, Math.round(targetRelativeX), Math.round(targetRelativeY), this.targetFindTolerance);\n\n return isTransparent;\n }\n\n var ctx = this.contextCache,\n originalColor = target.selectionBackgroundColor, v = this.viewportTransform;\n\n target.selectionBackgroundColor = '';\n\n this.clearContext(ctx);\n\n ctx.save();\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n target.render(ctx);\n ctx.restore();\n\n target.selectionBackgroundColor = originalColor;\n\n var isTransparent = fabric.util.isTransparent(\n ctx, x, y, this.targetFindTolerance);\n\n return isTransparent;\n },\n\n /**\n * takes an event and determines if selection key has been pressed\n * @private\n * @param {Event} e Event object\n */\n _isSelectionKeyPressed: function(e) {\n var selectionKeyPressed = false;\n\n if (Array.isArray(this.selectionKey)) {\n selectionKeyPressed = !!this.selectionKey.find(function(key) { return e[key] === true; });\n }\n else {\n selectionKeyPressed = e[this.selectionKey];\n }\n\n return selectionKeyPressed;\n },\n\n /**\n * @private\n * @param {Event} e Event object\n * @param {fabric.Object} target\n */\n _shouldClearSelection: function (e, target) {\n var activeObjects = this.getActiveObjects(),\n activeObject = this._activeObject;\n\n return (\n !target\n ||\n (target &&\n activeObject &&\n activeObjects.length > 1 &&\n activeObjects.indexOf(target) === -1 &&\n activeObject !== target &&\n !this._isSelectionKeyPressed(e))\n ||\n (target && !target.evented)\n ||\n (target &&\n !target.selectable &&\n activeObject &&\n activeObject !== target)\n );\n },\n\n /**\n * centeredScaling from object can't override centeredScaling from canvas.\n * this should be fixed, since object setting should take precedence over canvas.\n * also this should be something that will be migrated in the control properties.\n * as ability to define the origin of the transformation that the control provide.\n * @private\n * @param {fabric.Object} target\n * @param {String} action\n * @param {Boolean} altKey\n */\n _shouldCenterTransform: function (target, action, altKey) {\n if (!target) {\n return;\n }\n\n var centerTransform;\n\n if (action === 'scale' || action === 'scaleX' || action === 'scaleY' || action === 'resizing') {\n centerTransform = this.centeredScaling || target.centeredScaling;\n }\n else if (action === 'rotate') {\n centerTransform = this.centeredRotation || target.centeredRotation;\n }\n\n return centerTransform ? !altKey : altKey;\n },\n\n /**\n * should disappear before release 4.0\n * @private\n */\n _getOriginFromCorner: function(target, corner) {\n var origin = {\n x: target.originX,\n y: target.originY\n };\n\n if (corner === 'ml' || corner === 'tl' || corner === 'bl') {\n origin.x = 'right';\n }\n else if (corner === 'mr' || corner === 'tr' || corner === 'br') {\n origin.x = 'left';\n }\n\n if (corner === 'tl' || corner === 'mt' || corner === 'tr') {\n origin.y = 'bottom';\n }\n else if (corner === 'bl' || corner === 'mb' || corner === 'br') {\n origin.y = 'top';\n }\n return origin;\n },\n\n /**\n * @private\n * @param {Boolean} alreadySelected true if target is already selected\n * @param {String} corner a string representing the corner ml, mr, tl ...\n * @param {Event} e Event object\n * @param {fabric.Object} [target] inserted back to help overriding. Unused\n */\n _getActionFromCorner: function(alreadySelected, corner, e, target) {\n if (!corner || !alreadySelected) {\n return 'drag';\n }\n var control = target.controls[corner];\n return control.getActionName(e, control, target);\n },\n\n /**\n * @private\n * @param {Event} e Event object\n * @param {fabric.Object} target\n */\n _setupCurrentTransform: function (e, target, alreadySelected) {\n if (!target) {\n return;\n }\n\n var pointer = this.getPointer(e), corner = target.__corner,\n control = target.controls[corner],\n actionHandler = (alreadySelected && corner) ?\n control.getActionHandler(e, target, control) : fabric.controlsUtils.dragHandler,\n action = this._getActionFromCorner(alreadySelected, corner, e, target),\n origin = this._getOriginFromCorner(target, corner),\n altKey = e[this.centeredKey],\n transform = {\n target: target,\n action: action,\n actionHandler: actionHandler,\n corner: corner,\n scaleX: target.scaleX,\n scaleY: target.scaleY,\n skewX: target.skewX,\n skewY: target.skewY,\n // used by transation\n offsetX: pointer.x - target.left,\n offsetY: pointer.y - target.top,\n originX: origin.x,\n originY: origin.y,\n ex: pointer.x,\n ey: pointer.y,\n lastX: pointer.x,\n lastY: pointer.y,\n // unsure they are useful anymore.\n // left: target.left,\n // top: target.top,\n theta: degreesToRadians(target.angle),\n // end of unsure\n width: target.width * target.scaleX,\n shiftKey: e.shiftKey,\n altKey: altKey,\n original: fabric.util.saveObjectTransform(target),\n };\n\n if (this._shouldCenterTransform(target, action, altKey)) {\n transform.originX = 'center';\n transform.originY = 'center';\n }\n transform.original.originX = origin.x;\n transform.original.originY = origin.y;\n this._currentTransform = transform;\n this._beforeTransform(e);\n },\n\n /**\n * Set the cursor type of the canvas element\n * @param {String} value Cursor type of the canvas element.\n * @see http://www.w3.org/TR/css3-ui/#cursor\n */\n setCursor: function (value) {\n this.upperCanvasEl.style.cursor = value;\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx to draw the selection on\n */\n _drawSelection: function (ctx) {\n var selector = this._groupSelector,\n viewportStart = new fabric.Point(selector.ex, selector.ey),\n start = fabric.util.transformPoint(viewportStart, this.viewportTransform),\n viewportExtent = new fabric.Point(selector.ex + selector.left, selector.ey + selector.top),\n extent = fabric.util.transformPoint(viewportExtent, this.viewportTransform),\n minX = Math.min(start.x, extent.x),\n minY = Math.min(start.y, extent.y),\n maxX = Math.max(start.x, extent.x),\n maxY = Math.max(start.y, extent.y),\n strokeOffset = this.selectionLineWidth / 2;\n\n if (this.selectionColor) {\n ctx.fillStyle = this.selectionColor;\n ctx.fillRect(minX, minY, maxX - minX, maxY - minY);\n }\n\n if (!this.selectionLineWidth || !this.selectionBorderColor) {\n return;\n }\n ctx.lineWidth = this.selectionLineWidth;\n ctx.strokeStyle = this.selectionBorderColor;\n\n minX += strokeOffset;\n minY += strokeOffset;\n maxX -= strokeOffset;\n maxY -= strokeOffset;\n // selection border\n fabric.Object.prototype._setLineDash.call(this, ctx, this.selectionDashArray);\n ctx.strokeRect(minX, minY, maxX - minX, maxY - minY);\n },\n\n /**\n * Method that determines what object we are clicking on\n * the skipGroup parameter is for internal use, is needed for shift+click action\n * 11/09/2018 TODO: would be cool if findTarget could discern between being a full target\n * or the outside part of the corner.\n * @param {Event} e mouse event\n * @param {Boolean} skipGroup when true, activeGroup is skipped and only objects are traversed through\n * @return {fabric.Object} the target found\n */\n findTarget: function (e, skipGroup) {\n if (this.skipTargetFind) {\n return;\n }\n\n var ignoreZoom = true,\n pointer = this.getPointer(e, ignoreZoom),\n activeObject = this._activeObject,\n aObjects = this.getActiveObjects(),\n activeTarget, activeTargetSubs,\n isTouch = isTouchEvent(e),\n shouldLookForActive = (aObjects.length > 1 && !skipGroup) || aObjects.length === 1;\n\n // first check current group (if one exists)\n // active group does not check sub targets like normal groups.\n // if active group just exits.\n this.targets = [];\n\n // if we hit the corner of an activeObject, let's return that.\n if (shouldLookForActive && activeObject._findTargetCorner(pointer, isTouch)) {\n return activeObject;\n }\n if (aObjects.length > 1 && !skipGroup && activeObject === this._searchPossibleTargets([activeObject], pointer)) {\n return activeObject;\n }\n if (aObjects.length === 1 &&\n activeObject === this._searchPossibleTargets([activeObject], pointer)) {\n if (!this.preserveObjectStacking) {\n return activeObject;\n }\n else {\n activeTarget = activeObject;\n activeTargetSubs = this.targets;\n this.targets = [];\n }\n }\n var target = this._searchPossibleTargets(this._objects, pointer);\n if (e[this.altSelectionKey] && target && activeTarget && target !== activeTarget) {\n target = activeTarget;\n this.targets = activeTargetSubs;\n }\n return target;\n },\n\n /**\n * Checks point is inside the object.\n * @param {Object} [pointer] x,y object of point coordinates we want to check.\n * @param {fabric.Object} obj Object to test against\n * @param {Object} [globalPointer] x,y object of point coordinates relative to canvas used to search per pixel target.\n * @return {Boolean} true if point is contained within an area of given object\n * @private\n */\n _checkTarget: function(pointer, obj, globalPointer) {\n if (obj &&\n obj.visible &&\n obj.evented &&\n // http://www.geog.ubc.ca/courses/klink/gis.notes/ncgia/u32.html\n // http://idav.ucdavis.edu/~okreylos/TAship/Spring2000/PointInPolygon.html\n obj.containsPoint(pointer)\n ) {\n if ((this.perPixelTargetFind || obj.perPixelTargetFind) && !obj.isEditing) {\n var isTransparent = this.isTargetTransparent(obj, globalPointer.x, globalPointer.y);\n if (!isTransparent) {\n return true;\n }\n }\n else {\n return true;\n }\n }\n },\n\n /**\n * Function used to search inside objects an object that contains pointer in bounding box or that contains pointerOnCanvas when painted\n * @param {Array} [objects] objects array to look into\n * @param {Object} [pointer] x,y object of point coordinates we want to check.\n * @return {fabric.Object} object that contains pointer\n * @private\n */\n _searchPossibleTargets: function(objects, pointer) {\n // Cache all targets where their bounding box contains point.\n var target, i = objects.length, subTarget;\n // Do not check for currently grouped objects, since we check the parent group itself.\n // until we call this function specifically to search inside the activeGroup\n while (i--) {\n var objToCheck = objects[i];\n var pointerToUse = objToCheck.group ?\n this._normalizePointer(objToCheck.group, pointer) : pointer;\n if (this._checkTarget(pointerToUse, objToCheck, pointer)) {\n target = objects[i];\n if (target.subTargetCheck && target instanceof fabric.Group) {\n subTarget = this._searchPossibleTargets(target._objects, pointer);\n subTarget && this.targets.push(subTarget);\n }\n break;\n }\n }\n return target;\n },\n\n /**\n * Returns pointer coordinates without the effect of the viewport\n * @param {Object} pointer with \"x\" and \"y\" number values\n * @return {Object} object with \"x\" and \"y\" number values\n */\n restorePointerVpt: function(pointer) {\n return fabric.util.transformPoint(\n pointer,\n fabric.util.invertTransform(this.viewportTransform)\n );\n },\n\n /**\n * Returns pointer coordinates relative to canvas.\n * Can return coordinates with or without viewportTransform.\n * ignoreZoom false gives back coordinates that represent\n * the point clicked on canvas element.\n * ignoreZoom true gives back coordinates after being processed\n * by the viewportTransform ( sort of coordinates of what is displayed\n * on the canvas where you are clicking.\n * ignoreZoom true = HTMLElement coordinates relative to top,left\n * ignoreZoom false, default = fabric space coordinates, the same used for shape position\n * To interact with your shapes top and left you want to use ignoreZoom true\n * most of the time, while ignoreZoom false will give you coordinates\n * compatible with the object.oCoords system.\n * of the time.\n * @param {Event} e\n * @param {Boolean} ignoreZoom\n * @return {Object} object with \"x\" and \"y\" number values\n */\n getPointer: function (e, ignoreZoom) {\n // return cached values if we are in the event processing chain\n if (this._absolutePointer && !ignoreZoom) {\n return this._absolutePointer;\n }\n if (this._pointer && ignoreZoom) {\n return this._pointer;\n }\n\n var pointer = getPointer(e),\n upperCanvasEl = this.upperCanvasEl,\n bounds = upperCanvasEl.getBoundingClientRect(),\n boundsWidth = bounds.width || 0,\n boundsHeight = bounds.height || 0,\n cssScale;\n\n if (!boundsWidth || !boundsHeight ) {\n if ('top' in bounds && 'bottom' in bounds) {\n boundsHeight = Math.abs( bounds.top - bounds.bottom );\n }\n if ('right' in bounds && 'left' in bounds) {\n boundsWidth = Math.abs( bounds.right - bounds.left );\n }\n }\n\n this.calcOffset();\n pointer.x = pointer.x - this._offset.left;\n pointer.y = pointer.y - this._offset.top;\n if (!ignoreZoom) {\n pointer = this.restorePointerVpt(pointer);\n }\n\n var retinaScaling = this.getRetinaScaling();\n if (retinaScaling !== 1) {\n pointer.x /= retinaScaling;\n pointer.y /= retinaScaling;\n }\n\n if (boundsWidth === 0 || boundsHeight === 0) {\n // If bounds are not available (i.e. not visible), do not apply scale.\n cssScale = { width: 1, height: 1 };\n }\n else {\n cssScale = {\n width: upperCanvasEl.width / boundsWidth,\n height: upperCanvasEl.height / boundsHeight\n };\n }\n\n return {\n x: pointer.x * cssScale.width,\n y: pointer.y * cssScale.height\n };\n },\n\n /**\n * @private\n * @throws {CANVAS_INIT_ERROR} If canvas can not be initialized\n */\n _createUpperCanvas: function () {\n var lowerCanvasClass = this.lowerCanvasEl.className.replace(/\\s*lower-canvas\\s*/, ''),\n lowerCanvasEl = this.lowerCanvasEl, upperCanvasEl = this.upperCanvasEl;\n\n // there is no need to create a new upperCanvas element if we have already one.\n if (upperCanvasEl) {\n upperCanvasEl.className = '';\n }\n else {\n upperCanvasEl = this._createCanvasElement();\n this.upperCanvasEl = upperCanvasEl;\n }\n fabric.util.addClass(upperCanvasEl, 'upper-canvas ' + lowerCanvasClass);\n\n this.wrapperEl.appendChild(upperCanvasEl);\n\n this._copyCanvasStyle(lowerCanvasEl, upperCanvasEl);\n this._applyCanvasStyle(upperCanvasEl);\n this.contextTop = upperCanvasEl.getContext('2d');\n },\n\n /**\n * Returns context of top canvas where interactions are drawn\n * @returns {CanvasRenderingContext2D}\n */\n getTopContext: function () {\n return this.contextTop;\n },\n\n /**\n * @private\n */\n _createCacheCanvas: function () {\n this.cacheCanvasEl = this._createCanvasElement();\n this.cacheCanvasEl.setAttribute('width', this.width);\n this.cacheCanvasEl.setAttribute('height', this.height);\n this.contextCache = this.cacheCanvasEl.getContext('2d');\n },\n\n /**\n * @private\n */\n _initWrapperElement: function () {\n this.wrapperEl = fabric.util.wrapElement(this.lowerCanvasEl, 'div', {\n 'class': this.containerClass\n });\n fabric.util.setStyle(this.wrapperEl, {\n width: this.width + 'px',\n height: this.height + 'px',\n position: 'relative'\n });\n fabric.util.makeElementUnselectable(this.wrapperEl);\n },\n\n /**\n * @private\n * @param {HTMLElement} element canvas element to apply styles on\n */\n _applyCanvasStyle: function (element) {\n var width = this.width || element.width,\n height = this.height || element.height;\n\n fabric.util.setStyle(element, {\n position: 'absolute',\n width: width + 'px',\n height: height + 'px',\n left: 0,\n top: 0,\n 'touch-action': this.allowTouchScrolling ? 'manipulation' : 'none',\n '-ms-touch-action': this.allowTouchScrolling ? 'manipulation' : 'none'\n });\n element.width = width;\n element.height = height;\n fabric.util.makeElementUnselectable(element);\n },\n\n /**\n * Copy the entire inline style from one element (fromEl) to another (toEl)\n * @private\n * @param {Element} fromEl Element style is copied from\n * @param {Element} toEl Element copied style is applied to\n */\n _copyCanvasStyle: function (fromEl, toEl) {\n toEl.style.cssText = fromEl.style.cssText;\n },\n\n /**\n * Returns context of canvas where object selection is drawn\n * @return {CanvasRenderingContext2D}\n */\n getSelectionContext: function() {\n return this.contextTop;\n },\n\n /**\n * Returns <canvas> element on which object selection is drawn\n * @return {HTMLCanvasElement}\n */\n getSelectionElement: function () {\n return this.upperCanvasEl;\n },\n\n /**\n * Returns currently active object\n * @return {fabric.Object} active object\n */\n getActiveObject: function () {\n return this._activeObject;\n },\n\n /**\n * Returns an array with the current selected objects\n * @return {fabric.Object} active object\n */\n getActiveObjects: function () {\n var active = this._activeObject;\n if (active) {\n if (active.type === 'activeSelection' && active._objects) {\n return active._objects.slice(0);\n }\n else {\n return [active];\n }\n }\n return [];\n },\n\n /**\n * @private\n * @param {fabric.Object} obj Object that was removed\n */\n _onObjectRemoved: function(obj) {\n // removing active object should fire \"selection:cleared\" events\n if (obj === this._activeObject) {\n this.fire('before:selection:cleared', { target: obj });\n this._discardActiveObject();\n this.fire('selection:cleared', { target: obj });\n obj.fire('deselected');\n }\n if (obj === this._hoveredTarget){\n this._hoveredTarget = null;\n this._hoveredTargets = [];\n }\n this.callSuper('_onObjectRemoved', obj);\n },\n\n /**\n * @private\n * Compares the old activeObject with the current one and fires correct events\n * @param {fabric.Object} obj old activeObject\n */\n _fireSelectionEvents: function(oldObjects, e) {\n var somethingChanged = false, objects = this.getActiveObjects(),\n added = [], removed = [];\n oldObjects.forEach(function(oldObject) {\n if (objects.indexOf(oldObject) === -1) {\n somethingChanged = true;\n oldObject.fire('deselected', {\n e: e,\n target: oldObject\n });\n removed.push(oldObject);\n }\n });\n objects.forEach(function(object) {\n if (oldObjects.indexOf(object) === -1) {\n somethingChanged = true;\n object.fire('selected', {\n e: e,\n target: object\n });\n added.push(object);\n }\n });\n if (oldObjects.length > 0 && objects.length > 0) {\n somethingChanged && this.fire('selection:updated', {\n e: e,\n selected: added,\n deselected: removed,\n });\n }\n else if (objects.length > 0) {\n this.fire('selection:created', {\n e: e,\n selected: added,\n });\n }\n else if (oldObjects.length > 0) {\n this.fire('selection:cleared', {\n e: e,\n deselected: removed,\n });\n }\n },\n\n /**\n * Sets given object as the only active object on canvas\n * @param {fabric.Object} object Object to set as an active one\n * @param {Event} [e] Event (passed along when firing \"object:selected\")\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n setActiveObject: function (object, e) {\n var currentActives = this.getActiveObjects();\n this._setActiveObject(object, e);\n this._fireSelectionEvents(currentActives, e);\n return this;\n },\n\n /**\n * This is a private method for now.\n * This is supposed to be equivalent to setActiveObject but without firing\n * any event. There is commitment to have this stay this way.\n * This is the functional part of setActiveObject.\n * @private\n * @param {Object} object to set as active\n * @param {Event} [e] Event (passed along when firing \"object:selected\")\n * @return {Boolean} true if the selection happened\n */\n _setActiveObject: function(object, e) {\n if (this._activeObject === object) {\n return false;\n }\n if (!this._discardActiveObject(e, object)) {\n return false;\n }\n if (object.onSelect({ e: e })) {\n return false;\n }\n this._activeObject = object;\n return true;\n },\n\n /**\n * This is a private method for now.\n * This is supposed to be equivalent to discardActiveObject but without firing\n * any events. There is commitment to have this stay this way.\n * This is the functional part of discardActiveObject.\n * @param {Event} [e] Event (passed along when firing \"object:deselected\")\n * @param {Object} object to set as active\n * @return {Boolean} true if the selection happened\n * @private\n */\n _discardActiveObject: function(e, object) {\n var obj = this._activeObject;\n if (obj) {\n // onDeselect return TRUE to cancel selection;\n if (obj.onDeselect({ e: e, object: object })) {\n return false;\n }\n this._activeObject = null;\n }\n return true;\n },\n\n /**\n * Discards currently active object and fire events. If the function is called by fabric\n * as a consequence of a mouse event, the event is passed as a parameter and\n * sent to the fire function for the custom events. When used as a method the\n * e param does not have any application.\n * @param {event} e\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n discardActiveObject: function (e) {\n var currentActives = this.getActiveObjects(), activeObject = this.getActiveObject();\n if (currentActives.length) {\n this.fire('before:selection:cleared', { target: activeObject, e: e });\n }\n this._discardActiveObject(e);\n this._fireSelectionEvents(currentActives, e);\n return this;\n },\n\n /**\n * Clears a canvas element and removes all event listeners\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n dispose: function () {\n var wrapper = this.wrapperEl;\n this.removeListeners();\n wrapper.removeChild(this.upperCanvasEl);\n wrapper.removeChild(this.lowerCanvasEl);\n this.contextCache = null;\n this.contextTop = null;\n ['upperCanvasEl', 'cacheCanvasEl'].forEach((function(element) {\n fabric.util.cleanUpJsdomNode(this[element]);\n this[element] = undefined;\n }).bind(this));\n if (wrapper.parentNode) {\n wrapper.parentNode.replaceChild(this.lowerCanvasEl, this.wrapperEl);\n }\n delete this.wrapperEl;\n fabric.StaticCanvas.prototype.dispose.call(this);\n return this;\n },\n\n /**\n * Clears all contexts (background, main, top) of an instance\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n clear: function () {\n // this.discardActiveGroup();\n this.discardActiveObject();\n this.clearContext(this.contextTop);\n return this.callSuper('clear');\n },\n\n /**\n * Draws objects' controls (borders/controls)\n * @param {CanvasRenderingContext2D} ctx Context to render controls on\n */\n drawControls: function(ctx) {\n var activeObject = this._activeObject;\n\n if (activeObject) {\n activeObject._renderControls(ctx);\n }\n },\n\n /**\n * @private\n */\n _toObject: function(instance, methodName, propertiesToInclude) {\n //If the object is part of the current selection group, it should\n //be transformed appropriately\n //i.e. it should be serialised as it would appear if the selection group\n //were to be destroyed.\n var originalProperties = this._realizeGroupTransformOnObject(instance),\n object = this.callSuper('_toObject', instance, methodName, propertiesToInclude);\n //Undo the damage we did by changing all of its properties\n this._unwindGroupTransformOnObject(instance, originalProperties);\n return object;\n },\n\n /**\n * Realises an object's group transformation on it\n * @private\n * @param {fabric.Object} [instance] the object to transform (gets mutated)\n * @returns the original values of instance which were changed\n */\n _realizeGroupTransformOnObject: function(instance) {\n if (instance.group && instance.group.type === 'activeSelection' && this._activeObject === instance.group) {\n var layoutProps = ['angle', 'flipX', 'flipY', 'left', 'scaleX', 'scaleY', 'skewX', 'skewY', 'top'];\n //Copy all the positionally relevant properties across now\n var originalValues = {};\n layoutProps.forEach(function(prop) {\n originalValues[prop] = instance[prop];\n });\n fabric.util.addTransformToObject(instance, this._activeObject.calcOwnMatrix());\n return originalValues;\n }\n else {\n return null;\n }\n },\n\n /**\n * Restores the changed properties of instance\n * @private\n * @param {fabric.Object} [instance] the object to un-transform (gets mutated)\n * @param {Object} [originalValues] the original values of instance, as returned by _realizeGroupTransformOnObject\n */\n _unwindGroupTransformOnObject: function(instance, originalValues) {\n if (originalValues) {\n instance.set(originalValues);\n }\n },\n\n /**\n * @private\n */\n _setSVGObject: function(markup, instance, reviver) {\n //If the object is in a selection group, simulate what would happen to that\n //object when the group is deselected\n var originalProperties = this._realizeGroupTransformOnObject(instance);\n this.callSuper('_setSVGObject', markup, instance, reviver);\n this._unwindGroupTransformOnObject(instance, originalProperties);\n },\n\n setViewportTransform: function (vpt) {\n if (this.renderOnAddRemove && this._activeObject && this._activeObject.isEditing) {\n this._activeObject.clearContextTop();\n }\n fabric.StaticCanvas.prototype.setViewportTransform.call(this, vpt);\n }\n });\n\n // copying static properties manually to work around Opera's bug,\n // where \"prototype\" property is enumerable and overrides existing prototype\n for (var prop in fabric.StaticCanvas) {\n if (prop !== 'prototype') {\n fabric.Canvas[prop] = fabric.StaticCanvas[prop];\n }\n }\n})();\n\n\n(function() {\n\n var addListener = fabric.util.addListener,\n removeListener = fabric.util.removeListener,\n RIGHT_CLICK = 3, MIDDLE_CLICK = 2, LEFT_CLICK = 1,\n addEventOptions = { passive: false };\n\n function checkClick(e, value) {\n return e.button && (e.button === value - 1);\n }\n\n fabric.util.object.extend(fabric.Canvas.prototype, /** @lends fabric.Canvas.prototype */ {\n\n /**\n * Contains the id of the touch event that owns the fabric transform\n * @type Number\n * @private\n */\n mainTouchId: null,\n\n /**\n * Adds mouse listeners to canvas\n * @private\n */\n _initEventListeners: function () {\n // in case we initialized the class twice. This should not happen normally\n // but in some kind of applications where the canvas element may be changed\n // this is a workaround to having double listeners.\n this.removeListeners();\n this._bindEvents();\n this.addOrRemove(addListener, 'add');\n },\n\n /**\n * return an event prefix pointer or mouse.\n * @private\n */\n _getEventPrefix: function () {\n return this.enablePointerEvents ? 'pointer' : 'mouse';\n },\n\n addOrRemove: function(functor, eventjsFunctor) {\n var canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n functor(fabric.window, 'resize', this._onResize);\n functor(canvasElement, eventTypePrefix + 'down', this._onMouseDown);\n functor(canvasElement, eventTypePrefix + 'move', this._onMouseMove, addEventOptions);\n functor(canvasElement, eventTypePrefix + 'out', this._onMouseOut);\n functor(canvasElement, eventTypePrefix + 'enter', this._onMouseEnter);\n functor(canvasElement, 'wheel', this._onMouseWheel);\n functor(canvasElement, 'contextmenu', this._onContextMenu);\n functor(canvasElement, 'dblclick', this._onDoubleClick);\n functor(canvasElement, 'dragover', this._onDragOver);\n functor(canvasElement, 'dragenter', this._onDragEnter);\n functor(canvasElement, 'dragleave', this._onDragLeave);\n functor(canvasElement, 'drop', this._onDrop);\n if (!this.enablePointerEvents) {\n functor(canvasElement, 'touchstart', this._onTouchStart, addEventOptions);\n }\n if (typeof eventjs !== 'undefined' && eventjsFunctor in eventjs) {\n eventjs[eventjsFunctor](canvasElement, 'gesture', this._onGesture);\n eventjs[eventjsFunctor](canvasElement, 'drag', this._onDrag);\n eventjs[eventjsFunctor](canvasElement, 'orientation', this._onOrientationChange);\n eventjs[eventjsFunctor](canvasElement, 'shake', this._onShake);\n eventjs[eventjsFunctor](canvasElement, 'longpress', this._onLongPress);\n }\n },\n\n /**\n * Removes all event listeners\n */\n removeListeners: function() {\n this.addOrRemove(removeListener, 'remove');\n // if you dispose on a mouseDown, before mouse up, you need to clean document to...\n var eventTypePrefix = this._getEventPrefix();\n removeListener(fabric.document, eventTypePrefix + 'up', this._onMouseUp);\n removeListener(fabric.document, 'touchend', this._onTouchEnd, addEventOptions);\n removeListener(fabric.document, eventTypePrefix + 'move', this._onMouseMove, addEventOptions);\n removeListener(fabric.document, 'touchmove', this._onMouseMove, addEventOptions);\n },\n\n /**\n * @private\n */\n _bindEvents: function() {\n if (this.eventsBound) {\n // for any reason we pass here twice we do not want to bind events twice.\n return;\n }\n this._onMouseDown = this._onMouseDown.bind(this);\n this._onTouchStart = this._onTouchStart.bind(this);\n this._onMouseMove = this._onMouseMove.bind(this);\n this._onMouseUp = this._onMouseUp.bind(this);\n this._onTouchEnd = this._onTouchEnd.bind(this);\n this._onResize = this._onResize.bind(this);\n this._onGesture = this._onGesture.bind(this);\n this._onDrag = this._onDrag.bind(this);\n this._onShake = this._onShake.bind(this);\n this._onLongPress = this._onLongPress.bind(this);\n this._onOrientationChange = this._onOrientationChange.bind(this);\n this._onMouseWheel = this._onMouseWheel.bind(this);\n this._onMouseOut = this._onMouseOut.bind(this);\n this._onMouseEnter = this._onMouseEnter.bind(this);\n this._onContextMenu = this._onContextMenu.bind(this);\n this._onDoubleClick = this._onDoubleClick.bind(this);\n this._onDragOver = this._onDragOver.bind(this);\n this._onDragEnter = this._simpleEventHandler.bind(this, 'dragenter');\n this._onDragLeave = this._simpleEventHandler.bind(this, 'dragleave');\n this._onDrop = this._onDrop.bind(this);\n this.eventsBound = true;\n },\n\n /**\n * @private\n * @param {Event} [e] Event object fired on Event.js gesture\n * @param {Event} [self] Inner Event object\n */\n _onGesture: function(e, self) {\n this.__onTransformGesture && this.__onTransformGesture(e, self);\n },\n\n /**\n * @private\n * @param {Event} [e] Event object fired on Event.js drag\n * @param {Event} [self] Inner Event object\n */\n _onDrag: function(e, self) {\n this.__onDrag && this.__onDrag(e, self);\n },\n\n /**\n * @private\n * @param {Event} [e] Event object fired on wheel event\n */\n _onMouseWheel: function(e) {\n this.__onMouseWheel(e);\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onMouseOut: function(e) {\n var target = this._hoveredTarget;\n this.fire('mouse:out', { target: target, e: e });\n this._hoveredTarget = null;\n target && target.fire('mouseout', { e: e });\n\n var _this = this;\n this._hoveredTargets.forEach(function(_target){\n _this.fire('mouse:out', { target: target, e: e });\n _target && target.fire('mouseout', { e: e });\n });\n this._hoveredTargets = [];\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mouseenter\n */\n _onMouseEnter: function(e) {\n // This find target and consequent 'mouse:over' is used to\n // clear old instances on hovered target.\n // calling findTarget has the side effect of killing target.__corner.\n // as a short term fix we are not firing this if we are currently transforming.\n // as a long term fix we need to separate the action of finding a target with the\n // side effects we added to it.\n if (!this._currentTransform && !this.findTarget(e)) {\n this.fire('mouse:over', { target: null, e: e });\n this._hoveredTarget = null;\n this._hoveredTargets = [];\n }\n },\n\n /**\n * @private\n * @param {Event} [e] Event object fired on Event.js orientation change\n * @param {Event} [self] Inner Event object\n */\n _onOrientationChange: function(e, self) {\n this.__onOrientationChange && this.__onOrientationChange(e, self);\n },\n\n /**\n * @private\n * @param {Event} [e] Event object fired on Event.js shake\n * @param {Event} [self] Inner Event object\n */\n _onShake: function(e, self) {\n this.__onShake && this.__onShake(e, self);\n },\n\n /**\n * @private\n * @param {Event} [e] Event object fired on Event.js shake\n * @param {Event} [self] Inner Event object\n */\n _onLongPress: function(e, self) {\n this.__onLongPress && this.__onLongPress(e, self);\n },\n\n /**\n * prevent default to allow drop event to be fired\n * @private\n * @param {Event} [e] Event object fired on Event.js shake\n */\n _onDragOver: function(e) {\n e.preventDefault();\n var target = this._simpleEventHandler('dragover', e);\n this._fireEnterLeaveEvents(target, e);\n },\n\n /**\n * `drop:before` is a an event that allow you to schedule logic\n * before the `drop` event. Prefer `drop` event always, but if you need\n * to run some drop-disabling logic on an event, since there is no way\n * to handle event handlers ordering, use `drop:before`\n * @param {Event} e\n */\n _onDrop: function (e) {\n this._simpleEventHandler('drop:before', e);\n return this._simpleEventHandler('drop', e);\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onContextMenu: function (e) {\n if (this.stopContextMenu) {\n e.stopPropagation();\n e.preventDefault();\n }\n return false;\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onDoubleClick: function (e) {\n this._cacheTransformEventData(e);\n this._handleEvent(e, 'dblclick');\n this._resetTransformEventData(e);\n },\n\n /**\n * Return a the id of an event.\n * returns either the pointerId or the identifier or 0 for the mouse event\n * @private\n * @param {Event} evt Event object\n */\n getPointerId: function(evt) {\n var changedTouches = evt.changedTouches;\n\n if (changedTouches) {\n return changedTouches[0] && changedTouches[0].identifier;\n }\n\n if (this.enablePointerEvents) {\n return evt.pointerId;\n }\n\n return -1;\n },\n\n /**\n * Determines if an event has the id of the event that is considered main\n * @private\n * @param {evt} event Event object\n */\n _isMainEvent: function(evt) {\n if (evt.isPrimary === true) {\n return true;\n }\n if (evt.isPrimary === false) {\n return false;\n }\n if (evt.type === 'touchend' && evt.touches.length === 0) {\n return true;\n }\n if (evt.changedTouches) {\n return evt.changedTouches[0].identifier === this.mainTouchId;\n }\n return true;\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onTouchStart: function(e) {\n e.preventDefault();\n if (this.mainTouchId === null) {\n this.mainTouchId = this.getPointerId(e);\n }\n this.__onMouseDown(e);\n this._resetTransformEventData();\n var canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n addListener(fabric.document, 'touchend', this._onTouchEnd, addEventOptions);\n addListener(fabric.document, 'touchmove', this._onMouseMove, addEventOptions);\n // Unbind mousedown to prevent double triggers from touch devices\n removeListener(canvasElement, eventTypePrefix + 'down', this._onMouseDown);\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onMouseDown: function (e) {\n this.__onMouseDown(e);\n this._resetTransformEventData();\n var canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n removeListener(canvasElement, eventTypePrefix + 'move', this._onMouseMove, addEventOptions);\n addListener(fabric.document, eventTypePrefix + 'up', this._onMouseUp);\n addListener(fabric.document, eventTypePrefix + 'move', this._onMouseMove, addEventOptions);\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onTouchEnd: function(e) {\n if (e.touches.length > 0) {\n // if there are still touches stop here\n return;\n }\n this.__onMouseUp(e);\n this._resetTransformEventData();\n this.mainTouchId = null;\n var eventTypePrefix = this._getEventPrefix();\n removeListener(fabric.document, 'touchend', this._onTouchEnd, addEventOptions);\n removeListener(fabric.document, 'touchmove', this._onMouseMove, addEventOptions);\n var _this = this;\n if (this._willAddMouseDown) {\n clearTimeout(this._willAddMouseDown);\n }\n this._willAddMouseDown = setTimeout(function() {\n // Wait 400ms before rebinding mousedown to prevent double triggers\n // from touch devices\n addListener(_this.upperCanvasEl, eventTypePrefix + 'down', _this._onMouseDown);\n _this._willAddMouseDown = 0;\n }, 400);\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mouseup\n */\n _onMouseUp: function (e) {\n this.__onMouseUp(e);\n this._resetTransformEventData();\n var canvasElement = this.upperCanvasEl,\n eventTypePrefix = this._getEventPrefix();\n if (this._isMainEvent(e)) {\n removeListener(fabric.document, eventTypePrefix + 'up', this._onMouseUp);\n removeListener(fabric.document, eventTypePrefix + 'move', this._onMouseMove, addEventOptions);\n addListener(canvasElement, eventTypePrefix + 'move', this._onMouseMove, addEventOptions);\n }\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousemove\n */\n _onMouseMove: function (e) {\n !this.allowTouchScrolling && e.preventDefault && e.preventDefault();\n this.__onMouseMove(e);\n },\n\n /**\n * @private\n */\n _onResize: function () {\n this.calcOffset();\n },\n\n /**\n * Decides whether the canvas should be redrawn in mouseup and mousedown events.\n * @private\n * @param {Object} target\n */\n _shouldRender: function(target) {\n var activeObject = this._activeObject;\n\n if (\n !!activeObject !== !!target ||\n (activeObject && target && (activeObject !== target))\n ) {\n // this covers: switch of target, from target to no target, selection of target\n // multiSelection with key and mouse\n return true;\n }\n else if (activeObject && activeObject.isEditing) {\n // if we mouse up/down over a editing textbox a cursor change,\n // there is no need to re render\n return false;\n }\n return false;\n },\n\n /**\n * Method that defines the actions when mouse is released on canvas.\n * The method resets the currentTransform parameters, store the image corner\n * position in the image object and render the canvas on top.\n * @private\n * @param {Event} e Event object fired on mouseup\n */\n __onMouseUp: function (e) {\n var target, transform = this._currentTransform,\n groupSelector = this._groupSelector, shouldRender = false,\n isClick = (!groupSelector || (groupSelector.left === 0 && groupSelector.top === 0));\n this._cacheTransformEventData(e);\n target = this._target;\n this._handleEvent(e, 'up:before');\n // if right/middle click just fire events and return\n // target undefined will make the _handleEvent search the target\n if (checkClick(e, RIGHT_CLICK)) {\n if (this.fireRightClick) {\n this._handleEvent(e, 'up', RIGHT_CLICK, isClick);\n }\n return;\n }\n\n if (checkClick(e, MIDDLE_CLICK)) {\n if (this.fireMiddleClick) {\n this._handleEvent(e, 'up', MIDDLE_CLICK, isClick);\n }\n this._resetTransformEventData();\n return;\n }\n\n if (this.isDrawingMode && this._isCurrentlyDrawing) {\n this._onMouseUpInDrawingMode(e);\n return;\n }\n\n if (!this._isMainEvent(e)) {\n return;\n }\n if (transform) {\n this._finalizeCurrentTransform(e);\n shouldRender = transform.actionPerformed;\n }\n if (!isClick) {\n var targetWasActive = target === this._activeObject;\n this._maybeGroupObjects(e);\n if (!shouldRender) {\n shouldRender = (\n this._shouldRender(target) ||\n (!targetWasActive && target === this._activeObject)\n );\n }\n }\n var corner, pointer;\n if (target) {\n corner = target._findTargetCorner(\n this.getPointer(e, true),\n fabric.util.isTouchEvent(e)\n );\n if (target.selectable && target !== this._activeObject && target.activeOn === 'up') {\n this.setActiveObject(target, e);\n shouldRender = true;\n }\n else {\n var control = target.controls[corner],\n mouseUpHandler = control && control.getMouseUpHandler(e, target, control);\n if (mouseUpHandler) {\n pointer = this.getPointer(e);\n mouseUpHandler(e, transform, pointer.x, pointer.y);\n }\n }\n target.isMoving = false;\n }\n // if we are ending up a transform on a different control or a new object\n // fire the original mouse up from the corner that started the transform\n if (transform && (transform.target !== target || transform.corner !== corner)) {\n var originalControl = transform.target && transform.target.controls[transform.corner],\n originalMouseUpHandler = originalControl && originalControl.getMouseUpHandler(e, target, control);\n pointer = pointer || this.getPointer(e);\n originalMouseUpHandler && originalMouseUpHandler(e, transform, pointer.x, pointer.y);\n }\n this._setCursorFromEvent(e, target);\n this._handleEvent(e, 'up', LEFT_CLICK, isClick);\n this._groupSelector = null;\n this._currentTransform = null;\n // reset the target information about which corner is selected\n target && (target.__corner = 0);\n if (shouldRender) {\n this.requestRenderAll();\n }\n else if (!isClick) {\n this.renderTop();\n }\n },\n\n /**\n * @private\n * Handle event firing for target and subtargets\n * @param {Event} e event from mouse\n * @param {String} eventType event to fire (up, down or move)\n * @return {Fabric.Object} target return the the target found, for internal reasons.\n */\n _simpleEventHandler: function(eventType, e) {\n var target = this.findTarget(e),\n targets = this.targets,\n options = {\n e: e,\n target: target,\n subTargets: targets,\n };\n this.fire(eventType, options);\n target && target.fire(eventType, options);\n if (!targets) {\n return target;\n }\n for (var i = 0; i < targets.length; i++) {\n targets[i].fire(eventType, options);\n }\n return target;\n },\n\n /**\n * @private\n * Handle event firing for target and subtargets\n * @param {Event} e event from mouse\n * @param {String} eventType event to fire (up, down or move)\n * @param {fabric.Object} targetObj receiving event\n * @param {Number} [button] button used in the event 1 = left, 2 = middle, 3 = right\n * @param {Boolean} isClick for left button only, indicates that the mouse up happened without move.\n */\n _handleEvent: function(e, eventType, button, isClick) {\n var target = this._target,\n targets = this.targets || [],\n options = {\n e: e,\n target: target,\n subTargets: targets,\n button: button || LEFT_CLICK,\n isClick: isClick || false,\n pointer: this._pointer,\n absolutePointer: this._absolutePointer,\n transform: this._currentTransform\n };\n if (eventType === 'up') {\n options.currentTarget = this.findTarget(e);\n options.currentSubTargets = this.targets;\n }\n this.fire('mouse:' + eventType, options);\n target && target.fire('mouse' + eventType, options);\n for (var i = 0; i < targets.length; i++) {\n targets[i].fire('mouse' + eventType, options);\n }\n },\n\n /**\n * @private\n * @param {Event} e send the mouse event that generate the finalize down, so it can be used in the event\n */\n _finalizeCurrentTransform: function(e) {\n\n var transform = this._currentTransform,\n target = transform.target,\n options = {\n e: e,\n target: target,\n transform: transform,\n action: transform.action,\n };\n\n if (target._scaling) {\n target._scaling = false;\n }\n\n target.setCoords();\n\n if (transform.actionPerformed || (this.stateful && target.hasStateChanged())) {\n this._fire('modified', options);\n }\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n _onMouseDownInDrawingMode: function(e) {\n this._isCurrentlyDrawing = true;\n if (this.getActiveObject()) {\n this.discardActiveObject(e).requestRenderAll();\n }\n var pointer = this.getPointer(e);\n this.freeDrawingBrush.onMouseDown(pointer, { e: e, pointer: pointer });\n this._handleEvent(e, 'down');\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mousemove\n */\n _onMouseMoveInDrawingMode: function(e) {\n if (this._isCurrentlyDrawing) {\n var pointer = this.getPointer(e);\n this.freeDrawingBrush.onMouseMove(pointer, { e: e, pointer: pointer });\n }\n this.setCursor(this.freeDrawingCursor);\n this._handleEvent(e, 'move');\n },\n\n /**\n * @private\n * @param {Event} e Event object fired on mouseup\n */\n _onMouseUpInDrawingMode: function(e) {\n var pointer = this.getPointer(e);\n this._isCurrentlyDrawing = this.freeDrawingBrush.onMouseUp({ e: e, pointer: pointer });\n this._handleEvent(e, 'up');\n },\n\n /**\n * Method that defines the actions when mouse is clicked on canvas.\n * The method inits the currentTransform parameters and renders all the\n * canvas so the current image can be placed on the top canvas and the rest\n * in on the container one.\n * @private\n * @param {Event} e Event object fired on mousedown\n */\n __onMouseDown: function (e) {\n this._cacheTransformEventData(e);\n this._handleEvent(e, 'down:before');\n var target = this._target;\n // if right click just fire events\n if (checkClick(e, RIGHT_CLICK)) {\n if (this.fireRightClick) {\n this._handleEvent(e, 'down', RIGHT_CLICK);\n }\n return;\n }\n\n if (checkClick(e, MIDDLE_CLICK)) {\n if (this.fireMiddleClick) {\n this._handleEvent(e, 'down', MIDDLE_CLICK);\n }\n return;\n }\n\n if (this.isDrawingMode) {\n this._onMouseDownInDrawingMode(e);\n return;\n }\n\n if (!this._isMainEvent(e)) {\n return;\n }\n\n // ignore if some object is being transformed at this moment\n if (this._currentTransform) {\n return;\n }\n\n var pointer = this._pointer;\n // save pointer for check in __onMouseUp event\n this._previousPointer = pointer;\n var shouldRender = this._shouldRender(target),\n shouldGroup = this._shouldGroup(e, target);\n if (this._shouldClearSelection(e, target)) {\n this.discardActiveObject(e);\n }\n else if (shouldGroup) {\n this._handleGrouping(e, target);\n target = this._activeObject;\n }\n\n if (this.selection && (!target ||\n (!target.selectable && !target.isEditing && target !== this._activeObject))) {\n this._groupSelector = {\n ex: this._absolutePointer.x,\n ey: this._absolutePointer.y,\n top: 0,\n left: 0\n };\n }\n\n if (target) {\n var alreadySelected = target === this._activeObject;\n if (target.selectable && target.activeOn === 'down') {\n this.setActiveObject(target, e);\n }\n var corner = target._findTargetCorner(\n this.getPointer(e, true),\n fabric.util.isTouchEvent(e)\n );\n target.__corner = corner;\n if (target === this._activeObject && (corner || !shouldGroup)) {\n this._setupCurrentTransform(e, target, alreadySelected);\n var control = target.controls[corner],\n pointer = this.getPointer(e),\n mouseDownHandler = control && control.getMouseDownHandler(e, target, control);\n if (mouseDownHandler) {\n mouseDownHandler(e, this._currentTransform, pointer.x, pointer.y);\n }\n }\n }\n this._handleEvent(e, 'down');\n // we must renderAll so that we update the visuals\n (shouldRender || shouldGroup) && this.requestRenderAll();\n },\n\n /**\n * reset cache form common information needed during event processing\n * @private\n */\n _resetTransformEventData: function() {\n this._target = null;\n this._pointer = null;\n this._absolutePointer = null;\n },\n\n /**\n * Cache common information needed during event processing\n * @private\n * @param {Event} e Event object fired on event\n */\n _cacheTransformEventData: function(e) {\n // reset in order to avoid stale caching\n this._resetTransformEventData();\n this._pointer = this.getPointer(e, true);\n this._absolutePointer = this.restorePointerVpt(this._pointer);\n this._target = this._currentTransform ? this._currentTransform.target : this.findTarget(e) || null;\n },\n\n /**\n * @private\n */\n _beforeTransform: function(e) {\n var t = this._currentTransform;\n this.stateful && t.target.saveState();\n this.fire('before:transform', {\n e: e,\n transform: t,\n });\n },\n\n /**\n * Method that defines the actions when mouse is hovering the canvas.\n * The currentTransform parameter will define whether the user is rotating/scaling/translating\n * an image or neither of them (only hovering). A group selection is also possible and would cancel\n * all any other type of action.\n * In case of an image transformation only the top canvas will be rendered.\n * @private\n * @param {Event} e Event object fired on mousemove\n */\n __onMouseMove: function (e) {\n this._handleEvent(e, 'move:before');\n this._cacheTransformEventData(e);\n var target, pointer;\n\n if (this.isDrawingMode) {\n this._onMouseMoveInDrawingMode(e);\n return;\n }\n\n if (!this._isMainEvent(e)) {\n return;\n }\n\n var groupSelector = this._groupSelector;\n\n // We initially clicked in an empty area, so we draw a box for multiple selection\n if (groupSelector) {\n pointer = this._absolutePointer;\n\n groupSelector.left = pointer.x - groupSelector.ex;\n groupSelector.top = pointer.y - groupSelector.ey;\n\n this.renderTop();\n }\n else if (!this._currentTransform) {\n target = this.findTarget(e) || null;\n this._setCursorFromEvent(e, target);\n this._fireOverOutEvents(target, e);\n }\n else {\n this._transformObject(e);\n }\n this._handleEvent(e, 'move');\n this._resetTransformEventData();\n },\n\n /**\n * Manage the mouseout, mouseover events for the fabric object on the canvas\n * @param {Fabric.Object} target the target where the target from the mousemove event\n * @param {Event} e Event object fired on mousemove\n * @private\n */\n _fireOverOutEvents: function(target, e) {\n var _hoveredTarget = this._hoveredTarget,\n _hoveredTargets = this._hoveredTargets, targets = this.targets,\n length = Math.max(_hoveredTargets.length, targets.length);\n\n this.fireSyntheticInOutEvents(target, e, {\n oldTarget: _hoveredTarget,\n evtOut: 'mouseout',\n canvasEvtOut: 'mouse:out',\n evtIn: 'mouseover',\n canvasEvtIn: 'mouse:over',\n });\n for (var i = 0; i < length; i++){\n this.fireSyntheticInOutEvents(targets[i], e, {\n oldTarget: _hoveredTargets[i],\n evtOut: 'mouseout',\n evtIn: 'mouseover',\n });\n }\n this._hoveredTarget = target;\n this._hoveredTargets = this.targets.concat();\n },\n\n /**\n * Manage the dragEnter, dragLeave events for the fabric objects on the canvas\n * @param {Fabric.Object} target the target where the target from the onDrag event\n * @param {Event} e Event object fired on ondrag\n * @private\n */\n _fireEnterLeaveEvents: function(target, e) {\n var _draggedoverTarget = this._draggedoverTarget,\n _hoveredTargets = this._hoveredTargets, targets = this.targets,\n length = Math.max(_hoveredTargets.length, targets.length);\n\n this.fireSyntheticInOutEvents(target, e, {\n oldTarget: _draggedoverTarget,\n evtOut: 'dragleave',\n evtIn: 'dragenter',\n });\n for (var i = 0; i < length; i++) {\n this.fireSyntheticInOutEvents(targets[i], e, {\n oldTarget: _hoveredTargets[i],\n evtOut: 'dragleave',\n evtIn: 'dragenter',\n });\n }\n this._draggedoverTarget = target;\n },\n\n /**\n * Manage the synthetic in/out events for the fabric objects on the canvas\n * @param {Fabric.Object} target the target where the target from the supported events\n * @param {Event} e Event object fired\n * @param {Object} config configuration for the function to work\n * @param {String} config.targetName property on the canvas where the old target is stored\n * @param {String} [config.canvasEvtOut] name of the event to fire at canvas level for out\n * @param {String} config.evtOut name of the event to fire for out\n * @param {String} [config.canvasEvtIn] name of the event to fire at canvas level for in\n * @param {String} config.evtIn name of the event to fire for in\n * @private\n */\n fireSyntheticInOutEvents: function(target, e, config) {\n var inOpt, outOpt, oldTarget = config.oldTarget, outFires, inFires,\n targetChanged = oldTarget !== target, canvasEvtIn = config.canvasEvtIn, canvasEvtOut = config.canvasEvtOut;\n if (targetChanged) {\n inOpt = { e: e, target: target, previousTarget: oldTarget };\n outOpt = { e: e, target: oldTarget, nextTarget: target };\n }\n inFires = target && targetChanged;\n outFires = oldTarget && targetChanged;\n if (outFires) {\n canvasEvtOut && this.fire(canvasEvtOut, outOpt);\n oldTarget.fire(config.evtOut, outOpt);\n }\n if (inFires) {\n canvasEvtIn && this.fire(canvasEvtIn, inOpt);\n target.fire(config.evtIn, inOpt);\n }\n },\n\n /**\n * Method that defines actions when an Event Mouse Wheel\n * @param {Event} e Event object fired on mouseup\n */\n __onMouseWheel: function(e) {\n this._cacheTransformEventData(e);\n this._handleEvent(e, 'wheel');\n this._resetTransformEventData();\n },\n\n /**\n * @private\n * @param {Event} e Event fired on mousemove\n */\n _transformObject: function(e) {\n var pointer = this.getPointer(e),\n transform = this._currentTransform;\n\n transform.reset = false;\n transform.shiftKey = e.shiftKey;\n transform.altKey = e[this.centeredKey];\n\n this._performTransformAction(e, transform, pointer);\n transform.actionPerformed && this.requestRenderAll();\n },\n\n /**\n * @private\n */\n _performTransformAction: function(e, transform, pointer) {\n var x = pointer.x,\n y = pointer.y,\n action = transform.action,\n actionPerformed = false,\n actionHandler = transform.actionHandler;\n // this object could be created from the function in the control handlers\n\n\n if (actionHandler) {\n actionPerformed = actionHandler(e, transform, x, y);\n }\n if (action === 'drag' && actionPerformed) {\n transform.target.isMoving = true;\n this.setCursor(transform.target.moveCursor || this.moveCursor);\n }\n transform.actionPerformed = transform.actionPerformed || actionPerformed;\n },\n\n /**\n * @private\n */\n _fire: fabric.controlsUtils.fireEvent,\n\n /**\n * Sets the cursor depending on where the canvas is being hovered.\n * Note: very buggy in Opera\n * @param {Event} e Event object\n * @param {Object} target Object that the mouse is hovering, if so.\n */\n _setCursorFromEvent: function (e, target) {\n if (!target) {\n this.setCursor(this.defaultCursor);\n return false;\n }\n var hoverCursor = target.hoverCursor || this.hoverCursor,\n activeSelection = this._activeObject && this._activeObject.type === 'activeSelection' ?\n this._activeObject : null,\n // only show proper corner when group selection is not active\n corner = (!activeSelection || !activeSelection.contains(target))\n // here we call findTargetCorner always with undefined for the touch parameter.\n // we assume that if you are using a cursor you do not need to interact with\n // the bigger touch area.\n && target._findTargetCorner(this.getPointer(e, true));\n\n if (!corner) {\n if (target.subTargetCheck){\n // hoverCursor should come from top-most subTarget,\n // so we walk the array backwards\n this.targets.concat().reverse().map(function(_target){\n hoverCursor = _target.hoverCursor || hoverCursor;\n });\n }\n this.setCursor(hoverCursor);\n }\n else {\n this.setCursor(this.getCornerCursor(corner, target, e));\n }\n },\n\n /**\n * @private\n */\n getCornerCursor: function(corner, target, e) {\n var control = target.controls[corner];\n return control.cursorStyleHandler(e, control, target);\n }\n });\n})();\n\n\n(function() {\n\n var min = Math.min,\n max = Math.max;\n\n fabric.util.object.extend(fabric.Canvas.prototype, /** @lends fabric.Canvas.prototype */ {\n\n /**\n * @private\n * @param {Event} e Event object\n * @param {fabric.Object} target\n * @return {Boolean}\n */\n _shouldGroup: function(e, target) {\n var activeObject = this._activeObject;\n return activeObject && this._isSelectionKeyPressed(e) && target && target.selectable && this.selection &&\n (activeObject !== target || activeObject.type === 'activeSelection') && !target.onSelect({ e: e });\n },\n\n /**\n * @private\n * @param {Event} e Event object\n * @param {fabric.Object} target\n */\n _handleGrouping: function (e, target) {\n var activeObject = this._activeObject;\n // avoid multi select when shift click on a corner\n if (activeObject.__corner) {\n return;\n }\n if (target === activeObject) {\n // if it's a group, find target again, using activeGroup objects\n target = this.findTarget(e, true);\n // if even object is not found or we are on activeObjectCorner, bail out\n if (!target || !target.selectable) {\n return;\n }\n }\n if (activeObject && activeObject.type === 'activeSelection') {\n this._updateActiveSelection(target, e);\n }\n else {\n this._createActiveSelection(target, e);\n }\n },\n\n /**\n * @private\n */\n _updateActiveSelection: function(target, e) {\n var activeSelection = this._activeObject,\n currentActiveObjects = activeSelection._objects.slice(0);\n if (activeSelection.contains(target)) {\n activeSelection.removeWithUpdate(target);\n this._hoveredTarget = target;\n this._hoveredTargets = this.targets.concat();\n if (activeSelection.size() === 1) {\n // activate last remaining object\n this._setActiveObject(activeSelection.item(0), e);\n }\n }\n else {\n activeSelection.addWithUpdate(target);\n this._hoveredTarget = activeSelection;\n this._hoveredTargets = this.targets.concat();\n }\n this._fireSelectionEvents(currentActiveObjects, e);\n },\n\n /**\n * @private\n */\n _createActiveSelection: function(target, e) {\n var currentActives = this.getActiveObjects(), group = this._createGroup(target);\n this._hoveredTarget = group;\n // ISSUE 4115: should we consider subTargets here?\n // this._hoveredTargets = [];\n // this._hoveredTargets = this.targets.concat();\n this._setActiveObject(group, e);\n this._fireSelectionEvents(currentActives, e);\n },\n\n /**\n * @private\n * @param {Object} target\n */\n _createGroup: function(target) {\n var objects = this._objects,\n isActiveLower = objects.indexOf(this._activeObject) < objects.indexOf(target),\n groupObjects = isActiveLower\n ? [this._activeObject, target]\n : [target, this._activeObject];\n this._activeObject.isEditing && this._activeObject.exitEditing();\n return new fabric.ActiveSelection(groupObjects, {\n canvas: this\n });\n },\n\n /**\n * @private\n * @param {Event} e mouse event\n */\n _groupSelectedObjects: function (e) {\n\n var group = this._collectObjects(e),\n aGroup;\n\n // do not create group for 1 element only\n if (group.length === 1) {\n this.setActiveObject(group[0], e);\n }\n else if (group.length > 1) {\n aGroup = new fabric.ActiveSelection(group.reverse(), {\n canvas: this\n });\n this.setActiveObject(aGroup, e);\n }\n },\n\n /**\n * @private\n */\n _collectObjects: function(e) {\n var group = [],\n currentObject,\n x1 = this._groupSelector.ex,\n y1 = this._groupSelector.ey,\n x2 = x1 + this._groupSelector.left,\n y2 = y1 + this._groupSelector.top,\n selectionX1Y1 = new fabric.Point(min(x1, x2), min(y1, y2)),\n selectionX2Y2 = new fabric.Point(max(x1, x2), max(y1, y2)),\n allowIntersect = !this.selectionFullyContained,\n isClick = x1 === x2 && y1 === y2;\n // we iterate reverse order to collect top first in case of click.\n for (var i = this._objects.length; i--; ) {\n currentObject = this._objects[i];\n\n if (!currentObject || !currentObject.selectable || !currentObject.visible) {\n continue;\n }\n\n if ((allowIntersect && currentObject.intersectsWithRect(selectionX1Y1, selectionX2Y2, true)) ||\n currentObject.isContainedWithinRect(selectionX1Y1, selectionX2Y2, true) ||\n (allowIntersect && currentObject.containsPoint(selectionX1Y1, null, true)) ||\n (allowIntersect && currentObject.containsPoint(selectionX2Y2, null, true))\n ) {\n group.push(currentObject);\n // only add one object if it's a click\n if (isClick) {\n break;\n }\n }\n }\n\n if (group.length > 1) {\n group = group.filter(function(object) {\n return !object.onSelect({ e: e });\n });\n }\n\n return group;\n },\n\n /**\n * @private\n */\n _maybeGroupObjects: function(e) {\n if (this.selection && this._groupSelector) {\n this._groupSelectedObjects(e);\n }\n this.setCursor(this.defaultCursor);\n // clear selection and current transformation\n this._groupSelector = null;\n }\n });\n\n})();\n\n\n(function () {\n fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.StaticCanvas.prototype */ {\n\n /**\n * Exports canvas element to a dataurl image. Note that when multiplier is used, cropping is scaled appropriately\n * @param {Object} [options] Options object\n * @param {String} [options.format=png] The format of the output image. Either \"jpeg\" or \"png\"\n * @param {Number} [options.quality=1] Quality level (0..1). Only used for jpeg.\n * @param {Number} [options.multiplier=1] Multiplier to scale by, to have consistent\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 2.0.0\n * @return {String} Returns a data: URL containing a representation of the object in the format specified by options.format\n * @see {@link http://jsfiddle.net/fabricjs/NfZVb/|jsFiddle demo}\n * @example Generate jpeg dataURL with lower quality\n * var dataURL = canvas.toDataURL({\n * format: 'jpeg',\n * quality: 0.8\n * });\n * @example Generate cropped png dataURL (clipping of canvas)\n * var dataURL = canvas.toDataURL({\n * format: 'png',\n * left: 100,\n * top: 100,\n * width: 200,\n * height: 200\n * });\n * @example Generate double scaled png dataURL\n * var dataURL = canvas.toDataURL({\n * format: 'png',\n * multiplier: 2\n * });\n */\n toDataURL: function (options) {\n options || (options = { });\n\n var format = options.format || 'png',\n quality = options.quality || 1,\n multiplier = (options.multiplier || 1) * (options.enableRetinaScaling ? this.getRetinaScaling() : 1),\n canvasEl = this.toCanvasElement(multiplier, options);\n return fabric.util.toDataURL(canvasEl, format, quality);\n },\n\n /**\n * Create a new HTMLCanvas element painted with the current canvas content.\n * No need to resize the actual one or repaint it.\n * Will transfer object ownership to a new canvas, paint it, and set everything back.\n * This is an intermediary step used to get to a dataUrl but also it is useful to\n * create quick image copies of a canvas without passing for the dataUrl string\n * @param {Number} [multiplier] a zoom factor.\n * @param {Object} [cropping] Cropping informations\n * @param {Number} [cropping.left] Cropping left offset.\n * @param {Number} [cropping.top] Cropping top offset.\n * @param {Number} [cropping.width] Cropping width.\n * @param {Number} [cropping.height] Cropping height.\n */\n toCanvasElement: function(multiplier, cropping) {\n multiplier = multiplier || 1;\n cropping = cropping || { };\n var scaledWidth = (cropping.width || this.width) * multiplier,\n scaledHeight = (cropping.height || this.height) * multiplier,\n zoom = this.getZoom(),\n originalWidth = this.width,\n originalHeight = this.height,\n newZoom = zoom * multiplier,\n vp = this.viewportTransform,\n translateX = (vp[4] - (cropping.left || 0)) * multiplier,\n translateY = (vp[5] - (cropping.top || 0)) * multiplier,\n originalInteractive = this.interactive,\n newVp = [newZoom, 0, 0, newZoom, translateX, translateY],\n originalRetina = this.enableRetinaScaling,\n canvasEl = fabric.util.createCanvasElement(),\n originalContextTop = this.contextTop;\n canvasEl.width = scaledWidth;\n canvasEl.height = scaledHeight;\n this.contextTop = null;\n this.enableRetinaScaling = false;\n this.interactive = false;\n this.viewportTransform = newVp;\n this.width = scaledWidth;\n this.height = scaledHeight;\n this.calcViewportBoundaries();\n this.renderCanvas(canvasEl.getContext('2d'), this._objects);\n this.viewportTransform = vp;\n this.width = originalWidth;\n this.height = originalHeight;\n this.calcViewportBoundaries();\n this.interactive = originalInteractive;\n this.enableRetinaScaling = originalRetina;\n this.contextTop = originalContextTop;\n return canvasEl;\n },\n });\n\n})();\n\n\nfabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.StaticCanvas.prototype */ {\n /**\n * Populates canvas with data from the specified JSON.\n * JSON format must conform to the one of {@link fabric.Canvas#toJSON}\n * @param {String|Object} json JSON string or object\n * @param {Function} callback Callback, invoked when json is parsed\n * and corresponding objects (e.g: {@link fabric.Image})\n * are initialized\n * @param {Function} [reviver] Method for further parsing of JSON elements, called after each fabric object created.\n * @return {fabric.Canvas} instance\n * @chainable\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#deserialization}\n * @see {@link http://jsfiddle.net/fabricjs/fmgXt/|jsFiddle demo}\n * @example loadFromJSON\n * canvas.loadFromJSON(json, canvas.renderAll.bind(canvas));\n * @example loadFromJSON with reviver\n * canvas.loadFromJSON(json, canvas.renderAll.bind(canvas), function(o, object) {\n * // `o` = json object\n * // `object` = fabric.Object instance\n * // ... do some stuff ...\n * });\n */\n loadFromJSON: function (json, callback, reviver) {\n if (!json) {\n return;\n }\n\n // serialize if it wasn't already\n var serialized = (typeof json === 'string')\n ? JSON.parse(json)\n : fabric.util.object.clone(json);\n\n var _this = this,\n clipPath = serialized.clipPath,\n renderOnAddRemove = this.renderOnAddRemove;\n\n this.renderOnAddRemove = false;\n\n delete serialized.clipPath;\n\n this._enlivenObjects(serialized.objects, function (enlivenedObjects) {\n _this.clear();\n _this._setBgOverlay(serialized, function () {\n if (clipPath) {\n _this._enlivenObjects([clipPath], function (enlivenedCanvasClip) {\n _this.clipPath = enlivenedCanvasClip[0];\n _this.__setupCanvas.call(_this, serialized, enlivenedObjects, renderOnAddRemove, callback);\n });\n }\n else {\n _this.__setupCanvas.call(_this, serialized, enlivenedObjects, renderOnAddRemove, callback);\n }\n });\n }, reviver);\n return this;\n },\n\n /**\n * @private\n * @param {Object} serialized Object with background and overlay information\n * @param {Array} restored canvas objects\n * @param {Function} cached renderOnAddRemove callback\n * @param {Function} callback Invoked after all background and overlay images/patterns loaded\n */\n __setupCanvas: function(serialized, enlivenedObjects, renderOnAddRemove, callback) {\n var _this = this;\n enlivenedObjects.forEach(function(obj, index) {\n // we splice the array just in case some custom classes restored from JSON\n // will add more object to canvas at canvas init.\n _this.insertAt(obj, index);\n });\n this.renderOnAddRemove = renderOnAddRemove;\n // remove parts i cannot set as options\n delete serialized.objects;\n delete serialized.backgroundImage;\n delete serialized.overlayImage;\n delete serialized.background;\n delete serialized.overlay;\n // this._initOptions does too many things to just\n // call it. Normally loading an Object from JSON\n // create the Object instance. Here the Canvas is\n // already an instance and we are just loading things over it\n this._setOptions(serialized);\n this.renderAll();\n callback && callback();\n },\n\n /**\n * @private\n * @param {Object} serialized Object with background and overlay information\n * @param {Function} callback Invoked after all background and overlay images/patterns loaded\n */\n _setBgOverlay: function(serialized, callback) {\n var loaded = {\n backgroundColor: false,\n overlayColor: false,\n backgroundImage: false,\n overlayImage: false\n };\n\n if (!serialized.backgroundImage && !serialized.overlayImage && !serialized.background && !serialized.overlay) {\n callback && callback();\n return;\n }\n\n var cbIfLoaded = function () {\n if (loaded.backgroundImage && loaded.overlayImage && loaded.backgroundColor && loaded.overlayColor) {\n callback && callback();\n }\n };\n\n this.__setBgOverlay('backgroundImage', serialized.backgroundImage, loaded, cbIfLoaded);\n this.__setBgOverlay('overlayImage', serialized.overlayImage, loaded, cbIfLoaded);\n this.__setBgOverlay('backgroundColor', serialized.background, loaded, cbIfLoaded);\n this.__setBgOverlay('overlayColor', serialized.overlay, loaded, cbIfLoaded);\n },\n\n /**\n * @private\n * @param {String} property Property to set (backgroundImage, overlayImage, backgroundColor, overlayColor)\n * @param {(Object|String)} value Value to set\n * @param {Object} loaded Set loaded property to true if property is set\n * @param {Object} callback Callback function to invoke after property is set\n */\n __setBgOverlay: function(property, value, loaded, callback) {\n var _this = this;\n\n if (!value) {\n loaded[property] = true;\n callback && callback();\n return;\n }\n\n if (property === 'backgroundImage' || property === 'overlayImage') {\n fabric.util.enlivenObjects([value], function(enlivedObject){\n _this[property] = enlivedObject[0];\n loaded[property] = true;\n callback && callback();\n });\n }\n else {\n this['set' + fabric.util.string.capitalize(property, true)](value, function() {\n loaded[property] = true;\n callback && callback();\n });\n }\n },\n\n /**\n * @private\n * @param {Array} objects\n * @param {Function} callback\n * @param {Function} [reviver]\n */\n _enlivenObjects: function (objects, callback, reviver) {\n if (!objects || objects.length === 0) {\n callback && callback([]);\n return;\n }\n\n fabric.util.enlivenObjects(objects, function(enlivenedObjects) {\n callback && callback(enlivenedObjects);\n }, null, reviver);\n },\n\n /**\n * @private\n * @param {String} format\n * @param {Function} callback\n */\n _toDataURL: function (format, callback) {\n this.clone(function (clone) {\n callback(clone.toDataURL(format));\n });\n },\n\n /**\n * @private\n * @param {String} format\n * @param {Number} multiplier\n * @param {Function} callback\n */\n _toDataURLWithMultiplier: function (format, multiplier, callback) {\n this.clone(function (clone) {\n callback(clone.toDataURLWithMultiplier(format, multiplier));\n });\n },\n\n /**\n * Clones canvas instance\n * @param {Object} [callback] Receives cloned instance as a first argument\n * @param {Array} [properties] Array of properties to include in the cloned canvas and children\n */\n clone: function (callback, properties) {\n var data = JSON.stringify(this.toJSON(properties));\n this.cloneWithoutData(function(clone) {\n clone.loadFromJSON(data, function() {\n callback && callback(clone);\n });\n });\n },\n\n /**\n * Clones canvas instance without cloning existing data.\n * This essentially copies canvas dimensions, clipping properties, etc.\n * but leaves data empty (so that you can populate it with your own)\n * @param {Object} [callback] Receives cloned instance as a first argument\n */\n cloneWithoutData: function(callback) {\n var el = fabric.util.createCanvasElement();\n\n el.width = this.width;\n el.height = this.height;\n\n var clone = new fabric.Canvas(el);\n if (this.backgroundImage) {\n clone.setBackgroundImage(this.backgroundImage.src, function() {\n clone.renderAll();\n callback && callback(clone);\n });\n clone.backgroundImageOpacity = this.backgroundImageOpacity;\n clone.backgroundImageStretch = this.backgroundImageStretch;\n }\n else {\n callback && callback(clone);\n }\n }\n});\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n extend = fabric.util.object.extend,\n clone = fabric.util.object.clone,\n toFixed = fabric.util.toFixed,\n capitalize = fabric.util.string.capitalize,\n degreesToRadians = fabric.util.degreesToRadians,\n objectCaching = !fabric.isLikelyNode,\n ALIASING_LIMIT = 2;\n\n if (fabric.Object) {\n return;\n }\n\n /**\n * Root object class from which all 2d shape classes inherit from\n * @class fabric.Object\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#objects}\n * @see {@link fabric.Object#initialize} for constructor definition\n *\n * @fires added\n * @fires removed\n *\n * @fires selected\n * @fires deselected\n * @fires modified\n * @fires modified\n * @fires moved\n * @fires scaled\n * @fires rotated\n * @fires skewed\n *\n * @fires rotating\n * @fires scaling\n * @fires moving\n * @fires skewing\n *\n * @fires mousedown\n * @fires mouseup\n * @fires mouseover\n * @fires mouseout\n * @fires mousewheel\n * @fires mousedblclick\n *\n * @fires dragover\n * @fires dragenter\n * @fires dragleave\n * @fires drop\n */\n fabric.Object = fabric.util.createClass(fabric.CommonMethods, /** @lends fabric.Object.prototype */ {\n\n /**\n * Type of an object (rect, circle, path, etc.).\n * Note that this property is meant to be read-only and not meant to be modified.\n * If you modify, certain parts of Fabric (such as JSON loading) won't work correctly.\n * @type String\n * @default\n */\n type: 'object',\n\n /**\n * Horizontal origin of transformation of an object (one of \"left\", \"right\", \"center\")\n * See http://jsfiddle.net/1ow02gea/244/ on how originX/originY affect objects in groups\n * @type String\n * @default\n */\n originX: 'left',\n\n /**\n * Vertical origin of transformation of an object (one of \"top\", \"bottom\", \"center\")\n * See http://jsfiddle.net/1ow02gea/244/ on how originX/originY affect objects in groups\n * @type String\n * @default\n */\n originY: 'top',\n\n /**\n * Top position of an object. Note that by default it's relative to object top. You can change this by setting originY={top/center/bottom}\n * @type Number\n * @default\n */\n top: 0,\n\n /**\n * Left position of an object. Note that by default it's relative to object left. You can change this by setting originX={left/center/right}\n * @type Number\n * @default\n */\n left: 0,\n\n /**\n * Object width\n * @type Number\n * @default\n */\n width: 0,\n\n /**\n * Object height\n * @type Number\n * @default\n */\n height: 0,\n\n /**\n * Object scale factor (horizontal)\n * @type Number\n * @default\n */\n scaleX: 1,\n\n /**\n * Object scale factor (vertical)\n * @type Number\n * @default\n */\n scaleY: 1,\n\n /**\n * When true, an object is rendered as flipped horizontally\n * @type Boolean\n * @default\n */\n flipX: false,\n\n /**\n * When true, an object is rendered as flipped vertically\n * @type Boolean\n * @default\n */\n flipY: false,\n\n /**\n * Opacity of an object\n * @type Number\n * @default\n */\n opacity: 1,\n\n /**\n * Angle of rotation of an object (in degrees)\n * @type Number\n * @default\n */\n angle: 0,\n\n /**\n * Angle of skew on x axes of an object (in degrees)\n * @type Number\n * @default\n */\n skewX: 0,\n\n /**\n * Angle of skew on y axes of an object (in degrees)\n * @type Number\n * @default\n */\n skewY: 0,\n\n /**\n * Size of object's controlling corners (in pixels)\n * @type Number\n * @default\n */\n cornerSize: 13,\n\n /**\n * Size of object's controlling corners when touch interaction is detected\n * @type Number\n * @default\n */\n touchCornerSize: 24,\n\n /**\n * When true, object's controlling corners are rendered as transparent inside (i.e. stroke instead of fill)\n * @type Boolean\n * @default\n */\n transparentCorners: true,\n\n /**\n * Default cursor value used when hovering over this object on canvas\n * @type String\n * @default\n */\n hoverCursor: null,\n\n /**\n * Default cursor value used when moving this object on canvas\n * @type String\n * @default\n */\n moveCursor: null,\n\n /**\n * Padding between object and its controlling borders (in pixels)\n * @type Number\n * @default\n */\n padding: 0,\n\n /**\n * Color of controlling borders of an object (when it's active)\n * @type String\n * @default\n */\n borderColor: 'rgb(178,204,255)',\n\n /**\n * Array specifying dash pattern of an object's borders (hasBorder must be true)\n * @since 1.6.2\n * @type Array\n */\n borderDashArray: null,\n\n /**\n * Color of controlling corners of an object (when it's active)\n * @type String\n * @default\n */\n cornerColor: 'rgb(178,204,255)',\n\n /**\n * Color of controlling corners of an object (when it's active and transparentCorners false)\n * @since 1.6.2\n * @type String\n * @default\n */\n cornerStrokeColor: null,\n\n /**\n * Specify style of control, 'rect' or 'circle'\n * @since 1.6.2\n * @type String\n */\n cornerStyle: 'rect',\n\n /**\n * Array specifying dash pattern of an object's control (hasBorder must be true)\n * @since 1.6.2\n * @type Array\n */\n cornerDashArray: null,\n\n /**\n * When true, this object will use center point as the origin of transformation\n * when being scaled via the controls.\n * Backwards incompatibility note: This property replaces \"centerTransform\" (Boolean).\n * @since 1.3.4\n * @type Boolean\n * @default\n */\n centeredScaling: false,\n\n /**\n * When true, this object will use center point as the origin of transformation\n * when being rotated via the controls.\n * Backwards incompatibility note: This property replaces \"centerTransform\" (Boolean).\n * @since 1.3.4\n * @type Boolean\n * @default\n */\n centeredRotation: true,\n\n /**\n * Color of object's fill\n * takes css colors https://www.w3.org/TR/css-color-3/\n * @type String\n * @default\n */\n fill: 'rgb(0,0,0)',\n\n /**\n * Fill rule used to fill an object\n * accepted values are nonzero, evenodd\n * Backwards incompatibility note: This property was used for setting globalCompositeOperation until v1.4.12 (use `fabric.Object#globalCompositeOperation` instead)\n * @type String\n * @default\n */\n fillRule: 'nonzero',\n\n /**\n * Composite rule used for canvas globalCompositeOperation\n * @type String\n * @default\n */\n globalCompositeOperation: 'source-over',\n\n /**\n * Background color of an object.\n * takes css colors https://www.w3.org/TR/css-color-3/\n * @type String\n * @default\n */\n backgroundColor: '',\n\n /**\n * Selection Background color of an object. colored layer behind the object when it is active.\n * does not mix good with globalCompositeOperation methods.\n * @type String\n * @default\n */\n selectionBackgroundColor: '',\n\n /**\n * When defined, an object is rendered via stroke and this property specifies its color\n * takes css colors https://www.w3.org/TR/css-color-3/\n * @type String\n * @default\n */\n stroke: null,\n\n /**\n * Width of a stroke used to render this object\n * @type Number\n * @default\n */\n strokeWidth: 1,\n\n /**\n * Array specifying dash pattern of an object's stroke (stroke must be defined)\n * @type Array\n */\n strokeDashArray: null,\n\n /**\n * Line offset of an object's stroke\n * @type Number\n * @default\n */\n strokeDashOffset: 0,\n\n /**\n * Line endings style of an object's stroke (one of \"butt\", \"round\", \"square\")\n * @type String\n * @default\n */\n strokeLineCap: 'butt',\n\n /**\n * Corner style of an object's stroke (one of \"bevel\", \"round\", \"miter\")\n * @type String\n * @default\n */\n strokeLineJoin: 'miter',\n\n /**\n * Maximum miter length (used for strokeLineJoin = \"miter\") of an object's stroke\n * @type Number\n * @default\n */\n strokeMiterLimit: 4,\n\n /**\n * Shadow object representing shadow of this shape\n * @type fabric.Shadow\n * @default\n */\n shadow: null,\n\n /**\n * Opacity of object's controlling borders when object is active and moving\n * @type Number\n * @default\n */\n borderOpacityWhenMoving: 0.4,\n\n /**\n * Scale factor of object's controlling borders\n * bigger number will make a thicker border\n * border is 1, so this is basically a border thickness\n * since there is no way to change the border itself.\n * @type Number\n * @default\n */\n borderScaleFactor: 1,\n\n /**\n * Minimum allowed scale value of an object\n * @type Number\n * @default\n */\n minScaleLimit: 0,\n\n /**\n * When set to `false`, an object can not be selected for modification (using either point-click-based or group-based selection).\n * But events still fire on it.\n * @type Boolean\n * @default\n */\n selectable: true,\n\n /**\n * When set to `false`, an object can not be a target of events. All events propagate through it. Introduced in v1.3.4\n * @type Boolean\n * @default\n */\n evented: true,\n\n /**\n * When set to `false`, an object is not rendered on canvas\n * @type Boolean\n * @default\n */\n visible: true,\n\n /**\n * When set to `false`, object's controls are not displayed and can not be used to manipulate object\n * @type Boolean\n * @default\n */\n hasControls: true,\n\n /**\n * When set to `false`, object's controlling borders are not rendered\n * @type Boolean\n * @default\n */\n hasBorders: true,\n\n /**\n * When set to `true`, objects are \"found\" on canvas on per-pixel basis rather than according to bounding box\n * @type Boolean\n * @default\n */\n perPixelTargetFind: false,\n\n /**\n * When `false`, default object's values are not included in its serialization\n * @type Boolean\n * @default\n */\n includeDefaultValues: true,\n\n /**\n * When `true`, object horizontal movement is locked\n * @type Boolean\n * @default\n */\n lockMovementX: false,\n\n /**\n * When `true`, object vertical movement is locked\n * @type Boolean\n * @default\n */\n lockMovementY: false,\n\n /**\n * When `true`, object rotation is locked\n * @type Boolean\n * @default\n */\n lockRotation: false,\n\n /**\n * When `true`, object horizontal scaling is locked\n * @type Boolean\n * @default\n */\n lockScalingX: false,\n\n /**\n * When `true`, object vertical scaling is locked\n * @type Boolean\n * @default\n */\n lockScalingY: false,\n\n /**\n * When `true`, object horizontal skewing is locked\n * @type Boolean\n * @default\n */\n lockSkewingX: false,\n\n /**\n * When `true`, object vertical skewing is locked\n * @type Boolean\n * @default\n */\n lockSkewingY: false,\n\n /**\n * When `true`, object cannot be flipped by scaling into negative values\n * @type Boolean\n * @default\n */\n lockScalingFlip: false,\n\n /**\n * When `true`, object is not exported in OBJECT/JSON\n * @since 1.6.3\n * @type Boolean\n * @default\n */\n excludeFromExport: false,\n\n /**\n * When `true`, object is cached on an additional canvas.\n * When `false`, object is not cached unless necessary ( clipPath )\n * default to true\n * @since 1.7.0\n * @type Boolean\n * @default true\n */\n objectCaching: objectCaching,\n\n /**\n * When `true`, object properties are checked for cache invalidation. In some particular\n * situation you may want this to be disabled ( spray brush, very big, groups)\n * or if your application does not allow you to modify properties for groups child you want\n * to disable it for groups.\n * default to false\n * since 1.7.0\n * @type Boolean\n * @default false\n */\n statefullCache: false,\n\n /**\n * When `true`, cache does not get updated during scaling. The picture will get blocky if scaled\n * too much and will be redrawn with correct details at the end of scaling.\n * this setting is performance and application dependant.\n * default to true\n * since 1.7.0\n * @type Boolean\n * @default true\n */\n noScaleCache: true,\n\n /**\n * When `false`, the stoke width will scale with the object.\n * When `true`, the stroke will always match the exact pixel size entered for stroke width.\n * this Property does not work on Text classes or drawing call that uses strokeText,fillText methods\n * default to false\n * @since 2.6.0\n * @type Boolean\n * @default false\n * @type Boolean\n * @default false\n */\n strokeUniform: false,\n\n /**\n * When set to `true`, object's cache will be rerendered next render call.\n * since 1.7.0\n * @type Boolean\n * @default true\n */\n dirty: true,\n\n /**\n * keeps the value of the last hovered corner during mouse move.\n * 0 is no corner, or 'mt', 'ml', 'mtr' etc..\n * It should be private, but there is no harm in using it as\n * a read-only property.\n * @type number|string|any\n * @default 0\n */\n __corner: 0,\n\n /**\n * Determines if the fill or the stroke is drawn first (one of \"fill\" or \"stroke\")\n * @type String\n * @default\n */\n paintFirst: 'fill',\n\n /**\n * When 'down', object is set to active on mousedown/touchstart\n * When 'up', object is set to active on mouseup/touchend\n * Experimental. Let's see if this breaks anything before supporting officially\n * @private\n * since 4.4.0\n * @type String\n * @default 'down'\n */\n activeOn: 'down',\n\n /**\n * List of properties to consider when checking if state\n * of an object is changed (fabric.Object#hasStateChanged)\n * as well as for history (undo/redo) purposes\n * @type Array\n */\n stateProperties: (\n 'top left width height scaleX scaleY flipX flipY originX originY transformMatrix ' +\n 'stroke strokeWidth strokeDashArray strokeLineCap strokeDashOffset strokeLineJoin strokeMiterLimit ' +\n 'angle opacity fill globalCompositeOperation shadow visible backgroundColor ' +\n 'skewX skewY fillRule paintFirst clipPath strokeUniform'\n ).split(' '),\n\n /**\n * List of properties to consider when checking if cache needs refresh\n * Those properties are checked by statefullCache ON ( or lazy mode if we want ) or from single\n * calls to Object.set(key, value). If the key is in this list, the object is marked as dirty\n * and refreshed at the next render\n * @type Array\n */\n cacheProperties: (\n 'fill stroke strokeWidth strokeDashArray width height paintFirst strokeUniform' +\n ' strokeLineCap strokeDashOffset strokeLineJoin strokeMiterLimit backgroundColor clipPath'\n ).split(' '),\n\n /**\n * List of properties to consider for animating colors.\n * @type Array\n */\n colorProperties: (\n 'fill stroke backgroundColor'\n ).split(' '),\n\n /**\n * a fabricObject that, without stroke define a clipping area with their shape. filled in black\n * the clipPath object gets used when the object has rendered, and the context is placed in the center\n * of the object cacheCanvas.\n * If you want 0,0 of a clipPath to align with an object center, use clipPath.originX/Y to 'center'\n * @type fabric.Object\n */\n clipPath: undefined,\n\n /**\n * Meaningful ONLY when the object is used as clipPath.\n * if true, the clipPath will make the object clip to the outside of the clipPath\n * since 2.4.0\n * @type boolean\n * @default false\n */\n inverted: false,\n\n /**\n * Meaningful ONLY when the object is used as clipPath.\n * if true, the clipPath will have its top and left relative to canvas, and will\n * not be influenced by the object transform. This will make the clipPath relative\n * to the canvas, but clipping just a particular object.\n * WARNING this is beta, this feature may change or be renamed.\n * since 2.4.0\n * @type boolean\n * @default false\n */\n absolutePositioned: false,\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n initialize: function(options) {\n if (options) {\n this.setOptions(options);\n }\n },\n\n /**\n * Create a the canvas used to keep the cached copy of the object\n * @private\n */\n _createCacheCanvas: function() {\n this._cacheProperties = {};\n this._cacheCanvas = fabric.util.createCanvasElement();\n this._cacheContext = this._cacheCanvas.getContext('2d');\n this._updateCacheCanvas();\n // if canvas gets created, is empty, so dirty.\n this.dirty = true;\n },\n\n /**\n * Limit the cache dimensions so that X * Y do not cross fabric.perfLimitSizeTotal\n * and each side do not cross fabric.cacheSideLimit\n * those numbers are configurable so that you can get as much detail as you want\n * making bargain with performances.\n * @param {Object} dims\n * @param {Object} dims.width width of canvas\n * @param {Object} dims.height height of canvas\n * @param {Object} dims.zoomX zoomX zoom value to unscale the canvas before drawing cache\n * @param {Object} dims.zoomY zoomY zoom value to unscale the canvas before drawing cache\n * @return {Object}.width width of canvas\n * @return {Object}.height height of canvas\n * @return {Object}.zoomX zoomX zoom value to unscale the canvas before drawing cache\n * @return {Object}.zoomY zoomY zoom value to unscale the canvas before drawing cache\n */\n _limitCacheSize: function(dims) {\n var perfLimitSizeTotal = fabric.perfLimitSizeTotal,\n width = dims.width, height = dims.height,\n max = fabric.maxCacheSideLimit, min = fabric.minCacheSideLimit;\n if (width <= max && height <= max && width * height <= perfLimitSizeTotal) {\n if (width < min) {\n dims.width = min;\n }\n if (height < min) {\n dims.height = min;\n }\n return dims;\n }\n var ar = width / height, limitedDims = fabric.util.limitDimsByArea(ar, perfLimitSizeTotal),\n capValue = fabric.util.capValue,\n x = capValue(min, limitedDims.x, max),\n y = capValue(min, limitedDims.y, max);\n if (width > x) {\n dims.zoomX /= width / x;\n dims.width = x;\n dims.capped = true;\n }\n if (height > y) {\n dims.zoomY /= height / y;\n dims.height = y;\n dims.capped = true;\n }\n return dims;\n },\n\n /**\n * Return the dimension and the zoom level needed to create a cache canvas\n * big enough to host the object to be cached.\n * @private\n * @return {Object}.x width of object to be cached\n * @return {Object}.y height of object to be cached\n * @return {Object}.width width of canvas\n * @return {Object}.height height of canvas\n * @return {Object}.zoomX zoomX zoom value to unscale the canvas before drawing cache\n * @return {Object}.zoomY zoomY zoom value to unscale the canvas before drawing cache\n */\n _getCacheCanvasDimensions: function() {\n var objectScale = this.getTotalObjectScaling(),\n // caculate dimensions without skewing\n dim = this._getTransformedDimensions(0, 0),\n neededX = dim.x * objectScale.scaleX / this.scaleX,\n neededY = dim.y * objectScale.scaleY / this.scaleY;\n return {\n // for sure this ALIASING_LIMIT is slightly creating problem\n // in situation in which the cache canvas gets an upper limit\n // also objectScale contains already scaleX and scaleY\n width: neededX + ALIASING_LIMIT,\n height: neededY + ALIASING_LIMIT,\n zoomX: objectScale.scaleX,\n zoomY: objectScale.scaleY,\n x: neededX,\n y: neededY\n };\n },\n\n /**\n * Update width and height of the canvas for cache\n * returns true or false if canvas needed resize.\n * @private\n * @return {Boolean} true if the canvas has been resized\n */\n _updateCacheCanvas: function() {\n var targetCanvas = this.canvas;\n if (this.noScaleCache && targetCanvas && targetCanvas._currentTransform) {\n var target = targetCanvas._currentTransform.target,\n action = targetCanvas._currentTransform.action;\n if (this === target && action.slice && action.slice(0, 5) === 'scale') {\n return false;\n }\n }\n var canvas = this._cacheCanvas,\n dims = this._limitCacheSize(this._getCacheCanvasDimensions()),\n minCacheSize = fabric.minCacheSideLimit,\n width = dims.width, height = dims.height, drawingWidth, drawingHeight,\n zoomX = dims.zoomX, zoomY = dims.zoomY,\n dimensionsChanged = width !== this.cacheWidth || height !== this.cacheHeight,\n zoomChanged = this.zoomX !== zoomX || this.zoomY !== zoomY,\n shouldRedraw = dimensionsChanged || zoomChanged,\n additionalWidth = 0, additionalHeight = 0, shouldResizeCanvas = false;\n if (dimensionsChanged) {\n var canvasWidth = this._cacheCanvas.width,\n canvasHeight = this._cacheCanvas.height,\n sizeGrowing = width > canvasWidth || height > canvasHeight,\n sizeShrinking = (width < canvasWidth * 0.9 || height < canvasHeight * 0.9) &&\n canvasWidth > minCacheSize && canvasHeight > minCacheSize;\n shouldResizeCanvas = sizeGrowing || sizeShrinking;\n if (sizeGrowing && !dims.capped && (width > minCacheSize || height > minCacheSize)) {\n additionalWidth = width * 0.1;\n additionalHeight = height * 0.1;\n }\n }\n if (this instanceof fabric.Text && this.path) {\n shouldRedraw = true;\n shouldResizeCanvas = true;\n additionalWidth += this.getHeightOfLine(0) * this.zoomX;\n additionalHeight += this.getHeightOfLine(0) * this.zoomY;\n }\n if (shouldRedraw) {\n if (shouldResizeCanvas) {\n canvas.width = Math.ceil(width + additionalWidth);\n canvas.height = Math.ceil(height + additionalHeight);\n }\n else {\n this._cacheContext.setTransform(1, 0, 0, 1, 0, 0);\n this._cacheContext.clearRect(0, 0, canvas.width, canvas.height);\n }\n drawingWidth = dims.x / 2;\n drawingHeight = dims.y / 2;\n this.cacheTranslationX = Math.round(canvas.width / 2 - drawingWidth) + drawingWidth;\n this.cacheTranslationY = Math.round(canvas.height / 2 - drawingHeight) + drawingHeight;\n this.cacheWidth = width;\n this.cacheHeight = height;\n this._cacheContext.translate(this.cacheTranslationX, this.cacheTranslationY);\n this._cacheContext.scale(zoomX, zoomY);\n this.zoomX = zoomX;\n this.zoomY = zoomY;\n return true;\n }\n return false;\n },\n\n /**\n * Sets object's properties from options\n * @param {Object} [options] Options object\n */\n setOptions: function(options) {\n this._setOptions(options);\n this._initGradient(options.fill, 'fill');\n this._initGradient(options.stroke, 'stroke');\n this._initPattern(options.fill, 'fill');\n this._initPattern(options.stroke, 'stroke');\n },\n\n /**\n * Transforms context when rendering an object\n * @param {CanvasRenderingContext2D} ctx Context\n */\n transform: function(ctx) {\n var needFullTransform = (this.group && !this.group._transformDone) ||\n (this.group && this.canvas && ctx === this.canvas.contextTop);\n var m = this.calcTransformMatrix(!needFullTransform);\n ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n },\n\n /**\n * Returns an object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n var NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS,\n\n object = {\n type: this.type,\n version: fabric.version,\n originX: this.originX,\n originY: this.originY,\n left: toFixed(this.left, NUM_FRACTION_DIGITS),\n top: toFixed(this.top, NUM_FRACTION_DIGITS),\n width: toFixed(this.width, NUM_FRACTION_DIGITS),\n height: toFixed(this.height, NUM_FRACTION_DIGITS),\n fill: (this.fill && this.fill.toObject) ? this.fill.toObject() : this.fill,\n stroke: (this.stroke && this.stroke.toObject) ? this.stroke.toObject() : this.stroke,\n strokeWidth: toFixed(this.strokeWidth, NUM_FRACTION_DIGITS),\n strokeDashArray: this.strokeDashArray ? this.strokeDashArray.concat() : this.strokeDashArray,\n strokeLineCap: this.strokeLineCap,\n strokeDashOffset: this.strokeDashOffset,\n strokeLineJoin: this.strokeLineJoin,\n strokeUniform: this.strokeUniform,\n strokeMiterLimit: toFixed(this.strokeMiterLimit, NUM_FRACTION_DIGITS),\n scaleX: toFixed(this.scaleX, NUM_FRACTION_DIGITS),\n scaleY: toFixed(this.scaleY, NUM_FRACTION_DIGITS),\n angle: toFixed(this.angle, NUM_FRACTION_DIGITS),\n flipX: this.flipX,\n flipY: this.flipY,\n opacity: toFixed(this.opacity, NUM_FRACTION_DIGITS),\n shadow: (this.shadow && this.shadow.toObject) ? this.shadow.toObject() : this.shadow,\n visible: this.visible,\n backgroundColor: this.backgroundColor,\n fillRule: this.fillRule,\n paintFirst: this.paintFirst,\n globalCompositeOperation: this.globalCompositeOperation,\n skewX: toFixed(this.skewX, NUM_FRACTION_DIGITS),\n skewY: toFixed(this.skewY, NUM_FRACTION_DIGITS),\n };\n\n if (this.clipPath && !this.clipPath.excludeFromExport) {\n object.clipPath = this.clipPath.toObject(propertiesToInclude);\n object.clipPath.inverted = this.clipPath.inverted;\n object.clipPath.absolutePositioned = this.clipPath.absolutePositioned;\n }\n\n fabric.util.populateWithProperties(this, object, propertiesToInclude);\n if (!this.includeDefaultValues) {\n object = this._removeDefaultValues(object);\n }\n\n return object;\n },\n\n /**\n * Returns (dataless) object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toDatalessObject: function(propertiesToInclude) {\n // will be overwritten by subclasses\n return this.toObject(propertiesToInclude);\n },\n\n /**\n * @private\n * @param {Object} object\n */\n _removeDefaultValues: function(object) {\n var prototype = fabric.util.getKlass(object.type).prototype,\n stateProperties = prototype.stateProperties;\n stateProperties.forEach(function(prop) {\n if (prop === 'left' || prop === 'top') {\n return;\n }\n if (object[prop] === prototype[prop]) {\n delete object[prop];\n }\n // basically a check for [] === []\n if (Array.isArray(object[prop]) && Array.isArray(prototype[prop])\n && object[prop].length === 0 && prototype[prop].length === 0) {\n delete object[prop];\n }\n });\n\n return object;\n },\n\n /**\n * Returns a string representation of an instance\n * @return {String}\n */\n toString: function() {\n return '#';\n },\n\n /**\n * Return the object scale factor counting also the group scaling\n * @return {Object} object with scaleX and scaleY properties\n */\n getObjectScaling: function() {\n // if the object is a top level one, on the canvas, we go for simple aritmetic\n // otherwise the complex method with angles will return approximations and decimals\n // and will likely kill the cache when not needed\n // https://github.com/fabricjs/fabric.js/issues/7157\n if (!this.group) {\n return {\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n };\n }\n // if we are inside a group total zoom calculation is complex, we defer to generic matrices\n var options = fabric.util.qrDecompose(this.calcTransformMatrix());\n return { scaleX: Math.abs(options.scaleX), scaleY: Math.abs(options.scaleY) };\n },\n\n /**\n * Return the object scale factor counting also the group scaling, zoom and retina\n * @return {Object} object with scaleX and scaleY properties\n */\n getTotalObjectScaling: function() {\n var scale = this.getObjectScaling(), scaleX = scale.scaleX, scaleY = scale.scaleY;\n if (this.canvas) {\n var zoom = this.canvas.getZoom();\n var retina = this.canvas.getRetinaScaling();\n scaleX *= zoom * retina;\n scaleY *= zoom * retina;\n }\n return { scaleX: scaleX, scaleY: scaleY };\n },\n\n /**\n * Return the object opacity counting also the group property\n * @return {Number}\n */\n getObjectOpacity: function() {\n var opacity = this.opacity;\n if (this.group) {\n opacity *= this.group.getObjectOpacity();\n }\n return opacity;\n },\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n * @return {fabric.Object} thisArg\n */\n _set: function(key, value) {\n var shouldConstrainValue = (key === 'scaleX' || key === 'scaleY'),\n isChanged = this[key] !== value, groupNeedsUpdate = false;\n\n if (shouldConstrainValue) {\n value = this._constrainScale(value);\n }\n if (key === 'scaleX' && value < 0) {\n this.flipX = !this.flipX;\n value *= -1;\n }\n else if (key === 'scaleY' && value < 0) {\n this.flipY = !this.flipY;\n value *= -1;\n }\n else if (key === 'shadow' && value && !(value instanceof fabric.Shadow)) {\n value = new fabric.Shadow(value);\n }\n else if (key === 'dirty' && this.group) {\n this.group.set('dirty', value);\n }\n\n this[key] = value;\n\n if (isChanged) {\n groupNeedsUpdate = this.group && this.group.isOnACache();\n if (this.cacheProperties.indexOf(key) > -1) {\n this.dirty = true;\n groupNeedsUpdate && this.group.set('dirty', true);\n }\n else if (groupNeedsUpdate && this.stateProperties.indexOf(key) > -1) {\n this.group.set('dirty', true);\n }\n }\n return this;\n },\n\n /**\n * This callback function is called by the parent group of an object every\n * time a non-delegated property changes on the group. It is passed the key\n * and value as parameters. Not adding in this function's signature to avoid\n * Travis build error about unused variables.\n */\n setOnGroup: function() {\n // implemented by sub-classes, as needed.\n },\n\n /**\n * Retrieves viewportTransform from Object's canvas if possible\n * @method getViewportTransform\n * @memberOf fabric.Object.prototype\n * @return {Array}\n */\n getViewportTransform: function() {\n if (this.canvas && this.canvas.viewportTransform) {\n return this.canvas.viewportTransform;\n }\n return fabric.iMatrix.concat();\n },\n\n /*\n * @private\n * return if the object would be visible in rendering\n * @memberOf fabric.Object.prototype\n * @return {Boolean}\n */\n isNotVisible: function() {\n return this.opacity === 0 ||\n (!this.width && !this.height && this.strokeWidth === 0) ||\n !this.visible;\n },\n\n /**\n * Renders an object on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n render: function(ctx) {\n // do not render if width/height are zeros or object is not visible\n if (this.isNotVisible()) {\n return;\n }\n if (this.canvas && this.canvas.skipOffscreen && !this.group && !this.isOnScreen()) {\n return;\n }\n ctx.save();\n this._setupCompositeOperation(ctx);\n this.drawSelectionBackground(ctx);\n this.transform(ctx);\n this._setOpacity(ctx);\n this._setShadow(ctx, this);\n if (this.shouldCache()) {\n this.renderCache();\n this.drawCacheOnCanvas(ctx);\n }\n else {\n this._removeCacheCanvas();\n this.dirty = false;\n this.drawObject(ctx);\n if (this.objectCaching && this.statefullCache) {\n this.saveState({ propertySet: 'cacheProperties' });\n }\n }\n ctx.restore();\n },\n\n renderCache: function(options) {\n options = options || {};\n if (!this._cacheCanvas || !this._cacheContext) {\n this._createCacheCanvas();\n }\n if (this.isCacheDirty()) {\n this.statefullCache && this.saveState({ propertySet: 'cacheProperties' });\n this.drawObject(this._cacheContext, options.forClipping);\n this.dirty = false;\n }\n },\n\n /**\n * Remove cacheCanvas and its dimensions from the objects\n */\n _removeCacheCanvas: function() {\n this._cacheCanvas = null;\n this._cacheContext = null;\n this.cacheWidth = 0;\n this.cacheHeight = 0;\n },\n\n /**\n * return true if the object will draw a stroke\n * Does not consider text styles. This is just a shortcut used at rendering time\n * We want it to be an approximation and be fast.\n * wrote to avoid extra caching, it has to return true when stroke happens,\n * can guess when it will not happen at 100% chance, does not matter if it misses\n * some use case where the stroke is invisible.\n * @since 3.0.0\n * @returns Boolean\n */\n hasStroke: function() {\n return this.stroke && this.stroke !== 'transparent' && this.strokeWidth !== 0;\n },\n\n /**\n * return true if the object will draw a fill\n * Does not consider text styles. This is just a shortcut used at rendering time\n * We want it to be an approximation and be fast.\n * wrote to avoid extra caching, it has to return true when fill happens,\n * can guess when it will not happen at 100% chance, does not matter if it misses\n * some use case where the fill is invisible.\n * @since 3.0.0\n * @returns Boolean\n */\n hasFill: function() {\n return this.fill && this.fill !== 'transparent';\n },\n\n /**\n * When set to `true`, force the object to have its own cache, even if it is inside a group\n * it may be needed when your object behave in a particular way on the cache and always needs\n * its own isolated canvas to render correctly.\n * Created to be overridden\n * since 1.7.12\n * @returns Boolean\n */\n needsItsOwnCache: function() {\n if (this.paintFirst === 'stroke' &&\n this.hasFill() && this.hasStroke() && typeof this.shadow === 'object') {\n return true;\n }\n if (this.clipPath) {\n return true;\n }\n return false;\n },\n\n /**\n * Decide if the object should cache or not. Create its own cache level\n * objectCaching is a global flag, wins over everything\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step. None of the fabric classes requires it.\n * Generally you do not cache objects in groups because the group outside is cached.\n * Read as: cache if is needed, or if the feature is enabled but we are not already caching.\n * @return {Boolean}\n */\n shouldCache: function() {\n this.ownCaching = this.needsItsOwnCache() || (\n this.objectCaching &&\n (!this.group || !this.group.isOnACache())\n );\n return this.ownCaching;\n },\n\n /**\n * Check if this object or a child object will cast a shadow\n * used by Group.shouldCache to know if child has a shadow recursively\n * @return {Boolean}\n */\n willDrawShadow: function() {\n return !!this.shadow && (this.shadow.offsetX !== 0 || this.shadow.offsetY !== 0);\n },\n\n /**\n * Execute the drawing operation for an object clipPath\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {fabric.Object} clipPath\n */\n drawClipPathOnCache: function(ctx, clipPath) {\n ctx.save();\n // DEBUG: uncomment this line, comment the following\n // ctx.globalAlpha = 0.4\n if (clipPath.inverted) {\n ctx.globalCompositeOperation = 'destination-out';\n }\n else {\n ctx.globalCompositeOperation = 'destination-in';\n }\n //ctx.scale(1 / 2, 1 / 2);\n if (clipPath.absolutePositioned) {\n var m = fabric.util.invertTransform(this.calcTransformMatrix());\n ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]);\n }\n clipPath.transform(ctx);\n ctx.scale(1 / clipPath.zoomX, 1 / clipPath.zoomY);\n ctx.drawImage(clipPath._cacheCanvas, -clipPath.cacheTranslationX, -clipPath.cacheTranslationY);\n ctx.restore();\n },\n\n /**\n * Execute the drawing operation for an object on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawObject: function(ctx, forClipping) {\n var originalFill = this.fill, originalStroke = this.stroke;\n if (forClipping) {\n this.fill = 'black';\n this.stroke = '';\n this._setClippingProperties(ctx);\n }\n else {\n this._renderBackground(ctx);\n }\n this._render(ctx);\n this._drawClipPath(ctx, this.clipPath);\n this.fill = originalFill;\n this.stroke = originalStroke;\n },\n\n /**\n * Prepare clipPath state and cache and draw it on instance's cache\n * @param {CanvasRenderingContext2D} ctx\n * @param {fabric.Object} clipPath\n */\n _drawClipPath: function (ctx, clipPath) {\n if (!clipPath) { return; }\n // needed to setup a couple of variables\n // path canvas gets overridden with this one.\n // TODO find a better solution?\n clipPath.canvas = this.canvas;\n clipPath.shouldCache();\n clipPath._transformDone = true;\n clipPath.renderCache({ forClipping: true });\n this.drawClipPathOnCache(ctx, clipPath);\n },\n\n /**\n * Paint the cached copy of the object on the target context.\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawCacheOnCanvas: function(ctx) {\n ctx.scale(1 / this.zoomX, 1 / this.zoomY);\n ctx.drawImage(this._cacheCanvas, -this.cacheTranslationX, -this.cacheTranslationY);\n },\n\n /**\n * Check if cache is dirty\n * @param {Boolean} skipCanvas skip canvas checks because this object is painted\n * on parent canvas.\n */\n isCacheDirty: function(skipCanvas) {\n if (this.isNotVisible()) {\n return false;\n }\n if (this._cacheCanvas && this._cacheContext && !skipCanvas && this._updateCacheCanvas()) {\n // in this case the context is already cleared.\n return true;\n }\n else {\n if (this.dirty ||\n (this.clipPath && this.clipPath.absolutePositioned) ||\n (this.statefullCache && this.hasStateChanged('cacheProperties'))\n ) {\n if (this._cacheCanvas && this._cacheContext && !skipCanvas) {\n var width = this.cacheWidth / this.zoomX;\n var height = this.cacheHeight / this.zoomY;\n this._cacheContext.clearRect(-width / 2, -height / 2, width, height);\n }\n return true;\n }\n }\n return false;\n },\n\n /**\n * Draws a background for the object big as its untransformed dimensions\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderBackground: function(ctx) {\n if (!this.backgroundColor) {\n return;\n }\n var dim = this._getNonTransformedDimensions();\n ctx.fillStyle = this.backgroundColor;\n\n ctx.fillRect(\n -dim.x / 2,\n -dim.y / 2,\n dim.x,\n dim.y\n );\n // if there is background color no other shadows\n // should be casted\n this._removeShadow(ctx);\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _setOpacity: function(ctx) {\n if (this.group && !this.group._transformDone) {\n ctx.globalAlpha = this.getObjectOpacity();\n }\n else {\n ctx.globalAlpha *= this.opacity;\n }\n },\n\n _setStrokeStyles: function(ctx, decl) {\n var stroke = decl.stroke;\n if (stroke) {\n ctx.lineWidth = decl.strokeWidth;\n ctx.lineCap = decl.strokeLineCap;\n ctx.lineDashOffset = decl.strokeDashOffset;\n ctx.lineJoin = decl.strokeLineJoin;\n ctx.miterLimit = decl.strokeMiterLimit;\n if (stroke.toLive) {\n if (stroke.gradientUnits === 'percentage' || stroke.gradientTransform || stroke.patternTransform) {\n // need to transform gradient in a pattern.\n // this is a slow process. If you are hitting this codepath, and the object\n // is not using caching, you should consider switching it on.\n // we need a canvas as big as the current object caching canvas.\n this._applyPatternForTransformedGradient(ctx, stroke);\n }\n else {\n // is a simple gradient or pattern\n ctx.strokeStyle = stroke.toLive(ctx, this);\n this._applyPatternGradientTransform(ctx, stroke);\n }\n }\n else {\n // is a color\n ctx.strokeStyle = decl.stroke;\n }\n }\n },\n\n _setFillStyles: function(ctx, decl) {\n var fill = decl.fill;\n if (fill) {\n if (fill.toLive) {\n ctx.fillStyle = fill.toLive(ctx, this);\n this._applyPatternGradientTransform(ctx, decl.fill);\n }\n else {\n ctx.fillStyle = fill;\n }\n }\n },\n\n _setClippingProperties: function(ctx) {\n ctx.globalAlpha = 1;\n ctx.strokeStyle = 'transparent';\n ctx.fillStyle = '#000000';\n },\n\n /**\n * @private\n * Sets line dash\n * @param {CanvasRenderingContext2D} ctx Context to set the dash line on\n * @param {Array} dashArray array representing dashes\n */\n _setLineDash: function(ctx, dashArray) {\n if (!dashArray || dashArray.length === 0) {\n return;\n }\n // Spec requires the concatenation of two copies the dash list when the number of elements is odd\n if (1 & dashArray.length) {\n dashArray.push.apply(dashArray, dashArray);\n }\n ctx.setLineDash(dashArray);\n },\n\n /**\n * Renders controls and borders for the object\n * the context here is not transformed\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Object} [styleOverride] properties to override the object style\n */\n _renderControls: function(ctx, styleOverride) {\n var vpt = this.getViewportTransform(),\n matrix = this.calcTransformMatrix(),\n options, drawBorders, drawControls;\n styleOverride = styleOverride || { };\n drawBorders = typeof styleOverride.hasBorders !== 'undefined' ? styleOverride.hasBorders : this.hasBorders;\n drawControls = typeof styleOverride.hasControls !== 'undefined' ? styleOverride.hasControls : this.hasControls;\n matrix = fabric.util.multiplyTransformMatrices(vpt, matrix);\n options = fabric.util.qrDecompose(matrix);\n ctx.save();\n ctx.translate(options.translateX, options.translateY);\n ctx.lineWidth = 1 * this.borderScaleFactor;\n if (!this.group) {\n ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1;\n }\n if (this.flipX) {\n options.angle -= 180;\n }\n ctx.rotate(degreesToRadians(this.group ? options.angle : this.angle));\n if (styleOverride.forActiveSelection || this.group) {\n drawBorders && this.drawBordersInGroup(ctx, options, styleOverride);\n }\n else {\n drawBorders && this.drawBorders(ctx, styleOverride);\n }\n drawControls && this.drawControls(ctx, styleOverride);\n ctx.restore();\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _setShadow: function(ctx) {\n if (!this.shadow) {\n return;\n }\n\n var shadow = this.shadow, canvas = this.canvas, scaling,\n multX = (canvas && canvas.viewportTransform[0]) || 1,\n multY = (canvas && canvas.viewportTransform[3]) || 1;\n if (shadow.nonScaling) {\n scaling = { scaleX: 1, scaleY: 1 };\n }\n else {\n scaling = this.getObjectScaling();\n }\n if (canvas && canvas._isRetinaScaling()) {\n multX *= fabric.devicePixelRatio;\n multY *= fabric.devicePixelRatio;\n }\n ctx.shadowColor = shadow.color;\n ctx.shadowBlur = shadow.blur * fabric.browserShadowBlurConstant *\n (multX + multY) * (scaling.scaleX + scaling.scaleY) / 4;\n ctx.shadowOffsetX = shadow.offsetX * multX * scaling.scaleX;\n ctx.shadowOffsetY = shadow.offsetY * multY * scaling.scaleY;\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _removeShadow: function(ctx) {\n if (!this.shadow) {\n return;\n }\n\n ctx.shadowColor = '';\n ctx.shadowBlur = ctx.shadowOffsetX = ctx.shadowOffsetY = 0;\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Object} filler fabric.Pattern or fabric.Gradient\n * @return {Object} offset.offsetX offset for text rendering\n * @return {Object} offset.offsetY offset for text rendering\n */\n _applyPatternGradientTransform: function(ctx, filler) {\n if (!filler || !filler.toLive) {\n return { offsetX: 0, offsetY: 0 };\n }\n var t = filler.gradientTransform || filler.patternTransform;\n var offsetX = -this.width / 2 + filler.offsetX || 0,\n offsetY = -this.height / 2 + filler.offsetY || 0;\n\n if (filler.gradientUnits === 'percentage') {\n ctx.transform(this.width, 0, 0, this.height, offsetX, offsetY);\n }\n else {\n ctx.transform(1, 0, 0, 1, offsetX, offsetY);\n }\n if (t) {\n ctx.transform(t[0], t[1], t[2], t[3], t[4], t[5]);\n }\n return { offsetX: offsetX, offsetY: offsetY };\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderPaintInOrder: function(ctx) {\n if (this.paintFirst === 'stroke') {\n this._renderStroke(ctx);\n this._renderFill(ctx);\n }\n else {\n this._renderFill(ctx);\n this._renderStroke(ctx);\n }\n },\n\n /**\n * @private\n * function that actually render something on the context.\n * empty here to allow Obects to work on tests to benchmark fabric functionalites\n * not related to rendering\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(/* ctx */) {\n\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderFill: function(ctx) {\n if (!this.fill) {\n return;\n }\n\n ctx.save();\n this._setFillStyles(ctx, this);\n if (this.fillRule === 'evenodd') {\n ctx.fill('evenodd');\n }\n else {\n ctx.fill();\n }\n ctx.restore();\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderStroke: function(ctx) {\n if (!this.stroke || this.strokeWidth === 0) {\n return;\n }\n\n if (this.shadow && !this.shadow.affectStroke) {\n this._removeShadow(ctx);\n }\n\n ctx.save();\n if (this.strokeUniform && this.group) {\n var scaling = this.getObjectScaling();\n ctx.scale(1 / scaling.scaleX, 1 / scaling.scaleY);\n }\n else if (this.strokeUniform) {\n ctx.scale(1 / this.scaleX, 1 / this.scaleY);\n }\n this._setLineDash(ctx, this.strokeDashArray);\n this._setStrokeStyles(ctx, this);\n ctx.stroke();\n ctx.restore();\n },\n\n /**\n * This function try to patch the missing gradientTransform on canvas gradients.\n * transforming a context to transform the gradient, is going to transform the stroke too.\n * we want to transform the gradient but not the stroke operation, so we create\n * a transformed gradient on a pattern and then we use the pattern instead of the gradient.\n * this method has drwabacks: is slow, is in low resolution, needs a patch for when the size\n * is limited.\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {fabric.Gradient} filler a fabric gradient instance\n */\n _applyPatternForTransformedGradient: function(ctx, filler) {\n var dims = this._limitCacheSize(this._getCacheCanvasDimensions()),\n pCanvas = fabric.util.createCanvasElement(), pCtx, retinaScaling = this.canvas.getRetinaScaling(),\n width = dims.x / this.scaleX / retinaScaling, height = dims.y / this.scaleY / retinaScaling;\n pCanvas.width = width;\n pCanvas.height = height;\n pCtx = pCanvas.getContext('2d');\n pCtx.beginPath(); pCtx.moveTo(0, 0); pCtx.lineTo(width, 0); pCtx.lineTo(width, height);\n pCtx.lineTo(0, height); pCtx.closePath();\n pCtx.translate(width / 2, height / 2);\n pCtx.scale(\n dims.zoomX / this.scaleX / retinaScaling,\n dims.zoomY / this.scaleY / retinaScaling\n );\n this._applyPatternGradientTransform(pCtx, filler);\n pCtx.fillStyle = filler.toLive(ctx);\n pCtx.fill();\n ctx.translate(-this.width / 2 - this.strokeWidth / 2, -this.height / 2 - this.strokeWidth / 2);\n ctx.scale(\n retinaScaling * this.scaleX / dims.zoomX,\n retinaScaling * this.scaleY / dims.zoomY\n );\n ctx.strokeStyle = pCtx.createPattern(pCanvas, 'no-repeat');\n },\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates\n * @private\n * @return {Object} center point from element coordinates\n */\n _findCenterFromElement: function() {\n return { x: this.left + this.width / 2, y: this.top + this.height / 2 };\n },\n\n /**\n * This function is an helper for svg import. it decompose the transformMatrix\n * and assign properties to object.\n * untransformed coordinates\n * @private\n * @chainable\n */\n _assignTransformMatrixProps: function() {\n if (this.transformMatrix) {\n var options = fabric.util.qrDecompose(this.transformMatrix);\n this.flipX = false;\n this.flipY = false;\n this.set('scaleX', options.scaleX);\n this.set('scaleY', options.scaleY);\n this.angle = options.angle;\n this.skewX = options.skewX;\n this.skewY = 0;\n }\n },\n\n /**\n * This function is an helper for svg import. it removes the transform matrix\n * and set to object properties that fabricjs can handle\n * @private\n * @param {Object} preserveAspectRatioOptions\n * @return {thisArg}\n */\n _removeTransformMatrix: function(preserveAspectRatioOptions) {\n var center = this._findCenterFromElement();\n if (this.transformMatrix) {\n this._assignTransformMatrixProps();\n center = fabric.util.transformPoint(center, this.transformMatrix);\n }\n this.transformMatrix = null;\n if (preserveAspectRatioOptions) {\n this.scaleX *= preserveAspectRatioOptions.scaleX;\n this.scaleY *= preserveAspectRatioOptions.scaleY;\n this.cropX = preserveAspectRatioOptions.cropX;\n this.cropY = preserveAspectRatioOptions.cropY;\n center.x += preserveAspectRatioOptions.offsetLeft;\n center.y += preserveAspectRatioOptions.offsetTop;\n this.width = preserveAspectRatioOptions.width;\n this.height = preserveAspectRatioOptions.height;\n }\n this.setPositionByOrigin(center, 'center', 'center');\n },\n\n /**\n * Clones an instance, using a callback method will work for every object.\n * @param {Function} callback Callback is invoked with a clone as a first argument\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n */\n clone: function(callback, propertiesToInclude) {\n var objectForm = this.toObject(propertiesToInclude);\n if (this.constructor.fromObject) {\n this.constructor.fromObject(objectForm, callback);\n }\n else {\n fabric.Object._fromObject('Object', objectForm, callback);\n }\n },\n\n /**\n * Creates an instance of fabric.Image out of an object\n * makes use of toCanvasElement.\n * Once this method was based on toDataUrl and loadImage, so it also had a quality\n * and format option. toCanvasElement is faster and produce no loss of quality.\n * If you need to get a real Jpeg or Png from an object, using toDataURL is the right way to do it.\n * toCanvasElement and then toBlob from the obtained canvas is also a good option.\n * This method is sync now, but still support the callback because we did not want to break.\n * When fabricJS 5.0 will be planned, this will probably be changed to not have a callback.\n * @param {Function} callback callback, invoked with an instance as a first argument\n * @param {Object} [options] for clone as image, passed to toDataURL\n * @param {Number} [options.multiplier=1] Multiplier to scale by\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4\n * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4\n * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2\n * @return {fabric.Object} thisArg\n */\n cloneAsImage: function(callback, options) {\n var canvasEl = this.toCanvasElement(options);\n if (callback) {\n callback(new fabric.Image(canvasEl));\n }\n return this;\n },\n\n /**\n * Converts an object into a HTMLCanvas element\n * @param {Object} options Options object\n * @param {Number} [options.multiplier=1] Multiplier to scale by\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4\n * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4\n * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2\n * @return {HTMLCanvasElement} Returns DOM element with the fabric.Object\n */\n toCanvasElement: function(options) {\n options || (options = { });\n\n var utils = fabric.util, origParams = utils.saveObjectTransform(this),\n originalGroup = this.group,\n originalShadow = this.shadow, abs = Math.abs,\n multiplier = (options.multiplier || 1) * (options.enableRetinaScaling ? fabric.devicePixelRatio : 1);\n delete this.group;\n if (options.withoutTransform) {\n utils.resetObjectTransform(this);\n }\n if (options.withoutShadow) {\n this.shadow = null;\n }\n\n var el = fabric.util.createCanvasElement(),\n // skip canvas zoom and calculate with setCoords now.\n boundingRect = this.getBoundingRect(true, true),\n shadow = this.shadow, scaling,\n shadowOffset = { x: 0, y: 0 }, shadowBlur,\n width, height;\n\n if (shadow) {\n shadowBlur = shadow.blur;\n if (shadow.nonScaling) {\n scaling = { scaleX: 1, scaleY: 1 };\n }\n else {\n scaling = this.getObjectScaling();\n }\n // consider non scaling shadow.\n shadowOffset.x = 2 * Math.round(abs(shadow.offsetX) + shadowBlur) * (abs(scaling.scaleX));\n shadowOffset.y = 2 * Math.round(abs(shadow.offsetY) + shadowBlur) * (abs(scaling.scaleY));\n }\n width = boundingRect.width + shadowOffset.x;\n height = boundingRect.height + shadowOffset.y;\n // if the current width/height is not an integer\n // we need to make it so.\n el.width = Math.ceil(width);\n el.height = Math.ceil(height);\n var canvas = new fabric.StaticCanvas(el, {\n enableRetinaScaling: false,\n renderOnAddRemove: false,\n skipOffscreen: false,\n });\n if (options.format === 'jpeg') {\n canvas.backgroundColor = '#fff';\n }\n this.setPositionByOrigin(new fabric.Point(canvas.width / 2, canvas.height / 2), 'center', 'center');\n\n var originalCanvas = this.canvas;\n canvas.add(this);\n var canvasEl = canvas.toCanvasElement(multiplier || 1, options);\n this.shadow = originalShadow;\n this.set('canvas', originalCanvas);\n if (originalGroup) {\n this.group = originalGroup;\n }\n this.set(origParams).setCoords();\n // canvas.dispose will call image.dispose that will nullify the elements\n // since this canvas is a simple element for the process, we remove references\n // to objects in this way in order to avoid object trashing.\n canvas._objects = [];\n canvas.dispose();\n canvas = null;\n\n return canvasEl;\n },\n\n /**\n * Converts an object into a data-url-like string\n * @param {Object} options Options object\n * @param {String} [options.format=png] The format of the output image. Either \"jpeg\" or \"png\"\n * @param {Number} [options.quality=1] Quality level (0..1). Only used for jpeg.\n * @param {Number} [options.multiplier=1] Multiplier to scale by\n * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14\n * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14\n * @param {Number} [options.width] Cropping width. Introduced in v1.2.14\n * @param {Number} [options.height] Cropping height. Introduced in v1.2.14\n * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4\n * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4\n * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2\n * @return {String} Returns a data: URL containing a representation of the object in the format specified by options.format\n */\n toDataURL: function(options) {\n options || (options = { });\n return fabric.util.toDataURL(this.toCanvasElement(options), options.format || 'png', options.quality || 1);\n },\n\n /**\n * Returns true if specified type is identical to the type of an instance\n * @param {String} type Type to check against\n * @return {Boolean}\n */\n isType: function(type) {\n return arguments.length > 1 ? Array.from(arguments).includes(this.type) : this.type === type;\n },\n\n /**\n * Returns complexity of an instance\n * @return {Number} complexity of this instance (is 1 unless subclassed)\n */\n complexity: function() {\n return 1;\n },\n\n /**\n * Returns a JSON representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} JSON\n */\n toJSON: function(propertiesToInclude) {\n // delegate, not alias\n return this.toObject(propertiesToInclude);\n },\n\n /**\n * Sets \"angle\" of an instance with centered rotation\n * @param {Number} angle Angle value (in degrees)\n * @return {fabric.Object} thisArg\n * @chainable\n */\n rotate: function(angle) {\n var shouldCenterOrigin = (this.originX !== 'center' || this.originY !== 'center') && this.centeredRotation;\n\n if (shouldCenterOrigin) {\n this._setOriginToCenter();\n }\n\n this.set('angle', angle);\n\n if (shouldCenterOrigin) {\n this._resetOrigin();\n }\n\n return this;\n },\n\n /**\n * Centers object horizontally on canvas to which it was added last.\n * You might need to call `setCoords` on an object after centering, to update controls area.\n * @return {fabric.Object} thisArg\n * @chainable\n */\n centerH: function () {\n this.canvas && this.canvas.centerObjectH(this);\n return this;\n },\n\n /**\n * Centers object horizontally on current viewport of canvas to which it was added last.\n * You might need to call `setCoords` on an object after centering, to update controls area.\n * @return {fabric.Object} thisArg\n * @chainable\n */\n viewportCenterH: function () {\n this.canvas && this.canvas.viewportCenterObjectH(this);\n return this;\n },\n\n /**\n * Centers object vertically on canvas to which it was added last.\n * You might need to call `setCoords` on an object after centering, to update controls area.\n * @return {fabric.Object} thisArg\n * @chainable\n */\n centerV: function () {\n this.canvas && this.canvas.centerObjectV(this);\n return this;\n },\n\n /**\n * Centers object vertically on current viewport of canvas to which it was added last.\n * You might need to call `setCoords` on an object after centering, to update controls area.\n * @return {fabric.Object} thisArg\n * @chainable\n */\n viewportCenterV: function () {\n this.canvas && this.canvas.viewportCenterObjectV(this);\n return this;\n },\n\n /**\n * Centers object vertically and horizontally on canvas to which is was added last\n * You might need to call `setCoords` on an object after centering, to update controls area.\n * @return {fabric.Object} thisArg\n * @chainable\n */\n center: function () {\n this.canvas && this.canvas.centerObject(this);\n return this;\n },\n\n /**\n * Centers object on current viewport of canvas to which it was added last.\n * You might need to call `setCoords` on an object after centering, to update controls area.\n * @return {fabric.Object} thisArg\n * @chainable\n */\n viewportCenter: function () {\n this.canvas && this.canvas.viewportCenterObject(this);\n return this;\n },\n\n /**\n * Returns coordinates of a pointer relative to an object\n * @param {Event} e Event to operate upon\n * @param {Object} [pointer] Pointer to operate upon (instead of event)\n * @return {Object} Coordinates of a pointer (x, y)\n */\n getLocalPointer: function(e, pointer) {\n pointer = pointer || this.canvas.getPointer(e);\n var pClicked = new fabric.Point(pointer.x, pointer.y),\n objectLeftTop = this._getLeftTopCoords();\n if (this.angle) {\n pClicked = fabric.util.rotatePoint(\n pClicked, objectLeftTop, degreesToRadians(-this.angle));\n }\n return {\n x: pClicked.x - objectLeftTop.x,\n y: pClicked.y - objectLeftTop.y\n };\n },\n\n /**\n * Sets canvas globalCompositeOperation for specific object\n * custom composition operation for the particular object can be specified using globalCompositeOperation property\n * @param {CanvasRenderingContext2D} ctx Rendering canvas context\n */\n _setupCompositeOperation: function (ctx) {\n if (this.globalCompositeOperation) {\n ctx.globalCompositeOperation = this.globalCompositeOperation;\n }\n },\n\n /**\n * cancel instance's running animations\n * override if necessary to dispose artifacts such as `clipPath`\n */\n dispose: function () {\n if (fabric.runningAnimations) {\n fabric.runningAnimations.cancelByTarget(this);\n }\n }\n });\n\n fabric.util.createAccessors && fabric.util.createAccessors(fabric.Object);\n\n extend(fabric.Object.prototype, fabric.Observable);\n\n /**\n * Defines the number of fraction digits to use when serializing object values.\n * You can use it to increase/decrease precision of such values like left, top, scaleX, scaleY, etc.\n * @static\n * @memberOf fabric.Object\n * @constant\n * @type Number\n */\n fabric.Object.NUM_FRACTION_DIGITS = 2;\n\n /**\n * Defines which properties should be enlivened from the object passed to {@link fabric.Object._fromObject}\n * @static\n * @memberOf fabric.Object\n * @constant\n * @type string[]\n */\n fabric.Object.ENLIVEN_PROPS = ['clipPath'];\n\n fabric.Object._fromObject = function(className, object, callback, extraParam) {\n var klass = fabric[className];\n object = clone(object, true);\n fabric.util.enlivenPatterns([object.fill, object.stroke], function(patterns) {\n if (typeof patterns[0] !== 'undefined') {\n object.fill = patterns[0];\n }\n if (typeof patterns[1] !== 'undefined') {\n object.stroke = patterns[1];\n }\n fabric.util.enlivenObjectEnlivables(object, object, function () {\n var instance = extraParam ? new klass(object[extraParam], object) : new klass(object);\n callback && callback(instance);\n });\n });\n };\n\n /**\n * Unique id used internally when creating SVG elements\n * @static\n * @memberOf fabric.Object\n * @type Number\n */\n fabric.Object.__uid = 0;\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function() {\n\n var degreesToRadians = fabric.util.degreesToRadians,\n originXOffset = {\n left: -0.5,\n center: 0,\n right: 0.5\n },\n originYOffset = {\n top: -0.5,\n center: 0,\n bottom: 0.5\n };\n\n fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n\n /**\n * Translates the coordinates from a set of origin to another (based on the object's dimensions)\n * @param {fabric.Point} point The point which corresponds to the originX and originY params\n * @param {String} fromOriginX Horizontal origin: 'left', 'center' or 'right'\n * @param {String} fromOriginY Vertical origin: 'top', 'center' or 'bottom'\n * @param {String} toOriginX Horizontal origin: 'left', 'center' or 'right'\n * @param {String} toOriginY Vertical origin: 'top', 'center' or 'bottom'\n * @return {fabric.Point}\n */\n translateToGivenOrigin: function(point, fromOriginX, fromOriginY, toOriginX, toOriginY) {\n var x = point.x,\n y = point.y,\n offsetX, offsetY, dim;\n\n if (typeof fromOriginX === 'string') {\n fromOriginX = originXOffset[fromOriginX];\n }\n else {\n fromOriginX -= 0.5;\n }\n\n if (typeof toOriginX === 'string') {\n toOriginX = originXOffset[toOriginX];\n }\n else {\n toOriginX -= 0.5;\n }\n\n offsetX = toOriginX - fromOriginX;\n\n if (typeof fromOriginY === 'string') {\n fromOriginY = originYOffset[fromOriginY];\n }\n else {\n fromOriginY -= 0.5;\n }\n\n if (typeof toOriginY === 'string') {\n toOriginY = originYOffset[toOriginY];\n }\n else {\n toOriginY -= 0.5;\n }\n\n offsetY = toOriginY - fromOriginY;\n\n if (offsetX || offsetY) {\n dim = this._getTransformedDimensions();\n x = point.x + offsetX * dim.x;\n y = point.y + offsetY * dim.y;\n }\n\n return new fabric.Point(x, y);\n },\n\n /**\n * Translates the coordinates from origin to center coordinates (based on the object's dimensions)\n * @param {fabric.Point} point The point which corresponds to the originX and originY params\n * @param {String} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {String} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {fabric.Point}\n */\n translateToCenterPoint: function(point, originX, originY) {\n var p = this.translateToGivenOrigin(point, originX, originY, 'center', 'center');\n if (this.angle) {\n return fabric.util.rotatePoint(p, point, degreesToRadians(this.angle));\n }\n return p;\n },\n\n /**\n * Translates the coordinates from center to origin coordinates (based on the object's dimensions)\n * @param {fabric.Point} center The point which corresponds to center of the object\n * @param {String} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {String} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {fabric.Point}\n */\n translateToOriginPoint: function(center, originX, originY) {\n var p = this.translateToGivenOrigin(center, 'center', 'center', originX, originY);\n if (this.angle) {\n return fabric.util.rotatePoint(p, center, degreesToRadians(this.angle));\n }\n return p;\n },\n\n /**\n * Returns the real center coordinates of the object\n * @return {fabric.Point}\n */\n getCenterPoint: function() {\n var leftTop = new fabric.Point(this.left, this.top);\n return this.translateToCenterPoint(leftTop, this.originX, this.originY);\n },\n\n /**\n * Returns the coordinates of the object based on center coordinates\n * @param {fabric.Point} point The point which corresponds to the originX and originY params\n * @return {fabric.Point}\n */\n // getOriginPoint: function(center) {\n // return this.translateToOriginPoint(center, this.originX, this.originY);\n // },\n\n /**\n * Returns the coordinates of the object as if it has a different origin\n * @param {String} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {String} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {fabric.Point}\n */\n getPointByOrigin: function(originX, originY) {\n var center = this.getCenterPoint();\n return this.translateToOriginPoint(center, originX, originY);\n },\n\n /**\n * Returns the point in local coordinates\n * @param {fabric.Point} point The point relative to the global coordinate system\n * @param {String} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {String} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {fabric.Point}\n */\n toLocalPoint: function(point, originX, originY) {\n var center = this.getCenterPoint(),\n p, p2;\n\n if (typeof originX !== 'undefined' && typeof originY !== 'undefined' ) {\n p = this.translateToGivenOrigin(center, 'center', 'center', originX, originY);\n }\n else {\n p = new fabric.Point(this.left, this.top);\n }\n\n p2 = new fabric.Point(point.x, point.y);\n if (this.angle) {\n p2 = fabric.util.rotatePoint(p2, center, -degreesToRadians(this.angle));\n }\n return p2.subtractEquals(p);\n },\n\n /**\n * Returns the point in global coordinates\n * @param {fabric.Point} The point relative to the local coordinate system\n * @return {fabric.Point}\n */\n // toGlobalPoint: function(point) {\n // return fabric.util.rotatePoint(point, this.getCenterPoint(), degreesToRadians(this.angle)).addEquals(new fabric.Point(this.left, this.top));\n // },\n\n /**\n * Sets the position of the object taking into consideration the object's origin\n * @param {fabric.Point} pos The new position of the object\n * @param {String} originX Horizontal origin: 'left', 'center' or 'right'\n * @param {String} originY Vertical origin: 'top', 'center' or 'bottom'\n * @return {void}\n */\n setPositionByOrigin: function(pos, originX, originY) {\n var center = this.translateToCenterPoint(pos, originX, originY),\n position = this.translateToOriginPoint(center, this.originX, this.originY);\n this.set('left', position.x);\n this.set('top', position.y);\n },\n\n /**\n * @param {String} to One of 'left', 'center', 'right'\n */\n adjustPosition: function(to) {\n var angle = degreesToRadians(this.angle),\n hypotFull = this.getScaledWidth(),\n xFull = fabric.util.cos(angle) * hypotFull,\n yFull = fabric.util.sin(angle) * hypotFull,\n offsetFrom, offsetTo;\n\n //TODO: this function does not consider mixed situation like top, center.\n if (typeof this.originX === 'string') {\n offsetFrom = originXOffset[this.originX];\n }\n else {\n offsetFrom = this.originX - 0.5;\n }\n if (typeof to === 'string') {\n offsetTo = originXOffset[to];\n }\n else {\n offsetTo = to - 0.5;\n }\n this.left += xFull * (offsetTo - offsetFrom);\n this.top += yFull * (offsetTo - offsetFrom);\n this.setCoords();\n this.originX = to;\n },\n\n /**\n * Sets the origin/position of the object to it's center point\n * @private\n * @return {void}\n */\n _setOriginToCenter: function() {\n this._originalOriginX = this.originX;\n this._originalOriginY = this.originY;\n\n var center = this.getCenterPoint();\n\n this.originX = 'center';\n this.originY = 'center';\n\n this.left = center.x;\n this.top = center.y;\n },\n\n /**\n * Resets the origin/position of the object to it's original origin\n * @private\n * @return {void}\n */\n _resetOrigin: function() {\n var originPoint = this.translateToOriginPoint(\n this.getCenterPoint(),\n this._originalOriginX,\n this._originalOriginY);\n\n this.originX = this._originalOriginX;\n this.originY = this._originalOriginY;\n\n this.left = originPoint.x;\n this.top = originPoint.y;\n\n this._originalOriginX = null;\n this._originalOriginY = null;\n },\n\n /**\n * @private\n */\n _getLeftTopCoords: function() {\n return this.translateToOriginPoint(this.getCenterPoint(), 'left', 'top');\n },\n });\n\n})();\n\n\n(function() {\n\n function arrayFromCoords(coords) {\n return [\n new fabric.Point(coords.tl.x, coords.tl.y),\n new fabric.Point(coords.tr.x, coords.tr.y),\n new fabric.Point(coords.br.x, coords.br.y),\n new fabric.Point(coords.bl.x, coords.bl.y)\n ];\n }\n\n var util = fabric.util,\n degreesToRadians = util.degreesToRadians,\n multiplyMatrices = util.multiplyTransformMatrices,\n transformPoint = util.transformPoint;\n\n util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n\n /**\n * Describe object's corner position in canvas element coordinates.\n * properties are depending on control keys and padding the main controls.\n * each property is an object with x, y and corner.\n * The `corner` property contains in a similar manner the 4 points of the\n * interactive area of the corner.\n * The coordinates depends from the controls positionHandler and are used\n * to draw and locate controls\n * @memberOf fabric.Object.prototype\n */\n oCoords: null,\n\n /**\n * Describe object's corner position in canvas object absolute coordinates\n * properties are tl,tr,bl,br and describe the four main corner.\n * each property is an object with x, y, instance of Fabric.Point.\n * The coordinates depends from this properties: width, height, scaleX, scaleY\n * skewX, skewY, angle, strokeWidth, top, left.\n * Those coordinates are useful to understand where an object is. They get updated\n * with oCoords but they do not need to be updated when zoom or panning change.\n * The coordinates get updated with @method setCoords.\n * You can calculate them without updating with @method calcACoords();\n * @memberOf fabric.Object.prototype\n */\n aCoords: null,\n\n /**\n * Describe object's corner position in canvas element coordinates.\n * includes padding. Used of object detection.\n * set and refreshed with setCoords.\n * @memberOf fabric.Object.prototype\n */\n lineCoords: null,\n\n /**\n * storage for object transform matrix\n */\n ownMatrixCache: null,\n\n /**\n * storage for object full transform matrix\n */\n matrixCache: null,\n\n /**\n * custom controls interface\n * controls are added by default_controls.js\n */\n controls: { },\n\n /**\n * return correct set of coordinates for intersection\n * this will return either aCoords or lineCoords.\n * @param {Boolean} absolute will return aCoords if true or lineCoords\n * @return {Object} {tl, tr, br, bl} points\n */\n _getCoords: function(absolute, calculate) {\n if (calculate) {\n return (absolute ? this.calcACoords() : this.calcLineCoords());\n }\n if (!this.aCoords || !this.lineCoords) {\n this.setCoords(true);\n }\n return (absolute ? this.aCoords : this.lineCoords);\n },\n\n /**\n * return correct set of coordinates for intersection\n * this will return either aCoords or lineCoords.\n * The coords are returned in an array.\n * @return {Array} [tl, tr, br, bl] of points\n */\n getCoords: function(absolute, calculate) {\n return arrayFromCoords(this._getCoords(absolute, calculate));\n },\n\n /**\n * Checks if object intersects with an area formed by 2 points\n * @param {Object} pointTL top-left point of area\n * @param {Object} pointBR bottom-right point of area\n * @param {Boolean} [absolute] use coordinates without viewportTransform\n * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords\n * @return {Boolean} true if object intersects with an area formed by 2 points\n */\n intersectsWithRect: function(pointTL, pointBR, absolute, calculate) {\n var coords = this.getCoords(absolute, calculate),\n intersection = fabric.Intersection.intersectPolygonRectangle(\n coords,\n pointTL,\n pointBR\n );\n return intersection.status === 'Intersection';\n },\n\n /**\n * Checks if object intersects with another object\n * @param {Object} other Object to test\n * @param {Boolean} [absolute] use coordinates without viewportTransform\n * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords\n * @return {Boolean} true if object intersects with another object\n */\n intersectsWithObject: function(other, absolute, calculate) {\n var intersection = fabric.Intersection.intersectPolygonPolygon(\n this.getCoords(absolute, calculate),\n other.getCoords(absolute, calculate)\n );\n\n return intersection.status === 'Intersection'\n || other.isContainedWithinObject(this, absolute, calculate)\n || this.isContainedWithinObject(other, absolute, calculate);\n },\n\n /**\n * Checks if object is fully contained within area of another object\n * @param {Object} other Object to test\n * @param {Boolean} [absolute] use coordinates without viewportTransform\n * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords\n * @return {Boolean} true if object is fully contained within area of another object\n */\n isContainedWithinObject: function(other, absolute, calculate) {\n var points = this.getCoords(absolute, calculate),\n otherCoords = absolute ? other.aCoords : other.lineCoords,\n i = 0, lines = other._getImageLines(otherCoords);\n for (; i < 4; i++) {\n if (!other.containsPoint(points[i], lines)) {\n return false;\n }\n }\n return true;\n },\n\n /**\n * Checks if object is fully contained within area formed by 2 points\n * @param {Object} pointTL top-left point of area\n * @param {Object} pointBR bottom-right point of area\n * @param {Boolean} [absolute] use coordinates without viewportTransform\n * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords\n * @return {Boolean} true if object is fully contained within area formed by 2 points\n */\n isContainedWithinRect: function(pointTL, pointBR, absolute, calculate) {\n var boundingRect = this.getBoundingRect(absolute, calculate);\n\n return (\n boundingRect.left >= pointTL.x &&\n boundingRect.left + boundingRect.width <= pointBR.x &&\n boundingRect.top >= pointTL.y &&\n boundingRect.top + boundingRect.height <= pointBR.y\n );\n },\n\n /**\n * Checks if point is inside the object\n * @param {fabric.Point} point Point to check against\n * @param {Object} [lines] object returned from @method _getImageLines\n * @param {Boolean} [absolute] use coordinates without viewportTransform\n * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords\n * @return {Boolean} true if point is inside the object\n */\n containsPoint: function(point, lines, absolute, calculate) {\n var coords = this._getCoords(absolute, calculate),\n lines = lines || this._getImageLines(coords),\n xPoints = this._findCrossPoints(point, lines);\n // if xPoints is odd then point is inside the object\n return (xPoints !== 0 && xPoints % 2 === 1);\n },\n\n /**\n * Checks if object is contained within the canvas with current viewportTransform\n * the check is done stopping at first point that appears on screen\n * @param {Boolean} [calculate] use coordinates of current position instead of .aCoords\n * @return {Boolean} true if object is fully or partially contained within canvas\n */\n isOnScreen: function(calculate) {\n if (!this.canvas) {\n return false;\n }\n var pointTL = this.canvas.vptCoords.tl, pointBR = this.canvas.vptCoords.br;\n var points = this.getCoords(true, calculate);\n // if some point is on screen, the object is on screen.\n if (points.some(function(point) {\n return point.x <= pointBR.x && point.x >= pointTL.x &&\n point.y <= pointBR.y && point.y >= pointTL.y;\n })) {\n return true;\n }\n // no points on screen, check intersection with absolute coordinates\n if (this.intersectsWithRect(pointTL, pointBR, true, calculate)) {\n return true;\n }\n return this._containsCenterOfCanvas(pointTL, pointBR, calculate);\n },\n\n /**\n * Checks if the object contains the midpoint between canvas extremities\n * Does not make sense outside the context of isOnScreen and isPartiallyOnScreen\n * @private\n * @param {Fabric.Point} pointTL Top Left point\n * @param {Fabric.Point} pointBR Top Right point\n * @param {Boolean} calculate use coordinates of current position instead of .oCoords\n * @return {Boolean} true if the object contains the point\n */\n _containsCenterOfCanvas: function(pointTL, pointBR, calculate) {\n // worst case scenario the object is so big that contains the screen\n var centerPoint = { x: (pointTL.x + pointBR.x) / 2, y: (pointTL.y + pointBR.y) / 2 };\n if (this.containsPoint(centerPoint, null, true, calculate)) {\n return true;\n }\n return false;\n },\n\n /**\n * Checks if object is partially contained within the canvas with current viewportTransform\n * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords\n * @return {Boolean} true if object is partially contained within canvas\n */\n isPartiallyOnScreen: function(calculate) {\n if (!this.canvas) {\n return false;\n }\n var pointTL = this.canvas.vptCoords.tl, pointBR = this.canvas.vptCoords.br;\n if (this.intersectsWithRect(pointTL, pointBR, true, calculate)) {\n return true;\n }\n var allPointsAreOutside = this.getCoords(true, calculate).every(function(point) {\n return (point.x >= pointBR.x || point.x <= pointTL.x) &&\n (point.y >= pointBR.y || point.y <= pointTL.y);\n });\n return allPointsAreOutside && this._containsCenterOfCanvas(pointTL, pointBR, calculate);\n },\n\n /**\n * Method that returns an object with the object edges in it, given the coordinates of the corners\n * @private\n * @param {Object} oCoords Coordinates of the object corners\n */\n _getImageLines: function(oCoords) {\n\n var lines = {\n topline: {\n o: oCoords.tl,\n d: oCoords.tr\n },\n rightline: {\n o: oCoords.tr,\n d: oCoords.br\n },\n bottomline: {\n o: oCoords.br,\n d: oCoords.bl\n },\n leftline: {\n o: oCoords.bl,\n d: oCoords.tl\n }\n };\n\n // // debugging\n // if (this.canvas.contextTop) {\n // this.canvas.contextTop.fillRect(lines.bottomline.d.x, lines.bottomline.d.y, 2, 2);\n // this.canvas.contextTop.fillRect(lines.bottomline.o.x, lines.bottomline.o.y, 2, 2);\n //\n // this.canvas.contextTop.fillRect(lines.leftline.d.x, lines.leftline.d.y, 2, 2);\n // this.canvas.contextTop.fillRect(lines.leftline.o.x, lines.leftline.o.y, 2, 2);\n //\n // this.canvas.contextTop.fillRect(lines.topline.d.x, lines.topline.d.y, 2, 2);\n // this.canvas.contextTop.fillRect(lines.topline.o.x, lines.topline.o.y, 2, 2);\n //\n // this.canvas.contextTop.fillRect(lines.rightline.d.x, lines.rightline.d.y, 2, 2);\n // this.canvas.contextTop.fillRect(lines.rightline.o.x, lines.rightline.o.y, 2, 2);\n // }\n\n return lines;\n },\n\n /**\n * Helper method to determine how many cross points are between the 4 object edges\n * and the horizontal line determined by a point on canvas\n * @private\n * @param {fabric.Point} point Point to check\n * @param {Object} lines Coordinates of the object being evaluated\n */\n // remove yi, not used but left code here just in case.\n _findCrossPoints: function(point, lines) {\n var b1, b2, a1, a2, xi, // yi,\n xcount = 0,\n iLine;\n\n for (var lineKey in lines) {\n iLine = lines[lineKey];\n // optimisation 1: line below point. no cross\n if ((iLine.o.y < point.y) && (iLine.d.y < point.y)) {\n continue;\n }\n // optimisation 2: line above point. no cross\n if ((iLine.o.y >= point.y) && (iLine.d.y >= point.y)) {\n continue;\n }\n // optimisation 3: vertical line case\n if ((iLine.o.x === iLine.d.x) && (iLine.o.x >= point.x)) {\n xi = iLine.o.x;\n // yi = point.y;\n }\n // calculate the intersection point\n else {\n b1 = 0;\n b2 = (iLine.d.y - iLine.o.y) / (iLine.d.x - iLine.o.x);\n a1 = point.y - b1 * point.x;\n a2 = iLine.o.y - b2 * iLine.o.x;\n\n xi = -(a1 - a2) / (b1 - b2);\n // yi = a1 + b1 * xi;\n }\n // dont count xi < point.x cases\n if (xi >= point.x) {\n xcount += 1;\n }\n // optimisation 4: specific for square images\n if (xcount === 2) {\n break;\n }\n }\n return xcount;\n },\n\n /**\n * Returns coordinates of object's bounding rectangle (left, top, width, height)\n * the box is intended as aligned to axis of canvas.\n * @param {Boolean} [absolute] use coordinates without viewportTransform\n * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords / .aCoords\n * @return {Object} Object with left, top, width, height properties\n */\n getBoundingRect: function(absolute, calculate) {\n var coords = this.getCoords(absolute, calculate);\n return util.makeBoundingBoxFromPoints(coords);\n },\n\n /**\n * Returns width of an object's bounding box counting transformations\n * before 2.0 it was named getWidth();\n * @return {Number} width value\n */\n getScaledWidth: function() {\n return this._getTransformedDimensions().x;\n },\n\n /**\n * Returns height of an object bounding box counting transformations\n * before 2.0 it was named getHeight();\n * @return {Number} height value\n */\n getScaledHeight: function() {\n return this._getTransformedDimensions().y;\n },\n\n /**\n * Makes sure the scale is valid and modifies it if necessary\n * @private\n * @param {Number} value\n * @return {Number}\n */\n _constrainScale: function(value) {\n if (Math.abs(value) < this.minScaleLimit) {\n if (value < 0) {\n return -this.minScaleLimit;\n }\n else {\n return this.minScaleLimit;\n }\n }\n else if (value === 0) {\n return 0.0001;\n }\n return value;\n },\n\n /**\n * Scales an object (equally by x and y)\n * @param {Number} value Scale factor\n * @return {fabric.Object} thisArg\n * @chainable\n */\n scale: function(value) {\n this._set('scaleX', value);\n this._set('scaleY', value);\n return this.setCoords();\n },\n\n /**\n * Scales an object to a given width, with respect to bounding box (scaling by x/y equally)\n * @param {Number} value New width value\n * @param {Boolean} absolute ignore viewport\n * @return {fabric.Object} thisArg\n * @chainable\n */\n scaleToWidth: function(value, absolute) {\n // adjust to bounding rect factor so that rotated shapes would fit as well\n var boundingRectFactor = this.getBoundingRect(absolute).width / this.getScaledWidth();\n return this.scale(value / this.width / boundingRectFactor);\n },\n\n /**\n * Scales an object to a given height, with respect to bounding box (scaling by x/y equally)\n * @param {Number} value New height value\n * @param {Boolean} absolute ignore viewport\n * @return {fabric.Object} thisArg\n * @chainable\n */\n scaleToHeight: function(value, absolute) {\n // adjust to bounding rect factor so that rotated shapes would fit as well\n var boundingRectFactor = this.getBoundingRect(absolute).height / this.getScaledHeight();\n return this.scale(value / this.height / boundingRectFactor);\n },\n\n calcLineCoords: function() {\n var vpt = this.getViewportTransform(),\n padding = this.padding, angle = degreesToRadians(this.angle),\n cos = util.cos(angle), sin = util.sin(angle),\n cosP = cos * padding, sinP = sin * padding, cosPSinP = cosP + sinP,\n cosPMinusSinP = cosP - sinP, aCoords = this.calcACoords();\n\n var lineCoords = {\n tl: transformPoint(aCoords.tl, vpt),\n tr: transformPoint(aCoords.tr, vpt),\n bl: transformPoint(aCoords.bl, vpt),\n br: transformPoint(aCoords.br, vpt),\n };\n\n if (padding) {\n lineCoords.tl.x -= cosPMinusSinP;\n lineCoords.tl.y -= cosPSinP;\n lineCoords.tr.x += cosPSinP;\n lineCoords.tr.y -= cosPMinusSinP;\n lineCoords.bl.x -= cosPSinP;\n lineCoords.bl.y += cosPMinusSinP;\n lineCoords.br.x += cosPMinusSinP;\n lineCoords.br.y += cosPSinP;\n }\n\n return lineCoords;\n },\n\n calcOCoords: function() {\n var rotateMatrix = this._calcRotateMatrix(),\n translateMatrix = this._calcTranslateMatrix(),\n vpt = this.getViewportTransform(),\n startMatrix = multiplyMatrices(vpt, translateMatrix),\n finalMatrix = multiplyMatrices(startMatrix, rotateMatrix),\n finalMatrix = multiplyMatrices(finalMatrix, [1 / vpt[0], 0, 0, 1 / vpt[3], 0, 0]),\n dim = this._calculateCurrentDimensions(),\n coords = {};\n this.forEachControl(function(control, key, fabricObject) {\n coords[key] = control.positionHandler(dim, finalMatrix, fabricObject);\n });\n\n // debug code\n // var canvas = this.canvas;\n // setTimeout(function() {\n // canvas.contextTop.clearRect(0, 0, 700, 700);\n // canvas.contextTop.fillStyle = 'green';\n // Object.keys(coords).forEach(function(key) {\n // var control = coords[key];\n // canvas.contextTop.fillRect(control.x, control.y, 3, 3);\n // });\n // }, 50);\n return coords;\n },\n\n calcACoords: function() {\n var rotateMatrix = this._calcRotateMatrix(),\n translateMatrix = this._calcTranslateMatrix(),\n finalMatrix = multiplyMatrices(translateMatrix, rotateMatrix),\n dim = this._getTransformedDimensions(),\n w = dim.x / 2, h = dim.y / 2;\n return {\n // corners\n tl: transformPoint({ x: -w, y: -h }, finalMatrix),\n tr: transformPoint({ x: w, y: -h }, finalMatrix),\n bl: transformPoint({ x: -w, y: h }, finalMatrix),\n br: transformPoint({ x: w, y: h }, finalMatrix)\n };\n },\n\n /**\n * Sets corner and controls position coordinates based on current angle, width and height, left and top.\n * oCoords are used to find the corners\n * aCoords are used to quickly find an object on the canvas\n * lineCoords are used to quickly find object during pointer events.\n * See {@link https://github.com/fabricjs/fabric.js/wiki/When-to-call-setCoords} and {@link http://fabricjs.com/fabric-gotchas}\n *\n * @param {Boolean} [skipCorners] skip calculation of oCoords.\n * @return {fabric.Object} thisArg\n * @chainable\n */\n setCoords: function(skipCorners) {\n this.aCoords = this.calcACoords();\n // in case we are in a group, for how the inner group target check works,\n // lineCoords are exactly aCoords. Since the vpt gets absorbed by the normalized pointer.\n this.lineCoords = this.group ? this.aCoords : this.calcLineCoords();\n if (skipCorners) {\n return this;\n }\n // set coordinates of the draggable boxes in the corners used to scale/rotate the image\n this.oCoords = this.calcOCoords();\n this._setCornerCoords && this._setCornerCoords();\n return this;\n },\n\n /**\n * calculate rotation matrix of an object\n * @return {Array} rotation matrix for the object\n */\n _calcRotateMatrix: function() {\n return util.calcRotateMatrix(this);\n },\n\n /**\n * calculate the translation matrix for an object transform\n * @return {Array} rotation matrix for the object\n */\n _calcTranslateMatrix: function() {\n var center = this.getCenterPoint();\n return [1, 0, 0, 1, center.x, center.y];\n },\n\n transformMatrixKey: function(skipGroup) {\n var sep = '_', prefix = '';\n if (!skipGroup && this.group) {\n prefix = this.group.transformMatrixKey(skipGroup) + sep;\n };\n return prefix + this.top + sep + this.left + sep + this.scaleX + sep + this.scaleY +\n sep + this.skewX + sep + this.skewY + sep + this.angle + sep + this.originX + sep + this.originY +\n sep + this.width + sep + this.height + sep + this.strokeWidth + this.flipX + this.flipY;\n },\n\n /**\n * calculate transform matrix that represents the current transformations from the\n * object's properties.\n * @param {Boolean} [skipGroup] return transform matrix for object not counting parent transformations\n * There are some situation in which this is useful to avoid the fake rotation.\n * @return {Array} transform matrix for the object\n */\n calcTransformMatrix: function(skipGroup) {\n var matrix = this.calcOwnMatrix();\n if (skipGroup || !this.group) {\n return matrix;\n }\n var key = this.transformMatrixKey(skipGroup), cache = this.matrixCache || (this.matrixCache = {});\n if (cache.key === key) {\n return cache.value;\n }\n if (this.group) {\n matrix = multiplyMatrices(this.group.calcTransformMatrix(false), matrix);\n }\n cache.key = key;\n cache.value = matrix;\n return matrix;\n },\n\n /**\n * calculate transform matrix that represents the current transformations from the\n * object's properties, this matrix does not include the group transformation\n * @return {Array} transform matrix for the object\n */\n calcOwnMatrix: function() {\n var key = this.transformMatrixKey(true), cache = this.ownMatrixCache || (this.ownMatrixCache = {});\n if (cache.key === key) {\n return cache.value;\n }\n var tMatrix = this._calcTranslateMatrix(),\n options = {\n angle: this.angle,\n translateX: tMatrix[4],\n translateY: tMatrix[5],\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n skewX: this.skewX,\n skewY: this.skewY,\n flipX: this.flipX,\n flipY: this.flipY,\n };\n cache.key = key;\n cache.value = util.composeMatrix(options);\n return cache.value;\n },\n\n /*\n * Calculate object dimensions from its properties\n * @private\n * @return {Object} .x width dimension\n * @return {Object} .y height dimension\n */\n _getNonTransformedDimensions: function() {\n var strokeWidth = this.strokeWidth,\n w = this.width + strokeWidth,\n h = this.height + strokeWidth;\n return { x: w, y: h };\n },\n\n /*\n * Calculate object bounding box dimensions from its properties scale, skew.\n * @param {Number} skewX, a value to override current skewX\n * @param {Number} skewY, a value to override current skewY\n * @private\n * @return {Object} .x width dimension\n * @return {Object} .y height dimension\n */\n _getTransformedDimensions: function(skewX, skewY) {\n if (typeof skewX === 'undefined') {\n skewX = this.skewX;\n }\n if (typeof skewY === 'undefined') {\n skewY = this.skewY;\n }\n var dimensions, dimX, dimY,\n noSkew = skewX === 0 && skewY === 0;\n\n if (this.strokeUniform) {\n dimX = this.width;\n dimY = this.height;\n }\n else {\n dimensions = this._getNonTransformedDimensions();\n dimX = dimensions.x;\n dimY = dimensions.y;\n }\n if (noSkew) {\n return this._finalizeDimensions(dimX * this.scaleX, dimY * this.scaleY);\n }\n var bbox = util.sizeAfterTransform(dimX, dimY, {\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n skewX: skewX,\n skewY: skewY,\n });\n return this._finalizeDimensions(bbox.x, bbox.y);\n },\n\n /*\n * Calculate object bounding box dimensions from its properties scale, skew.\n * @param Number width width of the bbox\n * @param Number height height of the bbox\n * @private\n * @return {Object} .x finalized width dimension\n * @return {Object} .y finalized height dimension\n */\n _finalizeDimensions: function(width, height) {\n return this.strokeUniform ?\n { x: width + this.strokeWidth, y: height + this.strokeWidth }\n :\n { x: width, y: height };\n },\n\n /*\n * Calculate object dimensions for controls box, including padding and canvas zoom.\n * and active selection\n * private\n */\n _calculateCurrentDimensions: function() {\n var vpt = this.getViewportTransform(),\n dim = this._getTransformedDimensions(),\n p = transformPoint(dim, vpt, true);\n return p.scalarAdd(2 * this.padding);\n },\n });\n})();\n\n\nfabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n\n /**\n * Moves an object to the bottom of the stack of drawn objects\n * @return {fabric.Object} thisArg\n * @chainable\n */\n sendToBack: function() {\n if (this.group) {\n fabric.StaticCanvas.prototype.sendToBack.call(this.group, this);\n }\n else if (this.canvas) {\n this.canvas.sendToBack(this);\n }\n return this;\n },\n\n /**\n * Moves an object to the top of the stack of drawn objects\n * @return {fabric.Object} thisArg\n * @chainable\n */\n bringToFront: function() {\n if (this.group) {\n fabric.StaticCanvas.prototype.bringToFront.call(this.group, this);\n }\n else if (this.canvas) {\n this.canvas.bringToFront(this);\n }\n return this;\n },\n\n /**\n * Moves an object down in stack of drawn objects\n * @param {Boolean} [intersecting] If `true`, send object behind next lower intersecting object\n * @return {fabric.Object} thisArg\n * @chainable\n */\n sendBackwards: function(intersecting) {\n if (this.group) {\n fabric.StaticCanvas.prototype.sendBackwards.call(this.group, this, intersecting);\n }\n else if (this.canvas) {\n this.canvas.sendBackwards(this, intersecting);\n }\n return this;\n },\n\n /**\n * Moves an object up in stack of drawn objects\n * @param {Boolean} [intersecting] If `true`, send object in front of next upper intersecting object\n * @return {fabric.Object} thisArg\n * @chainable\n */\n bringForward: function(intersecting) {\n if (this.group) {\n fabric.StaticCanvas.prototype.bringForward.call(this.group, this, intersecting);\n }\n else if (this.canvas) {\n this.canvas.bringForward(this, intersecting);\n }\n return this;\n },\n\n /**\n * Moves an object to specified level in stack of drawn objects\n * @param {Number} index New position of object\n * @return {fabric.Object} thisArg\n * @chainable\n */\n moveTo: function(index) {\n if (this.group && this.group.type !== 'activeSelection') {\n fabric.StaticCanvas.prototype.moveTo.call(this.group, this, index);\n }\n else if (this.canvas) {\n this.canvas.moveTo(this, index);\n }\n return this;\n }\n});\n\n\n/* _TO_SVG_START_ */\n(function() {\n function getSvgColorString(prop, value) {\n if (!value) {\n return prop + ': none; ';\n }\n else if (value.toLive) {\n return prop + ': url(#SVGID_' + value.id + '); ';\n }\n else {\n var color = new fabric.Color(value),\n str = prop + ': ' + color.toRgb() + '; ',\n opacity = color.getAlpha();\n if (opacity !== 1) {\n //change the color in rgb + opacity\n str += prop + '-opacity: ' + opacity.toString() + '; ';\n }\n return str;\n }\n }\n\n var toFixed = fabric.util.toFixed;\n\n fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n /**\n * Returns styles-string for svg-export\n * @param {Boolean} skipShadow a boolean to skip shadow filter output\n * @return {String}\n */\n getSvgStyles: function(skipShadow) {\n\n var fillRule = this.fillRule ? this.fillRule : 'nonzero',\n strokeWidth = this.strokeWidth ? this.strokeWidth : '0',\n strokeDashArray = this.strokeDashArray ? this.strokeDashArray.join(' ') : 'none',\n strokeDashOffset = this.strokeDashOffset ? this.strokeDashOffset : '0',\n strokeLineCap = this.strokeLineCap ? this.strokeLineCap : 'butt',\n strokeLineJoin = this.strokeLineJoin ? this.strokeLineJoin : 'miter',\n strokeMiterLimit = this.strokeMiterLimit ? this.strokeMiterLimit : '4',\n opacity = typeof this.opacity !== 'undefined' ? this.opacity : '1',\n visibility = this.visible ? '' : ' visibility: hidden;',\n filter = skipShadow ? '' : this.getSvgFilter(),\n fill = getSvgColorString('fill', this.fill),\n stroke = getSvgColorString('stroke', this.stroke);\n\n return [\n stroke,\n 'stroke-width: ', strokeWidth, '; ',\n 'stroke-dasharray: ', strokeDashArray, '; ',\n 'stroke-linecap: ', strokeLineCap, '; ',\n 'stroke-dashoffset: ', strokeDashOffset, '; ',\n 'stroke-linejoin: ', strokeLineJoin, '; ',\n 'stroke-miterlimit: ', strokeMiterLimit, '; ',\n fill,\n 'fill-rule: ', fillRule, '; ',\n 'opacity: ', opacity, ';',\n filter,\n visibility\n ].join('');\n },\n\n /**\n * Returns styles-string for svg-export\n * @param {Object} style the object from which to retrieve style properties\n * @param {Boolean} useWhiteSpace a boolean to include an additional attribute in the style.\n * @return {String}\n */\n getSvgSpanStyles: function(style, useWhiteSpace) {\n var term = '; ';\n var fontFamily = style.fontFamily ?\n 'font-family: ' + (((style.fontFamily.indexOf('\\'') === -1 && style.fontFamily.indexOf('\"') === -1) ?\n '\\'' + style.fontFamily + '\\'' : style.fontFamily)) + term : '';\n var strokeWidth = style.strokeWidth ? 'stroke-width: ' + style.strokeWidth + term : '',\n fontFamily = fontFamily,\n fontSize = style.fontSize ? 'font-size: ' + style.fontSize + 'px' + term : '',\n fontStyle = style.fontStyle ? 'font-style: ' + style.fontStyle + term : '',\n fontWeight = style.fontWeight ? 'font-weight: ' + style.fontWeight + term : '',\n fill = style.fill ? getSvgColorString('fill', style.fill) : '',\n stroke = style.stroke ? getSvgColorString('stroke', style.stroke) : '',\n textDecoration = this.getSvgTextDecoration(style),\n deltaY = style.deltaY ? 'baseline-shift: ' + (-style.deltaY) + '; ' : '';\n if (textDecoration) {\n textDecoration = 'text-decoration: ' + textDecoration + term;\n }\n\n return [\n stroke,\n strokeWidth,\n fontFamily,\n fontSize,\n fontStyle,\n fontWeight,\n textDecoration,\n fill,\n deltaY,\n useWhiteSpace ? 'white-space: pre; ' : ''\n ].join('');\n },\n\n /**\n * Returns text-decoration property for svg-export\n * @param {Object} style the object from which to retrieve style properties\n * @return {String}\n */\n getSvgTextDecoration: function(style) {\n return ['overline', 'underline', 'line-through'].filter(function(decoration) {\n return style[decoration.replace('-', '')];\n }).join(' ');\n },\n\n /**\n * Returns filter for svg shadow\n * @return {String}\n */\n getSvgFilter: function() {\n return this.shadow ? 'filter: url(#SVGID_' + this.shadow.id + ');' : '';\n },\n\n /**\n * Returns id attribute for svg output\n * @return {String}\n */\n getSvgCommons: function() {\n return [\n this.id ? 'id=\"' + this.id + '\" ' : '',\n this.clipPath ? 'clip-path=\"url(#' + this.clipPath.clipPathId + ')\" ' : '',\n ].join('');\n },\n\n /**\n * Returns transform-string for svg-export\n * @param {Boolean} use the full transform or the single object one.\n * @return {String}\n */\n getSvgTransform: function(full, additionalTransform) {\n var transform = full ? this.calcTransformMatrix() : this.calcOwnMatrix(),\n svgTransform = 'transform=\"' + fabric.util.matrixToSVG(transform);\n return svgTransform +\n (additionalTransform || '') + '\" ';\n },\n\n _setSVGBg: function(textBgRects) {\n if (this.backgroundColor) {\n var NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS;\n textBgRects.push(\n '\\t\\t\\n');\n }\n },\n\n /**\n * Returns svg representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toSVG: function(reviver) {\n return this._createBaseSVGMarkup(this._toSVG(reviver), { reviver: reviver });\n },\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toClipPathSVG: function(reviver) {\n return '\\t' + this._createBaseClipPathSVGMarkup(this._toSVG(reviver), { reviver: reviver });\n },\n\n /**\n * @private\n */\n _createBaseClipPathSVGMarkup: function(objectMarkup, options) {\n options = options || {};\n var reviver = options.reviver,\n additionalTransform = options.additionalTransform || '',\n commonPieces = [\n this.getSvgTransform(true, additionalTransform),\n this.getSvgCommons(),\n ].join(''),\n // insert commons in the markup, style and svgCommons\n index = objectMarkup.indexOf('COMMON_PARTS');\n objectMarkup[index] = commonPieces;\n return reviver ? reviver(objectMarkup.join('')) : objectMarkup.join('');\n },\n\n /**\n * @private\n */\n _createBaseSVGMarkup: function(objectMarkup, options) {\n options = options || {};\n var noStyle = options.noStyle,\n reviver = options.reviver,\n styleInfo = noStyle ? '' : 'style=\"' + this.getSvgStyles() + '\" ',\n shadowInfo = options.withShadow ? 'style=\"' + this.getSvgFilter() + '\" ' : '',\n clipPath = this.clipPath,\n vectorEffect = this.strokeUniform ? 'vector-effect=\"non-scaling-stroke\" ' : '',\n absoluteClipPath = clipPath && clipPath.absolutePositioned,\n stroke = this.stroke, fill = this.fill, shadow = this.shadow,\n commonPieces, markup = [], clipPathMarkup,\n // insert commons in the markup, style and svgCommons\n index = objectMarkup.indexOf('COMMON_PARTS'),\n additionalTransform = options.additionalTransform;\n if (clipPath) {\n clipPath.clipPathId = 'CLIPPATH_' + fabric.Object.__uid++;\n clipPathMarkup = '\\n' +\n clipPath.toClipPathSVG(reviver) +\n '\\n';\n }\n if (absoluteClipPath) {\n markup.push(\n '\\n'\n );\n }\n markup.push(\n '\\n'\n );\n commonPieces = [\n styleInfo,\n vectorEffect,\n noStyle ? '' : this.addPaintOrder(), ' ',\n additionalTransform ? 'transform=\"' + additionalTransform + '\" ' : '',\n ].join('');\n objectMarkup[index] = commonPieces;\n if (fill && fill.toLive) {\n markup.push(fill.toSVG(this));\n }\n if (stroke && stroke.toLive) {\n markup.push(stroke.toSVG(this));\n }\n if (shadow) {\n markup.push(shadow.toSVG(this));\n }\n if (clipPath) {\n markup.push(clipPathMarkup);\n }\n markup.push(objectMarkup.join(''));\n markup.push('\\n');\n absoluteClipPath && markup.push('\\n');\n return reviver ? reviver(markup.join('')) : markup.join('');\n },\n\n addPaintOrder: function() {\n return this.paintFirst !== 'fill' ? ' paint-order=\"' + this.paintFirst + '\" ' : '';\n }\n });\n})();\n/* _TO_SVG_END_ */\n\n\n(function() {\n\n var extend = fabric.util.object.extend,\n originalSet = 'stateProperties';\n\n /*\n Depends on `stateProperties`\n */\n function saveProps(origin, destination, props) {\n var tmpObj = { }, deep = true;\n props.forEach(function(prop) {\n tmpObj[prop] = origin[prop];\n });\n\n extend(origin[destination], tmpObj, deep);\n }\n\n function _isEqual(origValue, currentValue, firstPass) {\n if (origValue === currentValue) {\n // if the objects are identical, return\n return true;\n }\n else if (Array.isArray(origValue)) {\n if (!Array.isArray(currentValue) || origValue.length !== currentValue.length) {\n return false;\n }\n for (var i = 0, len = origValue.length; i < len; i++) {\n if (!_isEqual(origValue[i], currentValue[i])) {\n return false;\n }\n }\n return true;\n }\n else if (origValue && typeof origValue === 'object') {\n var keys = Object.keys(origValue), key;\n if (!currentValue ||\n typeof currentValue !== 'object' ||\n (!firstPass && keys.length !== Object.keys(currentValue).length)\n ) {\n return false;\n }\n for (var i = 0, len = keys.length; i < len; i++) {\n key = keys[i];\n // since clipPath is in the statefull cache list and the clipPath objects\n // would be iterated as an object, this would lead to possible infinite recursion\n // we do not want to compare those.\n if (key === 'canvas' || key === 'group') {\n continue;\n }\n if (!_isEqual(origValue[key], currentValue[key])) {\n return false;\n }\n }\n return true;\n }\n }\n\n\n fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n\n /**\n * Returns true if object state (one of its state properties) was changed\n * @param {String} [propertySet] optional name for the set of property we want to save\n * @return {Boolean} true if instance' state has changed since `{@link fabric.Object#saveState}` was called\n */\n hasStateChanged: function(propertySet) {\n propertySet = propertySet || originalSet;\n var dashedPropertySet = '_' + propertySet;\n if (Object.keys(this[dashedPropertySet]).length < this[propertySet].length) {\n return true;\n }\n return !_isEqual(this[dashedPropertySet], this, true);\n },\n\n /**\n * Saves state of an object\n * @param {Object} [options] Object with additional `stateProperties` array to include when saving state\n * @return {fabric.Object} thisArg\n */\n saveState: function(options) {\n var propertySet = options && options.propertySet || originalSet,\n destination = '_' + propertySet;\n if (!this[destination]) {\n return this.setupState(options);\n }\n saveProps(this, destination, this[propertySet]);\n if (options && options.stateProperties) {\n saveProps(this, destination, options.stateProperties);\n }\n return this;\n },\n\n /**\n * Setups state of an object\n * @param {Object} [options] Object with additional `stateProperties` array to include when saving state\n * @return {fabric.Object} thisArg\n */\n setupState: function(options) {\n options = options || { };\n var propertySet = options.propertySet || originalSet;\n options.propertySet = propertySet;\n this['_' + propertySet] = { };\n this.saveState(options);\n return this;\n }\n });\n})();\n\n\n(function() {\n\n var degreesToRadians = fabric.util.degreesToRadians;\n\n fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n /**\n * Determines which corner has been clicked\n * @private\n * @param {Object} pointer The pointer indicating the mouse position\n * @return {String|Boolean} corner code (tl, tr, bl, br, etc.), or false if nothing is found\n */\n _findTargetCorner: function(pointer, forTouch) {\n // objects in group, anykind, are not self modificable,\n // must not return an hovered corner.\n if (!this.hasControls || this.group || (!this.canvas || this.canvas._activeObject !== this)) {\n return false;\n }\n\n var ex = pointer.x,\n ey = pointer.y,\n xPoints,\n lines, keys = Object.keys(this.oCoords),\n j = keys.length - 1, i;\n this.__corner = 0;\n\n // cycle in reverse order so we pick first the one on top\n for (; j >= 0; j--) {\n i = keys[j];\n if (!this.isControlVisible(i)) {\n continue;\n }\n\n lines = this._getImageLines(forTouch ? this.oCoords[i].touchCorner : this.oCoords[i].corner);\n // // debugging\n //\n // this.canvas.contextTop.fillRect(lines.bottomline.d.x, lines.bottomline.d.y, 2, 2);\n // this.canvas.contextTop.fillRect(lines.bottomline.o.x, lines.bottomline.o.y, 2, 2);\n //\n // this.canvas.contextTop.fillRect(lines.leftline.d.x, lines.leftline.d.y, 2, 2);\n // this.canvas.contextTop.fillRect(lines.leftline.o.x, lines.leftline.o.y, 2, 2);\n //\n // this.canvas.contextTop.fillRect(lines.topline.d.x, lines.topline.d.y, 2, 2);\n // this.canvas.contextTop.fillRect(lines.topline.o.x, lines.topline.o.y, 2, 2);\n //\n // this.canvas.contextTop.fillRect(lines.rightline.d.x, lines.rightline.d.y, 2, 2);\n // this.canvas.contextTop.fillRect(lines.rightline.o.x, lines.rightline.o.y, 2, 2);\n\n xPoints = this._findCrossPoints({ x: ex, y: ey }, lines);\n if (xPoints !== 0 && xPoints % 2 === 1) {\n this.__corner = i;\n return i;\n }\n }\n return false;\n },\n\n /**\n * Calls a function for each control. The function gets called,\n * with the control, the object that is calling the iterator and the control's key\n * @param {Function} fn function to iterate over the controls over\n */\n forEachControl: function(fn) {\n for (var i in this.controls) {\n fn(this.controls[i], i, this);\n };\n },\n\n /**\n * Sets the coordinates of the draggable boxes in the corners of\n * the image used to scale/rotate it.\n * note: if we would switch to ROUND corner area, all of this would disappear.\n * everything would resolve to a single point and a pythagorean theorem for the distance\n * @private\n */\n _setCornerCoords: function() {\n var coords = this.oCoords;\n\n for (var control in coords) {\n var controlObject = this.controls[control];\n coords[control].corner = controlObject.calcCornerCoords(\n this.angle, this.cornerSize, coords[control].x, coords[control].y, false);\n coords[control].touchCorner = controlObject.calcCornerCoords(\n this.angle, this.touchCornerSize, coords[control].x, coords[control].y, true);\n }\n },\n\n /**\n * Draws a colored layer behind the object, inside its selection borders.\n * Requires public options: padding, selectionBackgroundColor\n * this function is called when the context is transformed\n * has checks to be skipped when the object is on a staticCanvas\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @return {fabric.Object} thisArg\n * @chainable\n */\n drawSelectionBackground: function(ctx) {\n if (!this.selectionBackgroundColor ||\n (this.canvas && !this.canvas.interactive) ||\n (this.canvas && this.canvas._activeObject !== this)\n ) {\n return this;\n }\n ctx.save();\n var center = this.getCenterPoint(), wh = this._calculateCurrentDimensions(),\n vpt = this.canvas.viewportTransform;\n ctx.translate(center.x, center.y);\n ctx.scale(1 / vpt[0], 1 / vpt[3]);\n ctx.rotate(degreesToRadians(this.angle));\n ctx.fillStyle = this.selectionBackgroundColor;\n ctx.fillRect(-wh.x / 2, -wh.y / 2, wh.x, wh.y);\n ctx.restore();\n return this;\n },\n\n /**\n * Draws borders of an object's bounding box.\n * Requires public properties: width, height\n * Requires public options: padding, borderColor\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {Object} styleOverride object to override the object style\n * @return {fabric.Object} thisArg\n * @chainable\n */\n drawBorders: function(ctx, styleOverride) {\n styleOverride = styleOverride || {};\n var wh = this._calculateCurrentDimensions(),\n strokeWidth = this.borderScaleFactor,\n width = wh.x + strokeWidth,\n height = wh.y + strokeWidth,\n hasControls = typeof styleOverride.hasControls !== 'undefined' ?\n styleOverride.hasControls : this.hasControls,\n shouldStroke = false;\n\n ctx.save();\n ctx.strokeStyle = styleOverride.borderColor || this.borderColor;\n this._setLineDash(ctx, styleOverride.borderDashArray || this.borderDashArray);\n\n ctx.strokeRect(\n -width / 2,\n -height / 2,\n width,\n height\n );\n\n if (hasControls) {\n ctx.beginPath();\n this.forEachControl(function(control, key, fabricObject) {\n // in this moment, the ctx is centered on the object.\n // width and height of the above function are the size of the bbox.\n if (control.withConnection && control.getVisibility(fabricObject, key)) {\n // reset movement for each control\n shouldStroke = true;\n ctx.moveTo(control.x * width, control.y * height);\n ctx.lineTo(\n control.x * width + control.offsetX,\n control.y * height + control.offsetY\n );\n }\n });\n if (shouldStroke) {\n ctx.stroke();\n }\n }\n ctx.restore();\n return this;\n },\n\n /**\n * Draws borders of an object's bounding box when it is inside a group.\n * Requires public properties: width, height\n * Requires public options: padding, borderColor\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {object} options object representing current object parameters\n * @param {Object} styleOverride object to override the object style\n * @return {fabric.Object} thisArg\n * @chainable\n */\n drawBordersInGroup: function(ctx, options, styleOverride) {\n styleOverride = styleOverride || {};\n var bbox = fabric.util.sizeAfterTransform(this.width, this.height, options),\n strokeWidth = this.strokeWidth,\n strokeUniform = this.strokeUniform,\n borderScaleFactor = this.borderScaleFactor,\n width =\n bbox.x + strokeWidth * (strokeUniform ? this.canvas.getZoom() : options.scaleX) + borderScaleFactor,\n height =\n bbox.y + strokeWidth * (strokeUniform ? this.canvas.getZoom() : options.scaleY) + borderScaleFactor;\n ctx.save();\n this._setLineDash(ctx, styleOverride.borderDashArray || this.borderDashArray);\n ctx.strokeStyle = styleOverride.borderColor || this.borderColor;\n ctx.strokeRect(\n -width / 2,\n -height / 2,\n width,\n height\n );\n\n ctx.restore();\n return this;\n },\n\n /**\n * Draws corners of an object's bounding box.\n * Requires public properties: width, height\n * Requires public options: cornerSize, padding\n * @param {CanvasRenderingContext2D} ctx Context to draw on\n * @param {Object} styleOverride object to override the object style\n * @return {fabric.Object} thisArg\n * @chainable\n */\n drawControls: function(ctx, styleOverride) {\n styleOverride = styleOverride || {};\n ctx.save();\n var retinaScaling = this.canvas.getRetinaScaling(), matrix, p;\n ctx.setTransform(retinaScaling, 0, 0, retinaScaling, 0, 0);\n ctx.strokeStyle = ctx.fillStyle = styleOverride.cornerColor || this.cornerColor;\n if (!this.transparentCorners) {\n ctx.strokeStyle = styleOverride.cornerStrokeColor || this.cornerStrokeColor;\n }\n this._setLineDash(ctx, styleOverride.cornerDashArray || this.cornerDashArray);\n this.setCoords();\n if (this.group) {\n // fabricJS does not really support drawing controls inside groups,\n // this piece of code here helps having at least the control in places.\n // If an application needs to show some objects as selected because of some UI state\n // can still call Object._renderControls() on any object they desire, independently of groups.\n // using no padding, circular controls and hiding the rotating cursor is higly suggested,\n matrix = this.group.calcTransformMatrix();\n }\n this.forEachControl(function(control, key, fabricObject) {\n p = fabricObject.oCoords[key];\n if (control.getVisibility(fabricObject, key)) {\n if (matrix) {\n p = fabric.util.transformPoint(p, matrix);\n }\n control.render(ctx, p.x, p.y, styleOverride, fabricObject);\n }\n });\n ctx.restore();\n\n return this;\n },\n\n /**\n * Returns true if the specified control is visible, false otherwise.\n * @param {String} controlKey The key of the control. Possible values are 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr'.\n * @returns {Boolean} true if the specified control is visible, false otherwise\n */\n isControlVisible: function(controlKey) {\n return this.controls[controlKey] && this.controls[controlKey].getVisibility(this, controlKey);\n },\n\n /**\n * Sets the visibility of the specified control.\n * @param {String} controlKey The key of the control. Possible values are 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr'.\n * @param {Boolean} visible true to set the specified control visible, false otherwise\n * @return {fabric.Object} thisArg\n * @chainable\n */\n setControlVisible: function(controlKey, visible) {\n if (!this._controlsVisibility) {\n this._controlsVisibility = {};\n }\n this._controlsVisibility[controlKey] = visible;\n return this;\n },\n\n /**\n * Sets the visibility state of object controls.\n * @param {Object} [options] Options object\n * @param {Boolean} [options.bl] true to enable the bottom-left control, false to disable it\n * @param {Boolean} [options.br] true to enable the bottom-right control, false to disable it\n * @param {Boolean} [options.mb] true to enable the middle-bottom control, false to disable it\n * @param {Boolean} [options.ml] true to enable the middle-left control, false to disable it\n * @param {Boolean} [options.mr] true to enable the middle-right control, false to disable it\n * @param {Boolean} [options.mt] true to enable the middle-top control, false to disable it\n * @param {Boolean} [options.tl] true to enable the top-left control, false to disable it\n * @param {Boolean} [options.tr] true to enable the top-right control, false to disable it\n * @param {Boolean} [options.mtr] true to enable the middle-top-rotate control, false to disable it\n * @return {fabric.Object} thisArg\n * @chainable\n */\n setControlsVisibility: function(options) {\n options || (options = { });\n\n for (var p in options) {\n this.setControlVisible(p, options[p]);\n }\n return this;\n },\n\n\n /**\n * This callback function is called every time _discardActiveObject or _setActiveObject\n * try to to deselect this object. If the function returns true, the process is cancelled\n * @param {Object} [options] options sent from the upper functions\n * @param {Event} [options.e] event if the process is generated by an event\n */\n onDeselect: function() {\n // implemented by sub-classes, as needed.\n },\n\n\n /**\n * This callback function is called every time _discardActiveObject or _setActiveObject\n * try to to select this object. If the function returns true, the process is cancelled\n * @param {Object} [options] options sent from the upper functions\n * @param {Event} [options.e] event if the process is generated by an event\n */\n onSelect: function() {\n // implemented by sub-classes, as needed.\n }\n });\n})();\n\n\nfabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.StaticCanvas.prototype */ {\n\n /**\n * Animation duration (in ms) for fx* methods\n * @type Number\n * @default\n */\n FX_DURATION: 500,\n\n /**\n * Centers object horizontally with animation.\n * @param {fabric.Object} object Object to center\n * @param {Object} [callbacks] Callbacks object with optional \"onComplete\" and/or \"onChange\" properties\n * @param {Function} [callbacks.onComplete] Invoked on completion\n * @param {Function} [callbacks.onChange] Invoked on every step of animation\n * @return {fabric.AnimationContext} context\n */\n fxCenterObjectH: function (object, callbacks) {\n callbacks = callbacks || { };\n\n var empty = function() { },\n onComplete = callbacks.onComplete || empty,\n onChange = callbacks.onChange || empty,\n _this = this;\n\n return fabric.util.animate({\n target: this,\n startValue: object.left,\n endValue: this.getCenterPoint().x,\n duration: this.FX_DURATION,\n onChange: function(value) {\n object.set('left', value);\n _this.requestRenderAll();\n onChange();\n },\n onComplete: function() {\n object.setCoords();\n onComplete();\n }\n });\n },\n\n /**\n * Centers object vertically with animation.\n * @param {fabric.Object} object Object to center\n * @param {Object} [callbacks] Callbacks object with optional \"onComplete\" and/or \"onChange\" properties\n * @param {Function} [callbacks.onComplete] Invoked on completion\n * @param {Function} [callbacks.onChange] Invoked on every step of animation\n * @return {fabric.AnimationContext} context\n */\n fxCenterObjectV: function (object, callbacks) {\n callbacks = callbacks || { };\n\n var empty = function() { },\n onComplete = callbacks.onComplete || empty,\n onChange = callbacks.onChange || empty,\n _this = this;\n\n return fabric.util.animate({\n target: this,\n startValue: object.top,\n endValue: this.getCenterPoint().y,\n duration: this.FX_DURATION,\n onChange: function(value) {\n object.set('top', value);\n _this.requestRenderAll();\n onChange();\n },\n onComplete: function() {\n object.setCoords();\n onComplete();\n }\n });\n },\n\n /**\n * Same as `fabric.Canvas#remove` but animated\n * @param {fabric.Object} object Object to remove\n * @param {Object} [callbacks] Callbacks object with optional \"onComplete\" and/or \"onChange\" properties\n * @param {Function} [callbacks.onComplete] Invoked on completion\n * @param {Function} [callbacks.onChange] Invoked on every step of animation\n * @return {fabric.AnimationContext} context\n */\n fxRemove: function (object, callbacks) {\n callbacks = callbacks || { };\n\n var empty = function() { },\n onComplete = callbacks.onComplete || empty,\n onChange = callbacks.onChange || empty,\n _this = this;\n\n return fabric.util.animate({\n target: this,\n startValue: object.opacity,\n endValue: 0,\n duration: this.FX_DURATION,\n onChange: function(value) {\n object.set('opacity', value);\n _this.requestRenderAll();\n onChange();\n },\n onComplete: function () {\n _this.remove(object);\n onComplete();\n }\n });\n }\n});\n\nfabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n /**\n * Animates object's properties\n * @param {String|Object} property Property to animate (if string) or properties to animate (if object)\n * @param {Number|Object} value Value to animate property to (if string was given first) or options object\n * @return {fabric.Object} thisArg\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#animation}\n * @return {fabric.AnimationContext | fabric.AnimationContext[]} animation context (or an array if passed multiple properties)\n *\n * As object — multiple properties\n *\n * object.animate({ left: ..., top: ... });\n * object.animate({ left: ..., top: ... }, { duration: ... });\n *\n * As string — one property\n *\n * object.animate('left', ...);\n * object.animate('left', { duration: ... });\n *\n */\n animate: function () {\n if (arguments[0] && typeof arguments[0] === 'object') {\n var propsToAnimate = [], prop, skipCallbacks, out = [];\n for (prop in arguments[0]) {\n propsToAnimate.push(prop);\n }\n for (var i = 0, len = propsToAnimate.length; i < len; i++) {\n prop = propsToAnimate[i];\n skipCallbacks = i !== len - 1;\n out.push(this._animate(prop, arguments[0][prop], arguments[1], skipCallbacks));\n }\n return out;\n }\n else {\n return this._animate.apply(this, arguments);\n }\n },\n\n /**\n * @private\n * @param {String} property Property to animate\n * @param {String} to Value to animate to\n * @param {Object} [options] Options object\n * @param {Boolean} [skipCallbacks] When true, callbacks like onchange and oncomplete are not invoked\n */\n _animate: function(property, to, options, skipCallbacks) {\n var _this = this, propPair;\n\n to = to.toString();\n\n if (!options) {\n options = { };\n }\n else {\n options = fabric.util.object.clone(options);\n }\n\n if (~property.indexOf('.')) {\n propPair = property.split('.');\n }\n\n var propIsColor =\n _this.colorProperties.indexOf(property) > -1 ||\n (propPair && _this.colorProperties.indexOf(propPair[1]) > -1);\n\n var currentValue = propPair\n ? this.get(propPair[0])[propPair[1]]\n : this.get(property);\n\n if (!('from' in options)) {\n options.from = currentValue;\n }\n\n if (!propIsColor) {\n if (~to.indexOf('=')) {\n to = currentValue + parseFloat(to.replace('=', ''));\n }\n else {\n to = parseFloat(to);\n }\n }\n\n var _options = {\n target: this,\n startValue: options.from,\n endValue: to,\n byValue: options.by,\n easing: options.easing,\n duration: options.duration,\n abort: options.abort && function(value, valueProgress, timeProgress) {\n return options.abort.call(_this, value, valueProgress, timeProgress);\n },\n onChange: function (value, valueProgress, timeProgress) {\n if (propPair) {\n _this[propPair[0]][propPair[1]] = value;\n }\n else {\n _this.set(property, value);\n }\n if (skipCallbacks) {\n return;\n }\n options.onChange && options.onChange(value, valueProgress, timeProgress);\n },\n onComplete: function (value, valueProgress, timeProgress) {\n if (skipCallbacks) {\n return;\n }\n\n _this.setCoords();\n options.onComplete && options.onComplete(value, valueProgress, timeProgress);\n }\n };\n\n if (propIsColor) {\n return fabric.util.animateColor(_options.startValue, _options.endValue, _options.duration, _options);\n }\n else {\n return fabric.util.animate(_options);\n }\n }\n});\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n extend = fabric.util.object.extend,\n clone = fabric.util.object.clone,\n coordProps = { x1: 1, x2: 1, y1: 1, y2: 1 };\n\n if (fabric.Line) {\n fabric.warn('fabric.Line is already defined');\n return;\n }\n\n /**\n * Line class\n * @class fabric.Line\n * @extends fabric.Object\n * @see {@link fabric.Line#initialize} for constructor definition\n */\n fabric.Line = fabric.util.createClass(fabric.Object, /** @lends fabric.Line.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'line',\n\n /**\n * x value or first line edge\n * @type Number\n * @default\n */\n x1: 0,\n\n /**\n * y value or first line edge\n * @type Number\n * @default\n */\n y1: 0,\n\n /**\n * x value or second line edge\n * @type Number\n * @default\n */\n x2: 0,\n\n /**\n * y value or second line edge\n * @type Number\n * @default\n */\n y2: 0,\n\n cacheProperties: fabric.Object.prototype.cacheProperties.concat('x1', 'x2', 'y1', 'y2'),\n\n /**\n * Constructor\n * @param {Array} [points] Array of points\n * @param {Object} [options] Options object\n * @return {fabric.Line} thisArg\n */\n initialize: function(points, options) {\n if (!points) {\n points = [0, 0, 0, 0];\n }\n\n this.callSuper('initialize', options);\n\n this.set('x1', points[0]);\n this.set('y1', points[1]);\n this.set('x2', points[2]);\n this.set('y2', points[3]);\n\n this._setWidthHeight(options);\n },\n\n /**\n * @private\n * @param {Object} [options] Options\n */\n _setWidthHeight: function(options) {\n options || (options = { });\n\n this.width = Math.abs(this.x2 - this.x1);\n this.height = Math.abs(this.y2 - this.y1);\n\n this.left = 'left' in options\n ? options.left\n : this._getLeftToOriginX();\n\n this.top = 'top' in options\n ? options.top\n : this._getTopToOriginY();\n },\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n */\n _set: function(key, value) {\n this.callSuper('_set', key, value);\n if (typeof coordProps[key] !== 'undefined') {\n this._setWidthHeight();\n }\n return this;\n },\n\n /**\n * @private\n * @return {Number} leftToOriginX Distance from left edge of canvas to originX of Line.\n */\n _getLeftToOriginX: makeEdgeToOriginGetter(\n { // property names\n origin: 'originX',\n axis1: 'x1',\n axis2: 'x2',\n dimension: 'width'\n },\n { // possible values of origin\n nearest: 'left',\n center: 'center',\n farthest: 'right'\n }\n ),\n\n /**\n * @private\n * @return {Number} topToOriginY Distance from top edge of canvas to originY of Line.\n */\n _getTopToOriginY: makeEdgeToOriginGetter(\n { // property names\n origin: 'originY',\n axis1: 'y1',\n axis2: 'y2',\n dimension: 'height'\n },\n { // possible values of origin\n nearest: 'top',\n center: 'center',\n farthest: 'bottom'\n }\n ),\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(ctx) {\n ctx.beginPath();\n\n\n var p = this.calcLinePoints();\n ctx.moveTo(p.x1, p.y1);\n ctx.lineTo(p.x2, p.y2);\n\n ctx.lineWidth = this.strokeWidth;\n\n // TODO: test this\n // make sure setting \"fill\" changes color of a line\n // (by copying fillStyle to strokeStyle, since line is stroked, not filled)\n var origStrokeStyle = ctx.strokeStyle;\n ctx.strokeStyle = this.stroke || ctx.fillStyle;\n this.stroke && this._renderStroke(ctx);\n ctx.strokeStyle = origStrokeStyle;\n },\n\n /**\n * This function is an helper for svg import. it returns the center of the object in the svg\n * untransformed coordinates\n * @private\n * @return {Object} center point from element coordinates\n */\n _findCenterFromElement: function() {\n return {\n x: (this.x1 + this.x2) / 2,\n y: (this.y1 + this.y2) / 2,\n };\n },\n\n /**\n * Returns object representation of an instance\n * @method toObject\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n return extend(this.callSuper('toObject', propertiesToInclude), this.calcLinePoints());\n },\n\n /*\n * Calculate object dimensions from its properties\n * @private\n */\n _getNonTransformedDimensions: function() {\n var dim = this.callSuper('_getNonTransformedDimensions');\n if (this.strokeLineCap === 'butt') {\n if (this.width === 0) {\n dim.y -= this.strokeWidth;\n }\n if (this.height === 0) {\n dim.x -= this.strokeWidth;\n }\n }\n return dim;\n },\n\n /**\n * Recalculates line points given width and height\n * @private\n */\n calcLinePoints: function() {\n var xMult = this.x1 <= this.x2 ? -1 : 1,\n yMult = this.y1 <= this.y2 ? -1 : 1,\n x1 = (xMult * this.width * 0.5),\n y1 = (yMult * this.height * 0.5),\n x2 = (xMult * this.width * -0.5),\n y2 = (yMult * this.height * -0.5);\n\n return {\n x1: x1,\n x2: x2,\n y1: y1,\n y2: y2\n };\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG: function() {\n var p = this.calcLinePoints();\n return [\n '\\n'\n ];\n },\n /* _TO_SVG_END_ */\n });\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link fabric.Line.fromElement})\n * @static\n * @memberOf fabric.Line\n * @see http://www.w3.org/TR/SVG/shapes.html#LineElement\n */\n fabric.Line.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('x1 y1 x2 y2'.split(' '));\n\n /**\n * Returns fabric.Line instance from an SVG element\n * @static\n * @memberOf fabric.Line\n * @param {SVGElement} element Element to parse\n * @param {Object} [options] Options object\n * @param {Function} [callback] callback function invoked after parsing\n */\n fabric.Line.fromElement = function(element, callback, options) {\n options = options || { };\n var parsedAttributes = fabric.parseAttributes(element, fabric.Line.ATTRIBUTE_NAMES),\n points = [\n parsedAttributes.x1 || 0,\n parsedAttributes.y1 || 0,\n parsedAttributes.x2 || 0,\n parsedAttributes.y2 || 0\n ];\n callback(new fabric.Line(points, extend(parsedAttributes, options)));\n };\n /* _FROM_SVG_END_ */\n\n /**\n * Returns fabric.Line instance from an object representation\n * @static\n * @memberOf fabric.Line\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] invoked with new instance as first argument\n */\n fabric.Line.fromObject = function(object, callback) {\n function _callback(instance) {\n delete instance.points;\n callback && callback(instance);\n };\n var options = clone(object, true);\n options.points = [object.x1, object.y1, object.x2, object.y2];\n fabric.Object._fromObject('Line', options, _callback, 'points');\n };\n\n /**\n * Produces a function that calculates distance from canvas edge to Line origin.\n */\n function makeEdgeToOriginGetter(propertyNames, originValues) {\n var origin = propertyNames.origin,\n axis1 = propertyNames.axis1,\n axis2 = propertyNames.axis2,\n dimension = propertyNames.dimension,\n nearest = originValues.nearest,\n center = originValues.center,\n farthest = originValues.farthest;\n\n return function() {\n switch (this.get(origin)) {\n case nearest:\n return Math.min(this.get(axis1), this.get(axis2));\n case center:\n return Math.min(this.get(axis1), this.get(axis2)) + (0.5 * this.get(dimension));\n case farthest:\n return Math.max(this.get(axis1), this.get(axis2));\n }\n };\n\n }\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n degreesToRadians = fabric.util.degreesToRadians;\n\n if (fabric.Circle) {\n fabric.warn('fabric.Circle is already defined.');\n return;\n }\n\n /**\n * Circle class\n * @class fabric.Circle\n * @extends fabric.Object\n * @see {@link fabric.Circle#initialize} for constructor definition\n */\n fabric.Circle = fabric.util.createClass(fabric.Object, /** @lends fabric.Circle.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'circle',\n\n /**\n * Radius of this circle\n * @type Number\n * @default\n */\n radius: 0,\n\n /**\n * degrees of start of the circle.\n * probably will change to degrees in next major version\n * @type Number 0 - 359\n * @default 0\n */\n startAngle: 0,\n\n /**\n * End angle of the circle\n * probably will change to degrees in next major version\n * @type Number 1 - 360\n * @default 360\n */\n endAngle: 360,\n\n cacheProperties: fabric.Object.prototype.cacheProperties.concat('radius', 'startAngle', 'endAngle'),\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n * @return {fabric.Circle} thisArg\n */\n _set: function(key, value) {\n this.callSuper('_set', key, value);\n\n if (key === 'radius') {\n this.setRadius(value);\n }\n\n return this;\n },\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n return this.callSuper('toObject', ['radius', 'startAngle', 'endAngle'].concat(propertiesToInclude));\n },\n\n /* _TO_SVG_START_ */\n\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG: function() {\n var svgString, x = 0, y = 0,\n angle = (this.endAngle - this.startAngle) % 360;\n\n if (angle === 0) {\n svgString = [\n '\\n'\n ];\n }\n else {\n var start = degreesToRadians(this.startAngle),\n end = degreesToRadians(this.endAngle),\n radius = this.radius,\n startX = fabric.util.cos(start) * radius,\n startY = fabric.util.sin(start) * radius,\n endX = fabric.util.cos(end) * radius,\n endY = fabric.util.sin(end) * radius,\n largeFlag = angle > 180 ? '1' : '0';\n svgString = [\n '\\n'\n ];\n }\n return svgString;\n },\n /* _TO_SVG_END_ */\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render on\n */\n _render: function(ctx) {\n ctx.beginPath();\n ctx.arc(\n 0,\n 0,\n this.radius,\n degreesToRadians(this.startAngle),\n degreesToRadians(this.endAngle),\n false\n );\n this._renderPaintInOrder(ctx);\n },\n\n /**\n * Returns horizontal radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRadiusX: function() {\n return this.get('radius') * this.get('scaleX');\n },\n\n /**\n * Returns vertical radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRadiusY: function() {\n return this.get('radius') * this.get('scaleY');\n },\n\n /**\n * Sets radius of an object (and updates width accordingly)\n * @return {fabric.Circle} thisArg\n */\n setRadius: function(value) {\n this.radius = value;\n return this.set('width', value * 2).set('height', value * 2);\n },\n });\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link fabric.Circle.fromElement})\n * @static\n * @memberOf fabric.Circle\n * @see: http://www.w3.org/TR/SVG/shapes.html#CircleElement\n */\n fabric.Circle.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('cx cy r'.split(' '));\n\n /**\n * Returns {@link fabric.Circle} instance from an SVG element\n * @static\n * @memberOf fabric.Circle\n * @param {SVGElement} element Element to parse\n * @param {Function} [callback] Options callback invoked after parsing is finished\n * @param {Object} [options] Options object\n * @throws {Error} If value of `r` attribute is missing or invalid\n */\n fabric.Circle.fromElement = function(element, callback) {\n var parsedAttributes = fabric.parseAttributes(element, fabric.Circle.ATTRIBUTE_NAMES);\n\n if (!isValidRadius(parsedAttributes)) {\n throw new Error('value of `r` attribute is required and can not be negative');\n }\n\n parsedAttributes.left = (parsedAttributes.left || 0) - parsedAttributes.radius;\n parsedAttributes.top = (parsedAttributes.top || 0) - parsedAttributes.radius;\n callback(new fabric.Circle(parsedAttributes));\n };\n\n /**\n * @private\n */\n function isValidRadius(attributes) {\n return (('radius' in attributes) && (attributes.radius >= 0));\n }\n /* _FROM_SVG_END_ */\n\n /**\n * Returns {@link fabric.Circle} instance from an object representation\n * @static\n * @memberOf fabric.Circle\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] invoked with new instance as first argument\n * @return {void}\n */\n fabric.Circle.fromObject = function(object, callback) {\n fabric.Object._fromObject('Circle', object, callback);\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { });\n\n if (fabric.Triangle) {\n fabric.warn('fabric.Triangle is already defined');\n return;\n }\n\n /**\n * Triangle class\n * @class fabric.Triangle\n * @extends fabric.Object\n * @return {fabric.Triangle} thisArg\n * @see {@link fabric.Triangle#initialize} for constructor definition\n */\n fabric.Triangle = fabric.util.createClass(fabric.Object, /** @lends fabric.Triangle.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'triangle',\n\n /**\n * Width is set to 100 to compensate the old initialize code that was setting it to 100\n * @type Number\n * @default\n */\n width: 100,\n\n /**\n * Height is set to 100 to compensate the old initialize code that was setting it to 100\n * @type Number\n * @default\n */\n height: 100,\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(ctx) {\n var widthBy2 = this.width / 2,\n heightBy2 = this.height / 2;\n\n ctx.beginPath();\n ctx.moveTo(-widthBy2, heightBy2);\n ctx.lineTo(0, -heightBy2);\n ctx.lineTo(widthBy2, heightBy2);\n ctx.closePath();\n\n this._renderPaintInOrder(ctx);\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG: function() {\n var widthBy2 = this.width / 2,\n heightBy2 = this.height / 2,\n points = [\n -widthBy2 + ' ' + heightBy2,\n '0 ' + -heightBy2,\n widthBy2 + ' ' + heightBy2\n ].join(',');\n return [\n ''\n ];\n },\n /* _TO_SVG_END_ */\n });\n\n /**\n * Returns {@link fabric.Triangle} instance from an object representation\n * @static\n * @memberOf fabric.Triangle\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] invoked with new instance as first argument\n */\n fabric.Triangle.fromObject = function(object, callback) {\n return fabric.Object._fromObject('Triangle', object, callback);\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n piBy2 = Math.PI * 2;\n\n if (fabric.Ellipse) {\n fabric.warn('fabric.Ellipse is already defined.');\n return;\n }\n\n /**\n * Ellipse class\n * @class fabric.Ellipse\n * @extends fabric.Object\n * @return {fabric.Ellipse} thisArg\n * @see {@link fabric.Ellipse#initialize} for constructor definition\n */\n fabric.Ellipse = fabric.util.createClass(fabric.Object, /** @lends fabric.Ellipse.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'ellipse',\n\n /**\n * Horizontal radius\n * @type Number\n * @default\n */\n rx: 0,\n\n /**\n * Vertical radius\n * @type Number\n * @default\n */\n ry: 0,\n\n cacheProperties: fabric.Object.prototype.cacheProperties.concat('rx', 'ry'),\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n * @return {fabric.Ellipse} thisArg\n */\n initialize: function(options) {\n this.callSuper('initialize', options);\n this.set('rx', options && options.rx || 0);\n this.set('ry', options && options.ry || 0);\n },\n\n /**\n * @private\n * @param {String} key\n * @param {*} value\n * @return {fabric.Ellipse} thisArg\n */\n _set: function(key, value) {\n this.callSuper('_set', key, value);\n switch (key) {\n\n case 'rx':\n this.rx = value;\n this.set('width', value * 2);\n break;\n\n case 'ry':\n this.ry = value;\n this.set('height', value * 2);\n break;\n\n }\n return this;\n },\n\n /**\n * Returns horizontal radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRx: function() {\n return this.get('rx') * this.get('scaleX');\n },\n\n /**\n * Returns Vertical radius of an object (according to how an object is scaled)\n * @return {Number}\n */\n getRy: function() {\n return this.get('ry') * this.get('scaleY');\n },\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n return this.callSuper('toObject', ['rx', 'ry'].concat(propertiesToInclude));\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG: function() {\n return [\n '\\n'\n ];\n },\n /* _TO_SVG_END_ */\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render on\n */\n _render: function(ctx) {\n ctx.beginPath();\n ctx.save();\n ctx.transform(1, 0, 0, this.ry / this.rx, 0, 0);\n ctx.arc(\n 0,\n 0,\n this.rx,\n 0,\n piBy2,\n false);\n ctx.restore();\n this._renderPaintInOrder(ctx);\n },\n });\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link fabric.Ellipse.fromElement})\n * @static\n * @memberOf fabric.Ellipse\n * @see http://www.w3.org/TR/SVG/shapes.html#EllipseElement\n */\n fabric.Ellipse.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('cx cy rx ry'.split(' '));\n\n /**\n * Returns {@link fabric.Ellipse} instance from an SVG element\n * @static\n * @memberOf fabric.Ellipse\n * @param {SVGElement} element Element to parse\n * @param {Function} [callback] Options callback invoked after parsing is finished\n * @return {fabric.Ellipse}\n */\n fabric.Ellipse.fromElement = function(element, callback) {\n\n var parsedAttributes = fabric.parseAttributes(element, fabric.Ellipse.ATTRIBUTE_NAMES);\n\n parsedAttributes.left = (parsedAttributes.left || 0) - parsedAttributes.rx;\n parsedAttributes.top = (parsedAttributes.top || 0) - parsedAttributes.ry;\n callback(new fabric.Ellipse(parsedAttributes));\n };\n /* _FROM_SVG_END_ */\n\n /**\n * Returns {@link fabric.Ellipse} instance from an object representation\n * @static\n * @memberOf fabric.Ellipse\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] invoked with new instance as first argument\n * @return {void}\n */\n fabric.Ellipse.fromObject = function(object, callback) {\n fabric.Object._fromObject('Ellipse', object, callback);\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n extend = fabric.util.object.extend;\n\n if (fabric.Rect) {\n fabric.warn('fabric.Rect is already defined');\n return;\n }\n\n /**\n * Rectangle class\n * @class fabric.Rect\n * @extends fabric.Object\n * @return {fabric.Rect} thisArg\n * @see {@link fabric.Rect#initialize} for constructor definition\n */\n fabric.Rect = fabric.util.createClass(fabric.Object, /** @lends fabric.Rect.prototype */ {\n\n /**\n * List of properties to consider when checking if state of an object is changed ({@link fabric.Object#hasStateChanged})\n * as well as for history (undo/redo) purposes\n * @type Array\n */\n stateProperties: fabric.Object.prototype.stateProperties.concat('rx', 'ry'),\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'rect',\n\n /**\n * Horizontal border radius\n * @type Number\n * @default\n */\n rx: 0,\n\n /**\n * Vertical border radius\n * @type Number\n * @default\n */\n ry: 0,\n\n cacheProperties: fabric.Object.prototype.cacheProperties.concat('rx', 'ry'),\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n * @return {Object} thisArg\n */\n initialize: function(options) {\n this.callSuper('initialize', options);\n this._initRxRy();\n },\n\n /**\n * Initializes rx/ry attributes\n * @private\n */\n _initRxRy: function() {\n if (this.rx && !this.ry) {\n this.ry = this.rx;\n }\n else if (this.ry && !this.rx) {\n this.rx = this.ry;\n }\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(ctx) {\n\n // 1x1 case (used in spray brush) optimization was removed because\n // with caching and higher zoom level this makes more damage than help\n\n var rx = this.rx ? Math.min(this.rx, this.width / 2) : 0,\n ry = this.ry ? Math.min(this.ry, this.height / 2) : 0,\n w = this.width,\n h = this.height,\n x = -this.width / 2,\n y = -this.height / 2,\n isRounded = rx !== 0 || ry !== 0,\n /* \"magic number\" for bezier approximations of arcs (http://itc.ktu.lt/itc354/Riskus354.pdf) */\n k = 1 - 0.5522847498;\n ctx.beginPath();\n\n ctx.moveTo(x + rx, y);\n\n ctx.lineTo(x + w - rx, y);\n isRounded && ctx.bezierCurveTo(x + w - k * rx, y, x + w, y + k * ry, x + w, y + ry);\n\n ctx.lineTo(x + w, y + h - ry);\n isRounded && ctx.bezierCurveTo(x + w, y + h - k * ry, x + w - k * rx, y + h, x + w - rx, y + h);\n\n ctx.lineTo(x + rx, y + h);\n isRounded && ctx.bezierCurveTo(x + k * rx, y + h, x, y + h - k * ry, x, y + h - ry);\n\n ctx.lineTo(x, y + ry);\n isRounded && ctx.bezierCurveTo(x, y + k * ry, x + k * rx, y, x + rx, y);\n\n ctx.closePath();\n\n this._renderPaintInOrder(ctx);\n },\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n return this.callSuper('toObject', ['rx', 'ry'].concat(propertiesToInclude));\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG: function() {\n var x = -this.width / 2, y = -this.height / 2;\n return [\n '\\n'\n ];\n },\n /* _TO_SVG_END_ */\n });\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by `fabric.Rect.fromElement`)\n * @static\n * @memberOf fabric.Rect\n * @see: http://www.w3.org/TR/SVG/shapes.html#RectElement\n */\n fabric.Rect.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('x y rx ry width height'.split(' '));\n\n /**\n * Returns {@link fabric.Rect} instance from an SVG element\n * @static\n * @memberOf fabric.Rect\n * @param {SVGElement} element Element to parse\n * @param {Function} callback callback function invoked after parsing\n * @param {Object} [options] Options object\n */\n fabric.Rect.fromElement = function(element, callback, options) {\n if (!element) {\n return callback(null);\n }\n options = options || { };\n\n var parsedAttributes = fabric.parseAttributes(element, fabric.Rect.ATTRIBUTE_NAMES);\n parsedAttributes.left = parsedAttributes.left || 0;\n parsedAttributes.top = parsedAttributes.top || 0;\n parsedAttributes.height = parsedAttributes.height || 0;\n parsedAttributes.width = parsedAttributes.width || 0;\n var rect = new fabric.Rect(extend((options ? fabric.util.object.clone(options) : { }), parsedAttributes));\n rect.visible = rect.visible && rect.width > 0 && rect.height > 0;\n callback(rect);\n };\n /* _FROM_SVG_END_ */\n\n /**\n * Returns {@link fabric.Rect} instance from an object representation\n * @static\n * @memberOf fabric.Rect\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] Callback to invoke when an fabric.Rect instance is created\n */\n fabric.Rect.fromObject = function(object, callback) {\n return fabric.Object._fromObject('Rect', object, callback);\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n extend = fabric.util.object.extend,\n min = fabric.util.array.min,\n max = fabric.util.array.max,\n toFixed = fabric.util.toFixed,\n projectStrokeOnPoints = fabric.util.projectStrokeOnPoints;\n\n if (fabric.Polyline) {\n fabric.warn('fabric.Polyline is already defined');\n return;\n }\n\n /**\n * Polyline class\n * @class fabric.Polyline\n * @extends fabric.Object\n * @see {@link fabric.Polyline#initialize} for constructor definition\n */\n fabric.Polyline = fabric.util.createClass(fabric.Object, /** @lends fabric.Polyline.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'polyline',\n\n /**\n * Points array\n * @type Array\n * @default\n */\n points: null,\n\n /**\n * WARNING: Feature in progress\n * Calculate the exact bounding box taking in account strokeWidth on acute angles\n * this will be turned to true by default on fabric 6.0\n * maybe will be left in as an optimization since calculations may be slow\n * @deprecated\n * @type Boolean\n * @default false\n */\n exactBoundingBox: false,\n\n cacheProperties: fabric.Object.prototype.cacheProperties.concat('points'),\n\n /**\n * Constructor\n * @param {Array} points Array of points (where each point is an object with x and y)\n * @param {Object} [options] Options object\n * @return {fabric.Polyline} thisArg\n * @example\n * var poly = new fabric.Polyline([\n * { x: 10, y: 10 },\n * { x: 50, y: 30 },\n * { x: 40, y: 70 },\n * { x: 60, y: 50 },\n * { x: 100, y: 150 },\n * { x: 40, y: 100 }\n * ], {\n * stroke: 'red',\n * left: 100,\n * top: 100\n * });\n */\n initialize: function(points, options) {\n options = options || {};\n this.points = points || [];\n this.callSuper('initialize', options);\n this._setPositionDimensions(options);\n },\n\n /**\n * @private\n */\n _projectStrokeOnPoints: function () {\n return projectStrokeOnPoints(this.points, this, true);\n },\n\n _setPositionDimensions: function(options) {\n var calcDim = this._calcDimensions(options), correctLeftTop,\n correctSize = this.exactBoundingBox ? this.strokeWidth : 0;\n this.width = calcDim.width - correctSize;\n this.height = calcDim.height - correctSize;\n if (!options.fromSVG) {\n correctLeftTop = this.translateToGivenOrigin(\n {\n // this looks bad, but is one way to keep it optional for now.\n x: calcDim.left - this.strokeWidth / 2 + correctSize / 2,\n y: calcDim.top - this.strokeWidth / 2 + correctSize / 2\n },\n 'left',\n 'top',\n this.originX,\n this.originY\n );\n }\n if (typeof options.left === 'undefined') {\n this.left = options.fromSVG ? calcDim.left : correctLeftTop.x;\n }\n if (typeof options.top === 'undefined') {\n this.top = options.fromSVG ? calcDim.top : correctLeftTop.y;\n }\n this.pathOffset = {\n x: calcDim.left + this.width / 2 + correctSize / 2,\n y: calcDim.top + this.height / 2 + correctSize / 2\n };\n },\n\n /**\n * Calculate the polygon min and max point from points array,\n * returning an object with left, top, width, height to measure the\n * polygon size\n * @return {Object} object.left X coordinate of the polygon leftmost point\n * @return {Object} object.top Y coordinate of the polygon topmost point\n * @return {Object} object.width distance between X coordinates of the polygon leftmost and rightmost point\n * @return {Object} object.height distance between Y coordinates of the polygon topmost and bottommost point\n * @private\n */\n _calcDimensions: function() {\n\n var points = this.exactBoundingBox ? this._projectStrokeOnPoints() : this.points,\n minX = min(points, 'x') || 0,\n minY = min(points, 'y') || 0,\n maxX = max(points, 'x') || 0,\n maxY = max(points, 'y') || 0,\n width = (maxX - minX),\n height = (maxY - minY);\n\n return {\n left: minX,\n top: minY,\n width: width,\n height: height,\n };\n },\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n return extend(this.callSuper('toObject', propertiesToInclude), {\n points: this.points.concat()\n });\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG: function() {\n var points = [], diffX = this.pathOffset.x, diffY = this.pathOffset.y,\n NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS;\n\n for (var i = 0, len = this.points.length; i < len; i++) {\n points.push(\n toFixed(this.points[i].x - diffX, NUM_FRACTION_DIGITS), ',',\n toFixed(this.points[i].y - diffY, NUM_FRACTION_DIGITS), ' '\n );\n }\n return [\n '<' + this.type + ' ', 'COMMON_PARTS',\n 'points=\"', points.join(''),\n '\" />\\n'\n ];\n },\n /* _TO_SVG_END_ */\n\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n commonRender: function(ctx) {\n var point, len = this.points.length,\n x = this.pathOffset.x,\n y = this.pathOffset.y;\n\n if (!len || isNaN(this.points[len - 1].y)) {\n // do not draw if no points or odd points\n // NaN comes from parseFloat of a empty string in parser\n return false;\n }\n ctx.beginPath();\n ctx.moveTo(this.points[0].x - x, this.points[0].y - y);\n for (var i = 0; i < len; i++) {\n point = this.points[i];\n ctx.lineTo(point.x - x, point.y - y);\n }\n return true;\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(ctx) {\n if (!this.commonRender(ctx)) {\n return;\n }\n this._renderPaintInOrder(ctx);\n },\n\n /**\n * Returns complexity of an instance\n * @return {Number} complexity of this instance\n */\n complexity: function() {\n return this.get('points').length;\n }\n });\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link fabric.Polyline.fromElement})\n * @static\n * @memberOf fabric.Polyline\n * @see: http://www.w3.org/TR/SVG/shapes.html#PolylineElement\n */\n fabric.Polyline.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat();\n\n /**\n * Returns fabric.Polyline instance from an SVG element\n * @static\n * @memberOf fabric.Polyline\n * @param {SVGElement} element Element to parser\n * @param {Function} callback callback function invoked after parsing\n * @param {Object} [options] Options object\n */\n fabric.Polyline.fromElementGenerator = function(_class) {\n return function(element, callback, options) {\n if (!element) {\n return callback(null);\n }\n options || (options = { });\n\n var points = fabric.parsePointsAttribute(element.getAttribute('points')),\n parsedAttributes = fabric.parseAttributes(element, fabric[_class].ATTRIBUTE_NAMES);\n parsedAttributes.fromSVG = true;\n callback(new fabric[_class](points, extend(parsedAttributes, options)));\n };\n };\n\n fabric.Polyline.fromElement = fabric.Polyline.fromElementGenerator('Polyline');\n\n /* _FROM_SVG_END_ */\n\n /**\n * Returns fabric.Polyline instance from an object representation\n * @static\n * @memberOf fabric.Polyline\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] Callback to invoke when an fabric.Path instance is created\n */\n fabric.Polyline.fromObject = function(object, callback) {\n return fabric.Object._fromObject('Polyline', object, callback, 'points');\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = {}),\n projectStrokeOnPoints = fabric.util.projectStrokeOnPoints;\n\n if (fabric.Polygon) {\n fabric.warn('fabric.Polygon is already defined');\n return;\n }\n\n /**\n * Polygon class\n * @class fabric.Polygon\n * @extends fabric.Polyline\n * @see {@link fabric.Polygon#initialize} for constructor definition\n */\n fabric.Polygon = fabric.util.createClass(fabric.Polyline, /** @lends fabric.Polygon.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'polygon',\n\n /**\n * @private\n */\n _projectStrokeOnPoints: function () {\n return projectStrokeOnPoints(this.points, this);\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(ctx) {\n if (!this.commonRender(ctx)) {\n return;\n }\n ctx.closePath();\n this._renderPaintInOrder(ctx);\n },\n\n });\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by `fabric.Polygon.fromElement`)\n * @static\n * @memberOf fabric.Polygon\n * @see: http://www.w3.org/TR/SVG/shapes.html#PolygonElement\n */\n fabric.Polygon.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat();\n\n /**\n * Returns {@link fabric.Polygon} instance from an SVG element\n * @static\n * @memberOf fabric.Polygon\n * @param {SVGElement} element Element to parse\n * @param {Function} callback callback function invoked after parsing\n * @param {Object} [options] Options object\n */\n fabric.Polygon.fromElement = fabric.Polyline.fromElementGenerator('Polygon');\n /* _FROM_SVG_END_ */\n\n /**\n * Returns fabric.Polygon instance from an object representation\n * @static\n * @memberOf fabric.Polygon\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] Callback to invoke when an fabric.Path instance is created\n * @return {void}\n */\n fabric.Polygon.fromObject = function(object, callback) {\n fabric.Object._fromObject('Polygon', object, callback, 'points');\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n min = fabric.util.array.min,\n max = fabric.util.array.max,\n extend = fabric.util.object.extend,\n clone = fabric.util.object.clone,\n toFixed = fabric.util.toFixed;\n\n if (fabric.Path) {\n fabric.warn('fabric.Path is already defined');\n return;\n }\n\n /**\n * Path class\n * @class fabric.Path\n * @extends fabric.Object\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#path_and_pathgroup}\n * @see {@link fabric.Path#initialize} for constructor definition\n */\n fabric.Path = fabric.util.createClass(fabric.Object, /** @lends fabric.Path.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'path',\n\n /**\n * Array of path points\n * @type Array\n * @default\n */\n path: null,\n\n cacheProperties: fabric.Object.prototype.cacheProperties.concat('path', 'fillRule'),\n\n stateProperties: fabric.Object.prototype.stateProperties.concat('path'),\n\n /**\n * Constructor\n * @param {Array|String} path Path data (sequence of coordinates and corresponding \"command\" tokens)\n * @param {Object} [options] Options object\n * @return {fabric.Path} thisArg\n */\n initialize: function (path, options) {\n options = clone(options || {});\n delete options.path;\n this.callSuper('initialize', options);\n this._setPath(path || [], options);\n },\n\n /**\n * @private\n * @param {Array|String} path Path data (sequence of coordinates and corresponding \"command\" tokens)\n * @param {Object} [options] Options object\n */\n _setPath: function (path, options) {\n this.path = fabric.util.makePathSimpler(\n Array.isArray(path) ? path : fabric.util.parsePath(path)\n );\n\n fabric.Polyline.prototype._setPositionDimensions.call(this, options || {});\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render path on\n */\n _renderPathCommands: function(ctx) {\n var current, // current instruction\n subpathStartX = 0,\n subpathStartY = 0,\n x = 0, // current x\n y = 0, // current y\n controlX = 0, // current control point x\n controlY = 0, // current control point y\n l = -this.pathOffset.x,\n t = -this.pathOffset.y;\n\n ctx.beginPath();\n\n for (var i = 0, len = this.path.length; i < len; ++i) {\n\n current = this.path[i];\n\n switch (current[0]) { // first letter\n\n case 'L': // lineto, absolute\n x = current[1];\n y = current[2];\n ctx.lineTo(x + l, y + t);\n break;\n\n case 'M': // moveTo, absolute\n x = current[1];\n y = current[2];\n subpathStartX = x;\n subpathStartY = y;\n ctx.moveTo(x + l, y + t);\n break;\n\n case 'C': // bezierCurveTo, absolute\n x = current[5];\n y = current[6];\n controlX = current[3];\n controlY = current[4];\n ctx.bezierCurveTo(\n current[1] + l,\n current[2] + t,\n controlX + l,\n controlY + t,\n x + l,\n y + t\n );\n break;\n\n case 'Q': // quadraticCurveTo, absolute\n ctx.quadraticCurveTo(\n current[1] + l,\n current[2] + t,\n current[3] + l,\n current[4] + t\n );\n x = current[3];\n y = current[4];\n controlX = current[1];\n controlY = current[2];\n break;\n\n case 'z':\n case 'Z':\n x = subpathStartX;\n y = subpathStartY;\n ctx.closePath();\n break;\n }\n }\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx context to render path on\n */\n _render: function(ctx) {\n this._renderPathCommands(ctx);\n this._renderPaintInOrder(ctx);\n },\n\n /**\n * Returns string representation of an instance\n * @return {String} string representation of an instance\n */\n toString: function() {\n return '#';\n },\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n return extend(this.callSuper('toObject', propertiesToInclude), {\n path: this.path.map(function(item) { return item.slice(); }),\n });\n },\n\n /**\n * Returns dataless object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toDatalessObject: function(propertiesToInclude) {\n var o = this.toObject(['sourcePath'].concat(propertiesToInclude));\n if (o.sourcePath) {\n delete o.path;\n }\n return o;\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG: function() {\n var path = fabric.util.joinPath(this.path);\n return [\n '\\n'\n ];\n },\n\n _getOffsetTransform: function() {\n var digits = fabric.Object.NUM_FRACTION_DIGITS;\n return ' translate(' + toFixed(-this.pathOffset.x, digits) + ', ' +\n toFixed(-this.pathOffset.y, digits) + ')';\n },\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toClipPathSVG: function(reviver) {\n var additionalTransform = this._getOffsetTransform();\n return '\\t' + this._createBaseClipPathSVGMarkup(\n this._toSVG(), { reviver: reviver, additionalTransform: additionalTransform }\n );\n },\n\n /**\n * Returns svg representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toSVG: function(reviver) {\n var additionalTransform = this._getOffsetTransform();\n return this._createBaseSVGMarkup(this._toSVG(), { reviver: reviver, additionalTransform: additionalTransform });\n },\n /* _TO_SVG_END_ */\n\n /**\n * Returns number representation of an instance complexity\n * @return {Number} complexity of this instance\n */\n complexity: function() {\n return this.path.length;\n },\n\n /**\n * @private\n */\n _calcDimensions: function() {\n\n var aX = [],\n aY = [],\n current, // current instruction\n subpathStartX = 0,\n subpathStartY = 0,\n x = 0, // current x\n y = 0, // current y\n bounds;\n\n for (var i = 0, len = this.path.length; i < len; ++i) {\n\n current = this.path[i];\n\n switch (current[0]) { // first letter\n\n case 'L': // lineto, absolute\n x = current[1];\n y = current[2];\n bounds = [];\n break;\n\n case 'M': // moveTo, absolute\n x = current[1];\n y = current[2];\n subpathStartX = x;\n subpathStartY = y;\n bounds = [];\n break;\n\n case 'C': // bezierCurveTo, absolute\n bounds = fabric.util.getBoundsOfCurve(x, y,\n current[1],\n current[2],\n current[3],\n current[4],\n current[5],\n current[6]\n );\n x = current[5];\n y = current[6];\n break;\n\n case 'Q': // quadraticCurveTo, absolute\n bounds = fabric.util.getBoundsOfCurve(x, y,\n current[1],\n current[2],\n current[1],\n current[2],\n current[3],\n current[4]\n );\n x = current[3];\n y = current[4];\n break;\n\n case 'z':\n case 'Z':\n x = subpathStartX;\n y = subpathStartY;\n break;\n }\n bounds.forEach(function (point) {\n aX.push(point.x);\n aY.push(point.y);\n });\n aX.push(x);\n aY.push(y);\n }\n\n var minX = min(aX) || 0,\n minY = min(aY) || 0,\n maxX = max(aX) || 0,\n maxY = max(aY) || 0,\n deltaX = maxX - minX,\n deltaY = maxY - minY;\n\n return {\n left: minX,\n top: minY,\n width: deltaX,\n height: deltaY\n };\n }\n });\n\n /**\n * Creates an instance of fabric.Path from an object\n * @static\n * @memberOf fabric.Path\n * @param {Object} object\n * @param {Function} [callback] Callback to invoke when an fabric.Path instance is created\n */\n fabric.Path.fromObject = function(object, callback) {\n if (typeof object.sourcePath === 'string') {\n var pathUrl = object.sourcePath;\n fabric.loadSVGFromURL(pathUrl, function (elements) {\n var path = elements[0];\n path.setOptions(object);\n if (object.clipPath) {\n fabric.util.enlivenObjects([object.clipPath], function(elivenedObjects) {\n path.clipPath = elivenedObjects[0];\n callback && callback(path);\n });\n }\n else {\n callback && callback(path);\n }\n });\n }\n else {\n fabric.Object._fromObject('Path', object, callback, 'path');\n }\n };\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by `fabric.Path.fromElement`)\n * @static\n * @memberOf fabric.Path\n * @see http://www.w3.org/TR/SVG/paths.html#PathElement\n */\n fabric.Path.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat(['d']);\n\n /**\n * Creates an instance of fabric.Path from an SVG element\n * @static\n * @memberOf fabric.Path\n * @param {SVGElement} element to parse\n * @param {Function} callback Callback to invoke when an fabric.Path instance is created\n * @param {Object} [options] Options object\n * @param {Function} [callback] Options callback invoked after parsing is finished\n */\n fabric.Path.fromElement = function(element, callback, options) {\n var parsedAttributes = fabric.parseAttributes(element, fabric.Path.ATTRIBUTE_NAMES);\n parsedAttributes.fromSVG = true;\n callback(new fabric.Path(parsedAttributes.d, extend(parsedAttributes, options)));\n };\n /* _FROM_SVG_END_ */\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n min = fabric.util.array.min,\n max = fabric.util.array.max;\n\n if (fabric.Group) {\n return;\n }\n\n /**\n * Group class\n * @class fabric.Group\n * @extends fabric.Object\n * @mixes fabric.Collection\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#groups}\n * @see {@link fabric.Group#initialize} for constructor definition\n */\n fabric.Group = fabric.util.createClass(fabric.Object, fabric.Collection, /** @lends fabric.Group.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'group',\n\n /**\n * Width of stroke\n * @type Number\n * @default\n */\n strokeWidth: 0,\n\n /**\n * Indicates if click, mouseover, mouseout events & hoverCursor should also check for subtargets\n * @type Boolean\n * @default\n */\n subTargetCheck: false,\n\n /**\n * Groups are container, do not render anything on theyr own, ence no cache properties\n * @type Array\n * @default\n */\n cacheProperties: [],\n\n /**\n * setOnGroup is a method used for TextBox that is no more used since 2.0.0 The behavior is still\n * available setting this boolean to true.\n * @type Boolean\n * @since 2.0.0\n * @default\n */\n useSetOnGroup: false,\n\n /**\n * Constructor\n * @param {Object} objects Group objects\n * @param {Object} [options] Options object\n * @param {Boolean} [isAlreadyGrouped] if true, objects have been grouped already.\n * @return {Object} thisArg\n */\n initialize: function(objects, options, isAlreadyGrouped) {\n options = options || {};\n this._objects = [];\n // if objects enclosed in a group have been grouped already,\n // we cannot change properties of objects.\n // Thus we need to set options to group without objects,\n isAlreadyGrouped && this.callSuper('initialize', options);\n this._objects = objects || [];\n for (var i = this._objects.length; i--; ) {\n this._objects[i].group = this;\n }\n\n if (!isAlreadyGrouped) {\n var center = options && options.centerPoint;\n // we want to set origins before calculating the bounding box.\n // so that the topleft can be set with that in mind.\n // if specific top and left are passed, are overwritten later\n // with the callSuper('initialize', options)\n if (options.originX !== undefined) {\n this.originX = options.originX;\n }\n if (options.originY !== undefined) {\n this.originY = options.originY;\n }\n // if coming from svg i do not want to calc bounds.\n // i assume width and height are passed along options\n center || this._calcBounds();\n this._updateObjectsCoords(center);\n delete options.centerPoint;\n this.callSuper('initialize', options);\n }\n else {\n this._updateObjectsACoords();\n }\n\n this.setCoords();\n },\n\n /**\n * @private\n */\n _updateObjectsACoords: function() {\n var skipControls = true;\n for (var i = this._objects.length; i--; ){\n this._objects[i].setCoords(skipControls);\n }\n },\n\n /**\n * @private\n * @param {Boolean} [skipCoordsChange] if true, coordinates of objects enclosed in a group do not change\n */\n _updateObjectsCoords: function(center) {\n var center = center || this.getCenterPoint();\n for (var i = this._objects.length; i--; ){\n this._updateObjectCoords(this._objects[i], center);\n }\n },\n\n /**\n * @private\n * @param {Object} object\n * @param {fabric.Point} center, current center of group.\n */\n _updateObjectCoords: function(object, center) {\n var objectLeft = object.left,\n objectTop = object.top,\n skipControls = true;\n\n object.set({\n left: objectLeft - center.x,\n top: objectTop - center.y\n });\n object.group = this;\n object.setCoords(skipControls);\n },\n\n /**\n * Returns string represenation of a group\n * @return {String}\n */\n toString: function() {\n return '#';\n },\n\n /**\n * Adds an object to a group; Then recalculates group's dimension, position.\n * @param {Object} object\n * @return {fabric.Group} thisArg\n * @chainable\n */\n addWithUpdate: function(object) {\n var nested = !!this.group;\n this._restoreObjectsState();\n fabric.util.resetObjectTransform(this);\n if (object) {\n if (nested) {\n // if this group is inside another group, we need to pre transform the object\n fabric.util.removeTransformFromObject(object, this.group.calcTransformMatrix());\n }\n this._objects.push(object);\n object.group = this;\n object._set('canvas', this.canvas);\n }\n this._calcBounds();\n this._updateObjectsCoords();\n this.dirty = true;\n if (nested) {\n this.group.addWithUpdate();\n }\n else {\n this.setCoords();\n }\n return this;\n },\n\n /**\n * Removes an object from a group; Then recalculates group's dimension, position.\n * @param {Object} object\n * @return {fabric.Group} thisArg\n * @chainable\n */\n removeWithUpdate: function(object) {\n this._restoreObjectsState();\n fabric.util.resetObjectTransform(this);\n\n this.remove(object);\n this._calcBounds();\n this._updateObjectsCoords();\n this.setCoords();\n this.dirty = true;\n return this;\n },\n\n /**\n * @private\n */\n _onObjectAdded: function(object) {\n this.dirty = true;\n object.group = this;\n object._set('canvas', this.canvas);\n },\n\n /**\n * @private\n */\n _onObjectRemoved: function(object) {\n this.dirty = true;\n delete object.group;\n },\n\n /**\n * @private\n */\n _set: function(key, value) {\n var i = this._objects.length;\n if (this.useSetOnGroup) {\n while (i--) {\n this._objects[i].setOnGroup(key, value);\n }\n }\n if (key === 'canvas') {\n while (i--) {\n this._objects[i]._set(key, value);\n }\n }\n fabric.Object.prototype._set.call(this, key, value);\n },\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n var _includeDefaultValues = this.includeDefaultValues;\n var objsToObject = this._objects\n .filter(function (obj) {\n return !obj.excludeFromExport;\n })\n .map(function (obj) {\n var originalDefaults = obj.includeDefaultValues;\n obj.includeDefaultValues = _includeDefaultValues;\n var _obj = obj.toObject(propertiesToInclude);\n obj.includeDefaultValues = originalDefaults;\n return _obj;\n });\n var obj = fabric.Object.prototype.toObject.call(this, propertiesToInclude);\n obj.objects = objsToObject;\n return obj;\n },\n\n /**\n * Returns object representation of an instance, in dataless mode.\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toDatalessObject: function(propertiesToInclude) {\n var objsToObject, sourcePath = this.sourcePath;\n if (sourcePath) {\n objsToObject = sourcePath;\n }\n else {\n var _includeDefaultValues = this.includeDefaultValues;\n objsToObject = this._objects.map(function(obj) {\n var originalDefaults = obj.includeDefaultValues;\n obj.includeDefaultValues = _includeDefaultValues;\n var _obj = obj.toDatalessObject(propertiesToInclude);\n obj.includeDefaultValues = originalDefaults;\n return _obj;\n });\n }\n var obj = fabric.Object.prototype.toDatalessObject.call(this, propertiesToInclude);\n obj.objects = objsToObject;\n return obj;\n },\n\n /**\n * Renders instance on a given context\n * @param {CanvasRenderingContext2D} ctx context to render instance on\n */\n render: function(ctx) {\n this._transformDone = true;\n this.callSuper('render', ctx);\n this._transformDone = false;\n },\n\n /**\n * Decide if the object should cache or not. Create its own cache level\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step. None of the fabric classes requires it.\n * Generally you do not cache objects in groups because the group is already cached.\n * @return {Boolean}\n */\n shouldCache: function() {\n var ownCache = fabric.Object.prototype.shouldCache.call(this);\n if (ownCache) {\n for (var i = 0, len = this._objects.length; i < len; i++) {\n if (this._objects[i].willDrawShadow()) {\n this.ownCaching = false;\n return false;\n }\n }\n }\n return ownCache;\n },\n\n /**\n * Check if this object or a child object will cast a shadow\n * @return {Boolean}\n */\n willDrawShadow: function() {\n if (fabric.Object.prototype.willDrawShadow.call(this)) {\n return true;\n }\n for (var i = 0, len = this._objects.length; i < len; i++) {\n if (this._objects[i].willDrawShadow()) {\n return true;\n }\n }\n return false;\n },\n\n /**\n * Check if this group or its parent group are caching, recursively up\n * @return {Boolean}\n */\n isOnACache: function() {\n return this.ownCaching || (this.group && this.group.isOnACache());\n },\n\n /**\n * Execute the drawing operation for an object on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawObject: function(ctx) {\n for (var i = 0, len = this._objects.length; i < len; i++) {\n this._objects[i].render(ctx);\n }\n this._drawClipPath(ctx, this.clipPath);\n },\n\n /**\n * Check if cache is dirty\n */\n isCacheDirty: function(skipCanvas) {\n if (this.callSuper('isCacheDirty', skipCanvas)) {\n return true;\n }\n if (!this.statefullCache) {\n return false;\n }\n for (var i = 0, len = this._objects.length; i < len; i++) {\n if (this._objects[i].isCacheDirty(true)) {\n if (this._cacheCanvas) {\n // if this group has not a cache canvas there is nothing to clean\n var x = this.cacheWidth / this.zoomX, y = this.cacheHeight / this.zoomY;\n this._cacheContext.clearRect(-x / 2, -y / 2, x, y);\n }\n return true;\n }\n }\n return false;\n },\n\n /**\n * Restores original state of each of group objects (original state is that which was before group was created).\n * if the nested boolean is true, the original state will be restored just for the\n * first group and not for all the group chain\n * @private\n * @param {Boolean} nested tell the function to restore object state up to the parent group and not more\n * @return {fabric.Group} thisArg\n * @chainable\n */\n _restoreObjectsState: function() {\n var groupMatrix = this.calcOwnMatrix();\n this._objects.forEach(function(object) {\n // instead of using _this = this;\n fabric.util.addTransformToObject(object, groupMatrix);\n delete object.group;\n object.setCoords();\n });\n return this;\n },\n\n /**\n * Destroys a group (restoring state of its objects)\n * @return {fabric.Group} thisArg\n * @chainable\n */\n destroy: function() {\n // when group is destroyed objects needs to get a repaint to be eventually\n // displayed on canvas.\n this._objects.forEach(function(object) {\n object.set('dirty', true);\n });\n return this._restoreObjectsState();\n },\n\n dispose: function () {\n this.callSuper('dispose');\n this.forEachObject(function (object) {\n object.dispose && object.dispose();\n });\n this._objects = [];\n },\n\n /**\n * make a group an active selection, remove the group from canvas\n * the group has to be on canvas for this to work.\n * @return {fabric.ActiveSelection} thisArg\n * @chainable\n */\n toActiveSelection: function() {\n if (!this.canvas) {\n return;\n }\n var objects = this._objects, canvas = this.canvas;\n this._objects = [];\n var options = this.toObject();\n delete options.objects;\n var activeSelection = new fabric.ActiveSelection([]);\n activeSelection.set(options);\n activeSelection.type = 'activeSelection';\n canvas.remove(this);\n objects.forEach(function(object) {\n object.group = activeSelection;\n object.dirty = true;\n canvas.add(object);\n });\n activeSelection.canvas = canvas;\n activeSelection._objects = objects;\n canvas._activeObject = activeSelection;\n activeSelection.setCoords();\n return activeSelection;\n },\n\n /**\n * Destroys a group (restoring state of its objects)\n * @return {fabric.Group} thisArg\n * @chainable\n */\n ungroupOnCanvas: function() {\n return this._restoreObjectsState();\n },\n\n /**\n * Sets coordinates of all objects inside group\n * @return {fabric.Group} thisArg\n * @chainable\n */\n setObjectsCoords: function() {\n var skipControls = true;\n this.forEachObject(function(object) {\n object.setCoords(skipControls);\n });\n return this;\n },\n\n /**\n * @private\n */\n _calcBounds: function(onlyWidthHeight) {\n var aX = [],\n aY = [],\n o, prop, coords,\n props = ['tr', 'br', 'bl', 'tl'],\n i = 0, iLen = this._objects.length,\n j, jLen = props.length;\n\n for ( ; i < iLen; ++i) {\n o = this._objects[i];\n coords = o.calcACoords();\n for (j = 0; j < jLen; j++) {\n prop = props[j];\n aX.push(coords[prop].x);\n aY.push(coords[prop].y);\n }\n o.aCoords = coords;\n }\n\n this._getBounds(aX, aY, onlyWidthHeight);\n },\n\n /**\n * @private\n */\n _getBounds: function(aX, aY, onlyWidthHeight) {\n var minXY = new fabric.Point(min(aX), min(aY)),\n maxXY = new fabric.Point(max(aX), max(aY)),\n top = minXY.y || 0, left = minXY.x || 0,\n width = (maxXY.x - minXY.x) || 0,\n height = (maxXY.y - minXY.y) || 0;\n this.width = width;\n this.height = height;\n if (!onlyWidthHeight) {\n // the bounding box always finds the topleft most corner.\n // whatever is the group origin, we set up here the left/top position.\n this.setPositionByOrigin({ x: left, y: top }, 'left', 'top');\n }\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns svg representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n _toSVG: function(reviver) {\n var svgString = ['\\n'];\n\n for (var i = 0, len = this._objects.length; i < len; i++) {\n svgString.push('\\t\\t', this._objects[i].toSVG(reviver));\n }\n svgString.push('\\n');\n return svgString;\n },\n\n /**\n * Returns styles-string for svg-export, specific version for group\n * @return {String}\n */\n getSvgStyles: function() {\n var opacity = typeof this.opacity !== 'undefined' && this.opacity !== 1 ?\n 'opacity: ' + this.opacity + ';' : '',\n visibility = this.visible ? '' : ' visibility: hidden;';\n return [\n opacity,\n this.getSvgFilter(),\n visibility\n ].join('');\n },\n\n /**\n * Returns svg clipPath representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toClipPathSVG: function(reviver) {\n var svgString = [];\n\n for (var i = 0, len = this._objects.length; i < len; i++) {\n svgString.push('\\t', this._objects[i].toClipPathSVG(reviver));\n }\n\n return this._createBaseClipPathSVGMarkup(svgString, { reviver: reviver });\n },\n /* _TO_SVG_END_ */\n });\n\n /**\n * Returns {@link fabric.Group} instance from an object representation\n * @static\n * @memberOf fabric.Group\n * @param {Object} object Object to create a group from\n * @param {Function} [callback] Callback to invoke when an group instance is created\n */\n fabric.Group.fromObject = function(object, callback) {\n var objects = object.objects,\n options = fabric.util.object.clone(object, true);\n delete options.objects;\n if (typeof objects === 'string') {\n // it has to be an url or something went wrong.\n fabric.loadSVGFromURL(objects, function (elements) {\n var group = fabric.util.groupSVGElements(elements, object, objects);\n var clipPath = options.clipPath;\n delete options.clipPath;\n group.set(options);\n if (clipPath) {\n fabric.util.enlivenObjects([clipPath], function(elivenedObjects) {\n group.clipPath = elivenedObjects[0];\n callback && callback(group);\n });\n }\n else {\n callback && callback(group);\n }\n });\n return;\n }\n fabric.util.enlivenObjects(objects, function (enlivenedObjects) {\n fabric.util.enlivenObjectEnlivables(object, options, function () {\n callback && callback(new fabric.Group(enlivenedObjects, options, true));\n });\n });\n };\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { });\n\n if (fabric.ActiveSelection) {\n return;\n }\n\n /**\n * Group class\n * @class fabric.ActiveSelection\n * @extends fabric.Group\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#groups}\n * @see {@link fabric.ActiveSelection#initialize} for constructor definition\n */\n fabric.ActiveSelection = fabric.util.createClass(fabric.Group, /** @lends fabric.ActiveSelection.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'activeSelection',\n\n /**\n * Constructor\n * @param {Object} objects ActiveSelection objects\n * @param {Object} [options] Options object\n * @return {Object} thisArg\n */\n initialize: function(objects, options) {\n options = options || {};\n this._objects = objects || [];\n for (var i = this._objects.length; i--; ) {\n this._objects[i].group = this;\n }\n\n if (options.originX) {\n this.originX = options.originX;\n }\n if (options.originY) {\n this.originY = options.originY;\n }\n this._calcBounds();\n this._updateObjectsCoords();\n fabric.Object.prototype.initialize.call(this, options);\n this.setCoords();\n },\n\n /**\n * Change te activeSelection to a normal group,\n * High level function that automatically adds it to canvas as\n * active object. no events fired.\n * @since 2.0.0\n * @return {fabric.Group}\n */\n toGroup: function() {\n var objects = this._objects.concat();\n this._objects = [];\n var options = fabric.Object.prototype.toObject.call(this);\n var newGroup = new fabric.Group([]);\n delete options.type;\n newGroup.set(options);\n objects.forEach(function(object) {\n object.canvas.remove(object);\n object.group = newGroup;\n });\n newGroup._objects = objects;\n if (!this.canvas) {\n return newGroup;\n }\n var canvas = this.canvas;\n canvas.add(newGroup);\n canvas._activeObject = newGroup;\n newGroup.setCoords();\n return newGroup;\n },\n\n /**\n * If returns true, deselection is cancelled.\n * @since 2.0.0\n * @return {Boolean} [cancel]\n */\n onDeselect: function() {\n this.destroy();\n return false;\n },\n\n /**\n * Returns string representation of a group\n * @return {String}\n */\n toString: function() {\n return '#';\n },\n\n /**\n * Decide if the object should cache or not. Create its own cache level\n * objectCaching is a global flag, wins over everything\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step. None of the fabric classes requires it.\n * Generally you do not cache objects in groups because the group outside is cached.\n * @return {Boolean}\n */\n shouldCache: function() {\n return false;\n },\n\n /**\n * Check if this group or its parent group are caching, recursively up\n * @return {Boolean}\n */\n isOnACache: function() {\n return false;\n },\n\n /**\n * Renders controls and borders for the object\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Object} [styleOverride] properties to override the object style\n * @param {Object} [childrenOverride] properties to override the children overrides\n */\n _renderControls: function(ctx, styleOverride, childrenOverride) {\n ctx.save();\n ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1;\n this.callSuper('_renderControls', ctx, styleOverride);\n childrenOverride = childrenOverride || { };\n if (typeof childrenOverride.hasControls === 'undefined') {\n childrenOverride.hasControls = false;\n }\n childrenOverride.forActiveSelection = true;\n for (var i = 0, len = this._objects.length; i < len; i++) {\n this._objects[i]._renderControls(ctx, childrenOverride);\n }\n ctx.restore();\n },\n });\n\n /**\n * Returns {@link fabric.ActiveSelection} instance from an object representation\n * @static\n * @memberOf fabric.ActiveSelection\n * @param {Object} object Object to create a group from\n * @param {Function} [callback] Callback to invoke when an ActiveSelection instance is created\n */\n fabric.ActiveSelection.fromObject = function(object, callback) {\n fabric.util.enlivenObjects(object.objects, function(enlivenedObjects) {\n delete object.objects;\n callback && callback(new fabric.ActiveSelection(enlivenedObjects, object, true));\n });\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var extend = fabric.util.object.extend;\n\n if (!global.fabric) {\n global.fabric = { };\n }\n\n if (global.fabric.Image) {\n fabric.warn('fabric.Image is already defined.');\n return;\n }\n\n /**\n * Image class\n * @class fabric.Image\n * @extends fabric.Object\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#images}\n * @see {@link fabric.Image#initialize} for constructor definition\n */\n fabric.Image = fabric.util.createClass(fabric.Object, /** @lends fabric.Image.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'image',\n\n /**\n * Width of a stroke.\n * For image quality a stroke multiple of 2 gives better results.\n * @type Number\n * @default\n */\n strokeWidth: 0,\n\n /**\n * When calling {@link fabric.Image.getSrc}, return value from element src with `element.getAttribute('src')`.\n * This allows for relative urls as image src.\n * @since 2.7.0\n * @type Boolean\n * @default\n */\n srcFromAttribute: false,\n\n /**\n * private\n * contains last value of scaleX to detect\n * if the Image got resized after the last Render\n * @type Number\n */\n _lastScaleX: 1,\n\n /**\n * private\n * contains last value of scaleY to detect\n * if the Image got resized after the last Render\n * @type Number\n */\n _lastScaleY: 1,\n\n /**\n * private\n * contains last value of scaling applied by the apply filter chain\n * @type Number\n */\n _filterScalingX: 1,\n\n /**\n * private\n * contains last value of scaling applied by the apply filter chain\n * @type Number\n */\n _filterScalingY: 1,\n\n /**\n * minimum scale factor under which any resizeFilter is triggered to resize the image\n * 0 will disable the automatic resize. 1 will trigger automatically always.\n * number bigger than 1 are not implemented yet.\n * @type Number\n */\n minimumScaleTrigger: 0.5,\n\n /**\n * List of properties to consider when checking if\n * state of an object is changed ({@link fabric.Object#hasStateChanged})\n * as well as for history (undo/redo) purposes\n * @type Array\n */\n stateProperties: fabric.Object.prototype.stateProperties.concat('cropX', 'cropY'),\n\n /**\n * List of properties to consider when checking if cache needs refresh\n * Those properties are checked by statefullCache ON ( or lazy mode if we want ) or from single\n * calls to Object.set(key, value). If the key is in this list, the object is marked as dirty\n * and refreshed at the next render\n * @type Array\n */\n cacheProperties: fabric.Object.prototype.cacheProperties.concat('cropX', 'cropY'),\n\n /**\n * key used to retrieve the texture representing this image\n * @since 2.0.0\n * @type String\n * @default\n */\n cacheKey: '',\n\n /**\n * Image crop in pixels from original image size.\n * @since 2.0.0\n * @type Number\n * @default\n */\n cropX: 0,\n\n /**\n * Image crop in pixels from original image size.\n * @since 2.0.0\n * @type Number\n * @default\n */\n cropY: 0,\n\n /**\n * Indicates whether this canvas will use image smoothing when painting this image.\n * Also influence if the cacheCanvas for this image uses imageSmoothing\n * @since 4.0.0-beta.11\n * @type Boolean\n * @default\n */\n imageSmoothing: true,\n\n /**\n * Constructor\n * Image can be initialized with any canvas drawable or a string.\n * The string should be a url and will be loaded as an image.\n * Canvas and Image element work out of the box, while videos require extra code to work.\n * Please check video element events for seeking.\n * @param {HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | String} element Image element\n * @param {Object} [options] Options object\n * @param {function} [callback] callback function to call after eventual filters applied.\n * @return {fabric.Image} thisArg\n */\n initialize: function(element, options) {\n options || (options = { });\n this.filters = [];\n this.cacheKey = 'texture' + fabric.Object.__uid++;\n this.callSuper('initialize', options);\n this._initElement(element, options);\n },\n\n /**\n * Returns image element which this instance if based on\n * @return {HTMLImageElement} Image element\n */\n getElement: function() {\n return this._element || {};\n },\n\n /**\n * Sets image element for this instance to a specified one.\n * If filters defined they are applied to new image.\n * You might need to call `canvas.renderAll` and `object.setCoords` after replacing, to render new image and update controls area.\n * @param {HTMLImageElement} element\n * @param {Object} [options] Options object\n * @return {fabric.Image} thisArg\n * @chainable\n */\n setElement: function(element, options) {\n this.removeTexture(this.cacheKey);\n this.removeTexture(this.cacheKey + '_filtered');\n this._element = element;\n this._originalElement = element;\n this._initConfig(options);\n if (this.filters.length !== 0) {\n this.applyFilters();\n }\n // resizeFilters work on the already filtered copy.\n // we need to apply resizeFilters AFTER normal filters.\n // applyResizeFilters is run more often than normal filters\n // and is triggered by user interactions rather than dev code\n if (this.resizeFilter) {\n this.applyResizeFilters();\n }\n return this;\n },\n\n /**\n * Delete a single texture if in webgl mode\n */\n removeTexture: function(key) {\n var backend = fabric.filterBackend;\n if (backend && backend.evictCachesForKey) {\n backend.evictCachesForKey(key);\n }\n },\n\n /**\n * Delete textures, reference to elements and eventually JSDOM cleanup\n */\n dispose: function () {\n this.callSuper('dispose');\n this.removeTexture(this.cacheKey);\n this.removeTexture(this.cacheKey + '_filtered');\n this._cacheContext = undefined;\n ['_originalElement', '_element', '_filteredEl', '_cacheCanvas'].forEach((function(element) {\n fabric.util.cleanUpJsdomNode(this[element]);\n this[element] = undefined;\n }).bind(this));\n },\n\n /**\n * Get the crossOrigin value (of the corresponding image element)\n */\n getCrossOrigin: function() {\n return this._originalElement && (this._originalElement.crossOrigin || null);\n },\n\n /**\n * Returns original size of an image\n * @return {Object} Object with \"width\" and \"height\" properties\n */\n getOriginalSize: function() {\n var element = this.getElement();\n return {\n width: element.naturalWidth || element.width,\n height: element.naturalHeight || element.height\n };\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _stroke: function(ctx) {\n if (!this.stroke || this.strokeWidth === 0) {\n return;\n }\n var w = this.width / 2, h = this.height / 2;\n ctx.beginPath();\n ctx.moveTo(-w, -h);\n ctx.lineTo(w, -h);\n ctx.lineTo(w, h);\n ctx.lineTo(-w, h);\n ctx.lineTo(-w, -h);\n ctx.closePath();\n },\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n var filters = [];\n\n this.filters.forEach(function(filterObj) {\n if (filterObj) {\n filters.push(filterObj.toObject());\n }\n });\n var object = extend(\n this.callSuper(\n 'toObject',\n ['cropX', 'cropY'].concat(propertiesToInclude)\n ), {\n src: this.getSrc(),\n crossOrigin: this.getCrossOrigin(),\n filters: filters,\n });\n if (this.resizeFilter) {\n object.resizeFilter = this.resizeFilter.toObject();\n }\n return object;\n },\n\n /**\n * Returns true if an image has crop applied, inspecting values of cropX,cropY,width,height.\n * @return {Boolean}\n */\n hasCrop: function() {\n return this.cropX || this.cropY || this.width < this._element.width || this.height < this._element.height;\n },\n\n /* _TO_SVG_START_ */\n /**\n * Returns svg representation of an instance\n * @return {Array} an array of strings with the specific svg representation\n * of the instance\n */\n _toSVG: function() {\n var svgString = [], imageMarkup = [], strokeSvg, element = this._element,\n x = -this.width / 2, y = -this.height / 2, clipPath = '', imageRendering = '';\n if (!element) {\n return [];\n }\n if (this.hasCrop()) {\n var clipPathId = fabric.Object.__uid++;\n svgString.push(\n '\\n',\n '\\t\\n',\n '\\n'\n );\n clipPath = ' clip-path=\"url(#imageCrop_' + clipPathId + ')\" ';\n }\n if (!this.imageSmoothing) {\n imageRendering = '\" image-rendering=\"optimizeSpeed';\n }\n imageMarkup.push('\\t element with actual transformation, then offsetting object to the top/left\n // so that object's center aligns with container's left/top\n '\" width=\"', element.width || element.naturalWidth,\n '\" height=\"', element.height || element.height,\n imageRendering,\n '\"', clipPath,\n '>\\n');\n\n if (this.stroke || this.strokeDashArray) {\n var origFill = this.fill;\n this.fill = null;\n strokeSvg = [\n '\\t\\n'\n ];\n this.fill = origFill;\n }\n if (this.paintFirst !== 'fill') {\n svgString = svgString.concat(strokeSvg, imageMarkup);\n }\n else {\n svgString = svgString.concat(imageMarkup, strokeSvg);\n }\n return svgString;\n },\n /* _TO_SVG_END_ */\n\n /**\n * Returns source of an image\n * @param {Boolean} filtered indicates if the src is needed for svg\n * @return {String} Source of an image\n */\n getSrc: function(filtered) {\n var element = filtered ? this._element : this._originalElement;\n if (element) {\n if (element.toDataURL) {\n return element.toDataURL();\n }\n\n if (this.srcFromAttribute) {\n return element.getAttribute('src');\n }\n else {\n return element.src;\n }\n }\n else {\n return this.src || '';\n }\n },\n\n /**\n * Sets source of an image\n * @param {String} src Source string (URL)\n * @param {Function} [callback] Callback is invoked when image has been loaded (and all filters have been applied)\n * @param {Object} [options] Options object\n * @param {String} [options.crossOrigin] crossOrigin value (one of \"\", \"anonymous\", \"use-credentials\")\n * @see https://developer.mozilla.org/en-US/docs/HTML/CORS_settings_attributes\n * @return {fabric.Image} thisArg\n * @chainable\n */\n setSrc: function(src, callback, options) {\n fabric.util.loadImage(src, function(img, isError) {\n this.setElement(img, options);\n this._setWidthHeight();\n callback && callback(this, isError);\n }, this, options && options.crossOrigin);\n return this;\n },\n\n /**\n * Returns string representation of an instance\n * @return {String} String representation of an instance\n */\n toString: function() {\n return '#';\n },\n\n applyResizeFilters: function() {\n var filter = this.resizeFilter,\n minimumScale = this.minimumScaleTrigger,\n objectScale = this.getTotalObjectScaling(),\n scaleX = objectScale.scaleX,\n scaleY = objectScale.scaleY,\n elementToFilter = this._filteredEl || this._originalElement;\n if (this.group) {\n this.set('dirty', true);\n }\n if (!filter || (scaleX > minimumScale && scaleY > minimumScale)) {\n this._element = elementToFilter;\n this._filterScalingX = 1;\n this._filterScalingY = 1;\n this._lastScaleX = scaleX;\n this._lastScaleY = scaleY;\n return;\n }\n if (!fabric.filterBackend) {\n fabric.filterBackend = fabric.initFilterBackend();\n }\n var canvasEl = fabric.util.createCanvasElement(),\n cacheKey = this._filteredEl ? (this.cacheKey + '_filtered') : this.cacheKey,\n sourceWidth = elementToFilter.width, sourceHeight = elementToFilter.height;\n canvasEl.width = sourceWidth;\n canvasEl.height = sourceHeight;\n this._element = canvasEl;\n this._lastScaleX = filter.scaleX = scaleX;\n this._lastScaleY = filter.scaleY = scaleY;\n fabric.filterBackend.applyFilters(\n [filter], elementToFilter, sourceWidth, sourceHeight, this._element, cacheKey);\n this._filterScalingX = canvasEl.width / this._originalElement.width;\n this._filterScalingY = canvasEl.height / this._originalElement.height;\n },\n\n /**\n * Applies filters assigned to this image (from \"filters\" array) or from filter param\n * @method applyFilters\n * @param {Array} filters to be applied\n * @param {Boolean} forResizing specify if the filter operation is a resize operation\n * @return {thisArg} return the fabric.Image object\n * @chainable\n */\n applyFilters: function(filters) {\n\n filters = filters || this.filters || [];\n filters = filters.filter(function(filter) { return filter && !filter.isNeutralState(); });\n this.set('dirty', true);\n\n // needs to clear out or WEBGL will not resize correctly\n this.removeTexture(this.cacheKey + '_filtered');\n\n if (filters.length === 0) {\n this._element = this._originalElement;\n this._filteredEl = null;\n this._filterScalingX = 1;\n this._filterScalingY = 1;\n return this;\n }\n\n var imgElement = this._originalElement,\n sourceWidth = imgElement.naturalWidth || imgElement.width,\n sourceHeight = imgElement.naturalHeight || imgElement.height;\n\n if (this._element === this._originalElement) {\n // if the element is the same we need to create a new element\n var canvasEl = fabric.util.createCanvasElement();\n canvasEl.width = sourceWidth;\n canvasEl.height = sourceHeight;\n this._element = canvasEl;\n this._filteredEl = canvasEl;\n }\n else {\n // clear the existing element to get new filter data\n // also dereference the eventual resized _element\n this._element = this._filteredEl;\n this._filteredEl.getContext('2d').clearRect(0, 0, sourceWidth, sourceHeight);\n // we also need to resize again at next renderAll, so remove saved _lastScaleX/Y\n this._lastScaleX = 1;\n this._lastScaleY = 1;\n }\n if (!fabric.filterBackend) {\n fabric.filterBackend = fabric.initFilterBackend();\n }\n fabric.filterBackend.applyFilters(\n filters, this._originalElement, sourceWidth, sourceHeight, this._element, this.cacheKey);\n if (this._originalElement.width !== this._element.width ||\n this._originalElement.height !== this._element.height) {\n this._filterScalingX = this._element.width / this._originalElement.width;\n this._filterScalingY = this._element.height / this._originalElement.height;\n }\n return this;\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(ctx) {\n fabric.util.setImageSmoothing(ctx, this.imageSmoothing);\n if (this.isMoving !== true && this.resizeFilter && this._needsResize()) {\n this.applyResizeFilters();\n }\n this._stroke(ctx);\n this._renderPaintInOrder(ctx);\n },\n\n /**\n * Paint the cached copy of the object on the target context.\n * it will set the imageSmoothing for the draw operation\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n drawCacheOnCanvas: function(ctx) {\n fabric.util.setImageSmoothing(ctx, this.imageSmoothing);\n fabric.Object.prototype.drawCacheOnCanvas.call(this, ctx);\n },\n\n /**\n * Decide if the object should cache or not. Create its own cache level\n * needsItsOwnCache should be used when the object drawing method requires\n * a cache step. None of the fabric classes requires it.\n * Generally you do not cache objects in groups because the group outside is cached.\n * This is the special image version where we would like to avoid caching where possible.\n * Essentially images do not benefit from caching. They may require caching, and in that\n * case we do it. Also caching an image usually ends in a loss of details.\n * A full performance audit should be done.\n * @return {Boolean}\n */\n shouldCache: function() {\n return this.needsItsOwnCache();\n },\n\n _renderFill: function(ctx) {\n var elementToDraw = this._element;\n if (!elementToDraw) {\n return;\n }\n var scaleX = this._filterScalingX, scaleY = this._filterScalingY,\n w = this.width, h = this.height, min = Math.min, max = Math.max,\n // crop values cannot be lesser than 0.\n cropX = max(this.cropX, 0), cropY = max(this.cropY, 0),\n elWidth = elementToDraw.naturalWidth || elementToDraw.width,\n elHeight = elementToDraw.naturalHeight || elementToDraw.height,\n sX = cropX * scaleX,\n sY = cropY * scaleY,\n // the width height cannot exceed element width/height, starting from the crop offset.\n sW = min(w * scaleX, elWidth - sX),\n sH = min(h * scaleY, elHeight - sY),\n x = -w / 2, y = -h / 2,\n maxDestW = min(w, elWidth / scaleX - cropX),\n maxDestH = min(h, elHeight / scaleY - cropY);\n\n elementToDraw && ctx.drawImage(elementToDraw, sX, sY, sW, sH, x, y, maxDestW, maxDestH);\n },\n\n /**\n * needed to check if image needs resize\n * @private\n */\n _needsResize: function() {\n var scale = this.getTotalObjectScaling();\n return (scale.scaleX !== this._lastScaleX || scale.scaleY !== this._lastScaleY);\n },\n\n /**\n * @private\n */\n _resetWidthHeight: function() {\n this.set(this.getOriginalSize());\n },\n\n /**\n * The Image class's initialization method. This method is automatically\n * called by the constructor.\n * @private\n * @param {HTMLImageElement|String} element The element representing the image\n * @param {Object} [options] Options object\n */\n _initElement: function(element, options) {\n this.setElement(fabric.util.getById(element), options);\n fabric.util.addClass(this.getElement(), fabric.Image.CSS_CANVAS);\n },\n\n /**\n * @private\n * @param {Object} [options] Options object\n */\n _initConfig: function(options) {\n options || (options = { });\n this.setOptions(options);\n this._setWidthHeight(options);\n },\n\n /**\n * @private\n * @param {Array} filters to be initialized\n * @param {Function} callback Callback to invoke when all fabric.Image.filters instances are created\n */\n _initFilters: function(filters, callback) {\n if (filters && filters.length) {\n fabric.util.enlivenObjects(filters, function(enlivenedObjects) {\n callback && callback(enlivenedObjects);\n }, 'fabric.Image.filters');\n }\n else {\n callback && callback();\n }\n },\n\n /**\n * @private\n * Set the width and the height of the image object, using the element or the\n * options.\n * @param {Object} [options] Object with width/height properties\n */\n _setWidthHeight: function(options) {\n options || (options = { });\n var el = this.getElement();\n this.width = options.width || el.naturalWidth || el.width || 0;\n this.height = options.height || el.naturalHeight || el.height || 0;\n },\n\n /**\n * Calculate offset for center and scale factor for the image in order to respect\n * the preserveAspectRatio attribute\n * @private\n * @return {Object}\n */\n parsePreserveAspectRatioAttribute: function() {\n var pAR = fabric.util.parsePreserveAspectRatioAttribute(this.preserveAspectRatio || ''),\n rWidth = this._element.width, rHeight = this._element.height,\n scaleX = 1, scaleY = 1, offsetLeft = 0, offsetTop = 0, cropX = 0, cropY = 0,\n offset, pWidth = this.width, pHeight = this.height, parsedAttributes = { width: pWidth, height: pHeight };\n if (pAR && (pAR.alignX !== 'none' || pAR.alignY !== 'none')) {\n if (pAR.meetOrSlice === 'meet') {\n scaleX = scaleY = fabric.util.findScaleToFit(this._element, parsedAttributes);\n offset = (pWidth - rWidth * scaleX) / 2;\n if (pAR.alignX === 'Min') {\n offsetLeft = -offset;\n }\n if (pAR.alignX === 'Max') {\n offsetLeft = offset;\n }\n offset = (pHeight - rHeight * scaleY) / 2;\n if (pAR.alignY === 'Min') {\n offsetTop = -offset;\n }\n if (pAR.alignY === 'Max') {\n offsetTop = offset;\n }\n }\n if (pAR.meetOrSlice === 'slice') {\n scaleX = scaleY = fabric.util.findScaleToCover(this._element, parsedAttributes);\n offset = rWidth - pWidth / scaleX;\n if (pAR.alignX === 'Mid') {\n cropX = offset / 2;\n }\n if (pAR.alignX === 'Max') {\n cropX = offset;\n }\n offset = rHeight - pHeight / scaleY;\n if (pAR.alignY === 'Mid') {\n cropY = offset / 2;\n }\n if (pAR.alignY === 'Max') {\n cropY = offset;\n }\n rWidth = pWidth / scaleX;\n rHeight = pHeight / scaleY;\n }\n }\n else {\n scaleX = pWidth / rWidth;\n scaleY = pHeight / rHeight;\n }\n return {\n width: rWidth,\n height: rHeight,\n scaleX: scaleX,\n scaleY: scaleY,\n offsetLeft: offsetLeft,\n offsetTop: offsetTop,\n cropX: cropX,\n cropY: cropY\n };\n }\n });\n\n /**\n * Default CSS class name for canvas\n * @static\n * @type String\n * @default\n */\n fabric.Image.CSS_CANVAS = 'canvas-img';\n\n /**\n * Alias for getSrc\n * @static\n */\n fabric.Image.prototype.getSvgSrc = fabric.Image.prototype.getSrc;\n\n /**\n * Creates an instance of fabric.Image from its object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {Function} callback Callback to invoke when an image instance is created\n */\n fabric.Image.fromObject = function(_object, callback) {\n var object = fabric.util.object.clone(_object);\n fabric.util.loadImage(object.src, function(img, isError) {\n if (isError) {\n callback && callback(null, true);\n return;\n }\n fabric.Image.prototype._initFilters.call(object, object.filters, function(filters) {\n object.filters = filters || [];\n fabric.Image.prototype._initFilters.call(object, [object.resizeFilter], function(resizeFilters) {\n object.resizeFilter = resizeFilters[0];\n fabric.util.enlivenObjectEnlivables(object, object, function () {\n var image = new fabric.Image(img, object);\n callback(image, false);\n });\n });\n });\n }, null, object.crossOrigin);\n };\n\n /**\n * Creates an instance of fabric.Image from an URL string\n * @static\n * @param {String} url URL to create an image from\n * @param {Function} [callback] Callback to invoke when image is created (newly created image is passed as a first argument). Second argument is a boolean indicating if an error occurred or not.\n * @param {Object} [imgOptions] Options object\n */\n fabric.Image.fromURL = function(url, callback, imgOptions) {\n fabric.util.loadImage(url, function(img, isError) {\n callback && callback(new fabric.Image(img, imgOptions), isError);\n }, null, imgOptions && imgOptions.crossOrigin);\n };\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link fabric.Image.fromElement})\n * @static\n * @see {@link http://www.w3.org/TR/SVG/struct.html#ImageElement}\n */\n fabric.Image.ATTRIBUTE_NAMES =\n fabric.SHARED_ATTRIBUTES.concat(\n 'x y width height preserveAspectRatio xlink:href crossOrigin image-rendering'.split(' ')\n );\n\n /**\n * Returns {@link fabric.Image} instance from an SVG element\n * @static\n * @param {SVGElement} element Element to parse\n * @param {Object} [options] Options object\n * @param {Function} callback Callback to execute when fabric.Image object is created\n * @return {fabric.Image} Instance of fabric.Image\n */\n fabric.Image.fromElement = function(element, callback, options) {\n var parsedAttributes = fabric.parseAttributes(element, fabric.Image.ATTRIBUTE_NAMES);\n fabric.Image.fromURL(parsedAttributes['xlink:href'], callback,\n extend((options ? fabric.util.object.clone(options) : { }), parsedAttributes));\n };\n /* _FROM_SVG_END_ */\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\nfabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ {\n\n /**\n * @private\n * @return {Number} angle value\n */\n _getAngleValueForStraighten: function() {\n var angle = this.angle % 360;\n if (angle > 0) {\n return Math.round((angle - 1) / 90) * 90;\n }\n return Math.round(angle / 90) * 90;\n },\n\n /**\n * Straightens an object (rotating it from current angle to one of 0, 90, 180, 270, etc. depending on which is closer)\n * @return {fabric.Object} thisArg\n * @chainable\n */\n straighten: function() {\n return this.rotate(this._getAngleValueForStraighten());\n },\n\n /**\n * Same as {@link fabric.Object.prototype.straighten} but with animation\n * @param {Object} callbacks Object with callback functions\n * @param {Function} [callbacks.onComplete] Invoked on completion\n * @param {Function} [callbacks.onChange] Invoked on every step of animation\n * @return {fabric.Object} thisArg\n */\n fxStraighten: function(callbacks) {\n callbacks = callbacks || { };\n\n var empty = function() { },\n onComplete = callbacks.onComplete || empty,\n onChange = callbacks.onChange || empty,\n _this = this;\n\n return fabric.util.animate({\n target: this,\n startValue: this.get('angle'),\n endValue: this._getAngleValueForStraighten(),\n duration: this.FX_DURATION,\n onChange: function(value) {\n _this.rotate(value);\n onChange();\n },\n onComplete: function() {\n _this.setCoords();\n onComplete();\n },\n });\n }\n});\n\nfabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.StaticCanvas.prototype */ {\n\n /**\n * Straightens object, then rerenders canvas\n * @param {fabric.Object} object Object to straighten\n * @return {fabric.Canvas} thisArg\n * @chainable\n */\n straightenObject: function (object) {\n object.straighten();\n this.requestRenderAll();\n return this;\n },\n\n /**\n * Same as {@link fabric.Canvas.prototype.straightenObject}, but animated\n * @param {fabric.Object} object Object to straighten\n * @return {fabric.Canvas} thisArg\n */\n fxStraightenObject: function (object) {\n return object.fxStraighten({\n onChange: this.requestRenderAllBound\n });\n }\n});\n\n\n(function() {\n\n 'use strict';\n\n /**\n * Tests if webgl supports certain precision\n * @param {WebGL} Canvas WebGL context to test on\n * @param {String} Precision to test can be any of following: 'lowp', 'mediump', 'highp'\n * @returns {Boolean} Whether the user's browser WebGL supports given precision.\n */\n function testPrecision(gl, precision){\n var fragmentSource = 'precision ' + precision + ' float;\\nvoid main(){}';\n var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n gl.shaderSource(fragmentShader, fragmentSource);\n gl.compileShader(fragmentShader);\n if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n return false;\n }\n return true;\n }\n\n /**\n * Indicate whether this filtering backend is supported by the user's browser.\n * @param {Number} tileSize check if the tileSize is supported\n * @returns {Boolean} Whether the user's browser supports WebGL.\n */\n fabric.isWebglSupported = function(tileSize) {\n if (fabric.isLikelyNode) {\n return false;\n }\n tileSize = tileSize || fabric.WebglFilterBackend.prototype.tileSize;\n var canvas = document.createElement('canvas');\n var gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');\n var isSupported = false;\n // eslint-disable-next-line\n if (gl) {\n fabric.maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE);\n isSupported = fabric.maxTextureSize >= tileSize;\n var precisions = ['highp', 'mediump', 'lowp'];\n for (var i = 0; i < 3; i++){\n if (testPrecision(gl, precisions[i])){\n fabric.webGlPrecision = precisions[i];\n break;\n };\n }\n }\n this.isSupported = isSupported;\n return isSupported;\n };\n\n fabric.WebglFilterBackend = WebglFilterBackend;\n\n /**\n * WebGL filter backend.\n */\n function WebglFilterBackend(options) {\n if (options && options.tileSize) {\n this.tileSize = options.tileSize;\n }\n this.setupGLContext(this.tileSize, this.tileSize);\n this.captureGPUInfo();\n };\n\n WebglFilterBackend.prototype = /** @lends fabric.WebglFilterBackend.prototype */ {\n\n tileSize: 2048,\n\n /**\n * Experimental. This object is a sort of repository of help layers used to avoid\n * of recreating them during frequent filtering. If you are previewing a filter with\n * a slider you probably do not want to create help layers every filter step.\n * in this object there will be appended some canvases, created once, resized sometimes\n * cleared never. Clearing is left to the developer.\n **/\n resources: {\n\n },\n\n /**\n * Setup a WebGL context suitable for filtering, and bind any needed event handlers.\n */\n setupGLContext: function(width, height) {\n this.dispose();\n this.createWebGLCanvas(width, height);\n // eslint-disable-next-line\n this.aPosition = new Float32Array([0, 0, 0, 1, 1, 0, 1, 1]);\n this.chooseFastestCopyGLTo2DMethod(width, height);\n },\n\n /**\n * Pick a method to copy data from GL context to 2d canvas. In some browsers using\n * putImageData is faster than drawImage for that specific operation.\n */\n chooseFastestCopyGLTo2DMethod: function(width, height) {\n var canMeasurePerf = typeof window.performance !== 'undefined', canUseImageData;\n try {\n new ImageData(1, 1);\n canUseImageData = true;\n }\n catch (e) {\n canUseImageData = false;\n }\n // eslint-disable-next-line no-undef\n var canUseArrayBuffer = typeof ArrayBuffer !== 'undefined';\n // eslint-disable-next-line no-undef\n var canUseUint8Clamped = typeof Uint8ClampedArray !== 'undefined';\n\n if (!(canMeasurePerf && canUseImageData && canUseArrayBuffer && canUseUint8Clamped)) {\n return;\n }\n\n var targetCanvas = fabric.util.createCanvasElement();\n // eslint-disable-next-line no-undef\n var imageBuffer = new ArrayBuffer(width * height * 4);\n if (fabric.forceGLPutImageData) {\n this.imageBuffer = imageBuffer;\n this.copyGLTo2D = copyGLTo2DPutImageData;\n return;\n }\n var testContext = {\n imageBuffer: imageBuffer,\n destinationWidth: width,\n destinationHeight: height,\n targetCanvas: targetCanvas\n };\n var startTime, drawImageTime, putImageDataTime;\n targetCanvas.width = width;\n targetCanvas.height = height;\n\n startTime = window.performance.now();\n copyGLTo2DDrawImage.call(testContext, this.gl, testContext);\n drawImageTime = window.performance.now() - startTime;\n\n startTime = window.performance.now();\n copyGLTo2DPutImageData.call(testContext, this.gl, testContext);\n putImageDataTime = window.performance.now() - startTime;\n\n if (drawImageTime > putImageDataTime) {\n this.imageBuffer = imageBuffer;\n this.copyGLTo2D = copyGLTo2DPutImageData;\n }\n else {\n this.copyGLTo2D = copyGLTo2DDrawImage;\n }\n },\n\n /**\n * Create a canvas element and associated WebGL context and attaches them as\n * class properties to the GLFilterBackend class.\n */\n createWebGLCanvas: function(width, height) {\n var canvas = fabric.util.createCanvasElement();\n canvas.width = width;\n canvas.height = height;\n var glOptions = {\n alpha: true,\n premultipliedAlpha: false,\n depth: false,\n stencil: false,\n antialias: false\n },\n gl = canvas.getContext('webgl', glOptions);\n if (!gl) {\n gl = canvas.getContext('experimental-webgl', glOptions);\n }\n if (!gl) {\n return;\n }\n gl.clearColor(0, 0, 0, 0);\n // this canvas can fire webglcontextlost and webglcontextrestored\n this.canvas = canvas;\n this.gl = gl;\n },\n\n /**\n * Attempts to apply the requested filters to the source provided, drawing the filtered output\n * to the provided target canvas.\n *\n * @param {Array} filters The filters to apply.\n * @param {HTMLImageElement|HTMLCanvasElement} source The source to be filtered.\n * @param {Number} width The width of the source input.\n * @param {Number} height The height of the source input.\n * @param {HTMLCanvasElement} targetCanvas The destination for filtered output to be drawn.\n * @param {String|undefined} cacheKey A key used to cache resources related to the source. If\n * omitted, caching will be skipped.\n */\n applyFilters: function(filters, source, width, height, targetCanvas, cacheKey) {\n var gl = this.gl;\n var cachedTexture;\n if (cacheKey) {\n cachedTexture = this.getCachedTexture(cacheKey, source);\n }\n var pipelineState = {\n originalWidth: source.width || source.originalWidth,\n originalHeight: source.height || source.originalHeight,\n sourceWidth: width,\n sourceHeight: height,\n destinationWidth: width,\n destinationHeight: height,\n context: gl,\n sourceTexture: this.createTexture(gl, width, height, !cachedTexture && source),\n targetTexture: this.createTexture(gl, width, height),\n originalTexture: cachedTexture ||\n this.createTexture(gl, width, height, !cachedTexture && source),\n passes: filters.length,\n webgl: true,\n aPosition: this.aPosition,\n programCache: this.programCache,\n pass: 0,\n filterBackend: this,\n targetCanvas: targetCanvas\n };\n var tempFbo = gl.createFramebuffer();\n gl.bindFramebuffer(gl.FRAMEBUFFER, tempFbo);\n filters.forEach(function(filter) { filter && filter.applyTo(pipelineState); });\n resizeCanvasIfNeeded(pipelineState);\n this.copyGLTo2D(gl, pipelineState);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.deleteTexture(pipelineState.sourceTexture);\n gl.deleteTexture(pipelineState.targetTexture);\n gl.deleteFramebuffer(tempFbo);\n targetCanvas.getContext('2d').setTransform(1, 0, 0, 1, 0, 0);\n return pipelineState;\n },\n\n /**\n * Detach event listeners, remove references, and clean up caches.\n */\n dispose: function() {\n if (this.canvas) {\n this.canvas = null;\n this.gl = null;\n }\n this.clearWebGLCaches();\n },\n\n /**\n * Wipe out WebGL-related caches.\n */\n clearWebGLCaches: function() {\n this.programCache = {};\n this.textureCache = {};\n },\n\n /**\n * Create a WebGL texture object.\n *\n * Accepts specific dimensions to initialize the texture to or a source image.\n *\n * @param {WebGLRenderingContext} gl The GL context to use for creating the texture.\n * @param {Number} width The width to initialize the texture at.\n * @param {Number} height The height to initialize the texture.\n * @param {HTMLImageElement|HTMLCanvasElement} textureImageSource A source for the texture data.\n * @returns {WebGLTexture}\n */\n createTexture: function(gl, width, height, textureImageSource) {\n var texture = gl.createTexture();\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n if (textureImageSource) {\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, textureImageSource);\n }\n else {\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);\n }\n return texture;\n },\n\n /**\n * Can be optionally used to get a texture from the cache array\n *\n * If an existing texture is not found, a new texture is created and cached.\n *\n * @param {String} uniqueId A cache key to use to find an existing texture.\n * @param {HTMLImageElement|HTMLCanvasElement} textureImageSource A source to use to create the\n * texture cache entry if one does not already exist.\n */\n getCachedTexture: function(uniqueId, textureImageSource) {\n if (this.textureCache[uniqueId]) {\n return this.textureCache[uniqueId];\n }\n else {\n var texture = this.createTexture(\n this.gl, textureImageSource.width, textureImageSource.height, textureImageSource);\n this.textureCache[uniqueId] = texture;\n return texture;\n }\n },\n\n /**\n * Clear out cached resources related to a source image that has been\n * filtered previously.\n *\n * @param {String} cacheKey The cache key provided when the source image was filtered.\n */\n evictCachesForKey: function(cacheKey) {\n if (this.textureCache[cacheKey]) {\n this.gl.deleteTexture(this.textureCache[cacheKey]);\n delete this.textureCache[cacheKey];\n }\n },\n\n copyGLTo2D: copyGLTo2DDrawImage,\n\n /**\n * Attempt to extract GPU information strings from a WebGL context.\n *\n * Useful information when debugging or blacklisting specific GPUs.\n *\n * @returns {Object} A GPU info object with renderer and vendor strings.\n */\n captureGPUInfo: function() {\n if (this.gpuInfo) {\n return this.gpuInfo;\n }\n var gl = this.gl, gpuInfo = { renderer: '', vendor: '' };\n if (!gl) {\n return gpuInfo;\n }\n var ext = gl.getExtension('WEBGL_debug_renderer_info');\n if (ext) {\n var renderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL);\n var vendor = gl.getParameter(ext.UNMASKED_VENDOR_WEBGL);\n if (renderer) {\n gpuInfo.renderer = renderer.toLowerCase();\n }\n if (vendor) {\n gpuInfo.vendor = vendor.toLowerCase();\n }\n }\n this.gpuInfo = gpuInfo;\n return gpuInfo;\n },\n };\n})();\n\nfunction resizeCanvasIfNeeded(pipelineState) {\n var targetCanvas = pipelineState.targetCanvas,\n width = targetCanvas.width, height = targetCanvas.height,\n dWidth = pipelineState.destinationWidth,\n dHeight = pipelineState.destinationHeight;\n\n if (width !== dWidth || height !== dHeight) {\n targetCanvas.width = dWidth;\n targetCanvas.height = dHeight;\n }\n}\n\n/**\n * Copy an input WebGL canvas on to an output 2D canvas.\n *\n * The WebGL canvas is assumed to be upside down, with the top-left pixel of the\n * desired output image appearing in the bottom-left corner of the WebGL canvas.\n *\n * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from.\n * @param {HTMLCanvasElement} targetCanvas The 2D target canvas to copy on to.\n * @param {Object} pipelineState The 2D target canvas to copy on to.\n */\nfunction copyGLTo2DDrawImage(gl, pipelineState) {\n var glCanvas = gl.canvas, targetCanvas = pipelineState.targetCanvas,\n ctx = targetCanvas.getContext('2d');\n ctx.translate(0, targetCanvas.height); // move it down again\n ctx.scale(1, -1); // vertical flip\n // where is my image on the big glcanvas?\n var sourceY = glCanvas.height - targetCanvas.height;\n ctx.drawImage(glCanvas, 0, sourceY, targetCanvas.width, targetCanvas.height, 0, 0,\n targetCanvas.width, targetCanvas.height);\n}\n\n/**\n * Copy an input WebGL canvas on to an output 2D canvas using 2d canvas' putImageData\n * API. Measurably faster than using ctx.drawImage in Firefox (version 54 on OSX Sierra).\n *\n * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from.\n * @param {HTMLCanvasElement} targetCanvas The 2D target canvas to copy on to.\n * @param {Object} pipelineState The 2D target canvas to copy on to.\n */\nfunction copyGLTo2DPutImageData(gl, pipelineState) {\n var targetCanvas = pipelineState.targetCanvas, ctx = targetCanvas.getContext('2d'),\n dWidth = pipelineState.destinationWidth,\n dHeight = pipelineState.destinationHeight,\n numBytes = dWidth * dHeight * 4;\n\n // eslint-disable-next-line no-undef\n var u8 = new Uint8Array(this.imageBuffer, 0, numBytes);\n // eslint-disable-next-line no-undef\n var u8Clamped = new Uint8ClampedArray(this.imageBuffer, 0, numBytes);\n\n gl.readPixels(0, 0, dWidth, dHeight, gl.RGBA, gl.UNSIGNED_BYTE, u8);\n var imgData = new ImageData(u8Clamped, dWidth, dHeight);\n ctx.putImageData(imgData, 0, 0);\n}\n\n\n(function() {\n\n 'use strict';\n\n var noop = function() {};\n\n fabric.Canvas2dFilterBackend = Canvas2dFilterBackend;\n\n /**\n * Canvas 2D filter backend.\n */\n function Canvas2dFilterBackend() {};\n\n Canvas2dFilterBackend.prototype = /** @lends fabric.Canvas2dFilterBackend.prototype */ {\n evictCachesForKey: noop,\n dispose: noop,\n clearWebGLCaches: noop,\n\n /**\n * Experimental. This object is a sort of repository of help layers used to avoid\n * of recreating them during frequent filtering. If you are previewing a filter with\n * a slider you probably do not want to create help layers every filter step.\n * in this object there will be appended some canvases, created once, resized sometimes\n * cleared never. Clearing is left to the developer.\n **/\n resources: {\n\n },\n\n /**\n * Apply a set of filters against a source image and draw the filtered output\n * to the provided destination canvas.\n *\n * @param {EnhancedFilter} filters The filter to apply.\n * @param {HTMLImageElement|HTMLCanvasElement} sourceElement The source to be filtered.\n * @param {Number} sourceWidth The width of the source input.\n * @param {Number} sourceHeight The height of the source input.\n * @param {HTMLCanvasElement} targetCanvas The destination for filtered output to be drawn.\n */\n applyFilters: function(filters, sourceElement, sourceWidth, sourceHeight, targetCanvas) {\n var ctx = targetCanvas.getContext('2d');\n ctx.drawImage(sourceElement, 0, 0, sourceWidth, sourceHeight);\n var imageData = ctx.getImageData(0, 0, sourceWidth, sourceHeight);\n var originalImageData = ctx.getImageData(0, 0, sourceWidth, sourceHeight);\n var pipelineState = {\n sourceWidth: sourceWidth,\n sourceHeight: sourceHeight,\n imageData: imageData,\n originalEl: sourceElement,\n originalImageData: originalImageData,\n canvasEl: targetCanvas,\n ctx: ctx,\n filterBackend: this,\n };\n filters.forEach(function(filter) { filter.applyTo(pipelineState); });\n if (pipelineState.imageData.width !== sourceWidth || pipelineState.imageData.height !== sourceHeight) {\n targetCanvas.width = pipelineState.imageData.width;\n targetCanvas.height = pipelineState.imageData.height;\n }\n ctx.putImageData(pipelineState.imageData, 0, 0);\n return pipelineState;\n },\n\n };\n})();\n\n\n/**\n * @namespace fabric.Image.filters\n * @memberOf fabric.Image\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#image_filters}\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n */\nfabric.Image = fabric.Image || { };\nfabric.Image.filters = fabric.Image.filters || { };\n\n/**\n * Root filter class from which all filter classes inherit from\n * @class fabric.Image.filters.BaseFilter\n * @memberOf fabric.Image.filters\n */\nfabric.Image.filters.BaseFilter = fabric.util.createClass(/** @lends fabric.Image.filters.BaseFilter.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'BaseFilter',\n\n /**\n * Array of attributes to send with buffers. do not modify\n * @private\n */\n\n vertexSource: 'attribute vec2 aPosition;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vTexCoord = aPosition;\\n' +\n 'gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\\n' +\n '}',\n\n fragmentSource: 'precision highp float;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'void main() {\\n' +\n 'gl_FragColor = texture2D(uTexture, vTexCoord);\\n' +\n '}',\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n initialize: function(options) {\n if (options) {\n this.setOptions(options);\n }\n },\n\n /**\n * Sets filter's properties from options\n * @param {Object} [options] Options object\n */\n setOptions: function(options) {\n for (var prop in options) {\n this[prop] = options[prop];\n }\n },\n\n /**\n * Compile this filter's shader program.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context to use for shader compilation.\n * @param {String} fragmentSource fragmentShader source for compilation\n * @param {String} vertexSource vertexShader source for compilation\n */\n createProgram: function(gl, fragmentSource, vertexSource) {\n fragmentSource = fragmentSource || this.fragmentSource;\n vertexSource = vertexSource || this.vertexSource;\n if (fabric.webGlPrecision !== 'highp'){\n fragmentSource = fragmentSource.replace(\n /precision highp float/g,\n 'precision ' + fabric.webGlPrecision + ' float'\n );\n }\n var vertexShader = gl.createShader(gl.VERTEX_SHADER);\n gl.shaderSource(vertexShader, vertexSource);\n gl.compileShader(vertexShader);\n if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {\n throw new Error(\n // eslint-disable-next-line prefer-template\n 'Vertex shader compile error for ' + this.type + ': ' +\n gl.getShaderInfoLog(vertexShader)\n );\n }\n\n var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n gl.shaderSource(fragmentShader, fragmentSource);\n gl.compileShader(fragmentShader);\n if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {\n throw new Error(\n // eslint-disable-next-line prefer-template\n 'Fragment shader compile error for ' + this.type + ': ' +\n gl.getShaderInfoLog(fragmentShader)\n );\n }\n\n var program = gl.createProgram();\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n gl.linkProgram(program);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n throw new Error(\n // eslint-disable-next-line prefer-template\n 'Shader link error for \"${this.type}\" ' +\n gl.getProgramInfoLog(program)\n );\n }\n\n var attributeLocations = this.getAttributeLocations(gl, program);\n var uniformLocations = this.getUniformLocations(gl, program) || { };\n uniformLocations.uStepW = gl.getUniformLocation(program, 'uStepW');\n uniformLocations.uStepH = gl.getUniformLocation(program, 'uStepH');\n return {\n program: program,\n attributeLocations: attributeLocations,\n uniformLocations: uniformLocations\n };\n },\n\n /**\n * Return a map of attribute names to WebGLAttributeLocation objects.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {WebGLShaderProgram} program The shader program from which to take attribute locations.\n * @returns {Object} A map of attribute names to attribute locations.\n */\n getAttributeLocations: function(gl, program) {\n return {\n aPosition: gl.getAttribLocation(program, 'aPosition'),\n };\n },\n\n /**\n * Return a map of uniform names to WebGLUniformLocation objects.\n *\n * Intended to be overridden by subclasses.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {WebGLShaderProgram} program The shader program from which to take uniform locations.\n * @returns {Object} A map of uniform names to uniform locations.\n */\n getUniformLocations: function (/* gl, program */) {\n // in case i do not need any special uniform i need to return an empty object\n return { };\n },\n\n /**\n * Send attribute data from this filter to its shader program on the GPU.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {Object} attributeLocations A map of shader attribute names to their locations.\n */\n sendAttributeData: function(gl, attributeLocations, aPositionData) {\n var attributeLocation = attributeLocations.aPosition;\n var buffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.enableVertexAttribArray(attributeLocation);\n gl.vertexAttribPointer(attributeLocation, 2, gl.FLOAT, false, 0, 0);\n gl.bufferData(gl.ARRAY_BUFFER, aPositionData, gl.STATIC_DRAW);\n },\n\n _setupFrameBuffer: function(options) {\n var gl = options.context, width, height;\n if (options.passes > 1) {\n width = options.destinationWidth;\n height = options.destinationHeight;\n if (options.sourceWidth !== width || options.sourceHeight !== height) {\n gl.deleteTexture(options.targetTexture);\n options.targetTexture = options.filterBackend.createTexture(gl, width, height);\n }\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D,\n options.targetTexture, 0);\n }\n else {\n // draw last filter on canvas and not to framebuffer.\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n gl.finish();\n }\n },\n\n _swapTextures: function(options) {\n options.passes--;\n options.pass++;\n var temp = options.targetTexture;\n options.targetTexture = options.sourceTexture;\n options.sourceTexture = temp;\n },\n\n /**\n * Generic isNeutral implementation for one parameter based filters.\n * Used only in image applyFilters to discard filters that will not have an effect\n * on the image\n * Other filters may need their own version ( ColorMatrix, HueRotation, gamma, ComposedFilter )\n * @param {Object} options\n **/\n isNeutralState: function(/* options */) {\n var main = this.mainParameter,\n _class = fabric.Image.filters[this.type].prototype;\n if (main) {\n if (Array.isArray(_class[main])) {\n for (var i = _class[main].length; i--;) {\n if (this[main][i] !== _class[main][i]) {\n return false;\n }\n }\n return true;\n }\n else {\n return _class[main] === this[main];\n }\n }\n else {\n return false;\n }\n },\n\n /**\n * Apply this filter to the input image data provided.\n *\n * Determines whether to use WebGL or Canvas2D based on the options.webgl flag.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyTo: function(options) {\n if (options.webgl) {\n this._setupFrameBuffer(options);\n this.applyToWebGL(options);\n this._swapTextures(options);\n }\n else {\n this.applyTo2d(options);\n }\n },\n\n /**\n * Retrieves the cached shader.\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n retrieveShader: function(options) {\n if (!options.programCache.hasOwnProperty(this.type)) {\n options.programCache[this.type] = this.createProgram(options.context);\n }\n return options.programCache[this.type];\n },\n\n /**\n * Apply this filter using webgl.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.originalTexture The texture of the original input image.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyToWebGL: function(options) {\n var gl = options.context;\n var shader = this.retrieveShader(options);\n if (options.pass === 0 && options.originalTexture) {\n gl.bindTexture(gl.TEXTURE_2D, options.originalTexture);\n }\n else {\n gl.bindTexture(gl.TEXTURE_2D, options.sourceTexture);\n }\n gl.useProgram(shader.program);\n this.sendAttributeData(gl, shader.attributeLocations, options.aPosition);\n\n gl.uniform1f(shader.uniformLocations.uStepW, 1 / options.sourceWidth);\n gl.uniform1f(shader.uniformLocations.uStepH, 1 / options.sourceHeight);\n\n this.sendUniformData(gl, shader.uniformLocations);\n gl.viewport(0, 0, options.destinationWidth, options.destinationHeight);\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n },\n\n bindAdditionalTexture: function(gl, texture, textureUnit) {\n gl.activeTexture(textureUnit);\n gl.bindTexture(gl.TEXTURE_2D, texture);\n // reset active texture to 0 as usual\n gl.activeTexture(gl.TEXTURE0);\n },\n\n unbindAdditionalTexture: function(gl, textureUnit) {\n gl.activeTexture(textureUnit);\n gl.bindTexture(gl.TEXTURE_2D, null);\n gl.activeTexture(gl.TEXTURE0);\n },\n\n getMainParameter: function() {\n return this[this.mainParameter];\n },\n\n setMainParameter: function(value) {\n this[this.mainParameter] = value;\n },\n\n /**\n * Send uniform data from this filter to its shader program on the GPU.\n *\n * Intended to be overridden by subclasses.\n *\n * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program.\n * @param {Object} uniformLocations A map of shader uniform names to their locations.\n */\n sendUniformData: function(/* gl, uniformLocations */) {\n // Intentionally left blank. Override me in subclasses.\n },\n\n /**\n * If needed by a 2d filter, this functions can create an helper canvas to be used\n * remember that options.targetCanvas is available for use till end of chain.\n */\n createHelpLayer: function(options) {\n if (!options.helpLayer) {\n var helpLayer = document.createElement('canvas');\n helpLayer.width = options.sourceWidth;\n helpLayer.height = options.sourceHeight;\n options.helpLayer = helpLayer;\n }\n },\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject: function() {\n var object = { type: this.type }, mainP = this.mainParameter;\n if (mainP) {\n object[mainP] = this[mainP];\n }\n return object;\n },\n\n /**\n * Returns a JSON representation of an instance\n * @return {Object} JSON\n */\n toJSON: function() {\n // delegate, not alias\n return this.toObject();\n }\n});\n\nfabric.Image.filters.BaseFilter.fromObject = function(object, callback) {\n var filter = new fabric.Image.filters[object.type](object);\n callback && callback(filter);\n return filter;\n};\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Color Matrix filter class\n * @class fabric.Image.filters.ColorMatrix\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.ColorMatrix#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @see {@Link http://www.webwasp.co.uk/tutorials/219/Color_Matrix_Filter.php}\n * @see {@Link http://phoboslab.org/log/2013/11/fast-image-filters-with-webgl}\n * @example Kodachrome filter\n * var filter = new fabric.Image.filters.ColorMatrix({\n * matrix: [\n 1.1285582396593525, -0.3967382283601348, -0.03992559172921793, 0, 63.72958762196502,\n -0.16404339962244616, 1.0835251566291304, -0.05498805115633132, 0, 24.732407896706203,\n -0.16786010706155763, -0.5603416277695248, 1.6014850761964943, 0, 35.62982807460946,\n 0, 0, 0, 1, 0\n ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.ColorMatrix = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.ColorMatrix.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'ColorMatrix',\n\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'uniform mat4 uColorMatrix;\\n' +\n 'uniform vec4 uConstants;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'color *= uColorMatrix;\\n' +\n 'color += uConstants;\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n\n /**\n * Colormatrix for pixels.\n * array of 20 floats. Numbers in positions 4, 9, 14, 19 loose meaning\n * outside the -1, 1 range.\n * 0.0039215686 is the part of 1 that get translated to 1 in 2d\n * @param {Array} matrix array of 20 numbers.\n * @default\n */\n matrix: [\n 1, 0, 0, 0, 0,\n 0, 1, 0, 0, 0,\n 0, 0, 1, 0, 0,\n 0, 0, 0, 1, 0\n ],\n\n mainParameter: 'matrix',\n\n /**\n * Lock the colormatrix on the color part, skipping alpha, mainly for non webgl scenario\n * to save some calculation\n * @type Boolean\n * @default true\n */\n colorsOnly: true,\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n initialize: function(options) {\n this.callSuper('initialize', options);\n // create a new array instead mutating the prototype with push\n this.matrix = this.matrix.slice(0);\n },\n\n /**\n * Apply the ColorMatrix operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n data = imageData.data,\n iLen = data.length,\n m = this.matrix,\n r, g, b, a, i, colorsOnly = this.colorsOnly;\n\n for (i = 0; i < iLen; i += 4) {\n r = data[i];\n g = data[i + 1];\n b = data[i + 2];\n if (colorsOnly) {\n data[i] = r * m[0] + g * m[1] + b * m[2] + m[4] * 255;\n data[i + 1] = r * m[5] + g * m[6] + b * m[7] + m[9] * 255;\n data[i + 2] = r * m[10] + g * m[11] + b * m[12] + m[14] * 255;\n }\n else {\n a = data[i + 3];\n data[i] = r * m[0] + g * m[1] + b * m[2] + a * m[3] + m[4] * 255;\n data[i + 1] = r * m[5] + g * m[6] + b * m[7] + a * m[8] + m[9] * 255;\n data[i + 2] = r * m[10] + g * m[11] + b * m[12] + a * m[13] + m[14] * 255;\n data[i + 3] = r * m[15] + g * m[16] + b * m[17] + a * m[18] + m[19] * 255;\n }\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uColorMatrix: gl.getUniformLocation(program, 'uColorMatrix'),\n uConstants: gl.getUniformLocation(program, 'uConstants'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n var m = this.matrix,\n matrix = [\n m[0], m[1], m[2], m[3],\n m[5], m[6], m[7], m[8],\n m[10], m[11], m[12], m[13],\n m[15], m[16], m[17], m[18]\n ],\n constants = [m[4], m[9], m[14], m[19]];\n gl.uniformMatrix4fv(uniformLocations.uColorMatrix, false, matrix);\n gl.uniform4fv(uniformLocations.uConstants, constants);\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] function to invoke after filter creation\n * @return {fabric.Image.filters.ColorMatrix} Instance of fabric.Image.filters.ColorMatrix\n */\n fabric.Image.filters.ColorMatrix.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Brightness filter class\n * @class fabric.Image.filters.Brightness\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Brightness#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Brightness({\n * brightness: 0.05\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.Brightness = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Brightness.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Brightness',\n\n /**\n * Fragment source for the brightness program\n */\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uBrightness;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'color.rgb += uBrightness;\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n\n /**\n * Brightness value, from -1 to 1.\n * translated to -255 to 255 for 2d\n * 0.0039215686 is the part of 1 that get translated to 1 in 2d\n * @param {Number} brightness\n * @default\n */\n brightness: 0,\n\n /**\n * Describe the property that is the filter parameter\n * @param {String} m\n * @default\n */\n mainParameter: 'brightness',\n\n /**\n * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d: function(options) {\n if (this.brightness === 0) {\n return;\n }\n var imageData = options.imageData,\n data = imageData.data, i, len = data.length,\n brightness = Math.round(this.brightness * 255);\n for (i = 0; i < len; i += 4) {\n data[i] = data[i] + brightness;\n data[i + 1] = data[i + 1] + brightness;\n data[i + 2] = data[i + 2] + brightness;\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uBrightness: gl.getUniformLocation(program, 'uBrightness'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform1f(uniformLocations.uBrightness, this.brightness);\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Brightness} Instance of fabric.Image.filters.Brightness\n */\n fabric.Image.filters.Brightness.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n extend = fabric.util.object.extend,\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Adapted from html5rocks article\n * @class fabric.Image.filters.Convolute\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Convolute#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example Sharpen filter\n * var filter = new fabric.Image.filters.Convolute({\n * matrix: [ 0, -1, 0,\n * -1, 5, -1,\n * 0, -1, 0 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n * @example Blur filter\n * var filter = new fabric.Image.filters.Convolute({\n * matrix: [ 1/9, 1/9, 1/9,\n * 1/9, 1/9, 1/9,\n * 1/9, 1/9, 1/9 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n * @example Emboss filter\n * var filter = new fabric.Image.filters.Convolute({\n * matrix: [ 1, 1, 1,\n * 1, 0.7, -1,\n * -1, -1, -1 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n * @example Emboss filter with opaqueness\n * var filter = new fabric.Image.filters.Convolute({\n * opaque: true,\n * matrix: [ 1, 1, 1,\n * 1, 0.7, -1,\n * -1, -1, -1 ]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\n filters.Convolute = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Convolute.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Convolute',\n\n /*\n * Opaque value (true/false)\n */\n opaque: false,\n\n /*\n * matrix for the filter, max 9x9\n */\n matrix: [0, 0, 0, 0, 1, 0, 0, 0, 0],\n\n /**\n * Fragment source for the brightness program\n */\n fragmentSource: {\n Convolute_3_1: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uMatrix[9];\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0, 0, 0, 0);\\n' +\n 'for (float h = 0.0; h < 3.0; h+=1.0) {\\n' +\n 'for (float w = 0.0; w < 3.0; w+=1.0) {\\n' +\n 'vec2 matrixPos = vec2(uStepW * (w - 1), uStepH * (h - 1));\\n' +\n 'color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 3.0 + w)];\\n' +\n '}\\n' +\n '}\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n Convolute_3_0: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uMatrix[9];\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0, 0, 0, 1);\\n' +\n 'for (float h = 0.0; h < 3.0; h+=1.0) {\\n' +\n 'for (float w = 0.0; w < 3.0; w+=1.0) {\\n' +\n 'vec2 matrixPos = vec2(uStepW * (w - 1.0), uStepH * (h - 1.0));\\n' +\n 'color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 3.0 + w)];\\n' +\n '}\\n' +\n '}\\n' +\n 'float alpha = texture2D(uTexture, vTexCoord).a;\\n' +\n 'gl_FragColor = color;\\n' +\n 'gl_FragColor.a = alpha;\\n' +\n '}',\n Convolute_5_1: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uMatrix[25];\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0, 0, 0, 0);\\n' +\n 'for (float h = 0.0; h < 5.0; h+=1.0) {\\n' +\n 'for (float w = 0.0; w < 5.0; w+=1.0) {\\n' +\n 'vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));\\n' +\n 'color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 5.0 + w)];\\n' +\n '}\\n' +\n '}\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n Convolute_5_0: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uMatrix[25];\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0, 0, 0, 1);\\n' +\n 'for (float h = 0.0; h < 5.0; h+=1.0) {\\n' +\n 'for (float w = 0.0; w < 5.0; w+=1.0) {\\n' +\n 'vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));\\n' +\n 'color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 5.0 + w)];\\n' +\n '}\\n' +\n '}\\n' +\n 'float alpha = texture2D(uTexture, vTexCoord).a;\\n' +\n 'gl_FragColor = color;\\n' +\n 'gl_FragColor.a = alpha;\\n' +\n '}',\n Convolute_7_1: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uMatrix[49];\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0, 0, 0, 0);\\n' +\n 'for (float h = 0.0; h < 7.0; h+=1.0) {\\n' +\n 'for (float w = 0.0; w < 7.0; w+=1.0) {\\n' +\n 'vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));\\n' +\n 'color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 7.0 + w)];\\n' +\n '}\\n' +\n '}\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n Convolute_7_0: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uMatrix[49];\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0, 0, 0, 1);\\n' +\n 'for (float h = 0.0; h < 7.0; h+=1.0) {\\n' +\n 'for (float w = 0.0; w < 7.0; w+=1.0) {\\n' +\n 'vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));\\n' +\n 'color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 7.0 + w)];\\n' +\n '}\\n' +\n '}\\n' +\n 'float alpha = texture2D(uTexture, vTexCoord).a;\\n' +\n 'gl_FragColor = color;\\n' +\n 'gl_FragColor.a = alpha;\\n' +\n '}',\n Convolute_9_1: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uMatrix[81];\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0, 0, 0, 0);\\n' +\n 'for (float h = 0.0; h < 9.0; h+=1.0) {\\n' +\n 'for (float w = 0.0; w < 9.0; w+=1.0) {\\n' +\n 'vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));\\n' +\n 'color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 9.0 + w)];\\n' +\n '}\\n' +\n '}\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n Convolute_9_0: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uMatrix[81];\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0, 0, 0, 1);\\n' +\n 'for (float h = 0.0; h < 9.0; h+=1.0) {\\n' +\n 'for (float w = 0.0; w < 9.0; w+=1.0) {\\n' +\n 'vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));\\n' +\n 'color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 9.0 + w)];\\n' +\n '}\\n' +\n '}\\n' +\n 'float alpha = texture2D(uTexture, vTexCoord).a;\\n' +\n 'gl_FragColor = color;\\n' +\n 'gl_FragColor.a = alpha;\\n' +\n '}',\n },\n\n /**\n * Constructor\n * @memberOf fabric.Image.filters.Convolute.prototype\n * @param {Object} [options] Options object\n * @param {Boolean} [options.opaque=false] Opaque value (true/false)\n * @param {Array} [options.matrix] Filter matrix\n */\n\n\n /**\n * Retrieves the cached shader.\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n retrieveShader: function(options) {\n var size = Math.sqrt(this.matrix.length);\n var cacheKey = this.type + '_' + size + '_' + (this.opaque ? 1 : 0);\n var shaderSource = this.fragmentSource[cacheKey];\n if (!options.programCache.hasOwnProperty(cacheKey)) {\n options.programCache[cacheKey] = this.createProgram(options.context, shaderSource);\n }\n return options.programCache[cacheKey];\n },\n\n /**\n * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n data = imageData.data,\n weights = this.matrix,\n side = Math.round(Math.sqrt(weights.length)),\n halfSide = Math.floor(side / 2),\n sw = imageData.width,\n sh = imageData.height,\n output = options.ctx.createImageData(sw, sh),\n dst = output.data,\n // go through the destination image pixels\n alphaFac = this.opaque ? 1 : 0,\n r, g, b, a, dstOff,\n scx, scy, srcOff, wt,\n x, y, cx, cy;\n\n for (y = 0; y < sh; y++) {\n for (x = 0; x < sw; x++) {\n dstOff = (y * sw + x) * 4;\n // calculate the weighed sum of the source image pixels that\n // fall under the convolution matrix\n r = 0; g = 0; b = 0; a = 0;\n\n for (cy = 0; cy < side; cy++) {\n for (cx = 0; cx < side; cx++) {\n scy = y + cy - halfSide;\n scx = x + cx - halfSide;\n\n // eslint-disable-next-line max-depth\n if (scy < 0 || scy >= sh || scx < 0 || scx >= sw) {\n continue;\n }\n\n srcOff = (scy * sw + scx) * 4;\n wt = weights[cy * side + cx];\n\n r += data[srcOff] * wt;\n g += data[srcOff + 1] * wt;\n b += data[srcOff + 2] * wt;\n // eslint-disable-next-line max-depth\n if (!alphaFac) {\n a += data[srcOff + 3] * wt;\n }\n }\n }\n dst[dstOff] = r;\n dst[dstOff + 1] = g;\n dst[dstOff + 2] = b;\n if (!alphaFac) {\n dst[dstOff + 3] = a;\n }\n else {\n dst[dstOff + 3] = data[dstOff + 3];\n }\n }\n }\n options.imageData = output;\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uMatrix: gl.getUniformLocation(program, 'uMatrix'),\n uOpaque: gl.getUniformLocation(program, 'uOpaque'),\n uHalfSize: gl.getUniformLocation(program, 'uHalfSize'),\n uSize: gl.getUniformLocation(program, 'uSize'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform1fv(uniformLocations.uMatrix, this.matrix);\n },\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject: function() {\n return extend(this.callSuper('toObject'), {\n opaque: this.opaque,\n matrix: this.matrix\n });\n }\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Convolute} Instance of fabric.Image.filters.Convolute\n */\n fabric.Image.filters.Convolute.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Grayscale image filter class\n * @class fabric.Image.filters.Grayscale\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Grayscale();\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.Grayscale = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Grayscale.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Grayscale',\n\n fragmentSource: {\n average: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'float average = (color.r + color.b + color.g) / 3.0;\\n' +\n 'gl_FragColor = vec4(average, average, average, color.a);\\n' +\n '}',\n lightness: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform int uMode;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 col = texture2D(uTexture, vTexCoord);\\n' +\n 'float average = (max(max(col.r, col.g),col.b) + min(min(col.r, col.g),col.b)) / 2.0;\\n' +\n 'gl_FragColor = vec4(average, average, average, col.a);\\n' +\n '}',\n luminosity: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform int uMode;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 col = texture2D(uTexture, vTexCoord);\\n' +\n 'float average = 0.21 * col.r + 0.72 * col.g + 0.07 * col.b;\\n' +\n 'gl_FragColor = vec4(average, average, average, col.a);\\n' +\n '}',\n },\n\n\n /**\n * Grayscale mode, between 'average', 'lightness', 'luminosity'\n * @param {String} type\n * @default\n */\n mode: 'average',\n\n mainParameter: 'mode',\n\n /**\n * Apply the Grayscale operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n data = imageData.data, i,\n len = data.length, value,\n mode = this.mode;\n for (i = 0; i < len; i += 4) {\n if (mode === 'average') {\n value = (data[i] + data[i + 1] + data[i + 2]) / 3;\n }\n else if (mode === 'lightness') {\n value = (Math.min(data[i], data[i + 1], data[i + 2]) +\n Math.max(data[i], data[i + 1], data[i + 2])) / 2;\n }\n else if (mode === 'luminosity') {\n value = 0.21 * data[i] + 0.72 * data[i + 1] + 0.07 * data[i + 2];\n }\n data[i] = value;\n data[i + 1] = value;\n data[i + 2] = value;\n }\n },\n\n /**\n * Retrieves the cached shader.\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n retrieveShader: function(options) {\n var cacheKey = this.type + '_' + this.mode;\n if (!options.programCache.hasOwnProperty(cacheKey)) {\n var shaderSource = this.fragmentSource[this.mode];\n options.programCache[cacheKey] = this.createProgram(options.context, shaderSource);\n }\n return options.programCache[cacheKey];\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uMode: gl.getUniformLocation(program, 'uMode'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n // default average mode.\n var mode = 1;\n gl.uniform1i(uniformLocations.uMode, mode);\n },\n\n /**\n * Grayscale filter isNeutralState implementation\n * The filter is never neutral\n * on the image\n **/\n isNeutralState: function() {\n return false;\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Grayscale} Instance of fabric.Image.filters.Grayscale\n */\n fabric.Image.filters.Grayscale.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Invert filter class\n * @class fabric.Image.filters.Invert\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Invert();\n * object.filters.push(filter);\n * object.applyFilters(canvas.renderAll.bind(canvas));\n */\n filters.Invert = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Invert.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Invert',\n\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform int uInvert;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'if (uInvert == 1) {\\n' +\n 'gl_FragColor = vec4(1.0 - color.r,1.0 -color.g,1.0 -color.b,color.a);\\n' +\n '} else {\\n' +\n 'gl_FragColor = color;\\n' +\n '}\\n' +\n '}',\n\n /**\n * Filter invert. if false, does nothing\n * @param {Boolean} invert\n * @default\n */\n invert: true,\n\n mainParameter: 'invert',\n\n /**\n * Apply the Invert operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n data = imageData.data, i,\n len = data.length;\n for (i = 0; i < len; i += 4) {\n data[i] = 255 - data[i];\n data[i + 1] = 255 - data[i + 1];\n data[i + 2] = 255 - data[i + 2];\n }\n },\n\n /**\n * Invert filter isNeutralState implementation\n * Used only in image applyFilters to discard filters that will not have an effect\n * on the image\n * @param {Object} options\n **/\n isNeutralState: function() {\n return !this.invert;\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uInvert: gl.getUniformLocation(program, 'uInvert'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform1i(uniformLocations.uInvert, this.invert);\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Invert} Instance of fabric.Image.filters.Invert\n */\n fabric.Image.filters.Invert.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n extend = fabric.util.object.extend,\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Noise filter class\n * @class fabric.Image.filters.Noise\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Noise#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Noise({\n * noise: 700\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\n filters.Noise = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Noise.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Noise',\n\n /**\n * Fragment source for the noise program\n */\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uStepH;\\n' +\n 'uniform float uNoise;\\n' +\n 'uniform float uSeed;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'float rand(vec2 co, float seed, float vScale) {\\n' +\n 'return fract(sin(dot(co.xy * vScale ,vec2(12.9898 , 78.233))) * 43758.5453 * (seed + 0.01) / 2.0);\\n' +\n '}\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'color.rgb += (0.5 - rand(vTexCoord, uSeed, 0.1 / uStepH)) * uNoise;\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n\n /**\n * Describe the property that is the filter parameter\n * @param {String} m\n * @default\n */\n mainParameter: 'noise',\n\n /**\n * Noise value, from\n * @param {Number} noise\n * @default\n */\n noise: 0,\n\n /**\n * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d: function(options) {\n if (this.noise === 0) {\n return;\n }\n var imageData = options.imageData,\n data = imageData.data, i, len = data.length,\n noise = this.noise, rand;\n\n for (i = 0, len = data.length; i < len; i += 4) {\n\n rand = (0.5 - Math.random()) * noise;\n\n data[i] += rand;\n data[i + 1] += rand;\n data[i + 2] += rand;\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uNoise: gl.getUniformLocation(program, 'uNoise'),\n uSeed: gl.getUniformLocation(program, 'uSeed'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform1f(uniformLocations.uNoise, this.noise / 255);\n gl.uniform1f(uniformLocations.uSeed, Math.random());\n },\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject: function() {\n return extend(this.callSuper('toObject'), {\n noise: this.noise\n });\n }\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Noise} Instance of fabric.Image.filters.Noise\n */\n fabric.Image.filters.Noise.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Pixelate filter class\n * @class fabric.Image.filters.Pixelate\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Pixelate#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Pixelate({\n * blocksize: 8\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.Pixelate = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Pixelate.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Pixelate',\n\n blocksize: 4,\n\n mainParameter: 'blocksize',\n\n /**\n * Fragment source for the Pixelate program\n */\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uBlocksize;\\n' +\n 'uniform float uStepW;\\n' +\n 'uniform float uStepH;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'float blockW = uBlocksize * uStepW;\\n' +\n 'float blockH = uBlocksize * uStepW;\\n' +\n 'int posX = int(vTexCoord.x / blockW);\\n' +\n 'int posY = int(vTexCoord.y / blockH);\\n' +\n 'float fposX = float(posX);\\n' +\n 'float fposY = float(posY);\\n' +\n 'vec2 squareCoords = vec2(fposX * blockW, fposY * blockH);\\n' +\n 'vec4 color = texture2D(uTexture, squareCoords);\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n\n /**\n * Apply the Pixelate operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n data = imageData.data,\n iLen = imageData.height,\n jLen = imageData.width,\n index, i, j, r, g, b, a,\n _i, _j, _iLen, _jLen;\n\n for (i = 0; i < iLen; i += this.blocksize) {\n for (j = 0; j < jLen; j += this.blocksize) {\n\n index = (i * 4) * jLen + (j * 4);\n\n r = data[index];\n g = data[index + 1];\n b = data[index + 2];\n a = data[index + 3];\n\n _iLen = Math.min(i + this.blocksize, iLen);\n _jLen = Math.min(j + this.blocksize, jLen);\n for (_i = i; _i < _iLen; _i++) {\n for (_j = j; _j < _jLen; _j++) {\n index = (_i * 4) * jLen + (_j * 4);\n data[index] = r;\n data[index + 1] = g;\n data[index + 2] = b;\n data[index + 3] = a;\n }\n }\n }\n }\n },\n\n /**\n * Indicate when the filter is not gonna apply changes to the image\n **/\n isNeutralState: function() {\n return this.blocksize === 1;\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uBlocksize: gl.getUniformLocation(program, 'uBlocksize'),\n uStepW: gl.getUniformLocation(program, 'uStepW'),\n uStepH: gl.getUniformLocation(program, 'uStepH'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform1f(uniformLocations.uBlocksize, this.blocksize);\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Pixelate} Instance of fabric.Image.filters.Pixelate\n */\n fabric.Image.filters.Pixelate.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n extend = fabric.util.object.extend,\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Remove white filter class\n * @class fabric.Image.filters.RemoveColor\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.RemoveColor#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.RemoveColor({\n * threshold: 0.2,\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\n filters.RemoveColor = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.RemoveColor.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'RemoveColor',\n\n /**\n * Color to remove, in any format understood by fabric.Color.\n * @param {String} type\n * @default\n */\n color: '#FFFFFF',\n\n /**\n * Fragment source for the brightness program\n */\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform vec4 uLow;\\n' +\n 'uniform vec4 uHigh;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'gl_FragColor = texture2D(uTexture, vTexCoord);\\n' +\n 'if(all(greaterThan(gl_FragColor.rgb,uLow.rgb)) && all(greaterThan(uHigh.rgb,gl_FragColor.rgb))) {\\n' +\n 'gl_FragColor.a = 0.0;\\n' +\n '}\\n' +\n '}',\n\n /**\n * distance to actual color, as value up or down from each r,g,b\n * between 0 and 1\n **/\n distance: 0.02,\n\n /**\n * For color to remove inside distance, use alpha channel for a smoother deletion\n * NOT IMPLEMENTED YET\n **/\n useAlpha: false,\n\n /**\n * Constructor\n * @memberOf fabric.Image.filters.RemoveWhite.prototype\n * @param {Object} [options] Options object\n * @param {Number} [options.color=#RRGGBB] Threshold value\n * @param {Number} [options.distance=10] Distance value\n */\n\n /**\n * Applies filter to canvas element\n * @param {Object} canvasEl Canvas element to apply filter to\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n data = imageData.data, i,\n distance = this.distance * 255,\n r, g, b,\n source = new fabric.Color(this.color).getSource(),\n lowC = [\n source[0] - distance,\n source[1] - distance,\n source[2] - distance,\n ],\n highC = [\n source[0] + distance,\n source[1] + distance,\n source[2] + distance,\n ];\n\n\n for (i = 0; i < data.length; i += 4) {\n r = data[i];\n g = data[i + 1];\n b = data[i + 2];\n\n if (r > lowC[0] &&\n g > lowC[1] &&\n b > lowC[2] &&\n r < highC[0] &&\n g < highC[1] &&\n b < highC[2]) {\n data[i + 3] = 0;\n }\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uLow: gl.getUniformLocation(program, 'uLow'),\n uHigh: gl.getUniformLocation(program, 'uHigh'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n var source = new fabric.Color(this.color).getSource(),\n distance = parseFloat(this.distance),\n lowC = [\n 0 + source[0] / 255 - distance,\n 0 + source[1] / 255 - distance,\n 0 + source[2] / 255 - distance,\n 1\n ],\n highC = [\n source[0] / 255 + distance,\n source[1] / 255 + distance,\n source[2] / 255 + distance,\n 1\n ];\n gl.uniform4fv(uniformLocations.uLow, lowC);\n gl.uniform4fv(uniformLocations.uHigh, highC);\n },\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject: function() {\n return extend(this.callSuper('toObject'), {\n color: this.color,\n distance: this.distance\n });\n }\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.RemoveColor} Instance of fabric.Image.filters.RemoveWhite\n */\n fabric.Image.filters.RemoveColor.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n var matrices = {\n Brownie: [\n 0.59970,0.34553,-0.27082,0,0.186,\n -0.03770,0.86095,0.15059,0,-0.1449,\n 0.24113,-0.07441,0.44972,0,-0.02965,\n 0,0,0,1,0\n ],\n Vintage: [\n 0.62793,0.32021,-0.03965,0,0.03784,\n 0.02578,0.64411,0.03259,0,0.02926,\n 0.04660,-0.08512,0.52416,0,0.02023,\n 0,0,0,1,0\n ],\n Kodachrome: [\n 1.12855,-0.39673,-0.03992,0,0.24991,\n -0.16404,1.08352,-0.05498,0,0.09698,\n -0.16786,-0.56034,1.60148,0,0.13972,\n 0,0,0,1,0\n ],\n Technicolor: [\n 1.91252,-0.85453,-0.09155,0,0.04624,\n -0.30878,1.76589,-0.10601,0,-0.27589,\n -0.23110,-0.75018,1.84759,0,0.12137,\n 0,0,0,1,0\n ],\n Polaroid: [\n 1.438,-0.062,-0.062,0,0,\n -0.122,1.378,-0.122,0,0,\n -0.016,-0.016,1.483,0,0,\n 0,0,0,1,0\n ],\n Sepia: [\n 0.393, 0.769, 0.189, 0, 0,\n 0.349, 0.686, 0.168, 0, 0,\n 0.272, 0.534, 0.131, 0, 0,\n 0, 0, 0, 1, 0\n ],\n BlackWhite: [\n 1.5, 1.5, 1.5, 0, -1,\n 1.5, 1.5, 1.5, 0, -1,\n 1.5, 1.5, 1.5, 0, -1,\n 0, 0, 0, 1, 0,\n ]\n };\n\n for (var key in matrices) {\n filters[key] = createClass(filters.ColorMatrix, /** @lends fabric.Image.filters.Sepia.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: key,\n\n /**\n * Colormatrix for the effect\n * array of 20 floats. Numbers in positions 4, 9, 14, 19 loose meaning\n * outside the -1, 1 range.\n * @param {Array} matrix array of 20 numbers.\n * @default\n */\n matrix: matrices[key],\n\n /**\n * Lock the matrix export for this kind of static, parameter less filters.\n */\n mainParameter: false,\n /**\n * Lock the colormatrix on the color part, skipping alpha\n */\n colorsOnly: true,\n\n });\n fabric.Image.filters[key].fromObject = fabric.Image.filters.BaseFilter.fromObject;\n }\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n 'use strict';\n\n var fabric = global.fabric,\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Color Blend filter class\n * @class fabric.Image.filter.BlendColor\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @example\n * var filter = new fabric.Image.filters.BlendColor({\n * color: '#000',\n * mode: 'multiply'\n * });\n *\n * var filter = new fabric.Image.filters.BlendImage({\n * image: fabricImageObject,\n * mode: 'multiply',\n * alpha: 0.5\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\n\n filters.BlendColor = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Blend.prototype */ {\n type: 'BlendColor',\n\n /**\n * Color to make the blend operation with. default to a reddish color since black or white\n * gives always strong result.\n * @type String\n * @default\n **/\n color: '#F95C63',\n\n /**\n * Blend mode for the filter: one of multiply, add, diff, screen, subtract,\n * darken, lighten, overlay, exclusion, tint.\n * @type String\n * @default\n **/\n mode: 'multiply',\n\n /**\n * alpha value. represent the strength of the blend color operation.\n * @type Number\n * @default\n **/\n alpha: 1,\n\n /**\n * Fragment source for the Multiply program\n */\n fragmentSource: {\n multiply: 'gl_FragColor.rgb *= uColor.rgb;\\n',\n screen: 'gl_FragColor.rgb = 1.0 - (1.0 - gl_FragColor.rgb) * (1.0 - uColor.rgb);\\n',\n add: 'gl_FragColor.rgb += uColor.rgb;\\n',\n diff: 'gl_FragColor.rgb = abs(gl_FragColor.rgb - uColor.rgb);\\n',\n subtract: 'gl_FragColor.rgb -= uColor.rgb;\\n',\n lighten: 'gl_FragColor.rgb = max(gl_FragColor.rgb, uColor.rgb);\\n',\n darken: 'gl_FragColor.rgb = min(gl_FragColor.rgb, uColor.rgb);\\n',\n exclusion: 'gl_FragColor.rgb += uColor.rgb - 2.0 * (uColor.rgb * gl_FragColor.rgb);\\n',\n overlay: 'if (uColor.r < 0.5) {\\n' +\n 'gl_FragColor.r *= 2.0 * uColor.r;\\n' +\n '} else {\\n' +\n 'gl_FragColor.r = 1.0 - 2.0 * (1.0 - gl_FragColor.r) * (1.0 - uColor.r);\\n' +\n '}\\n' +\n 'if (uColor.g < 0.5) {\\n' +\n 'gl_FragColor.g *= 2.0 * uColor.g;\\n' +\n '} else {\\n' +\n 'gl_FragColor.g = 1.0 - 2.0 * (1.0 - gl_FragColor.g) * (1.0 - uColor.g);\\n' +\n '}\\n' +\n 'if (uColor.b < 0.5) {\\n' +\n 'gl_FragColor.b *= 2.0 * uColor.b;\\n' +\n '} else {\\n' +\n 'gl_FragColor.b = 1.0 - 2.0 * (1.0 - gl_FragColor.b) * (1.0 - uColor.b);\\n' +\n '}\\n',\n tint: 'gl_FragColor.rgb *= (1.0 - uColor.a);\\n' +\n 'gl_FragColor.rgb += uColor.rgb;\\n',\n },\n\n /**\n * build the fragment source for the filters, joining the common part with\n * the specific one.\n * @param {String} mode the mode of the filter, a key of this.fragmentSource\n * @return {String} the source to be compiled\n * @private\n */\n buildSource: function(mode) {\n return 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform vec4 uColor;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'gl_FragColor = color;\\n' +\n 'if (color.a > 0.0) {\\n' +\n this.fragmentSource[mode] +\n '}\\n' +\n '}';\n },\n\n /**\n * Retrieves the cached shader.\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n retrieveShader: function(options) {\n var cacheKey = this.type + '_' + this.mode, shaderSource;\n if (!options.programCache.hasOwnProperty(cacheKey)) {\n shaderSource = this.buildSource(this.mode);\n options.programCache[cacheKey] = this.createProgram(options.context, shaderSource);\n }\n return options.programCache[cacheKey];\n },\n\n /**\n * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n data = imageData.data, iLen = data.length,\n tr, tg, tb,\n r, g, b,\n source, alpha1 = 1 - this.alpha;\n\n source = new fabric.Color(this.color).getSource();\n tr = source[0] * this.alpha;\n tg = source[1] * this.alpha;\n tb = source[2] * this.alpha;\n\n for (var i = 0; i < iLen; i += 4) {\n\n r = data[i];\n g = data[i + 1];\n b = data[i + 2];\n\n switch (this.mode) {\n case 'multiply':\n data[i] = r * tr / 255;\n data[i + 1] = g * tg / 255;\n data[i + 2] = b * tb / 255;\n break;\n case 'screen':\n data[i] = 255 - (255 - r) * (255 - tr) / 255;\n data[i + 1] = 255 - (255 - g) * (255 - tg) / 255;\n data[i + 2] = 255 - (255 - b) * (255 - tb) / 255;\n break;\n case 'add':\n data[i] = r + tr;\n data[i + 1] = g + tg;\n data[i + 2] = b + tb;\n break;\n case 'diff':\n case 'difference':\n data[i] = Math.abs(r - tr);\n data[i + 1] = Math.abs(g - tg);\n data[i + 2] = Math.abs(b - tb);\n break;\n case 'subtract':\n data[i] = r - tr;\n data[i + 1] = g - tg;\n data[i + 2] = b - tb;\n break;\n case 'darken':\n data[i] = Math.min(r, tr);\n data[i + 1] = Math.min(g, tg);\n data[i + 2] = Math.min(b, tb);\n break;\n case 'lighten':\n data[i] = Math.max(r, tr);\n data[i + 1] = Math.max(g, tg);\n data[i + 2] = Math.max(b, tb);\n break;\n case 'overlay':\n data[i] = tr < 128 ? (2 * r * tr / 255) : (255 - 2 * (255 - r) * (255 - tr) / 255);\n data[i + 1] = tg < 128 ? (2 * g * tg / 255) : (255 - 2 * (255 - g) * (255 - tg) / 255);\n data[i + 2] = tb < 128 ? (2 * b * tb / 255) : (255 - 2 * (255 - b) * (255 - tb) / 255);\n break;\n case 'exclusion':\n data[i] = tr + r - ((2 * tr * r) / 255);\n data[i + 1] = tg + g - ((2 * tg * g) / 255);\n data[i + 2] = tb + b - ((2 * tb * b) / 255);\n break;\n case 'tint':\n data[i] = tr + r * alpha1;\n data[i + 1] = tg + g * alpha1;\n data[i + 2] = tb + b * alpha1;\n }\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uColor: gl.getUniformLocation(program, 'uColor'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n var source = new fabric.Color(this.color).getSource();\n source[0] = this.alpha * source[0] / 255;\n source[1] = this.alpha * source[1] / 255;\n source[2] = this.alpha * source[2] / 255;\n source[3] = this.alpha;\n gl.uniform4fv(uniformLocations.uColor, source);\n },\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject: function() {\n return {\n type: this.type,\n color: this.color,\n mode: this.mode,\n alpha: this.alpha\n };\n }\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.BlendColor} Instance of fabric.Image.filters.BlendColor\n */\n fabric.Image.filters.BlendColor.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n 'use strict';\n\n var fabric = global.fabric,\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Image Blend filter class\n * @class fabric.Image.filter.BlendImage\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @example\n * var filter = new fabric.Image.filters.BlendColor({\n * color: '#000',\n * mode: 'multiply'\n * });\n *\n * var filter = new fabric.Image.filters.BlendImage({\n * image: fabricImageObject,\n * mode: 'multiply',\n * alpha: 0.5\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\n\n filters.BlendImage = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.BlendImage.prototype */ {\n type: 'BlendImage',\n\n /**\n * Color to make the blend operation with. default to a reddish color since black or white\n * gives always strong result.\n **/\n image: null,\n\n /**\n * Blend mode for the filter (one of \"multiply\", \"mask\")\n * @type String\n * @default\n **/\n mode: 'multiply',\n\n /**\n * alpha value. represent the strength of the blend image operation.\n * not implemented.\n **/\n alpha: 1,\n\n vertexSource: 'attribute vec2 aPosition;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'varying vec2 vTexCoord2;\\n' +\n 'uniform mat3 uTransformMatrix;\\n' +\n 'void main() {\\n' +\n 'vTexCoord = aPosition;\\n' +\n 'vTexCoord2 = (uTransformMatrix * vec3(aPosition, 1.0)).xy;\\n' +\n 'gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\\n' +\n '}',\n\n /**\n * Fragment source for the Multiply program\n */\n fragmentSource: {\n multiply: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform sampler2D uImage;\\n' +\n 'uniform vec4 uColor;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'varying vec2 vTexCoord2;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'vec4 color2 = texture2D(uImage, vTexCoord2);\\n' +\n 'color.rgba *= color2.rgba;\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n mask: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform sampler2D uImage;\\n' +\n 'uniform vec4 uColor;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'varying vec2 vTexCoord2;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'vec4 color2 = texture2D(uImage, vTexCoord2);\\n' +\n 'color.a = color2.a;\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n },\n\n /**\n * Retrieves the cached shader.\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n retrieveShader: function(options) {\n var cacheKey = this.type + '_' + this.mode;\n var shaderSource = this.fragmentSource[this.mode];\n if (!options.programCache.hasOwnProperty(cacheKey)) {\n options.programCache[cacheKey] = this.createProgram(options.context, shaderSource);\n }\n return options.programCache[cacheKey];\n },\n\n applyToWebGL: function(options) {\n // load texture to blend.\n var gl = options.context,\n texture = this.createTexture(options.filterBackend, this.image);\n this.bindAdditionalTexture(gl, texture, gl.TEXTURE1);\n this.callSuper('applyToWebGL', options);\n this.unbindAdditionalTexture(gl, gl.TEXTURE1);\n },\n\n createTexture: function(backend, image) {\n return backend.getCachedTexture(image.cacheKey, image._element);\n },\n\n /**\n * Calculate a transformMatrix to adapt the image to blend over\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n calculateMatrix: function() {\n var image = this.image,\n width = image._element.width,\n height = image._element.height;\n return [\n 1 / image.scaleX, 0, 0,\n 0, 1 / image.scaleY, 0,\n -image.left / width, -image.top / height, 1\n ];\n },\n\n /**\n * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n resources = options.filterBackend.resources,\n data = imageData.data, iLen = data.length,\n width = imageData.width,\n height = imageData.height,\n tr, tg, tb, ta,\n r, g, b, a,\n canvas1, context, image = this.image, blendData;\n\n if (!resources.blendImage) {\n resources.blendImage = fabric.util.createCanvasElement();\n }\n canvas1 = resources.blendImage;\n context = canvas1.getContext('2d');\n if (canvas1.width !== width || canvas1.height !== height) {\n canvas1.width = width;\n canvas1.height = height;\n }\n else {\n context.clearRect(0, 0, width, height);\n }\n context.setTransform(image.scaleX, 0, 0, image.scaleY, image.left, image.top);\n context.drawImage(image._element, 0, 0, width, height);\n blendData = context.getImageData(0, 0, width, height).data;\n for (var i = 0; i < iLen; i += 4) {\n\n r = data[i];\n g = data[i + 1];\n b = data[i + 2];\n a = data[i + 3];\n\n tr = blendData[i];\n tg = blendData[i + 1];\n tb = blendData[i + 2];\n ta = blendData[i + 3];\n\n switch (this.mode) {\n case 'multiply':\n data[i] = r * tr / 255;\n data[i + 1] = g * tg / 255;\n data[i + 2] = b * tb / 255;\n data[i + 3] = a * ta / 255;\n break;\n case 'mask':\n data[i + 3] = ta;\n break;\n }\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uTransformMatrix: gl.getUniformLocation(program, 'uTransformMatrix'),\n uImage: gl.getUniformLocation(program, 'uImage'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n var matrix = this.calculateMatrix();\n gl.uniform1i(uniformLocations.uImage, 1); // texture unit 1.\n gl.uniformMatrix3fv(uniformLocations.uTransformMatrix, false, matrix);\n },\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject: function() {\n return {\n type: this.type,\n image: this.image && this.image.toObject(),\n mode: this.mode,\n alpha: this.alpha\n };\n }\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} callback to be invoked after filter creation\n * @return {fabric.Image.filters.BlendImage} Instance of fabric.Image.filters.BlendImage\n */\n fabric.Image.filters.BlendImage.fromObject = function(object, callback) {\n fabric.Image.fromObject(object.image, function(image) {\n var options = fabric.util.object.clone(object);\n options.image = image;\n callback(new fabric.Image.filters.BlendImage(options));\n });\n };\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }), pow = Math.pow, floor = Math.floor,\n sqrt = Math.sqrt, abs = Math.abs, round = Math.round, sin = Math.sin,\n ceil = Math.ceil,\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Resize image filter class\n * @class fabric.Image.filters.Resize\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Resize();\n * object.filters.push(filter);\n * object.applyFilters(canvas.renderAll.bind(canvas));\n */\n filters.Resize = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Resize.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Resize',\n\n /**\n * Resize type\n * for webgl resizeType is just lanczos, for canvas2d can be:\n * bilinear, hermite, sliceHack, lanczos.\n * @param {String} resizeType\n * @default\n */\n resizeType: 'hermite',\n\n /**\n * Scale factor for resizing, x axis\n * @param {Number} scaleX\n * @default\n */\n scaleX: 1,\n\n /**\n * Scale factor for resizing, y axis\n * @param {Number} scaleY\n * @default\n */\n scaleY: 1,\n\n /**\n * LanczosLobes parameter for lanczos filter, valid for resizeType lanczos\n * @param {Number} lanczosLobes\n * @default\n */\n lanczosLobes: 3,\n\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uDelta: gl.getUniformLocation(program, 'uDelta'),\n uTaps: gl.getUniformLocation(program, 'uTaps'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform2fv(uniformLocations.uDelta, this.horizontal ? [1 / this.width, 0] : [0, 1 / this.height]);\n gl.uniform1fv(uniformLocations.uTaps, this.taps);\n },\n\n /**\n * Retrieves the cached shader.\n * @param {Object} options\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n retrieveShader: function(options) {\n var filterWindow = this.getFilterWindow(), cacheKey = this.type + '_' + filterWindow;\n if (!options.programCache.hasOwnProperty(cacheKey)) {\n var fragmentShader = this.generateShader(filterWindow);\n options.programCache[cacheKey] = this.createProgram(options.context, fragmentShader);\n }\n return options.programCache[cacheKey];\n },\n\n getFilterWindow: function() {\n var scale = this.tempScale;\n return Math.ceil(this.lanczosLobes / scale);\n },\n\n getTaps: function() {\n var lobeFunction = this.lanczosCreate(this.lanczosLobes), scale = this.tempScale,\n filterWindow = this.getFilterWindow(), taps = new Array(filterWindow);\n for (var i = 1; i <= filterWindow; i++) {\n taps[i - 1] = lobeFunction(i * scale);\n }\n return taps;\n },\n\n /**\n * Generate vertex and shader sources from the necessary steps numbers\n * @param {Number} filterWindow\n */\n generateShader: function(filterWindow) {\n var offsets = new Array(filterWindow),\n fragmentShader = this.fragmentSourceTOP, filterWindow;\n\n for (var i = 1; i <= filterWindow; i++) {\n offsets[i - 1] = i + '.0 * uDelta';\n }\n\n fragmentShader += 'uniform float uTaps[' + filterWindow + '];\\n';\n fragmentShader += 'void main() {\\n';\n fragmentShader += ' vec4 color = texture2D(uTexture, vTexCoord);\\n';\n fragmentShader += ' float sum = 1.0;\\n';\n\n offsets.forEach(function(offset, i) {\n fragmentShader += ' color += texture2D(uTexture, vTexCoord + ' + offset + ') * uTaps[' + i + '];\\n';\n fragmentShader += ' color += texture2D(uTexture, vTexCoord - ' + offset + ') * uTaps[' + i + '];\\n';\n fragmentShader += ' sum += 2.0 * uTaps[' + i + '];\\n';\n });\n fragmentShader += ' gl_FragColor = color / sum;\\n';\n fragmentShader += '}';\n return fragmentShader;\n },\n\n fragmentSourceTOP: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform vec2 uDelta;\\n' +\n 'varying vec2 vTexCoord;\\n',\n\n /**\n * Apply the resize filter to the image\n * Determines whether to use WebGL or Canvas2D based on the options.webgl flag.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyTo: function(options) {\n if (options.webgl) {\n options.passes++;\n this.width = options.sourceWidth;\n this.horizontal = true;\n this.dW = Math.round(this.width * this.scaleX);\n this.dH = options.sourceHeight;\n this.tempScale = this.dW / this.width;\n this.taps = this.getTaps();\n options.destinationWidth = this.dW;\n this._setupFrameBuffer(options);\n this.applyToWebGL(options);\n this._swapTextures(options);\n options.sourceWidth = options.destinationWidth;\n\n this.height = options.sourceHeight;\n this.horizontal = false;\n this.dH = Math.round(this.height * this.scaleY);\n this.tempScale = this.dH / this.height;\n this.taps = this.getTaps();\n options.destinationHeight = this.dH;\n this._setupFrameBuffer(options);\n this.applyToWebGL(options);\n this._swapTextures(options);\n options.sourceHeight = options.destinationHeight;\n }\n else {\n this.applyTo2d(options);\n }\n },\n\n isNeutralState: function() {\n return this.scaleX === 1 && this.scaleY === 1;\n },\n\n lanczosCreate: function(lobes) {\n return function(x) {\n if (x >= lobes || x <= -lobes) {\n return 0.0;\n }\n if (x < 1.19209290E-07 && x > -1.19209290E-07) {\n return 1.0;\n }\n x *= Math.PI;\n var xx = x / lobes;\n return (sin(x) / x) * sin(xx) / xx;\n };\n },\n\n /**\n * Applies filter to canvas element\n * @memberOf fabric.Image.filters.Resize.prototype\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} scaleX\n * @param {Number} scaleY\n */\n applyTo2d: function(options) {\n var imageData = options.imageData,\n scaleX = this.scaleX,\n scaleY = this.scaleY;\n\n this.rcpScaleX = 1 / scaleX;\n this.rcpScaleY = 1 / scaleY;\n\n var oW = imageData.width, oH = imageData.height,\n dW = round(oW * scaleX), dH = round(oH * scaleY),\n newData;\n\n if (this.resizeType === 'sliceHack') {\n newData = this.sliceByTwo(options, oW, oH, dW, dH);\n }\n else if (this.resizeType === 'hermite') {\n newData = this.hermiteFastResize(options, oW, oH, dW, dH);\n }\n else if (this.resizeType === 'bilinear') {\n newData = this.bilinearFiltering(options, oW, oH, dW, dH);\n }\n else if (this.resizeType === 'lanczos') {\n newData = this.lanczosResize(options, oW, oH, dW, dH);\n }\n options.imageData = newData;\n },\n\n /**\n * Filter sliceByTwo\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n sliceByTwo: function(options, oW, oH, dW, dH) {\n var imageData = options.imageData,\n mult = 0.5, doneW = false, doneH = false, stepW = oW * mult,\n stepH = oH * mult, resources = fabric.filterBackend.resources,\n tmpCanvas, ctx, sX = 0, sY = 0, dX = oW, dY = 0;\n if (!resources.sliceByTwo) {\n resources.sliceByTwo = document.createElement('canvas');\n }\n tmpCanvas = resources.sliceByTwo;\n if (tmpCanvas.width < oW * 1.5 || tmpCanvas.height < oH) {\n tmpCanvas.width = oW * 1.5;\n tmpCanvas.height = oH;\n }\n ctx = tmpCanvas.getContext('2d');\n ctx.clearRect(0, 0, oW * 1.5, oH);\n ctx.putImageData(imageData, 0, 0);\n\n dW = floor(dW);\n dH = floor(dH);\n\n while (!doneW || !doneH) {\n oW = stepW;\n oH = stepH;\n if (dW < floor(stepW * mult)) {\n stepW = floor(stepW * mult);\n }\n else {\n stepW = dW;\n doneW = true;\n }\n if (dH < floor(stepH * mult)) {\n stepH = floor(stepH * mult);\n }\n else {\n stepH = dH;\n doneH = true;\n }\n ctx.drawImage(tmpCanvas, sX, sY, oW, oH, dX, dY, stepW, stepH);\n sX = dX;\n sY = dY;\n dY += stepH;\n }\n return ctx.getImageData(sX, sY, dW, dH);\n },\n\n /**\n * Filter lanczosResize\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n lanczosResize: function(options, oW, oH, dW, dH) {\n\n function process(u) {\n var v, i, weight, idx, a, red, green,\n blue, alpha, fX, fY;\n center.x = (u + 0.5) * ratioX;\n icenter.x = floor(center.x);\n for (v = 0; v < dH; v++) {\n center.y = (v + 0.5) * ratioY;\n icenter.y = floor(center.y);\n a = 0; red = 0; green = 0; blue = 0; alpha = 0;\n for (i = icenter.x - range2X; i <= icenter.x + range2X; i++) {\n if (i < 0 || i >= oW) {\n continue;\n }\n fX = floor(1000 * abs(i - center.x));\n if (!cacheLanc[fX]) {\n cacheLanc[fX] = { };\n }\n for (var j = icenter.y - range2Y; j <= icenter.y + range2Y; j++) {\n if (j < 0 || j >= oH) {\n continue;\n }\n fY = floor(1000 * abs(j - center.y));\n if (!cacheLanc[fX][fY]) {\n cacheLanc[fX][fY] = lanczos(sqrt(pow(fX * rcpRatioX, 2) + pow(fY * rcpRatioY, 2)) / 1000);\n }\n weight = cacheLanc[fX][fY];\n if (weight > 0) {\n idx = (j * oW + i) * 4;\n a += weight;\n red += weight * srcData[idx];\n green += weight * srcData[idx + 1];\n blue += weight * srcData[idx + 2];\n alpha += weight * srcData[idx + 3];\n }\n }\n }\n idx = (v * dW + u) * 4;\n destData[idx] = red / a;\n destData[idx + 1] = green / a;\n destData[idx + 2] = blue / a;\n destData[idx + 3] = alpha / a;\n }\n\n if (++u < dW) {\n return process(u);\n }\n else {\n return destImg;\n }\n }\n\n var srcData = options.imageData.data,\n destImg = options.ctx.createImageData(dW, dH),\n destData = destImg.data,\n lanczos = this.lanczosCreate(this.lanczosLobes),\n ratioX = this.rcpScaleX, ratioY = this.rcpScaleY,\n rcpRatioX = 2 / this.rcpScaleX, rcpRatioY = 2 / this.rcpScaleY,\n range2X = ceil(ratioX * this.lanczosLobes / 2),\n range2Y = ceil(ratioY * this.lanczosLobes / 2),\n cacheLanc = { }, center = { }, icenter = { };\n\n return process(0);\n },\n\n /**\n * bilinearFiltering\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n bilinearFiltering: function(options, oW, oH, dW, dH) {\n var a, b, c, d, x, y, i, j, xDiff, yDiff, chnl,\n color, offset = 0, origPix, ratioX = this.rcpScaleX,\n ratioY = this.rcpScaleY,\n w4 = 4 * (oW - 1), img = options.imageData,\n pixels = img.data, destImage = options.ctx.createImageData(dW, dH),\n destPixels = destImage.data;\n for (i = 0; i < dH; i++) {\n for (j = 0; j < dW; j++) {\n x = floor(ratioX * j);\n y = floor(ratioY * i);\n xDiff = ratioX * j - x;\n yDiff = ratioY * i - y;\n origPix = 4 * (y * oW + x);\n\n for (chnl = 0; chnl < 4; chnl++) {\n a = pixels[origPix + chnl];\n b = pixels[origPix + 4 + chnl];\n c = pixels[origPix + w4 + chnl];\n d = pixels[origPix + w4 + 4 + chnl];\n color = a * (1 - xDiff) * (1 - yDiff) + b * xDiff * (1 - yDiff) +\n c * yDiff * (1 - xDiff) + d * xDiff * yDiff;\n destPixels[offset++] = color;\n }\n }\n }\n return destImage;\n },\n\n /**\n * hermiteFastResize\n * @param {Object} canvasEl Canvas element to apply filter to\n * @param {Number} oW Original Width\n * @param {Number} oH Original Height\n * @param {Number} dW Destination Width\n * @param {Number} dH Destination Height\n * @returns {ImageData}\n */\n hermiteFastResize: function(options, oW, oH, dW, dH) {\n var ratioW = this.rcpScaleX, ratioH = this.rcpScaleY,\n ratioWHalf = ceil(ratioW / 2),\n ratioHHalf = ceil(ratioH / 2),\n img = options.imageData, data = img.data,\n img2 = options.ctx.createImageData(dW, dH), data2 = img2.data;\n for (var j = 0; j < dH; j++) {\n for (var i = 0; i < dW; i++) {\n var x2 = (i + j * dW) * 4, weight = 0, weights = 0, weightsAlpha = 0,\n gxR = 0, gxG = 0, gxB = 0, gxA = 0, centerY = (j + 0.5) * ratioH;\n for (var yy = floor(j * ratioH); yy < (j + 1) * ratioH; yy++) {\n var dy = abs(centerY - (yy + 0.5)) / ratioHHalf,\n centerX = (i + 0.5) * ratioW, w0 = dy * dy;\n for (var xx = floor(i * ratioW); xx < (i + 1) * ratioW; xx++) {\n var dx = abs(centerX - (xx + 0.5)) / ratioWHalf,\n w = sqrt(w0 + dx * dx);\n /* eslint-disable max-depth */\n if (w > 1 && w < -1) {\n continue;\n }\n //hermite filter\n weight = 2 * w * w * w - 3 * w * w + 1;\n if (weight > 0) {\n dx = 4 * (xx + yy * oW);\n //alpha\n gxA += weight * data[dx + 3];\n weightsAlpha += weight;\n //colors\n if (data[dx + 3] < 255) {\n weight = weight * data[dx + 3] / 250;\n }\n gxR += weight * data[dx];\n gxG += weight * data[dx + 1];\n gxB += weight * data[dx + 2];\n weights += weight;\n }\n /* eslint-enable max-depth */\n }\n }\n data2[x2] = gxR / weights;\n data2[x2 + 1] = gxG / weights;\n data2[x2 + 2] = gxB / weights;\n data2[x2 + 3] = gxA / weightsAlpha;\n }\n }\n return img2;\n },\n\n /**\n * Returns object representation of an instance\n * @return {Object} Object representation of an instance\n */\n toObject: function() {\n return {\n type: this.type,\n scaleX: this.scaleX,\n scaleY: this.scaleY,\n resizeType: this.resizeType,\n lanczosLobes: this.lanczosLobes\n };\n }\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Resize} Instance of fabric.Image.filters.Resize\n */\n fabric.Image.filters.Resize.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Contrast filter class\n * @class fabric.Image.filters.Contrast\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Contrast#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Contrast({\n * contrast: 0.25\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.Contrast = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Contrast.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Contrast',\n\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uContrast;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'float contrastF = 1.015 * (uContrast + 1.0) / (1.0 * (1.015 - uContrast));\\n' +\n 'color.rgb = contrastF * (color.rgb - 0.5) + 0.5;\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n\n /**\n * contrast value, range from -1 to 1.\n * @param {Number} contrast\n * @default 0\n */\n contrast: 0,\n\n mainParameter: 'contrast',\n\n /**\n * Constructor\n * @memberOf fabric.Image.filters.Contrast.prototype\n * @param {Object} [options] Options object\n * @param {Number} [options.contrast=0] Value to contrast the image up (-1...1)\n */\n\n /**\n * Apply the Contrast operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d: function(options) {\n if (this.contrast === 0) {\n return;\n }\n var imageData = options.imageData, i, len,\n data = imageData.data, len = data.length,\n contrast = Math.floor(this.contrast * 255),\n contrastF = 259 * (contrast + 255) / (255 * (259 - contrast));\n\n for (i = 0; i < len; i += 4) {\n data[i] = contrastF * (data[i] - 128) + 128;\n data[i + 1] = contrastF * (data[i + 1] - 128) + 128;\n data[i + 2] = contrastF * (data[i + 2] - 128) + 128;\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uContrast: gl.getUniformLocation(program, 'uContrast'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform1f(uniformLocations.uContrast, this.contrast);\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Contrast} Instance of fabric.Image.filters.Contrast\n */\n fabric.Image.filters.Contrast.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Saturate filter class\n * @class fabric.Image.filters.Saturation\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Saturation#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Saturation({\n * saturation: 1\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.Saturation = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Saturation.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Saturation',\n\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uSaturation;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'float rgMax = max(color.r, color.g);\\n' +\n 'float rgbMax = max(rgMax, color.b);\\n' +\n 'color.r += rgbMax != color.r ? (rgbMax - color.r) * uSaturation : 0.00;\\n' +\n 'color.g += rgbMax != color.g ? (rgbMax - color.g) * uSaturation : 0.00;\\n' +\n 'color.b += rgbMax != color.b ? (rgbMax - color.b) * uSaturation : 0.00;\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n\n /**\n * Saturation value, from -1 to 1.\n * Increases/decreases the color saturation.\n * A value of 0 has no effect.\n * \n * @param {Number} saturation\n * @default\n */\n saturation: 0,\n\n mainParameter: 'saturation',\n\n /**\n * Constructor\n * @memberOf fabric.Image.filters.Saturate.prototype\n * @param {Object} [options] Options object\n * @param {Number} [options.saturate=0] Value to saturate the image (-1...1)\n */\n\n /**\n * Apply the Saturation operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d: function(options) {\n if (this.saturation === 0) {\n return;\n }\n var imageData = options.imageData,\n data = imageData.data, len = data.length,\n adjust = -this.saturation, i, max;\n\n for (i = 0; i < len; i += 4) {\n max = Math.max(data[i], data[i + 1], data[i + 2]);\n data[i] += max !== data[i] ? (max - data[i]) * adjust : 0;\n data[i + 1] += max !== data[i + 1] ? (max - data[i + 1]) * adjust : 0;\n data[i + 2] += max !== data[i + 2] ? (max - data[i + 2]) * adjust : 0;\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uSaturation: gl.getUniformLocation(program, 'uSaturation'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform1f(uniformLocations.uSaturation, -this.saturation);\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Saturation} Instance of fabric.Image.filters.Saturate\n */\n fabric.Image.filters.Saturation.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Vibrance filter class\n * @class fabric.Image.filters.Vibrance\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Vibrance#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Vibrance({\n * vibrance: 1\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.Vibrance = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Vibrance.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Vibrance',\n\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform float uVibrance;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'float max = max(color.r, max(color.g, color.b));\\n' +\n 'float avg = (color.r + color.g + color.b) / 3.0;\\n' +\n 'float amt = (abs(max - avg) * 2.0) * uVibrance;\\n' +\n 'color.r += max != color.r ? (max - color.r) * amt : 0.00;\\n' +\n 'color.g += max != color.g ? (max - color.g) * amt : 0.00;\\n' +\n 'color.b += max != color.b ? (max - color.b) * amt : 0.00;\\n' +\n 'gl_FragColor = color;\\n' +\n '}',\n\n /**\n * Vibrance value, from -1 to 1.\n * Increases/decreases the saturation of more muted colors with less effect on saturated colors.\n * A value of 0 has no effect.\n * \n * @param {Number} vibrance\n * @default\n */\n vibrance: 0,\n\n mainParameter: 'vibrance',\n\n /**\n * Constructor\n * @memberOf fabric.Image.filters.Vibrance.prototype\n * @param {Object} [options] Options object\n * @param {Number} [options.vibrance=0] Vibrance value for the image (between -1 and 1)\n */\n\n /**\n * Apply the Vibrance operation to a Uint8ClampedArray representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered.\n */\n applyTo2d: function(options) {\n if (this.vibrance === 0) {\n return;\n }\n var imageData = options.imageData,\n data = imageData.data, len = data.length,\n adjust = -this.vibrance, i, max, avg, amt;\n\n for (i = 0; i < len; i += 4) {\n max = Math.max(data[i], data[i + 1], data[i + 2]);\n avg = (data[i] + data[i + 1] + data[i + 2]) / 3;\n amt = ((Math.abs(max - avg) * 2 / 255) * adjust);\n data[i] += max !== data[i] ? (max - data[i]) * amt : 0;\n data[i + 1] += max !== data[i + 1] ? (max - data[i + 1]) * amt : 0;\n data[i + 2] += max !== data[i + 2] ? (max - data[i + 2]) * amt : 0;\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uVibrance: gl.getUniformLocation(program, 'uVibrance'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform1f(uniformLocations.uVibrance, -this.vibrance);\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Vibrance} Instance of fabric.Image.filters.Vibrance\n */\n fabric.Image.filters.Vibrance.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Blur filter class\n * @class fabric.Image.filters.Blur\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Blur#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Blur({\n * blur: 0.5\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n * canvas.renderAll();\n */\n filters.Blur = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Blur.prototype */ {\n\n type: 'Blur',\n\n /*\n'gl_FragColor = vec4(0.0);',\n'gl_FragColor += texture2D(texture, vTexCoord + -7 * uDelta)*0.0044299121055113265;',\n'gl_FragColor += texture2D(texture, vTexCoord + -6 * uDelta)*0.00895781211794;',\n'gl_FragColor += texture2D(texture, vTexCoord + -5 * uDelta)*0.0215963866053;',\n'gl_FragColor += texture2D(texture, vTexCoord + -4 * uDelta)*0.0443683338718;',\n'gl_FragColor += texture2D(texture, vTexCoord + -3 * uDelta)*0.0776744219933;',\n'gl_FragColor += texture2D(texture, vTexCoord + -2 * uDelta)*0.115876621105;',\n'gl_FragColor += texture2D(texture, vTexCoord + -1 * uDelta)*0.147308056121;',\n'gl_FragColor += texture2D(texture, vTexCoord )*0.159576912161;',\n'gl_FragColor += texture2D(texture, vTexCoord + 1 * uDelta)*0.147308056121;',\n'gl_FragColor += texture2D(texture, vTexCoord + 2 * uDelta)*0.115876621105;',\n'gl_FragColor += texture2D(texture, vTexCoord + 3 * uDelta)*0.0776744219933;',\n'gl_FragColor += texture2D(texture, vTexCoord + 4 * uDelta)*0.0443683338718;',\n'gl_FragColor += texture2D(texture, vTexCoord + 5 * uDelta)*0.0215963866053;',\n'gl_FragColor += texture2D(texture, vTexCoord + 6 * uDelta)*0.00895781211794;',\n'gl_FragColor += texture2D(texture, vTexCoord + 7 * uDelta)*0.0044299121055113265;',\n*/\n\n /* eslint-disable max-len */\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform vec2 uDelta;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'const float nSamples = 15.0;\\n' +\n 'vec3 v3offset = vec3(12.9898, 78.233, 151.7182);\\n' +\n 'float random(vec3 scale) {\\n' +\n /* use the fragment position for a different seed per-pixel */\n 'return fract(sin(dot(gl_FragCoord.xyz, scale)) * 43758.5453);\\n' +\n '}\\n' +\n 'void main() {\\n' +\n 'vec4 color = vec4(0.0);\\n' +\n 'float total = 0.0;\\n' +\n 'float offset = random(v3offset);\\n' +\n 'for (float t = -nSamples; t <= nSamples; t++) {\\n' +\n 'float percent = (t + offset - 0.5) / nSamples;\\n' +\n 'float weight = 1.0 - abs(percent);\\n' +\n 'color += texture2D(uTexture, vTexCoord + uDelta * percent) * weight;\\n' +\n 'total += weight;\\n' +\n '}\\n' +\n 'gl_FragColor = color / total;\\n' +\n '}',\n /* eslint-enable max-len */\n\n /**\n * blur value, in percentage of image dimensions.\n * specific to keep the image blur constant at different resolutions\n * range between 0 and 1.\n * @type Number\n * @default\n */\n blur: 0,\n\n mainParameter: 'blur',\n\n applyTo: function(options) {\n if (options.webgl) {\n // this aspectRatio is used to give the same blur to vertical and horizontal\n this.aspectRatio = options.sourceWidth / options.sourceHeight;\n options.passes++;\n this._setupFrameBuffer(options);\n this.horizontal = true;\n this.applyToWebGL(options);\n this._swapTextures(options);\n this._setupFrameBuffer(options);\n this.horizontal = false;\n this.applyToWebGL(options);\n this._swapTextures(options);\n }\n else {\n this.applyTo2d(options);\n }\n },\n\n applyTo2d: function(options) {\n // paint canvasEl with current image data.\n //options.ctx.putImageData(options.imageData, 0, 0);\n options.imageData = this.simpleBlur(options);\n },\n\n simpleBlur: function(options) {\n var resources = options.filterBackend.resources, canvas1, canvas2,\n width = options.imageData.width,\n height = options.imageData.height;\n\n if (!resources.blurLayer1) {\n resources.blurLayer1 = fabric.util.createCanvasElement();\n resources.blurLayer2 = fabric.util.createCanvasElement();\n }\n canvas1 = resources.blurLayer1;\n canvas2 = resources.blurLayer2;\n if (canvas1.width !== width || canvas1.height !== height) {\n canvas2.width = canvas1.width = width;\n canvas2.height = canvas1.height = height;\n }\n var ctx1 = canvas1.getContext('2d'),\n ctx2 = canvas2.getContext('2d'),\n nSamples = 15,\n random, percent, j, i,\n blur = this.blur * 0.06 * 0.5;\n\n // load first canvas\n ctx1.putImageData(options.imageData, 0, 0);\n ctx2.clearRect(0, 0, width, height);\n\n for (i = -nSamples; i <= nSamples; i++) {\n random = (Math.random() - 0.5) / 4;\n percent = i / nSamples;\n j = blur * percent * width + random;\n ctx2.globalAlpha = 1 - Math.abs(percent);\n ctx2.drawImage(canvas1, j, random);\n ctx1.drawImage(canvas2, 0, 0);\n ctx2.globalAlpha = 1;\n ctx2.clearRect(0, 0, canvas2.width, canvas2.height);\n }\n for (i = -nSamples; i <= nSamples; i++) {\n random = (Math.random() - 0.5) / 4;\n percent = i / nSamples;\n j = blur * percent * height + random;\n ctx2.globalAlpha = 1 - Math.abs(percent);\n ctx2.drawImage(canvas1, random, j);\n ctx1.drawImage(canvas2, 0, 0);\n ctx2.globalAlpha = 1;\n ctx2.clearRect(0, 0, canvas2.width, canvas2.height);\n }\n options.ctx.drawImage(canvas1, 0, 0);\n var newImageData = options.ctx.getImageData(0, 0, canvas1.width, canvas1.height);\n ctx1.globalAlpha = 1;\n ctx1.clearRect(0, 0, canvas1.width, canvas1.height);\n return newImageData;\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n delta: gl.getUniformLocation(program, 'uDelta'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n var delta = this.chooseRightDelta();\n gl.uniform2fv(uniformLocations.delta, delta);\n },\n\n /**\n * choose right value of image percentage to blur with\n * @returns {Array} a numeric array with delta values\n */\n chooseRightDelta: function() {\n var blurScale = 1, delta = [0, 0], blur;\n if (this.horizontal) {\n if (this.aspectRatio > 1) {\n // image is wide, i want to shrink radius horizontal\n blurScale = 1 / this.aspectRatio;\n }\n }\n else {\n if (this.aspectRatio < 1) {\n // image is tall, i want to shrink radius vertical\n blurScale = this.aspectRatio;\n }\n }\n blur = blurScale * this.blur * 0.12;\n if (this.horizontal) {\n delta[0] = blur;\n }\n else {\n delta[1] = blur;\n }\n return delta;\n },\n });\n\n /**\n * Deserialize a JSON definition of a BlurFilter into a concrete instance.\n */\n filters.Blur.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * Gamma filter class\n * @class fabric.Image.filters.Gamma\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.Gamma#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.Gamma({\n * gamma: [1, 0.5, 2.1]\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.Gamma = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Gamma.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'Gamma',\n\n fragmentSource: 'precision highp float;\\n' +\n 'uniform sampler2D uTexture;\\n' +\n 'uniform vec3 uGamma;\\n' +\n 'varying vec2 vTexCoord;\\n' +\n 'void main() {\\n' +\n 'vec4 color = texture2D(uTexture, vTexCoord);\\n' +\n 'vec3 correction = (1.0 / uGamma);\\n' +\n 'color.r = pow(color.r, correction.r);\\n' +\n 'color.g = pow(color.g, correction.g);\\n' +\n 'color.b = pow(color.b, correction.b);\\n' +\n 'gl_FragColor = color;\\n' +\n 'gl_FragColor.rgb *= color.a;\\n' +\n '}',\n\n /**\n * Gamma array value, from 0.01 to 2.2.\n * @param {Array} gamma\n * @default\n */\n gamma: [1, 1, 1],\n\n /**\n * Describe the property that is the filter parameter\n * @param {String} m\n * @default\n */\n mainParameter: 'gamma',\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n initialize: function(options) {\n this.gamma = [1, 1, 1];\n filters.BaseFilter.prototype.initialize.call(this, options);\n },\n\n /**\n * Apply the Gamma operation to a Uint8Array representing the pixels of an image.\n *\n * @param {Object} options\n * @param {ImageData} options.imageData The Uint8Array to be filtered.\n */\n applyTo2d: function(options) {\n var imageData = options.imageData, data = imageData.data,\n gamma = this.gamma, len = data.length,\n rInv = 1 / gamma[0], gInv = 1 / gamma[1],\n bInv = 1 / gamma[2], i;\n\n if (!this.rVals) {\n // eslint-disable-next-line\n this.rVals = new Uint8Array(256);\n // eslint-disable-next-line\n this.gVals = new Uint8Array(256);\n // eslint-disable-next-line\n this.bVals = new Uint8Array(256);\n }\n\n // This is an optimization - pre-compute a look-up table for each color channel\n // instead of performing these pow calls for each pixel in the image.\n for (i = 0, len = 256; i < len; i++) {\n this.rVals[i] = Math.pow(i / 255, rInv) * 255;\n this.gVals[i] = Math.pow(i / 255, gInv) * 255;\n this.bVals[i] = Math.pow(i / 255, bInv) * 255;\n }\n for (i = 0, len = data.length; i < len; i += 4) {\n data[i] = this.rVals[data[i]];\n data[i + 1] = this.gVals[data[i + 1]];\n data[i + 2] = this.bVals[data[i + 2]];\n }\n },\n\n /**\n * Return WebGL uniform locations for this filter's shader.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {WebGLShaderProgram} program This filter's compiled shader program.\n */\n getUniformLocations: function(gl, program) {\n return {\n uGamma: gl.getUniformLocation(program, 'uGamma'),\n };\n },\n\n /**\n * Send data from this filter to its shader program's uniforms.\n *\n * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader.\n * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects\n */\n sendUniformData: function(gl, uniformLocations) {\n gl.uniform3fv(uniformLocations.uGamma, this.gamma);\n },\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.Gamma} Instance of fabric.Image.filters.Gamma\n */\n fabric.Image.filters.Gamma.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * A container class that knows how to apply a sequence of filters to an input image.\n */\n filters.Composed = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Composed.prototype */ {\n\n type: 'Composed',\n\n /**\n * A non sparse array of filters to apply\n */\n subFilters: [],\n\n /**\n * Constructor\n * @param {Object} [options] Options object\n */\n initialize: function(options) {\n this.callSuper('initialize', options);\n // create a new array instead mutating the prototype with push\n this.subFilters = this.subFilters.slice(0);\n },\n\n /**\n * Apply this container's filters to the input image provided.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be applied.\n */\n applyTo: function(options) {\n options.passes += this.subFilters.length - 1;\n this.subFilters.forEach(function(filter) {\n filter.applyTo(options);\n });\n },\n\n /**\n * Serialize this filter into JSON.\n *\n * @returns {Object} A JSON representation of this filter.\n */\n toObject: function() {\n return fabric.util.object.extend(this.callSuper('toObject'), {\n subFilters: this.subFilters.map(function(filter) { return filter.toObject(); }),\n });\n },\n\n isNeutralState: function() {\n return !this.subFilters.some(function(filter) { return !filter.isNeutralState(); });\n }\n });\n\n /**\n * Deserialize a JSON definition of a ComposedFilter into a concrete instance.\n */\n fabric.Image.filters.Composed.fromObject = function(object, callback) {\n var filters = object.subFilters || [],\n subFilters = filters.map(function(filter) {\n return new fabric.Image.filters[filter.type](filter);\n }),\n instance = new fabric.Image.filters.Composed({ subFilters: subFilters });\n callback && callback(instance);\n return instance;\n };\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n filters = fabric.Image.filters,\n createClass = fabric.util.createClass;\n\n /**\n * HueRotation filter class\n * @class fabric.Image.filters.HueRotation\n * @memberOf fabric.Image.filters\n * @extends fabric.Image.filters.BaseFilter\n * @see {@link fabric.Image.filters.HueRotation#initialize} for constructor definition\n * @see {@link http://fabricjs.com/image-filters|ImageFilters demo}\n * @example\n * var filter = new fabric.Image.filters.HueRotation({\n * rotation: -0.5\n * });\n * object.filters.push(filter);\n * object.applyFilters();\n */\n filters.HueRotation = createClass(filters.ColorMatrix, /** @lends fabric.Image.filters.HueRotation.prototype */ {\n\n /**\n * Filter type\n * @param {String} type\n * @default\n */\n type: 'HueRotation',\n\n /**\n * HueRotation value, from -1 to 1.\n * the unit is radians\n * @param {Number} myParameter\n * @default\n */\n rotation: 0,\n\n /**\n * Describe the property that is the filter parameter\n * @param {String} m\n * @default\n */\n mainParameter: 'rotation',\n\n calculateMatrix: function() {\n var rad = this.rotation * Math.PI, cos = fabric.util.cos(rad), sin = fabric.util.sin(rad),\n aThird = 1 / 3, aThirdSqtSin = Math.sqrt(aThird) * sin, OneMinusCos = 1 - cos;\n this.matrix = [\n 1, 0, 0, 0, 0,\n 0, 1, 0, 0, 0,\n 0, 0, 1, 0, 0,\n 0, 0, 0, 1, 0\n ];\n this.matrix[0] = cos + OneMinusCos / 3;\n this.matrix[1] = aThird * OneMinusCos - aThirdSqtSin;\n this.matrix[2] = aThird * OneMinusCos + aThirdSqtSin;\n this.matrix[5] = aThird * OneMinusCos + aThirdSqtSin;\n this.matrix[6] = cos + aThird * OneMinusCos;\n this.matrix[7] = aThird * OneMinusCos - aThirdSqtSin;\n this.matrix[10] = aThird * OneMinusCos - aThirdSqtSin;\n this.matrix[11] = aThird * OneMinusCos + aThirdSqtSin;\n this.matrix[12] = cos + aThird * OneMinusCos;\n },\n\n /**\n * HueRotation isNeutralState implementation\n * Used only in image applyFilters to discard filters that will not have an effect\n * on the image\n * @param {Object} options\n **/\n isNeutralState: function(options) {\n this.calculateMatrix();\n return filters.BaseFilter.prototype.isNeutralState.call(this, options);\n },\n\n /**\n * Apply this filter to the input image data provided.\n *\n * Determines whether to use WebGL or Canvas2D based on the options.webgl flag.\n *\n * @param {Object} options\n * @param {Number} options.passes The number of filters remaining to be executed\n * @param {Boolean} options.webgl Whether to use webgl to render the filter.\n * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered.\n * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn.\n * @param {WebGLRenderingContext} options.context The GL context used for rendering.\n * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type.\n */\n applyTo: function(options) {\n this.calculateMatrix();\n filters.BaseFilter.prototype.applyTo.call(this, options);\n },\n\n });\n\n /**\n * Returns filter instance from an object representation\n * @static\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] to be invoked after filter creation\n * @return {fabric.Image.filters.HueRotation} Instance of fabric.Image.filters.HueRotation\n */\n fabric.Image.filters.HueRotation.fromObject = fabric.Image.filters.BaseFilter.fromObject;\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = { }),\n clone = fabric.util.object.clone;\n\n if (fabric.Text) {\n fabric.warn('fabric.Text is already defined');\n return;\n }\n\n var additionalProps =\n ('fontFamily fontWeight fontSize text underline overline linethrough' +\n ' textAlign fontStyle lineHeight textBackgroundColor charSpacing styles' +\n ' direction path pathStartOffset pathSide pathAlign').split(' ');\n\n /**\n * Text class\n * @class fabric.Text\n * @extends fabric.Object\n * @return {fabric.Text} thisArg\n * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#text}\n * @see {@link fabric.Text#initialize} for constructor definition\n */\n fabric.Text = fabric.util.createClass(fabric.Object, /** @lends fabric.Text.prototype */ {\n\n /**\n * Properties which when set cause object to change dimensions\n * @type Array\n * @private\n */\n _dimensionAffectingProps: [\n 'fontSize',\n 'fontWeight',\n 'fontFamily',\n 'fontStyle',\n 'lineHeight',\n 'text',\n 'charSpacing',\n 'textAlign',\n 'styles',\n 'path',\n 'pathStartOffset',\n 'pathSide',\n 'pathAlign'\n ],\n\n /**\n * @private\n */\n _reNewline: /\\r?\\n/,\n\n /**\n * Use this regular expression to filter for whitespaces that is not a new line.\n * Mostly used when text is 'justify' aligned.\n * @private\n */\n _reSpacesAndTabs: /[ \\t\\r]/g,\n\n /**\n * Use this regular expression to filter for whitespace that is not a new line.\n * Mostly used when text is 'justify' aligned.\n * @private\n */\n _reSpaceAndTab: /[ \\t\\r]/,\n\n /**\n * Use this regular expression to filter consecutive groups of non spaces.\n * Mostly used when text is 'justify' aligned.\n * @private\n */\n _reWords: /\\S+/g,\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'text',\n\n /**\n * Font size (in pixels)\n * @type Number\n * @default\n */\n fontSize: 40,\n\n /**\n * Font weight (e.g. bold, normal, 400, 600, 800)\n * @type {(Number|String)}\n * @default\n */\n fontWeight: 'normal',\n\n /**\n * Font family\n * @type String\n * @default\n */\n fontFamily: 'Times New Roman',\n\n /**\n * Text decoration underline.\n * @type Boolean\n * @default\n */\n underline: false,\n\n /**\n * Text decoration overline.\n * @type Boolean\n * @default\n */\n overline: false,\n\n /**\n * Text decoration linethrough.\n * @type Boolean\n * @default\n */\n linethrough: false,\n\n /**\n * Text alignment. Possible values: \"left\", \"center\", \"right\", \"justify\",\n * \"justify-left\", \"justify-center\" or \"justify-right\".\n * @type String\n * @default\n */\n textAlign: 'left',\n\n /**\n * Font style . Possible values: \"\", \"normal\", \"italic\" or \"oblique\".\n * @type String\n * @default\n */\n fontStyle: 'normal',\n\n /**\n * Line height\n * @type Number\n * @default\n */\n lineHeight: 1.16,\n\n /**\n * Superscript schema object (minimum overlap)\n * @type {Object}\n * @default\n */\n superscript: {\n size: 0.60, // fontSize factor\n baseline: -0.35 // baseline-shift factor (upwards)\n },\n\n /**\n * Subscript schema object (minimum overlap)\n * @type {Object}\n * @default\n */\n subscript: {\n size: 0.60, // fontSize factor\n baseline: 0.11 // baseline-shift factor (downwards)\n },\n\n /**\n * Background color of text lines\n * @type String\n * @default\n */\n textBackgroundColor: '',\n\n /**\n * List of properties to consider when checking if\n * state of an object is changed ({@link fabric.Object#hasStateChanged})\n * as well as for history (undo/redo) purposes\n * @type Array\n */\n stateProperties: fabric.Object.prototype.stateProperties.concat(additionalProps),\n\n /**\n * List of properties to consider when checking if cache needs refresh\n * @type Array\n */\n cacheProperties: fabric.Object.prototype.cacheProperties.concat(additionalProps),\n\n /**\n * When defined, an object is rendered via stroke and this property specifies its color.\n * Backwards incompatibility note: This property was named \"strokeStyle\" until v1.1.6\n * @type String\n * @default\n */\n stroke: null,\n\n /**\n * Shadow object representing shadow of this shape.\n * Backwards incompatibility note: This property was named \"textShadow\" (String) until v1.2.11\n * @type fabric.Shadow\n * @default\n */\n shadow: null,\n\n /**\n * fabric.Path that the text should follow.\n * since 4.6.0 the path will be drawn automatically.\n * if you want to make the path visible, give it a stroke and strokeWidth or fill value\n * if you want it to be hidden, assign visible = false to the path.\n * This feature is in BETA, and SVG import/export is not yet supported.\n * @type fabric.Path\n * @example\n * var textPath = new fabric.Text('Text on a path', {\n * top: 150,\n * left: 150,\n * textAlign: 'center',\n * charSpacing: -50,\n * path: new fabric.Path('M 0 0 C 50 -100 150 -100 200 0', {\n * strokeWidth: 1,\n * visible: false\n * }),\n * pathSide: 'left',\n * pathStartOffset: 0\n * });\n * @default\n */\n path: null,\n\n /**\n * Offset amount for text path starting position\n * Only used when text has a path\n * @type Number\n * @default\n */\n pathStartOffset: 0,\n\n /**\n * Which side of the path the text should be drawn on.\n * Only used when text has a path\n * @type {String} 'left|right'\n * @default\n */\n pathSide: 'left',\n\n /**\n * How text is aligned to the path. This property determines\n * the perpendicular position of each character relative to the path.\n * (one of \"baseline\", \"center\", \"ascender\", \"descender\")\n * This feature is in BETA, and its behavior may change\n * @type String\n * @default\n */\n pathAlign: 'baseline',\n\n /**\n * @private\n */\n _fontSizeFraction: 0.222,\n\n /**\n * @private\n */\n offsets: {\n underline: 0.10,\n linethrough: -0.315,\n overline: -0.88\n },\n\n /**\n * Text Line proportion to font Size (in pixels)\n * @type Number\n * @default\n */\n _fontSizeMult: 1.13,\n\n /**\n * additional space between characters\n * expressed in thousands of em unit\n * @type Number\n * @default\n */\n charSpacing: 0,\n\n /**\n * Object containing character styles - top-level properties -> line numbers,\n * 2nd-level properties - character numbers\n * @type Object\n * @default\n */\n styles: null,\n\n /**\n * Reference to a context to measure text char or couple of chars\n * the cacheContext of the canvas will be used or a freshly created one if the object is not on canvas\n * once created it will be referenced on fabric._measuringContext to avoid creating a canvas for every\n * text object created.\n * @type {CanvasRenderingContext2D}\n * @default\n */\n _measuringContext: null,\n\n /**\n * Baseline shift, styles only, keep at 0 for the main text object\n * @type {Number}\n * @default\n */\n deltaY: 0,\n\n /**\n * WARNING: EXPERIMENTAL. NOT SUPPORTED YET\n * determine the direction of the text.\n * This has to be set manually together with textAlign and originX for proper\n * experience.\n * some interesting link for the future\n * https://www.w3.org/International/questions/qa-bidi-unicode-controls\n * @since 4.5.0\n * @type {String} 'ltr|rtl'\n * @default\n */\n direction: 'ltr',\n\n /**\n * Array of properties that define a style unit (of 'styles').\n * @type {Array}\n * @default\n */\n _styleProperties: [\n 'stroke',\n 'strokeWidth',\n 'fill',\n 'fontFamily',\n 'fontSize',\n 'fontWeight',\n 'fontStyle',\n 'underline',\n 'overline',\n 'linethrough',\n 'deltaY',\n 'textBackgroundColor',\n ],\n\n /**\n * contains characters bounding boxes\n */\n __charBounds: [],\n\n /**\n * use this size when measuring text. To avoid IE11 rounding errors\n * @type {Number}\n * @default\n * @readonly\n * @private\n */\n CACHE_FONT_SIZE: 400,\n\n /**\n * contains the min text width to avoid getting 0\n * @type {Number}\n * @default\n */\n MIN_TEXT_WIDTH: 2,\n\n /**\n * Constructor\n * @param {String} text Text string\n * @param {Object} [options] Options object\n * @return {fabric.Text} thisArg\n */\n initialize: function(text, options) {\n this.styles = options ? (options.styles || { }) : { };\n this.text = text;\n this.__skipDimension = true;\n this.callSuper('initialize', options);\n if (this.path) {\n this.setPathInfo();\n }\n this.__skipDimension = false;\n this.initDimensions();\n this.setCoords();\n this.setupState({ propertySet: '_dimensionAffectingProps' });\n },\n\n /**\n * If text has a path, it will add the extra information needed\n * for path and text calculations\n * @return {fabric.Text} thisArg\n */\n setPathInfo: function() {\n var path = this.path;\n if (path) {\n path.segmentsInfo = fabric.util.getPathSegmentsInfo(path.path);\n }\n },\n\n /**\n * Return a context for measurement of text string.\n * if created it gets stored for reuse\n * this is for internal use, please do not use it\n * @private\n * @param {String} text Text string\n * @param {Object} [options] Options object\n * @return {fabric.Text} thisArg\n */\n getMeasuringContext: function() {\n // if we did not return we have to measure something.\n if (!fabric._measuringContext) {\n fabric._measuringContext = this.canvas && this.canvas.contextCache ||\n fabric.util.createCanvasElement().getContext('2d');\n }\n return fabric._measuringContext;\n },\n\n /**\n * @private\n * Divides text into lines of text and lines of graphemes.\n */\n _splitText: function() {\n var newLines = this._splitTextIntoLines(this.text);\n this.textLines = newLines.lines;\n this._textLines = newLines.graphemeLines;\n this._unwrappedTextLines = newLines._unwrappedLines;\n this._text = newLines.graphemeText;\n return newLines;\n },\n\n /**\n * Initialize or update text dimensions.\n * Updates this.width and this.height with the proper values.\n * Does not return dimensions.\n */\n initDimensions: function() {\n if (this.__skipDimension) {\n return;\n }\n this._splitText();\n this._clearCache();\n if (this.path) {\n this.width = this.path.width;\n this.height = this.path.height;\n }\n else {\n this.width = this.calcTextWidth() || this.cursorWidth || this.MIN_TEXT_WIDTH;\n this.height = this.calcTextHeight();\n }\n if (this.textAlign.indexOf('justify') !== -1) {\n // once text is measured we need to make space fatter to make justified text.\n this.enlargeSpaces();\n }\n this.saveState({ propertySet: '_dimensionAffectingProps' });\n },\n\n /**\n * Enlarge space boxes and shift the others\n */\n enlargeSpaces: function() {\n var diffSpace, currentLineWidth, numberOfSpaces, accumulatedSpace, line, charBound, spaces;\n for (var i = 0, len = this._textLines.length; i < len; i++) {\n if (this.textAlign !== 'justify' && (i === len - 1 || this.isEndOfWrapping(i))) {\n continue;\n }\n accumulatedSpace = 0;\n line = this._textLines[i];\n currentLineWidth = this.getLineWidth(i);\n if (currentLineWidth < this.width && (spaces = this.textLines[i].match(this._reSpacesAndTabs))) {\n numberOfSpaces = spaces.length;\n diffSpace = (this.width - currentLineWidth) / numberOfSpaces;\n for (var j = 0, jlen = line.length; j <= jlen; j++) {\n charBound = this.__charBounds[i][j];\n if (this._reSpaceAndTab.test(line[j])) {\n charBound.width += diffSpace;\n charBound.kernedWidth += diffSpace;\n charBound.left += accumulatedSpace;\n accumulatedSpace += diffSpace;\n }\n else {\n charBound.left += accumulatedSpace;\n }\n }\n }\n }\n },\n\n /**\n * Detect if the text line is ended with an hard break\n * text and itext do not have wrapping, return false\n * @return {Boolean}\n */\n isEndOfWrapping: function(lineIndex) {\n return lineIndex === this._textLines.length - 1;\n },\n\n /**\n * Detect if a line has a linebreak and so we need to account for it when moving\n * and counting style.\n * It return always for text and Itext.\n * @return Number\n */\n missingNewlineOffset: function() {\n return 1;\n },\n\n /**\n * Returns string representation of an instance\n * @return {String} String representation of text object\n */\n toString: function() {\n return '#';\n },\n\n /**\n * Return the dimension and the zoom level needed to create a cache canvas\n * big enough to host the object to be cached.\n * @private\n * @param {Object} dim.x width of object to be cached\n * @param {Object} dim.y height of object to be cached\n * @return {Object}.width width of canvas\n * @return {Object}.height height of canvas\n * @return {Object}.zoomX zoomX zoom value to unscale the canvas before drawing cache\n * @return {Object}.zoomY zoomY zoom value to unscale the canvas before drawing cache\n */\n _getCacheCanvasDimensions: function() {\n var dims = this.callSuper('_getCacheCanvasDimensions');\n var fontSize = this.fontSize;\n dims.width += fontSize * dims.zoomX;\n dims.height += fontSize * dims.zoomY;\n return dims;\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(ctx) {\n var path = this.path;\n path && !path.isNotVisible() && path._render(ctx);\n this._setTextStyles(ctx);\n this._renderTextLinesBackground(ctx);\n this._renderTextDecoration(ctx, 'underline');\n this._renderText(ctx);\n this._renderTextDecoration(ctx, 'overline');\n this._renderTextDecoration(ctx, 'linethrough');\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderText: function(ctx) {\n if (this.paintFirst === 'stroke') {\n this._renderTextStroke(ctx);\n this._renderTextFill(ctx);\n }\n else {\n this._renderTextFill(ctx);\n this._renderTextStroke(ctx);\n }\n },\n\n /**\n * Set the font parameter of the context with the object properties or with charStyle\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Object} [charStyle] object with font style properties\n * @param {String} [charStyle.fontFamily] Font Family\n * @param {Number} [charStyle.fontSize] Font size in pixels. ( without px suffix )\n * @param {String} [charStyle.fontWeight] Font weight\n * @param {String} [charStyle.fontStyle] Font style (italic|normal)\n */\n _setTextStyles: function(ctx, charStyle, forMeasuring) {\n ctx.textBaseline = 'alphabetical';\n if (this.path) {\n switch (this.pathAlign) {\n case 'center':\n ctx.textBaseline = 'middle';\n break;\n case 'ascender':\n ctx.textBaseline = 'top';\n break;\n case 'descender':\n ctx.textBaseline = 'bottom';\n break;\n }\n }\n ctx.font = this._getFontDeclaration(charStyle, forMeasuring);\n },\n\n /**\n * calculate and return the text Width measuring each line.\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @return {Number} Maximum width of fabric.Text object\n */\n calcTextWidth: function() {\n var maxWidth = this.getLineWidth(0);\n\n for (var i = 1, len = this._textLines.length; i < len; i++) {\n var currentLineWidth = this.getLineWidth(i);\n if (currentLineWidth > maxWidth) {\n maxWidth = currentLineWidth;\n }\n }\n return maxWidth;\n },\n\n /**\n * @private\n * @param {String} method Method name (\"fillText\" or \"strokeText\")\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {String} line Text to render\n * @param {Number} left Left position of text\n * @param {Number} top Top position of text\n * @param {Number} lineIndex Index of a line in a text\n */\n _renderTextLine: function(method, ctx, line, left, top, lineIndex) {\n this._renderChars(method, ctx, line, left, top, lineIndex);\n },\n\n /**\n * Renders the text background for lines, taking care of style\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextLinesBackground: function(ctx) {\n if (!this.textBackgroundColor && !this.styleHas('textBackgroundColor')) {\n return;\n }\n var heightOfLine,\n lineLeftOffset, originalFill = ctx.fillStyle,\n line, lastColor,\n leftOffset = this._getLeftOffset(),\n lineTopOffset = this._getTopOffset(),\n boxStart = 0, boxWidth = 0, charBox, currentColor, path = this.path,\n drawStart;\n\n for (var i = 0, len = this._textLines.length; i < len; i++) {\n heightOfLine = this.getHeightOfLine(i);\n if (!this.textBackgroundColor && !this.styleHas('textBackgroundColor', i)) {\n lineTopOffset += heightOfLine;\n continue;\n }\n line = this._textLines[i];\n lineLeftOffset = this._getLineLeftOffset(i);\n boxWidth = 0;\n boxStart = 0;\n lastColor = this.getValueOfPropertyAt(i, 0, 'textBackgroundColor');\n for (var j = 0, jlen = line.length; j < jlen; j++) {\n charBox = this.__charBounds[i][j];\n currentColor = this.getValueOfPropertyAt(i, j, 'textBackgroundColor');\n if (path) {\n ctx.save();\n ctx.translate(charBox.renderLeft, charBox.renderTop);\n ctx.rotate(charBox.angle);\n ctx.fillStyle = currentColor;\n currentColor && ctx.fillRect(\n -charBox.width / 2,\n -heightOfLine / this.lineHeight * (1 - this._fontSizeFraction),\n charBox.width,\n heightOfLine / this.lineHeight\n );\n ctx.restore();\n }\n else if (currentColor !== lastColor) {\n drawStart = leftOffset + lineLeftOffset + boxStart;\n if (this.direction === 'rtl') {\n drawStart = this.width - drawStart - boxWidth;\n }\n ctx.fillStyle = lastColor;\n lastColor && ctx.fillRect(\n drawStart,\n lineTopOffset,\n boxWidth,\n heightOfLine / this.lineHeight\n );\n boxStart = charBox.left;\n boxWidth = charBox.width;\n lastColor = currentColor;\n }\n else {\n boxWidth += charBox.kernedWidth;\n }\n }\n if (currentColor && !path) {\n drawStart = leftOffset + lineLeftOffset + boxStart;\n if (this.direction === 'rtl') {\n drawStart = this.width - drawStart - boxWidth;\n }\n ctx.fillStyle = currentColor;\n ctx.fillRect(\n drawStart,\n lineTopOffset,\n boxWidth,\n heightOfLine / this.lineHeight\n );\n }\n lineTopOffset += heightOfLine;\n }\n ctx.fillStyle = originalFill;\n // if there is text background color no\n // other shadows should be casted\n this._removeShadow(ctx);\n },\n\n /**\n * @private\n * @param {Object} decl style declaration for cache\n * @param {String} decl.fontFamily fontFamily\n * @param {String} decl.fontStyle fontStyle\n * @param {String} decl.fontWeight fontWeight\n * @return {Object} reference to cache\n */\n getFontCache: function(decl) {\n var fontFamily = decl.fontFamily.toLowerCase();\n if (!fabric.charWidthsCache[fontFamily]) {\n fabric.charWidthsCache[fontFamily] = { };\n }\n var cache = fabric.charWidthsCache[fontFamily],\n cacheProp = decl.fontStyle.toLowerCase() + '_' + (decl.fontWeight + '').toLowerCase();\n if (!cache[cacheProp]) {\n cache[cacheProp] = { };\n }\n return cache[cacheProp];\n },\n\n /**\n * measure and return the width of a single character.\n * possibly overridden to accommodate different measure logic or\n * to hook some external lib for character measurement\n * @private\n * @param {String} _char, char to be measured\n * @param {Object} charStyle style of char to be measured\n * @param {String} [previousChar] previous char\n * @param {Object} [prevCharStyle] style of previous char\n */\n _measureChar: function(_char, charStyle, previousChar, prevCharStyle) {\n // first i try to return from cache\n var fontCache = this.getFontCache(charStyle), fontDeclaration = this._getFontDeclaration(charStyle),\n previousFontDeclaration = this._getFontDeclaration(prevCharStyle), couple = previousChar + _char,\n stylesAreEqual = fontDeclaration === previousFontDeclaration, width, coupleWidth, previousWidth,\n fontMultiplier = charStyle.fontSize / this.CACHE_FONT_SIZE, kernedWidth;\n\n if (previousChar && fontCache[previousChar] !== undefined) {\n previousWidth = fontCache[previousChar];\n }\n if (fontCache[_char] !== undefined) {\n kernedWidth = width = fontCache[_char];\n }\n if (stylesAreEqual && fontCache[couple] !== undefined) {\n coupleWidth = fontCache[couple];\n kernedWidth = coupleWidth - previousWidth;\n }\n if (width === undefined || previousWidth === undefined || coupleWidth === undefined) {\n var ctx = this.getMeasuringContext();\n // send a TRUE to specify measuring font size CACHE_FONT_SIZE\n this._setTextStyles(ctx, charStyle, true);\n }\n if (width === undefined) {\n kernedWidth = width = ctx.measureText(_char).width;\n fontCache[_char] = width;\n }\n if (previousWidth === undefined && stylesAreEqual && previousChar) {\n previousWidth = ctx.measureText(previousChar).width;\n fontCache[previousChar] = previousWidth;\n }\n if (stylesAreEqual && coupleWidth === undefined) {\n // we can measure the kerning couple and subtract the width of the previous character\n coupleWidth = ctx.measureText(couple).width;\n fontCache[couple] = coupleWidth;\n kernedWidth = coupleWidth - previousWidth;\n }\n return { width: width * fontMultiplier, kernedWidth: kernedWidth * fontMultiplier };\n },\n\n /**\n * Computes height of character at given position\n * @param {Number} line the line index number\n * @param {Number} _char the character index number\n * @return {Number} fontSize of the character\n */\n getHeightOfChar: function(line, _char) {\n return this.getValueOfPropertyAt(line, _char, 'fontSize');\n },\n\n /**\n * measure a text line measuring all characters.\n * @param {Number} lineIndex line number\n * @return {Number} Line width\n */\n measureLine: function(lineIndex) {\n var lineInfo = this._measureLine(lineIndex);\n if (this.charSpacing !== 0) {\n lineInfo.width -= this._getWidthOfCharSpacing();\n }\n if (lineInfo.width < 0) {\n lineInfo.width = 0;\n }\n return lineInfo;\n },\n\n /**\n * measure every grapheme of a line, populating __charBounds\n * @param {Number} lineIndex\n * @return {Object} object.width total width of characters\n * @return {Object} object.widthOfSpaces length of chars that match this._reSpacesAndTabs\n */\n _measureLine: function(lineIndex) {\n var width = 0, i, grapheme, line = this._textLines[lineIndex], prevGrapheme,\n graphemeInfo, numOfSpaces = 0, lineBounds = new Array(line.length),\n positionInPath = 0, startingPoint, totalPathLength, path = this.path,\n reverse = this.pathSide === 'right';\n\n this.__charBounds[lineIndex] = lineBounds;\n for (i = 0; i < line.length; i++) {\n grapheme = line[i];\n graphemeInfo = this._getGraphemeBox(grapheme, lineIndex, i, prevGrapheme);\n lineBounds[i] = graphemeInfo;\n width += graphemeInfo.kernedWidth;\n prevGrapheme = grapheme;\n }\n // this latest bound box represent the last character of the line\n // to simplify cursor handling in interactive mode.\n lineBounds[i] = {\n left: graphemeInfo ? graphemeInfo.left + graphemeInfo.width : 0,\n width: 0,\n kernedWidth: 0,\n height: this.fontSize\n };\n if (path) {\n totalPathLength = path.segmentsInfo[path.segmentsInfo.length - 1].length;\n startingPoint = fabric.util.getPointOnPath(path.path, 0, path.segmentsInfo);\n startingPoint.x += path.pathOffset.x;\n startingPoint.y += path.pathOffset.y;\n switch (this.textAlign) {\n case 'left':\n positionInPath = reverse ? (totalPathLength - width) : 0;\n break;\n case 'center':\n positionInPath = (totalPathLength - width) / 2;\n break;\n case 'right':\n positionInPath = reverse ? 0 : (totalPathLength - width);\n break;\n //todo - add support for justify\n }\n positionInPath += this.pathStartOffset * (reverse ? -1 : 1);\n for (i = reverse ? line.length - 1 : 0;\n reverse ? i >= 0 : i < line.length;\n reverse ? i-- : i++) {\n graphemeInfo = lineBounds[i];\n if (positionInPath > totalPathLength) {\n positionInPath %= totalPathLength;\n }\n else if (positionInPath < 0) {\n positionInPath += totalPathLength;\n }\n // it would probably much faster to send all the grapheme position for a line\n // and calculate path position/angle at once.\n this._setGraphemeOnPath(positionInPath, graphemeInfo, startingPoint);\n positionInPath += graphemeInfo.kernedWidth;\n }\n }\n return { width: width, numOfSpaces: numOfSpaces };\n },\n\n /**\n * Calculate the angle and the left,top position of the char that follow a path.\n * It appends it to graphemeInfo to be reused later at rendering\n * @private\n * @param {Number} positionInPath to be measured\n * @param {Object} graphemeInfo current grapheme box information\n * @param {Object} startingPoint position of the point\n */\n _setGraphemeOnPath: function(positionInPath, graphemeInfo, startingPoint) {\n var centerPosition = positionInPath + graphemeInfo.kernedWidth / 2,\n path = this.path;\n\n // we are at currentPositionOnPath. we want to know what point on the path is.\n var info = fabric.util.getPointOnPath(path.path, centerPosition, path.segmentsInfo);\n graphemeInfo.renderLeft = info.x - startingPoint.x;\n graphemeInfo.renderTop = info.y - startingPoint.y;\n graphemeInfo.angle = info.angle + (this.pathSide === 'right' ? Math.PI : 0);\n },\n\n /**\n * Measure and return the info of a single grapheme.\n * needs the the info of previous graphemes already filled\n * @private\n * @param {String} grapheme to be measured\n * @param {Number} lineIndex index of the line where the char is\n * @param {Number} charIndex position in the line\n * @param {String} [prevGrapheme] character preceding the one to be measured\n */\n _getGraphemeBox: function(grapheme, lineIndex, charIndex, prevGrapheme, skipLeft) {\n var style = this.getCompleteStyleDeclaration(lineIndex, charIndex),\n prevStyle = prevGrapheme ? this.getCompleteStyleDeclaration(lineIndex, charIndex - 1) : { },\n info = this._measureChar(grapheme, style, prevGrapheme, prevStyle),\n kernedWidth = info.kernedWidth,\n width = info.width, charSpacing;\n\n if (this.charSpacing !== 0) {\n charSpacing = this._getWidthOfCharSpacing();\n width += charSpacing;\n kernedWidth += charSpacing;\n }\n\n var box = {\n width: width,\n left: 0,\n height: style.fontSize,\n kernedWidth: kernedWidth,\n deltaY: style.deltaY,\n };\n if (charIndex > 0 && !skipLeft) {\n var previousBox = this.__charBounds[lineIndex][charIndex - 1];\n box.left = previousBox.left + previousBox.width + info.kernedWidth - info.width;\n }\n return box;\n },\n\n /**\n * Calculate height of line at 'lineIndex'\n * @param {Number} lineIndex index of line to calculate\n * @return {Number}\n */\n getHeightOfLine: function(lineIndex) {\n if (this.__lineHeights[lineIndex]) {\n return this.__lineHeights[lineIndex];\n }\n\n var line = this._textLines[lineIndex],\n // char 0 is measured before the line cycle because it nneds to char\n // emptylines\n maxHeight = this.getHeightOfChar(lineIndex, 0);\n for (var i = 1, len = line.length; i < len; i++) {\n maxHeight = Math.max(this.getHeightOfChar(lineIndex, i), maxHeight);\n }\n\n return this.__lineHeights[lineIndex] = maxHeight * this.lineHeight * this._fontSizeMult;\n },\n\n /**\n * Calculate text box height\n */\n calcTextHeight: function() {\n var lineHeight, height = 0;\n for (var i = 0, len = this._textLines.length; i < len; i++) {\n lineHeight = this.getHeightOfLine(i);\n height += (i === len - 1 ? lineHeight / this.lineHeight : lineHeight);\n }\n return height;\n },\n\n /**\n * @private\n * @return {Number} Left offset\n */\n _getLeftOffset: function() {\n return this.direction === 'ltr' ? -this.width / 2 : this.width / 2;\n },\n\n /**\n * @private\n * @return {Number} Top offset\n */\n _getTopOffset: function() {\n return -this.height / 2;\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {String} method Method name (\"fillText\" or \"strokeText\")\n */\n _renderTextCommon: function(ctx, method) {\n ctx.save();\n var lineHeights = 0, left = this._getLeftOffset(), top = this._getTopOffset();\n for (var i = 0, len = this._textLines.length; i < len; i++) {\n var heightOfLine = this.getHeightOfLine(i),\n maxHeight = heightOfLine / this.lineHeight,\n leftOffset = this._getLineLeftOffset(i);\n this._renderTextLine(\n method,\n ctx,\n this._textLines[i],\n left + leftOffset,\n top + lineHeights + maxHeight,\n i\n );\n lineHeights += heightOfLine;\n }\n ctx.restore();\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextFill: function(ctx) {\n if (!this.fill && !this.styleHas('fill')) {\n return;\n }\n\n this._renderTextCommon(ctx, 'fillText');\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextStroke: function(ctx) {\n if ((!this.stroke || this.strokeWidth === 0) && this.isEmptyStyles()) {\n return;\n }\n\n if (this.shadow && !this.shadow.affectStroke) {\n this._removeShadow(ctx);\n }\n\n ctx.save();\n this._setLineDash(ctx, this.strokeDashArray);\n ctx.beginPath();\n this._renderTextCommon(ctx, 'strokeText');\n ctx.closePath();\n ctx.restore();\n },\n\n /**\n * @private\n * @param {String} method fillText or strokeText.\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Array} line Content of the line, splitted in an array by grapheme\n * @param {Number} left\n * @param {Number} top\n * @param {Number} lineIndex\n */\n _renderChars: function(method, ctx, line, left, top, lineIndex) {\n // set proper line offset\n var lineHeight = this.getHeightOfLine(lineIndex),\n isJustify = this.textAlign.indexOf('justify') !== -1,\n actualStyle,\n nextStyle,\n charsToRender = '',\n charBox,\n boxWidth = 0,\n timeToRender,\n path = this.path,\n shortCut = !isJustify && this.charSpacing === 0 && this.isEmptyStyles(lineIndex) && !path,\n isLtr = this.direction === 'ltr', sign = this.direction === 'ltr' ? 1 : -1,\n drawingLeft, currentDirection = ctx.canvas.getAttribute('dir');\n ctx.save();\n if (currentDirection !== this.direction) {\n ctx.canvas.setAttribute('dir', isLtr ? 'ltr' : 'rtl');\n ctx.direction = isLtr ? 'ltr' : 'rtl';\n ctx.textAlign = isLtr ? 'left' : 'right';\n }\n top -= lineHeight * this._fontSizeFraction / this.lineHeight;\n if (shortCut) {\n // render all the line in one pass without checking\n // drawingLeft = isLtr ? left : left - this.getLineWidth(lineIndex);\n this._renderChar(method, ctx, lineIndex, 0, line.join(''), left, top, lineHeight);\n ctx.restore();\n return;\n }\n for (var i = 0, len = line.length - 1; i <= len; i++) {\n timeToRender = i === len || this.charSpacing || path;\n charsToRender += line[i];\n charBox = this.__charBounds[lineIndex][i];\n if (boxWidth === 0) {\n left += sign * (charBox.kernedWidth - charBox.width);\n boxWidth += charBox.width;\n }\n else {\n boxWidth += charBox.kernedWidth;\n }\n if (isJustify && !timeToRender) {\n if (this._reSpaceAndTab.test(line[i])) {\n timeToRender = true;\n }\n }\n if (!timeToRender) {\n // if we have charSpacing, we render char by char\n actualStyle = actualStyle || this.getCompleteStyleDeclaration(lineIndex, i);\n nextStyle = this.getCompleteStyleDeclaration(lineIndex, i + 1);\n timeToRender = fabric.util.hasStyleChanged(actualStyle, nextStyle, false);\n }\n if (timeToRender) {\n if (path) {\n ctx.save();\n ctx.translate(charBox.renderLeft, charBox.renderTop);\n ctx.rotate(charBox.angle);\n this._renderChar(method, ctx, lineIndex, i, charsToRender, -boxWidth / 2, 0, lineHeight);\n ctx.restore();\n }\n else {\n drawingLeft = left;\n this._renderChar(method, ctx, lineIndex, i, charsToRender, drawingLeft, top, lineHeight);\n }\n charsToRender = '';\n actualStyle = nextStyle;\n left += sign * boxWidth;\n boxWidth = 0;\n }\n }\n ctx.restore();\n },\n\n /**\n * This function try to patch the missing gradientTransform on canvas gradients.\n * transforming a context to transform the gradient, is going to transform the stroke too.\n * we want to transform the gradient but not the stroke operation, so we create\n * a transformed gradient on a pattern and then we use the pattern instead of the gradient.\n * this method has drawbacks: is slow, is in low resolution, needs a patch for when the size\n * is limited.\n * @private\n * @param {fabric.Gradient} filler a fabric gradient instance\n * @return {CanvasPattern} a pattern to use as fill/stroke style\n */\n _applyPatternGradientTransformText: function(filler) {\n var pCanvas = fabric.util.createCanvasElement(), pCtx,\n // TODO: verify compatibility with strokeUniform\n width = this.width + this.strokeWidth, height = this.height + this.strokeWidth;\n pCanvas.width = width;\n pCanvas.height = height;\n pCtx = pCanvas.getContext('2d');\n pCtx.beginPath(); pCtx.moveTo(0, 0); pCtx.lineTo(width, 0); pCtx.lineTo(width, height);\n pCtx.lineTo(0, height); pCtx.closePath();\n pCtx.translate(width / 2, height / 2);\n pCtx.fillStyle = filler.toLive(pCtx);\n this._applyPatternGradientTransform(pCtx, filler);\n pCtx.fill();\n return pCtx.createPattern(pCanvas, 'no-repeat');\n },\n\n handleFiller: function(ctx, property, filler) {\n var offsetX, offsetY;\n if (filler.toLive) {\n if (filler.gradientUnits === 'percentage' || filler.gradientTransform || filler.patternTransform) {\n // need to transform gradient in a pattern.\n // this is a slow process. If you are hitting this codepath, and the object\n // is not using caching, you should consider switching it on.\n // we need a canvas as big as the current object caching canvas.\n offsetX = -this.width / 2;\n offsetY = -this.height / 2;\n ctx.translate(offsetX, offsetY);\n ctx[property] = this._applyPatternGradientTransformText(filler);\n return { offsetX: offsetX, offsetY: offsetY };\n }\n else {\n // is a simple gradient or pattern\n ctx[property] = filler.toLive(ctx, this);\n return this._applyPatternGradientTransform(ctx, filler);\n }\n }\n else {\n // is a color\n ctx[property] = filler;\n }\n return { offsetX: 0, offsetY: 0 };\n },\n\n _setStrokeStyles: function(ctx, decl) {\n ctx.lineWidth = decl.strokeWidth;\n ctx.lineCap = this.strokeLineCap;\n ctx.lineDashOffset = this.strokeDashOffset;\n ctx.lineJoin = this.strokeLineJoin;\n ctx.miterLimit = this.strokeMiterLimit;\n return this.handleFiller(ctx, 'strokeStyle', decl.stroke);\n },\n\n _setFillStyles: function(ctx, decl) {\n return this.handleFiller(ctx, 'fillStyle', decl.fill);\n },\n\n /**\n * @private\n * @param {String} method\n * @param {CanvasRenderingContext2D} ctx Context to render on\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @param {String} _char\n * @param {Number} left Left coordinate\n * @param {Number} top Top coordinate\n * @param {Number} lineHeight Height of the line\n */\n _renderChar: function(method, ctx, lineIndex, charIndex, _char, left, top) {\n var decl = this._getStyleDeclaration(lineIndex, charIndex),\n fullDecl = this.getCompleteStyleDeclaration(lineIndex, charIndex),\n shouldFill = method === 'fillText' && fullDecl.fill,\n shouldStroke = method === 'strokeText' && fullDecl.stroke && fullDecl.strokeWidth,\n fillOffsets, strokeOffsets;\n\n if (!shouldStroke && !shouldFill) {\n return;\n }\n ctx.save();\n\n shouldFill && (fillOffsets = this._setFillStyles(ctx, fullDecl));\n shouldStroke && (strokeOffsets = this._setStrokeStyles(ctx, fullDecl));\n\n ctx.font = this._getFontDeclaration(fullDecl);\n\n\n if (decl && decl.textBackgroundColor) {\n this._removeShadow(ctx);\n }\n if (decl && decl.deltaY) {\n top += decl.deltaY;\n }\n shouldFill && ctx.fillText(_char, left - fillOffsets.offsetX, top - fillOffsets.offsetY);\n shouldStroke && ctx.strokeText(_char, left - strokeOffsets.offsetX, top - strokeOffsets.offsetY);\n ctx.restore();\n },\n\n /**\n * Turns the character into a 'superior figure' (i.e. 'superscript')\n * @param {Number} start selection start\n * @param {Number} end selection end\n * @returns {fabric.Text} thisArg\n * @chainable\n */\n setSuperscript: function(start, end) {\n return this._setScript(start, end, this.superscript);\n },\n\n /**\n * Turns the character into an 'inferior figure' (i.e. 'subscript')\n * @param {Number} start selection start\n * @param {Number} end selection end\n * @returns {fabric.Text} thisArg\n * @chainable\n */\n setSubscript: function(start, end) {\n return this._setScript(start, end, this.subscript);\n },\n\n /**\n * Applies 'schema' at given position\n * @private\n * @param {Number} start selection start\n * @param {Number} end selection end\n * @param {Number} schema\n * @returns {fabric.Text} thisArg\n * @chainable\n */\n _setScript: function(start, end, schema) {\n var loc = this.get2DCursorLocation(start, true),\n fontSize = this.getValueOfPropertyAt(loc.lineIndex, loc.charIndex, 'fontSize'),\n dy = this.getValueOfPropertyAt(loc.lineIndex, loc.charIndex, 'deltaY'),\n style = { fontSize: fontSize * schema.size, deltaY: dy + fontSize * schema.baseline };\n this.setSelectionStyles(style, start, end);\n return this;\n },\n\n /**\n * @private\n * @param {Number} lineIndex index text line\n * @return {Number} Line left offset\n */\n _getLineLeftOffset: function(lineIndex) {\n var lineWidth = this.getLineWidth(lineIndex),\n lineDiff = this.width - lineWidth, textAlign = this.textAlign, direction = this.direction,\n isEndOfWrapping, leftOffset = 0, isEndOfWrapping = this.isEndOfWrapping(lineIndex);\n if (textAlign === 'justify'\n || (textAlign === 'justify-center' && !isEndOfWrapping)\n || (textAlign === 'justify-right' && !isEndOfWrapping)\n || (textAlign === 'justify-left' && !isEndOfWrapping)\n ) {\n return 0;\n }\n if (textAlign === 'center') {\n leftOffset = lineDiff / 2;\n }\n if (textAlign === 'right') {\n leftOffset = lineDiff;\n }\n if (textAlign === 'justify-center') {\n leftOffset = lineDiff / 2;\n }\n if (textAlign === 'justify-right') {\n leftOffset = lineDiff;\n }\n if (direction === 'rtl') {\n leftOffset -= lineDiff;\n }\n return leftOffset;\n },\n\n /**\n * @private\n */\n _clearCache: function() {\n this.__lineWidths = [];\n this.__lineHeights = [];\n this.__charBounds = [];\n },\n\n /**\n * @private\n */\n _shouldClearDimensionCache: function() {\n var shouldClear = this._forceClearCache;\n shouldClear || (shouldClear = this.hasStateChanged('_dimensionAffectingProps'));\n if (shouldClear) {\n this.dirty = true;\n this._forceClearCache = false;\n }\n return shouldClear;\n },\n\n /**\n * Measure a single line given its index. Used to calculate the initial\n * text bounding box. The values are calculated and stored in __lineWidths cache.\n * @private\n * @param {Number} lineIndex line number\n * @return {Number} Line width\n */\n getLineWidth: function(lineIndex) {\n if (this.__lineWidths[lineIndex] !== undefined) {\n return this.__lineWidths[lineIndex];\n }\n\n var lineInfo = this.measureLine(lineIndex);\n var width = lineInfo.width;\n this.__lineWidths[lineIndex] = width;\n return width;\n },\n\n _getWidthOfCharSpacing: function() {\n if (this.charSpacing !== 0) {\n return this.fontSize * this.charSpacing / 1000;\n }\n return 0;\n },\n\n /**\n * Retrieves the value of property at given character position\n * @param {Number} lineIndex the line number\n * @param {Number} charIndex the character number\n * @param {String} property the property name\n * @returns the value of 'property'\n */\n getValueOfPropertyAt: function(lineIndex, charIndex, property) {\n var charStyle = this._getStyleDeclaration(lineIndex, charIndex);\n if (charStyle && typeof charStyle[property] !== 'undefined') {\n return charStyle[property];\n }\n return this[property];\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _renderTextDecoration: function(ctx, type) {\n if (!this[type] && !this.styleHas(type)) {\n return;\n }\n var heightOfLine, size, _size,\n lineLeftOffset, dy, _dy,\n line, lastDecoration,\n leftOffset = this._getLeftOffset(),\n topOffset = this._getTopOffset(), top,\n boxStart, boxWidth, charBox, currentDecoration,\n maxHeight, currentFill, lastFill, path = this.path,\n charSpacing = this._getWidthOfCharSpacing(),\n offsetY = this.offsets[type];\n\n for (var i = 0, len = this._textLines.length; i < len; i++) {\n heightOfLine = this.getHeightOfLine(i);\n if (!this[type] && !this.styleHas(type, i)) {\n topOffset += heightOfLine;\n continue;\n }\n line = this._textLines[i];\n maxHeight = heightOfLine / this.lineHeight;\n lineLeftOffset = this._getLineLeftOffset(i);\n boxStart = 0;\n boxWidth = 0;\n lastDecoration = this.getValueOfPropertyAt(i, 0, type);\n lastFill = this.getValueOfPropertyAt(i, 0, 'fill');\n top = topOffset + maxHeight * (1 - this._fontSizeFraction);\n size = this.getHeightOfChar(i, 0);\n dy = this.getValueOfPropertyAt(i, 0, 'deltaY');\n for (var j = 0, jlen = line.length; j < jlen; j++) {\n charBox = this.__charBounds[i][j];\n currentDecoration = this.getValueOfPropertyAt(i, j, type);\n currentFill = this.getValueOfPropertyAt(i, j, 'fill');\n _size = this.getHeightOfChar(i, j);\n _dy = this.getValueOfPropertyAt(i, j, 'deltaY');\n if (path && currentDecoration && currentFill) {\n ctx.save();\n ctx.fillStyle = lastFill;\n ctx.translate(charBox.renderLeft, charBox.renderTop);\n ctx.rotate(charBox.angle);\n ctx.fillRect(\n -charBox.kernedWidth / 2,\n offsetY * _size + _dy,\n charBox.kernedWidth,\n this.fontSize / 15\n );\n ctx.restore();\n }\n else if (\n (currentDecoration !== lastDecoration || currentFill !== lastFill || _size !== size || _dy !== dy)\n && boxWidth > 0\n ) {\n var drawStart = leftOffset + lineLeftOffset + boxStart;\n if (this.direction === 'rtl') {\n drawStart = this.width - drawStart - boxWidth;\n }\n if (lastDecoration && lastFill) {\n ctx.fillStyle = lastFill;\n ctx.fillRect(\n drawStart,\n top + offsetY * size + dy,\n boxWidth,\n this.fontSize / 15\n );\n }\n boxStart = charBox.left;\n boxWidth = charBox.width;\n lastDecoration = currentDecoration;\n lastFill = currentFill;\n size = _size;\n dy = _dy;\n }\n else {\n boxWidth += charBox.kernedWidth;\n }\n }\n var drawStart = leftOffset + lineLeftOffset + boxStart;\n if (this.direction === 'rtl') {\n drawStart = this.width - drawStart - boxWidth;\n }\n ctx.fillStyle = currentFill;\n currentDecoration && currentFill && ctx.fillRect(\n drawStart,\n top + offsetY * size + dy,\n boxWidth - charSpacing,\n this.fontSize / 15\n );\n topOffset += heightOfLine;\n }\n // if there is text background color no\n // other shadows should be casted\n this._removeShadow(ctx);\n },\n\n /**\n * return font declaration string for canvas context\n * @param {Object} [styleObject] object\n * @returns {String} font declaration formatted for canvas context.\n */\n _getFontDeclaration: function(styleObject, forMeasuring) {\n var style = styleObject || this, family = this.fontFamily,\n fontIsGeneric = fabric.Text.genericFonts.indexOf(family.toLowerCase()) > -1;\n var fontFamily = family === undefined ||\n family.indexOf('\\'') > -1 || family.indexOf(',') > -1 ||\n family.indexOf('\"') > -1 || fontIsGeneric\n ? style.fontFamily : '\"' + style.fontFamily + '\"';\n return [\n // node-canvas needs \"weight style\", while browsers need \"style weight\"\n // verify if this can be fixed in JSDOM\n (fabric.isLikelyNode ? style.fontWeight : style.fontStyle),\n (fabric.isLikelyNode ? style.fontStyle : style.fontWeight),\n forMeasuring ? this.CACHE_FONT_SIZE + 'px' : style.fontSize + 'px',\n fontFamily\n ].join(' ');\n },\n\n /**\n * Renders text instance on a specified context\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n render: function(ctx) {\n // do not render if object is not visible\n if (!this.visible) {\n return;\n }\n if (this.canvas && this.canvas.skipOffscreen && !this.group && !this.isOnScreen()) {\n return;\n }\n if (this._shouldClearDimensionCache()) {\n this.initDimensions();\n }\n this.callSuper('render', ctx);\n },\n\n /**\n * Returns the text as an array of lines.\n * @param {String} text text to split\n * @returns {Array} Lines in the text\n */\n _splitTextIntoLines: function(text) {\n var lines = text.split(this._reNewline),\n newLines = new Array(lines.length),\n newLine = ['\\n'],\n newText = [];\n for (var i = 0; i < lines.length; i++) {\n newLines[i] = fabric.util.string.graphemeSplit(lines[i]);\n newText = newText.concat(newLines[i], newLine);\n }\n newText.pop();\n return { _unwrappedLines: newLines, lines: lines, graphemeText: newText, graphemeLines: newLines };\n },\n\n /**\n * Returns object representation of an instance\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} Object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n var allProperties = additionalProps.concat(propertiesToInclude);\n var obj = this.callSuper('toObject', allProperties);\n obj.styles = fabric.util.stylesToArray(this.styles, this.text);\n if (obj.path) {\n obj.path = this.path.toObject();\n }\n return obj;\n },\n\n /**\n * Sets property to a given value. When changing position/dimension -related properties (left, top, scale, angle, etc.) `set` does not update position of object's borders/controls. If you need to update those, call `setCoords()`.\n * @param {String|Object} key Property name or object (if object, iterate over the object properties)\n * @param {Object|Function} value Property value (if function, the value is passed into it and its return value is used as a new one)\n * @return {fabric.Object} thisArg\n * @chainable\n */\n set: function(key, value) {\n this.callSuper('set', key, value);\n var needsDims = false;\n var isAddingPath = false;\n if (typeof key === 'object') {\n for (var _key in key) {\n if (_key === 'path') {\n this.setPathInfo();\n }\n needsDims = needsDims || this._dimensionAffectingProps.indexOf(_key) !== -1;\n isAddingPath = isAddingPath || _key === 'path';\n }\n }\n else {\n needsDims = this._dimensionAffectingProps.indexOf(key) !== -1;\n isAddingPath = key === 'path';\n }\n if (isAddingPath) {\n this.setPathInfo();\n }\n if (needsDims) {\n this.initDimensions();\n this.setCoords();\n }\n return this;\n },\n\n /**\n * Returns complexity of an instance\n * @return {Number} complexity\n */\n complexity: function() {\n return 1;\n }\n });\n\n /* _FROM_SVG_START_ */\n /**\n * List of attribute names to account for when parsing SVG element (used by {@link fabric.Text.fromElement})\n * @static\n * @memberOf fabric.Text\n * @see: http://www.w3.org/TR/SVG/text.html#TextElement\n */\n fabric.Text.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat(\n 'x y dx dy font-family font-style font-weight font-size letter-spacing text-decoration text-anchor'.split(' '));\n\n /**\n * Default SVG font size\n * @static\n * @memberOf fabric.Text\n */\n fabric.Text.DEFAULT_SVG_FONT_SIZE = 16;\n\n /**\n * Returns fabric.Text instance from an SVG element (not yet implemented)\n * @static\n * @memberOf fabric.Text\n * @param {SVGElement} element Element to parse\n * @param {Function} callback callback function invoked after parsing\n * @param {Object} [options] Options object\n */\n fabric.Text.fromElement = function(element, callback, options) {\n if (!element) {\n return callback(null);\n }\n\n var parsedAttributes = fabric.parseAttributes(element, fabric.Text.ATTRIBUTE_NAMES),\n parsedAnchor = parsedAttributes.textAnchor || 'left';\n options = fabric.util.object.extend((options ? clone(options) : { }), parsedAttributes);\n\n options.top = options.top || 0;\n options.left = options.left || 0;\n if (parsedAttributes.textDecoration) {\n var textDecoration = parsedAttributes.textDecoration;\n if (textDecoration.indexOf('underline') !== -1) {\n options.underline = true;\n }\n if (textDecoration.indexOf('overline') !== -1) {\n options.overline = true;\n }\n if (textDecoration.indexOf('line-through') !== -1) {\n options.linethrough = true;\n }\n delete options.textDecoration;\n }\n if ('dx' in parsedAttributes) {\n options.left += parsedAttributes.dx;\n }\n if ('dy' in parsedAttributes) {\n options.top += parsedAttributes.dy;\n }\n if (!('fontSize' in options)) {\n options.fontSize = fabric.Text.DEFAULT_SVG_FONT_SIZE;\n }\n\n var textContent = '';\n\n // The XML is not properly parsed in IE9 so a workaround to get\n // textContent is through firstChild.data. Another workaround would be\n // to convert XML loaded from a file to be converted using DOMParser (same way loadSVGFromString() does)\n if (!('textContent' in element)) {\n if ('firstChild' in element && element.firstChild !== null) {\n if ('data' in element.firstChild && element.firstChild.data !== null) {\n textContent = element.firstChild.data;\n }\n }\n }\n else {\n textContent = element.textContent;\n }\n\n textContent = textContent.replace(/^\\s+|\\s+$|\\n+/g, '').replace(/\\s+/g, ' ');\n var originalStrokeWidth = options.strokeWidth;\n options.strokeWidth = 0;\n\n var text = new fabric.Text(textContent, options),\n textHeightScaleFactor = text.getScaledHeight() / text.height,\n lineHeightDiff = (text.height + text.strokeWidth) * text.lineHeight - text.height,\n scaledDiff = lineHeightDiff * textHeightScaleFactor,\n textHeight = text.getScaledHeight() + scaledDiff,\n offX = 0;\n /*\n Adjust positioning:\n x/y attributes in SVG correspond to the bottom-left corner of text bounding box\n fabric output by default at top, left.\n */\n if (parsedAnchor === 'center') {\n offX = text.getScaledWidth() / 2;\n }\n if (parsedAnchor === 'right') {\n offX = text.getScaledWidth();\n }\n text.set({\n left: text.left - offX,\n top: text.top - (textHeight - text.fontSize * (0.07 + text._fontSizeFraction)) / text.lineHeight,\n strokeWidth: typeof originalStrokeWidth !== 'undefined' ? originalStrokeWidth : 1,\n });\n callback(text);\n };\n /* _FROM_SVG_END_ */\n\n /**\n * Returns fabric.Text instance from an object representation\n * @static\n * @memberOf fabric.Text\n * @param {Object} object plain js Object to create an instance from\n * @param {Function} [callback] Callback to invoke when an fabric.Text instance is created\n */\n fabric.Text.fromObject = function(object, callback) {\n var objectCopy = clone(object), path = object.path;\n delete objectCopy.path;\n return fabric.Object._fromObject('Text', objectCopy, function(textInstance) {\n textInstance.styles = fabric.util.stylesFromArray(object.styles, object.text);\n if (path) {\n fabric.Object._fromObject('Path', path, function(pathInstance) {\n textInstance.set('path', pathInstance);\n callback(textInstance);\n }, 'path');\n }\n else {\n callback(textInstance);\n }\n }, 'text');\n };\n\n fabric.Text.genericFonts = ['sans-serif', 'serif', 'cursive', 'fantasy', 'monospace'];\n\n fabric.util.createAccessors && fabric.util.createAccessors(fabric.Text);\n\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function() {\n fabric.util.object.extend(fabric.Text.prototype, /** @lends fabric.Text.prototype */ {\n /**\n * Returns true if object has no styling or no styling in a line\n * @param {Number} lineIndex , lineIndex is on wrapped lines.\n * @return {Boolean}\n */\n isEmptyStyles: function(lineIndex) {\n if (!this.styles) {\n return true;\n }\n if (typeof lineIndex !== 'undefined' && !this.styles[lineIndex]) {\n return true;\n }\n var obj = typeof lineIndex === 'undefined' ? this.styles : { line: this.styles[lineIndex] };\n for (var p1 in obj) {\n for (var p2 in obj[p1]) {\n // eslint-disable-next-line no-unused-vars\n for (var p3 in obj[p1][p2]) {\n return false;\n }\n }\n }\n return true;\n },\n\n /**\n * Returns true if object has a style property or has it ina specified line\n * This function is used to detect if a text will use a particular property or not.\n * @param {String} property to check for\n * @param {Number} lineIndex to check the style on\n * @return {Boolean}\n */\n styleHas: function(property, lineIndex) {\n if (!this.styles || !property || property === '') {\n return false;\n }\n if (typeof lineIndex !== 'undefined' && !this.styles[lineIndex]) {\n return false;\n }\n var obj = typeof lineIndex === 'undefined' ? this.styles : { 0: this.styles[lineIndex] };\n // eslint-disable-next-line\n for (var p1 in obj) {\n // eslint-disable-next-line\n for (var p2 in obj[p1]) {\n if (typeof obj[p1][p2][property] !== 'undefined') {\n return true;\n }\n }\n }\n return false;\n },\n\n /**\n * Check if characters in a text have a value for a property\n * whose value matches the textbox's value for that property. If so,\n * the character-level property is deleted. If the character\n * has no other properties, then it is also deleted. Finally,\n * if the line containing that character has no other characters\n * then it also is deleted.\n *\n * @param {string} property The property to compare between characters and text.\n */\n cleanStyle: function(property) {\n if (!this.styles || !property || property === '') {\n return false;\n }\n var obj = this.styles, stylesCount = 0, letterCount, stylePropertyValue,\n allStyleObjectPropertiesMatch = true, graphemeCount = 0, styleObject;\n // eslint-disable-next-line\n for (var p1 in obj) {\n letterCount = 0;\n // eslint-disable-next-line\n for (var p2 in obj[p1]) {\n var styleObject = obj[p1][p2],\n stylePropertyHasBeenSet = styleObject.hasOwnProperty(property);\n\n stylesCount++;\n\n if (stylePropertyHasBeenSet) {\n if (!stylePropertyValue) {\n stylePropertyValue = styleObject[property];\n }\n else if (styleObject[property] !== stylePropertyValue) {\n allStyleObjectPropertiesMatch = false;\n }\n\n if (styleObject[property] === this[property]) {\n delete styleObject[property];\n }\n }\n else {\n allStyleObjectPropertiesMatch = false;\n }\n\n if (Object.keys(styleObject).length !== 0) {\n letterCount++;\n }\n else {\n delete obj[p1][p2];\n }\n }\n\n if (letterCount === 0) {\n delete obj[p1];\n }\n }\n // if every grapheme has the same style set then\n // delete those styles and set it on the parent\n for (var i = 0; i < this._textLines.length; i++) {\n graphemeCount += this._textLines[i].length;\n }\n if (allStyleObjectPropertiesMatch && stylesCount === graphemeCount) {\n this[property] = stylePropertyValue;\n this.removeStyle(property);\n }\n },\n\n /**\n * Remove a style property or properties from all individual character styles\n * in a text object. Deletes the character style object if it contains no other style\n * props. Deletes a line style object if it contains no other character styles.\n *\n * @param {String} props The property to remove from character styles.\n */\n removeStyle: function(property) {\n if (!this.styles || !property || property === '') {\n return;\n }\n var obj = this.styles, line, lineNum, charNum;\n for (lineNum in obj) {\n line = obj[lineNum];\n for (charNum in line) {\n delete line[charNum][property];\n if (Object.keys(line[charNum]).length === 0) {\n delete line[charNum];\n }\n }\n if (Object.keys(line).length === 0) {\n delete obj[lineNum];\n }\n }\n },\n\n /**\n * @private\n */\n _extendStyles: function(index, styles) {\n var loc = this.get2DCursorLocation(index);\n\n if (!this._getLineStyle(loc.lineIndex)) {\n this._setLineStyle(loc.lineIndex);\n }\n\n if (!this._getStyleDeclaration(loc.lineIndex, loc.charIndex)) {\n this._setStyleDeclaration(loc.lineIndex, loc.charIndex, {});\n }\n\n fabric.util.object.extend(this._getStyleDeclaration(loc.lineIndex, loc.charIndex), styles);\n },\n\n /**\n * Returns 2d representation (lineIndex and charIndex) of cursor (or selection start)\n * @param {Number} [selectionStart] Optional index. When not given, current selectionStart is used.\n * @param {Boolean} [skipWrapping] consider the location for unwrapped lines. useful to manage styles.\n */\n get2DCursorLocation: function(selectionStart, skipWrapping) {\n if (typeof selectionStart === 'undefined') {\n selectionStart = this.selectionStart;\n }\n var lines = skipWrapping ? this._unwrappedTextLines : this._textLines,\n len = lines.length;\n for (var i = 0; i < len; i++) {\n if (selectionStart <= lines[i].length) {\n return {\n lineIndex: i,\n charIndex: selectionStart\n };\n }\n selectionStart -= lines[i].length + this.missingNewlineOffset(i);\n }\n return {\n lineIndex: i - 1,\n charIndex: lines[i - 1].length < selectionStart ? lines[i - 1].length : selectionStart\n };\n },\n\n /**\n * Gets style of a current selection/cursor (at the start position)\n * if startIndex or endIndex are not provided, selectionStart or selectionEnd will be used.\n * @param {Number} [startIndex] Start index to get styles at\n * @param {Number} [endIndex] End index to get styles at, if not specified selectionEnd or startIndex + 1\n * @param {Boolean} [complete] get full style or not\n * @return {Array} styles an array with one, zero or more Style objects\n */\n getSelectionStyles: function(startIndex, endIndex, complete) {\n if (typeof startIndex === 'undefined') {\n startIndex = this.selectionStart || 0;\n }\n if (typeof endIndex === 'undefined') {\n endIndex = this.selectionEnd || startIndex;\n }\n var styles = [];\n for (var i = startIndex; i < endIndex; i++) {\n styles.push(this.getStyleAtPosition(i, complete));\n }\n return styles;\n },\n\n /**\n * Gets style of a current selection/cursor position\n * @param {Number} position to get styles at\n * @param {Boolean} [complete] full style if true\n * @return {Object} style Style object at a specified index\n * @private\n */\n getStyleAtPosition: function(position, complete) {\n var loc = this.get2DCursorLocation(position),\n style = complete ? this.getCompleteStyleDeclaration(loc.lineIndex, loc.charIndex) :\n this._getStyleDeclaration(loc.lineIndex, loc.charIndex);\n return style || {};\n },\n\n /**\n * Sets style of a current selection, if no selection exist, do not set anything.\n * @param {Object} [styles] Styles object\n * @param {Number} [startIndex] Start index to get styles at\n * @param {Number} [endIndex] End index to get styles at, if not specified selectionEnd or startIndex + 1\n * @return {fabric.IText} thisArg\n * @chainable\n */\n setSelectionStyles: function(styles, startIndex, endIndex) {\n if (typeof startIndex === 'undefined') {\n startIndex = this.selectionStart || 0;\n }\n if (typeof endIndex === 'undefined') {\n endIndex = this.selectionEnd || startIndex;\n }\n for (var i = startIndex; i < endIndex; i++) {\n this._extendStyles(i, styles);\n }\n /* not included in _extendStyles to avoid clearing cache more than once */\n this._forceClearCache = true;\n return this;\n },\n\n /**\n * get the reference, not a clone, of the style object for a given character\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @return {Object} style object\n */\n _getStyleDeclaration: function(lineIndex, charIndex) {\n var lineStyle = this.styles && this.styles[lineIndex];\n if (!lineStyle) {\n return null;\n }\n return lineStyle[charIndex];\n },\n\n /**\n * return a new object that contains all the style property for a character\n * the object returned is newly created\n * @param {Number} lineIndex of the line where the character is\n * @param {Number} charIndex position of the character on the line\n * @return {Object} style object\n */\n getCompleteStyleDeclaration: function(lineIndex, charIndex) {\n var style = this._getStyleDeclaration(lineIndex, charIndex) || { },\n styleObject = { }, prop;\n for (var i = 0; i < this._styleProperties.length; i++) {\n prop = this._styleProperties[i];\n styleObject[prop] = typeof style[prop] === 'undefined' ? this[prop] : style[prop];\n }\n return styleObject;\n },\n\n /**\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @param {Object} style\n * @private\n */\n _setStyleDeclaration: function(lineIndex, charIndex, style) {\n this.styles[lineIndex][charIndex] = style;\n },\n\n /**\n *\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @private\n */\n _deleteStyleDeclaration: function(lineIndex, charIndex) {\n delete this.styles[lineIndex][charIndex];\n },\n\n /**\n * @param {Number} lineIndex\n * @return {Boolean} if the line exists or not\n * @private\n */\n _getLineStyle: function(lineIndex) {\n return !!this.styles[lineIndex];\n },\n\n /**\n * Set the line style to an empty object so that is initialized\n * @param {Number} lineIndex\n * @private\n */\n _setLineStyle: function(lineIndex) {\n this.styles[lineIndex] = {};\n },\n\n /**\n * @param {Number} lineIndex\n * @private\n */\n _deleteLineStyle: function(lineIndex) {\n delete this.styles[lineIndex];\n }\n });\n})();\n\n\n(function() {\n\n function parseDecoration(object) {\n if (object.textDecoration) {\n object.textDecoration.indexOf('underline') > -1 && (object.underline = true);\n object.textDecoration.indexOf('line-through') > -1 && (object.linethrough = true);\n object.textDecoration.indexOf('overline') > -1 && (object.overline = true);\n delete object.textDecoration;\n }\n }\n\n /**\n * IText class (introduced in v1.4) Events are also fired with \"text:\"\n * prefix when observing canvas.\n * @class fabric.IText\n * @extends fabric.Text\n * @mixes fabric.Observable\n *\n * @fires changed\n * @fires selection:changed\n * @fires editing:entered\n * @fires editing:exited\n *\n * @return {fabric.IText} thisArg\n * @see {@link fabric.IText#initialize} for constructor definition\n *\n *

Supported key combinations:

\n *
\n   *   Move cursor:                    left, right, up, down\n   *   Select character:               shift + left, shift + right\n   *   Select text vertically:         shift + up, shift + down\n   *   Move cursor by word:            alt + left, alt + right\n   *   Select words:                   shift + alt + left, shift + alt + right\n   *   Move cursor to line start/end:  cmd + left, cmd + right or home, end\n   *   Select till start/end of line:  cmd + shift + left, cmd + shift + right or shift + home, shift + end\n   *   Jump to start/end of text:      cmd + up, cmd + down\n   *   Select till start/end of text:  cmd + shift + up, cmd + shift + down or shift + pgUp, shift + pgDown\n   *   Delete character:               backspace\n   *   Delete word:                    alt + backspace\n   *   Delete line:                    cmd + backspace\n   *   Forward delete:                 delete\n   *   Copy text:                      ctrl/cmd + c\n   *   Paste text:                     ctrl/cmd + v\n   *   Cut text:                       ctrl/cmd + x\n   *   Select entire text:             ctrl/cmd + a\n   *   Quit editing                    tab or esc\n   * 
\n *\n *

Supported mouse/touch combination

\n *
\n   *   Position cursor:                click/touch\n   *   Create selection:               click/touch & drag\n   *   Create selection:               click & shift + click\n   *   Select word:                    double click\n   *   Select line:                    triple click\n   * 
\n */\n fabric.IText = fabric.util.createClass(fabric.Text, fabric.Observable, /** @lends fabric.IText.prototype */ {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'i-text',\n\n /**\n * Index where text selection starts (or where cursor is when there is no selection)\n * @type Number\n * @default\n */\n selectionStart: 0,\n\n /**\n * Index where text selection ends\n * @type Number\n * @default\n */\n selectionEnd: 0,\n\n /**\n * Color of text selection\n * @type String\n * @default\n */\n selectionColor: 'rgba(17,119,255,0.3)',\n\n /**\n * Indicates whether text is in editing mode\n * @type Boolean\n * @default\n */\n isEditing: false,\n\n /**\n * Indicates whether a text can be edited\n * @type Boolean\n * @default\n */\n editable: true,\n\n /**\n * Border color of text object while it's in editing mode\n * @type String\n * @default\n */\n editingBorderColor: 'rgba(102,153,255,0.25)',\n\n /**\n * Width of cursor (in px)\n * @type Number\n * @default\n */\n cursorWidth: 2,\n\n /**\n * Color of text cursor color in editing mode.\n * if not set (default) will take color from the text.\n * if set to a color value that fabric can understand, it will\n * be used instead of the color of the text at the current position.\n * @type String\n * @default\n */\n cursorColor: '',\n\n /**\n * Delay between cursor blink (in ms)\n * @type Number\n * @default\n */\n cursorDelay: 1000,\n\n /**\n * Duration of cursor fadein (in ms)\n * @type Number\n * @default\n */\n cursorDuration: 600,\n\n /**\n * Indicates whether internal text char widths can be cached\n * @type Boolean\n * @default\n */\n caching: true,\n\n /**\n * DOM container to append the hiddenTextarea.\n * An alternative to attaching to the document.body.\n * Useful to reduce laggish redraw of the full document.body tree and\n * also with modals event capturing that won't let the textarea take focus.\n * @type HTMLElement\n * @default\n */\n hiddenTextareaContainer: null,\n\n /**\n * @private\n */\n _reSpace: /\\s|\\n/,\n\n /**\n * @private\n */\n _currentCursorOpacity: 0,\n\n /**\n * @private\n */\n _selectionDirection: null,\n\n /**\n * @private\n */\n _abortCursorAnimation: false,\n\n /**\n * @private\n */\n __widthOfSpace: [],\n\n /**\n * Helps determining when the text is in composition, so that the cursor\n * rendering is altered.\n */\n inCompositionMode: false,\n\n /**\n * Constructor\n * @param {String} text Text string\n * @param {Object} [options] Options object\n * @return {fabric.IText} thisArg\n */\n initialize: function(text, options) {\n this.callSuper('initialize', text, options);\n this.initBehavior();\n },\n\n /**\n * Sets selection start (left boundary of a selection)\n * @param {Number} index Index to set selection start to\n */\n setSelectionStart: function(index) {\n index = Math.max(index, 0);\n this._updateAndFire('selectionStart', index);\n },\n\n /**\n * Sets selection end (right boundary of a selection)\n * @param {Number} index Index to set selection end to\n */\n setSelectionEnd: function(index) {\n index = Math.min(index, this.text.length);\n this._updateAndFire('selectionEnd', index);\n },\n\n /**\n * @private\n * @param {String} property 'selectionStart' or 'selectionEnd'\n * @param {Number} index new position of property\n */\n _updateAndFire: function(property, index) {\n if (this[property] !== index) {\n this._fireSelectionChanged();\n this[property] = index;\n }\n this._updateTextarea();\n },\n\n /**\n * Fires the even of selection changed\n * @private\n */\n _fireSelectionChanged: function() {\n this.fire('selection:changed');\n this.canvas && this.canvas.fire('text:selection:changed', { target: this });\n },\n\n /**\n * Initialize text dimensions. Render all text on given context\n * or on a offscreen canvas to get the text width with measureText.\n * Updates this.width and this.height with the proper values.\n * Does not return dimensions.\n * @private\n */\n initDimensions: function() {\n this.isEditing && this.initDelayedCursor();\n this.clearContextTop();\n this.callSuper('initDimensions');\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n render: function(ctx) {\n this.clearContextTop();\n this.callSuper('render', ctx);\n // clear the cursorOffsetCache, so we ensure to calculate once per renderCursor\n // the correct position but not at every cursor animation.\n this.cursorOffsetCache = { };\n this.renderCursorOrSelection();\n },\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} ctx Context to render on\n */\n _render: function(ctx) {\n this.callSuper('_render', ctx);\n },\n\n /**\n * Prepare and clean the contextTop\n */\n clearContextTop: function(skipRestore) {\n if (!this.isEditing || !this.canvas || !this.canvas.contextTop) {\n return;\n }\n var ctx = this.canvas.contextTop, v = this.canvas.viewportTransform;\n ctx.save();\n ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]);\n this.transform(ctx);\n this._clearTextArea(ctx);\n skipRestore || ctx.restore();\n },\n /**\n * Renders cursor or selection (depending on what exists)\n * it does on the contextTop. If contextTop is not available, do nothing.\n */\n renderCursorOrSelection: function() {\n if (!this.isEditing || !this.canvas || !this.canvas.contextTop) {\n return;\n }\n var boundaries = this._getCursorBoundaries(),\n ctx = this.canvas.contextTop;\n this.clearContextTop(true);\n if (this.selectionStart === this.selectionEnd) {\n this.renderCursor(boundaries, ctx);\n }\n else {\n this.renderSelection(boundaries, ctx);\n }\n ctx.restore();\n },\n\n _clearTextArea: function(ctx) {\n // we add 4 pixel, to be sure to do not leave any pixel out\n var width = this.width + 4, height = this.height + 4;\n ctx.clearRect(-width / 2, -height / 2, width, height);\n },\n\n /**\n * Returns cursor boundaries (left, top, leftOffset, topOffset)\n * @private\n * @param {Array} chars Array of characters\n * @param {String} typeOfBoundaries\n */\n _getCursorBoundaries: function(position) {\n\n // left/top are left/top of entire text box\n // leftOffset/topOffset are offset from that left/top point of a text box\n\n if (typeof position === 'undefined') {\n position = this.selectionStart;\n }\n\n var left = this._getLeftOffset(),\n top = this._getTopOffset(),\n offsets = this._getCursorBoundariesOffsets(position);\n return {\n left: left,\n top: top,\n leftOffset: offsets.left,\n topOffset: offsets.top\n };\n },\n\n /**\n * @private\n */\n _getCursorBoundariesOffsets: function(position) {\n if (this.cursorOffsetCache && 'top' in this.cursorOffsetCache) {\n return this.cursorOffsetCache;\n }\n var lineLeftOffset,\n lineIndex,\n charIndex,\n topOffset = 0,\n leftOffset = 0,\n boundaries,\n cursorPosition = this.get2DCursorLocation(position);\n charIndex = cursorPosition.charIndex;\n lineIndex = cursorPosition.lineIndex;\n for (var i = 0; i < lineIndex; i++) {\n topOffset += this.getHeightOfLine(i);\n }\n lineLeftOffset = this._getLineLeftOffset(lineIndex);\n var bound = this.__charBounds[lineIndex][charIndex];\n bound && (leftOffset = bound.left);\n if (this.charSpacing !== 0 && charIndex === this._textLines[lineIndex].length) {\n leftOffset -= this._getWidthOfCharSpacing();\n }\n boundaries = {\n top: topOffset,\n left: lineLeftOffset + (leftOffset > 0 ? leftOffset : 0),\n };\n if (this.direction === 'rtl') {\n boundaries.left *= -1;\n }\n this.cursorOffsetCache = boundaries;\n return this.cursorOffsetCache;\n },\n\n /**\n * Renders cursor\n * @param {Object} boundaries\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n renderCursor: function(boundaries, ctx) {\n var cursorLocation = this.get2DCursorLocation(),\n lineIndex = cursorLocation.lineIndex,\n charIndex = cursorLocation.charIndex > 0 ? cursorLocation.charIndex - 1 : 0,\n charHeight = this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize'),\n multiplier = this.scaleX * this.canvas.getZoom(),\n cursorWidth = this.cursorWidth / multiplier,\n topOffset = boundaries.topOffset,\n dy = this.getValueOfPropertyAt(lineIndex, charIndex, 'deltaY');\n topOffset += (1 - this._fontSizeFraction) * this.getHeightOfLine(lineIndex) / this.lineHeight\n - charHeight * (1 - this._fontSizeFraction);\n\n if (this.inCompositionMode) {\n this.renderSelection(boundaries, ctx);\n }\n ctx.fillStyle = this.cursorColor || this.getValueOfPropertyAt(lineIndex, charIndex, 'fill');\n ctx.globalAlpha = this.__isMousedown ? 1 : this._currentCursorOpacity;\n ctx.fillRect(\n boundaries.left + boundaries.leftOffset - cursorWidth / 2,\n topOffset + boundaries.top + dy,\n cursorWidth,\n charHeight);\n },\n\n /**\n * Renders text selection\n * @param {Object} boundaries Object with left/top/leftOffset/topOffset\n * @param {CanvasRenderingContext2D} ctx transformed context to draw on\n */\n renderSelection: function(boundaries, ctx) {\n\n var selectionStart = this.inCompositionMode ? this.hiddenTextarea.selectionStart : this.selectionStart,\n selectionEnd = this.inCompositionMode ? this.hiddenTextarea.selectionEnd : this.selectionEnd,\n isJustify = this.textAlign.indexOf('justify') !== -1,\n start = this.get2DCursorLocation(selectionStart),\n end = this.get2DCursorLocation(selectionEnd),\n startLine = start.lineIndex,\n endLine = end.lineIndex,\n startChar = start.charIndex < 0 ? 0 : start.charIndex,\n endChar = end.charIndex < 0 ? 0 : end.charIndex;\n\n for (var i = startLine; i <= endLine; i++) {\n var lineOffset = this._getLineLeftOffset(i) || 0,\n lineHeight = this.getHeightOfLine(i),\n realLineHeight = 0, boxStart = 0, boxEnd = 0;\n\n if (i === startLine) {\n boxStart = this.__charBounds[startLine][startChar].left;\n }\n if (i >= startLine && i < endLine) {\n boxEnd = isJustify && !this.isEndOfWrapping(i) ? this.width : this.getLineWidth(i) || 5; // WTF is this 5?\n }\n else if (i === endLine) {\n if (endChar === 0) {\n boxEnd = this.__charBounds[endLine][endChar].left;\n }\n else {\n var charSpacing = this._getWidthOfCharSpacing();\n boxEnd = this.__charBounds[endLine][endChar - 1].left\n + this.__charBounds[endLine][endChar - 1].width - charSpacing;\n }\n }\n realLineHeight = lineHeight;\n if (this.lineHeight < 1 || (i === endLine && this.lineHeight > 1)) {\n lineHeight /= this.lineHeight;\n }\n var drawStart = boundaries.left + lineOffset + boxStart,\n drawWidth = boxEnd - boxStart,\n drawHeight = lineHeight, extraTop = 0;\n if (this.inCompositionMode) {\n ctx.fillStyle = this.compositionColor || 'black';\n drawHeight = 1;\n extraTop = lineHeight;\n }\n else {\n ctx.fillStyle = this.selectionColor;\n }\n if (this.direction === 'rtl') {\n drawStart = this.width - drawStart - drawWidth;\n }\n ctx.fillRect(\n drawStart,\n boundaries.top + boundaries.topOffset + extraTop,\n drawWidth,\n drawHeight);\n boundaries.topOffset += realLineHeight;\n }\n },\n\n /**\n * High level function to know the height of the cursor.\n * the currentChar is the one that precedes the cursor\n * Returns fontSize of char at the current cursor\n * Unused from the library, is for the end user\n * @return {Number} Character font size\n */\n getCurrentCharFontSize: function() {\n var cp = this._getCurrentCharIndex();\n return this.getValueOfPropertyAt(cp.l, cp.c, 'fontSize');\n },\n\n /**\n * High level function to know the color of the cursor.\n * the currentChar is the one that precedes the cursor\n * Returns color (fill) of char at the current cursor\n * if the text object has a pattern or gradient for filler, it will return that.\n * Unused by the library, is for the end user\n * @return {String | fabric.Gradient | fabric.Pattern} Character color (fill)\n */\n getCurrentCharColor: function() {\n var cp = this._getCurrentCharIndex();\n return this.getValueOfPropertyAt(cp.l, cp.c, 'fill');\n },\n\n /**\n * Returns the cursor position for the getCurrent.. functions\n * @private\n */\n _getCurrentCharIndex: function() {\n var cursorPosition = this.get2DCursorLocation(this.selectionStart, true),\n charIndex = cursorPosition.charIndex > 0 ? cursorPosition.charIndex - 1 : 0;\n return { l: cursorPosition.lineIndex, c: charIndex };\n }\n });\n\n /**\n * Returns fabric.IText instance from an object representation\n * @static\n * @memberOf fabric.IText\n * @param {Object} object Object to create an instance from\n * @param {function} [callback] invoked with new instance as argument\n */\n fabric.IText.fromObject = function(object, callback) {\n var styles = fabric.util.stylesFromArray(object.styles, object.text);\n //copy object to prevent mutation\n var objCopy = Object.assign({}, object, { styles: styles });\n parseDecoration(objCopy);\n if (objCopy.styles) {\n for (var i in objCopy.styles) {\n for (var j in objCopy.styles[i]) {\n parseDecoration(objCopy.styles[i][j]);\n }\n }\n }\n fabric.Object._fromObject('IText', objCopy, callback, 'text');\n };\n})();\n\n\n(function() {\n\n var clone = fabric.util.object.clone;\n\n fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.prototype */ {\n\n /**\n * Initializes all the interactive behavior of IText\n */\n initBehavior: function() {\n this.initAddedHandler();\n this.initRemovedHandler();\n this.initCursorSelectionHandlers();\n this.initDoubleClickSimulation();\n this.mouseMoveHandler = this.mouseMoveHandler.bind(this);\n },\n\n onDeselect: function() {\n this.isEditing && this.exitEditing();\n this.selected = false;\n },\n\n /**\n * Initializes \"added\" event handler\n */\n initAddedHandler: function() {\n var _this = this;\n this.on('added', function() {\n var canvas = _this.canvas;\n if (canvas) {\n if (!canvas._hasITextHandlers) {\n canvas._hasITextHandlers = true;\n _this._initCanvasHandlers(canvas);\n }\n canvas._iTextInstances = canvas._iTextInstances || [];\n canvas._iTextInstances.push(_this);\n }\n });\n },\n\n initRemovedHandler: function() {\n var _this = this;\n this.on('removed', function() {\n var canvas = _this.canvas;\n if (canvas) {\n canvas._iTextInstances = canvas._iTextInstances || [];\n fabric.util.removeFromArray(canvas._iTextInstances, _this);\n if (canvas._iTextInstances.length === 0) {\n canvas._hasITextHandlers = false;\n _this._removeCanvasHandlers(canvas);\n }\n }\n });\n },\n\n /**\n * register canvas event to manage exiting on other instances\n * @private\n */\n _initCanvasHandlers: function(canvas) {\n canvas._mouseUpITextHandler = function() {\n if (canvas._iTextInstances) {\n canvas._iTextInstances.forEach(function(obj) {\n obj.__isMousedown = false;\n });\n }\n };\n canvas.on('mouse:up', canvas._mouseUpITextHandler);\n },\n\n /**\n * remove canvas event to manage exiting on other instances\n * @private\n */\n _removeCanvasHandlers: function(canvas) {\n canvas.off('mouse:up', canvas._mouseUpITextHandler);\n },\n\n /**\n * @private\n */\n _tick: function() {\n this._currentTickState = this._animateCursor(this, 1, this.cursorDuration, '_onTickComplete');\n },\n\n /**\n * @private\n */\n _animateCursor: function(obj, targetOpacity, duration, completeMethod) {\n\n var tickState;\n\n tickState = {\n isAborted: false,\n abort: function() {\n this.isAborted = true;\n },\n };\n\n obj.animate('_currentCursorOpacity', targetOpacity, {\n duration: duration,\n onComplete: function() {\n if (!tickState.isAborted) {\n obj[completeMethod]();\n }\n },\n onChange: function() {\n // we do not want to animate a selection, only cursor\n if (obj.canvas && obj.selectionStart === obj.selectionEnd) {\n obj.renderCursorOrSelection();\n }\n },\n abort: function() {\n return tickState.isAborted;\n }\n });\n return tickState;\n },\n\n /**\n * @private\n */\n _onTickComplete: function() {\n\n var _this = this;\n\n if (this._cursorTimeout1) {\n clearTimeout(this._cursorTimeout1);\n }\n this._cursorTimeout1 = setTimeout(function() {\n _this._currentTickCompleteState = _this._animateCursor(_this, 0, this.cursorDuration / 2, '_tick');\n }, 100);\n },\n\n /**\n * Initializes delayed cursor\n */\n initDelayedCursor: function(restart) {\n var _this = this,\n delay = restart ? 0 : this.cursorDelay;\n\n this.abortCursorAnimation();\n this._currentCursorOpacity = 1;\n this._cursorTimeout2 = setTimeout(function() {\n _this._tick();\n }, delay);\n },\n\n /**\n * Aborts cursor animation and clears all timeouts\n */\n abortCursorAnimation: function() {\n var shouldClear = this._currentTickState || this._currentTickCompleteState,\n canvas = this.canvas;\n this._currentTickState && this._currentTickState.abort();\n this._currentTickCompleteState && this._currentTickCompleteState.abort();\n\n clearTimeout(this._cursorTimeout1);\n clearTimeout(this._cursorTimeout2);\n\n this._currentCursorOpacity = 0;\n // to clear just itext area we need to transform the context\n // it may not be worth it\n if (shouldClear && canvas) {\n canvas.clearContext(canvas.contextTop || canvas.contextContainer);\n }\n\n },\n\n /**\n * Selects entire text\n * @return {fabric.IText} thisArg\n * @chainable\n */\n selectAll: function() {\n this.selectionStart = 0;\n this.selectionEnd = this._text.length;\n this._fireSelectionChanged();\n this._updateTextarea();\n return this;\n },\n\n /**\n * Returns selected text\n * @return {String}\n */\n getSelectedText: function() {\n return this._text.slice(this.selectionStart, this.selectionEnd).join('');\n },\n\n /**\n * Find new selection index representing start of current word according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findWordBoundaryLeft: function(startFrom) {\n var offset = 0, index = startFrom - 1;\n\n // remove space before cursor first\n if (this._reSpace.test(this._text[index])) {\n while (this._reSpace.test(this._text[index])) {\n offset++;\n index--;\n }\n }\n while (/\\S/.test(this._text[index]) && index > -1) {\n offset++;\n index--;\n }\n\n return startFrom - offset;\n },\n\n /**\n * Find new selection index representing end of current word according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findWordBoundaryRight: function(startFrom) {\n var offset = 0, index = startFrom;\n\n // remove space after cursor first\n if (this._reSpace.test(this._text[index])) {\n while (this._reSpace.test(this._text[index])) {\n offset++;\n index++;\n }\n }\n while (/\\S/.test(this._text[index]) && index < this._text.length) {\n offset++;\n index++;\n }\n\n return startFrom + offset;\n },\n\n /**\n * Find new selection index representing start of current line according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findLineBoundaryLeft: function(startFrom) {\n var offset = 0, index = startFrom - 1;\n\n while (!/\\n/.test(this._text[index]) && index > -1) {\n offset++;\n index--;\n }\n\n return startFrom - offset;\n },\n\n /**\n * Find new selection index representing end of current line according to current selection index\n * @param {Number} startFrom Current selection index\n * @return {Number} New selection index\n */\n findLineBoundaryRight: function(startFrom) {\n var offset = 0, index = startFrom;\n\n while (!/\\n/.test(this._text[index]) && index < this._text.length) {\n offset++;\n index++;\n }\n\n return startFrom + offset;\n },\n\n /**\n * Finds index corresponding to beginning or end of a word\n * @param {Number} selectionStart Index of a character\n * @param {Number} direction 1 or -1\n * @return {Number} Index of the beginning or end of a word\n */\n searchWordBoundary: function(selectionStart, direction) {\n var text = this._text,\n index = this._reSpace.test(text[selectionStart]) ? selectionStart - 1 : selectionStart,\n _char = text[index],\n // wrong\n reNonWord = fabric.reNonWord;\n\n while (!reNonWord.test(_char) && index > 0 && index < text.length) {\n index += direction;\n _char = text[index];\n }\n if (reNonWord.test(_char)) {\n index += direction === 1 ? 0 : 1;\n }\n return index;\n },\n\n /**\n * Selects a word based on the index\n * @param {Number} selectionStart Index of a character\n */\n selectWord: function(selectionStart) {\n selectionStart = selectionStart || this.selectionStart;\n var newSelectionStart = this.searchWordBoundary(selectionStart, -1), /* search backwards */\n newSelectionEnd = this.searchWordBoundary(selectionStart, 1); /* search forward */\n\n this.selectionStart = newSelectionStart;\n this.selectionEnd = newSelectionEnd;\n this._fireSelectionChanged();\n this._updateTextarea();\n this.renderCursorOrSelection();\n },\n\n /**\n * Selects a line based on the index\n * @param {Number} selectionStart Index of a character\n * @return {fabric.IText} thisArg\n * @chainable\n */\n selectLine: function(selectionStart) {\n selectionStart = selectionStart || this.selectionStart;\n var newSelectionStart = this.findLineBoundaryLeft(selectionStart),\n newSelectionEnd = this.findLineBoundaryRight(selectionStart);\n\n this.selectionStart = newSelectionStart;\n this.selectionEnd = newSelectionEnd;\n this._fireSelectionChanged();\n this._updateTextarea();\n return this;\n },\n\n /**\n * Enters editing state\n * @return {fabric.IText} thisArg\n * @chainable\n */\n enterEditing: function(e) {\n if (this.isEditing || !this.editable) {\n return;\n }\n\n if (this.canvas) {\n this.canvas.calcOffset();\n this.exitEditingOnOthers(this.canvas);\n }\n\n this.isEditing = true;\n\n this.initHiddenTextarea(e);\n this.hiddenTextarea.focus();\n this.hiddenTextarea.value = this.text;\n this._updateTextarea();\n this._saveEditingProps();\n this._setEditingProps();\n this._textBeforeEdit = this.text;\n\n this._tick();\n this.fire('editing:entered');\n this._fireSelectionChanged();\n if (!this.canvas) {\n return this;\n }\n this.canvas.fire('text:editing:entered', { target: this });\n this.initMouseMoveHandler();\n this.canvas.requestRenderAll();\n return this;\n },\n\n exitEditingOnOthers: function(canvas) {\n if (canvas._iTextInstances) {\n canvas._iTextInstances.forEach(function(obj) {\n obj.selected = false;\n if (obj.isEditing) {\n obj.exitEditing();\n }\n });\n }\n },\n\n /**\n * Initializes \"mousemove\" event handler\n */\n initMouseMoveHandler: function() {\n this.canvas.on('mouse:move', this.mouseMoveHandler);\n },\n\n /**\n * @private\n */\n mouseMoveHandler: function(options) {\n if (!this.__isMousedown || !this.isEditing) {\n return;\n }\n\n // regain focus\n document.activeElement !== this.hiddenTextarea && this.hiddenTextarea.focus();\n\n var newSelectionStart = this.getSelectionStartFromPointer(options.e),\n currentStart = this.selectionStart,\n currentEnd = this.selectionEnd;\n if (\n (newSelectionStart !== this.__selectionStartOnMouseDown || currentStart === currentEnd)\n &&\n (currentStart === newSelectionStart || currentEnd === newSelectionStart)\n ) {\n return;\n }\n if (newSelectionStart > this.__selectionStartOnMouseDown) {\n this.selectionStart = this.__selectionStartOnMouseDown;\n this.selectionEnd = newSelectionStart;\n }\n else {\n this.selectionStart = newSelectionStart;\n this.selectionEnd = this.__selectionStartOnMouseDown;\n }\n if (this.selectionStart !== currentStart || this.selectionEnd !== currentEnd) {\n this.restartCursorIfNeeded();\n this._fireSelectionChanged();\n this._updateTextarea();\n this.renderCursorOrSelection();\n }\n },\n\n /**\n * @private\n */\n _setEditingProps: function() {\n this.hoverCursor = 'text';\n\n if (this.canvas) {\n this.canvas.defaultCursor = this.canvas.moveCursor = 'text';\n }\n\n this.borderColor = this.editingBorderColor;\n this.hasControls = this.selectable = false;\n this.lockMovementX = this.lockMovementY = true;\n },\n\n /**\n * convert from textarea to grapheme indexes\n */\n fromStringToGraphemeSelection: function(start, end, text) {\n var smallerTextStart = text.slice(0, start),\n graphemeStart = fabric.util.string.graphemeSplit(smallerTextStart).length;\n if (start === end) {\n return { selectionStart: graphemeStart, selectionEnd: graphemeStart };\n }\n var smallerTextEnd = text.slice(start, end),\n graphemeEnd = fabric.util.string.graphemeSplit(smallerTextEnd).length;\n return { selectionStart: graphemeStart, selectionEnd: graphemeStart + graphemeEnd };\n },\n\n /**\n * convert from fabric to textarea values\n */\n fromGraphemeToStringSelection: function(start, end, _text) {\n var smallerTextStart = _text.slice(0, start),\n graphemeStart = smallerTextStart.join('').length;\n if (start === end) {\n return { selectionStart: graphemeStart, selectionEnd: graphemeStart };\n }\n var smallerTextEnd = _text.slice(start, end),\n graphemeEnd = smallerTextEnd.join('').length;\n return { selectionStart: graphemeStart, selectionEnd: graphemeStart + graphemeEnd };\n },\n\n /**\n * @private\n */\n _updateTextarea: function() {\n this.cursorOffsetCache = { };\n if (!this.hiddenTextarea) {\n return;\n }\n if (!this.inCompositionMode) {\n var newSelection = this.fromGraphemeToStringSelection(this.selectionStart, this.selectionEnd, this._text);\n this.hiddenTextarea.selectionStart = newSelection.selectionStart;\n this.hiddenTextarea.selectionEnd = newSelection.selectionEnd;\n }\n this.updateTextareaPosition();\n },\n\n /**\n * @private\n */\n updateFromTextArea: function() {\n if (!this.hiddenTextarea) {\n return;\n }\n this.cursorOffsetCache = { };\n this.text = this.hiddenTextarea.value;\n if (this._shouldClearDimensionCache()) {\n this.initDimensions();\n this.setCoords();\n }\n var newSelection = this.fromStringToGraphemeSelection(\n this.hiddenTextarea.selectionStart, this.hiddenTextarea.selectionEnd, this.hiddenTextarea.value);\n this.selectionEnd = this.selectionStart = newSelection.selectionEnd;\n if (!this.inCompositionMode) {\n this.selectionStart = newSelection.selectionStart;\n }\n this.updateTextareaPosition();\n },\n\n /**\n * @private\n */\n updateTextareaPosition: function() {\n if (this.selectionStart === this.selectionEnd) {\n var style = this._calcTextareaPosition();\n this.hiddenTextarea.style.left = style.left;\n this.hiddenTextarea.style.top = style.top;\n }\n },\n\n /**\n * @private\n * @return {Object} style contains style for hiddenTextarea\n */\n _calcTextareaPosition: function() {\n if (!this.canvas) {\n return { x: 1, y: 1 };\n }\n var desiredPosition = this.inCompositionMode ? this.compositionStart : this.selectionStart,\n boundaries = this._getCursorBoundaries(desiredPosition),\n cursorLocation = this.get2DCursorLocation(desiredPosition),\n lineIndex = cursorLocation.lineIndex,\n charIndex = cursorLocation.charIndex,\n charHeight = this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize') * this.lineHeight,\n leftOffset = boundaries.leftOffset,\n m = this.calcTransformMatrix(),\n p = {\n x: boundaries.left + leftOffset,\n y: boundaries.top + boundaries.topOffset + charHeight\n },\n retinaScaling = this.canvas.getRetinaScaling(),\n upperCanvas = this.canvas.upperCanvasEl,\n upperCanvasWidth = upperCanvas.width / retinaScaling,\n upperCanvasHeight = upperCanvas.height / retinaScaling,\n maxWidth = upperCanvasWidth - charHeight,\n maxHeight = upperCanvasHeight - charHeight,\n scaleX = upperCanvas.clientWidth / upperCanvasWidth,\n scaleY = upperCanvas.clientHeight / upperCanvasHeight;\n\n p = fabric.util.transformPoint(p, m);\n p = fabric.util.transformPoint(p, this.canvas.viewportTransform);\n p.x *= scaleX;\n p.y *= scaleY;\n if (p.x < 0) {\n p.x = 0;\n }\n if (p.x > maxWidth) {\n p.x = maxWidth;\n }\n if (p.y < 0) {\n p.y = 0;\n }\n if (p.y > maxHeight) {\n p.y = maxHeight;\n }\n\n // add canvas offset on document\n p.x += this.canvas._offset.left;\n p.y += this.canvas._offset.top;\n\n return { left: p.x + 'px', top: p.y + 'px', fontSize: charHeight + 'px', charHeight: charHeight };\n },\n\n /**\n * @private\n */\n _saveEditingProps: function() {\n this._savedProps = {\n hasControls: this.hasControls,\n borderColor: this.borderColor,\n lockMovementX: this.lockMovementX,\n lockMovementY: this.lockMovementY,\n hoverCursor: this.hoverCursor,\n selectable: this.selectable,\n defaultCursor: this.canvas && this.canvas.defaultCursor,\n moveCursor: this.canvas && this.canvas.moveCursor\n };\n },\n\n /**\n * @private\n */\n _restoreEditingProps: function() {\n if (!this._savedProps) {\n return;\n }\n\n this.hoverCursor = this._savedProps.hoverCursor;\n this.hasControls = this._savedProps.hasControls;\n this.borderColor = this._savedProps.borderColor;\n this.selectable = this._savedProps.selectable;\n this.lockMovementX = this._savedProps.lockMovementX;\n this.lockMovementY = this._savedProps.lockMovementY;\n\n if (this.canvas) {\n this.canvas.defaultCursor = this._savedProps.defaultCursor;\n this.canvas.moveCursor = this._savedProps.moveCursor;\n }\n },\n\n /**\n * Exits from editing state\n * @return {fabric.IText} thisArg\n * @chainable\n */\n exitEditing: function() {\n var isTextChanged = (this._textBeforeEdit !== this.text);\n var hiddenTextarea = this.hiddenTextarea;\n this.selected = false;\n this.isEditing = false;\n\n this.selectionEnd = this.selectionStart;\n\n if (hiddenTextarea) {\n hiddenTextarea.blur && hiddenTextarea.blur();\n hiddenTextarea.parentNode && hiddenTextarea.parentNode.removeChild(hiddenTextarea);\n }\n this.hiddenTextarea = null;\n this.abortCursorAnimation();\n this._restoreEditingProps();\n this._currentCursorOpacity = 0;\n if (this._shouldClearDimensionCache()) {\n this.initDimensions();\n this.setCoords();\n }\n this.fire('editing:exited');\n isTextChanged && this.fire('modified');\n if (this.canvas) {\n this.canvas.off('mouse:move', this.mouseMoveHandler);\n this.canvas.fire('text:editing:exited', { target: this });\n isTextChanged && this.canvas.fire('object:modified', { target: this });\n }\n return this;\n },\n\n /**\n * @private\n */\n _removeExtraneousStyles: function() {\n for (var prop in this.styles) {\n if (!this._textLines[prop]) {\n delete this.styles[prop];\n }\n }\n },\n\n /**\n * remove and reflow a style block from start to end.\n * @param {Number} start linear start position for removal (included in removal)\n * @param {Number} end linear end position for removal ( excluded from removal )\n */\n removeStyleFromTo: function(start, end) {\n var cursorStart = this.get2DCursorLocation(start, true),\n cursorEnd = this.get2DCursorLocation(end, true),\n lineStart = cursorStart.lineIndex,\n charStart = cursorStart.charIndex,\n lineEnd = cursorEnd.lineIndex,\n charEnd = cursorEnd.charIndex,\n i, styleObj;\n if (lineStart !== lineEnd) {\n // step1 remove the trailing of lineStart\n if (this.styles[lineStart]) {\n for (i = charStart; i < this._unwrappedTextLines[lineStart].length; i++) {\n delete this.styles[lineStart][i];\n }\n }\n // step2 move the trailing of lineEnd to lineStart if needed\n if (this.styles[lineEnd]) {\n for (i = charEnd; i < this._unwrappedTextLines[lineEnd].length; i++) {\n styleObj = this.styles[lineEnd][i];\n if (styleObj) {\n this.styles[lineStart] || (this.styles[lineStart] = { });\n this.styles[lineStart][charStart + i - charEnd] = styleObj;\n }\n }\n }\n // step3 detects lines will be completely removed.\n for (i = lineStart + 1; i <= lineEnd; i++) {\n delete this.styles[i];\n }\n // step4 shift remaining lines.\n this.shiftLineStyles(lineEnd, lineStart - lineEnd);\n }\n else {\n // remove and shift left on the same line\n if (this.styles[lineStart]) {\n styleObj = this.styles[lineStart];\n var diff = charEnd - charStart, numericChar, _char;\n for (i = charStart; i < charEnd; i++) {\n delete styleObj[i];\n }\n for (_char in this.styles[lineStart]) {\n numericChar = parseInt(_char, 10);\n if (numericChar >= charEnd) {\n styleObj[numericChar - diff] = styleObj[_char];\n delete styleObj[_char];\n }\n }\n }\n }\n },\n\n /**\n * Shifts line styles up or down\n * @param {Number} lineIndex Index of a line\n * @param {Number} offset Can any number?\n */\n shiftLineStyles: function(lineIndex, offset) {\n // shift all line styles by offset upward or downward\n // do not clone deep. we need new array, not new style objects\n var clonedStyles = clone(this.styles);\n for (var line in this.styles) {\n var numericLine = parseInt(line, 10);\n if (numericLine > lineIndex) {\n this.styles[numericLine + offset] = clonedStyles[numericLine];\n if (!clonedStyles[numericLine - offset]) {\n delete this.styles[numericLine];\n }\n }\n }\n },\n\n restartCursorIfNeeded: function() {\n if (!this._currentTickState || this._currentTickState.isAborted\n || !this._currentTickCompleteState || this._currentTickCompleteState.isAborted\n ) {\n this.initDelayedCursor();\n }\n },\n\n /**\n * Handle insertion of more consecutive style lines for when one or more\n * newlines gets added to the text. Since current style needs to be shifted\n * first we shift the current style of the number lines needed, then we add\n * new lines from the last to the first.\n * @param {Number} lineIndex Index of a line\n * @param {Number} charIndex Index of a char\n * @param {Number} qty number of lines to add\n * @param {Array} copiedStyle Array of objects styles\n */\n insertNewlineStyleObject: function(lineIndex, charIndex, qty, copiedStyle) {\n var currentCharStyle,\n newLineStyles = {},\n somethingAdded = false,\n isEndOfLine = this._unwrappedTextLines[lineIndex].length === charIndex;\n\n qty || (qty = 1);\n this.shiftLineStyles(lineIndex, qty);\n if (this.styles[lineIndex]) {\n currentCharStyle = this.styles[lineIndex][charIndex === 0 ? charIndex : charIndex - 1];\n }\n // we clone styles of all chars\n // after cursor onto the current line\n for (var index in this.styles[lineIndex]) {\n var numIndex = parseInt(index, 10);\n if (numIndex >= charIndex) {\n somethingAdded = true;\n newLineStyles[numIndex - charIndex] = this.styles[lineIndex][index];\n // remove lines from the previous line since they're on a new line now\n if (!(isEndOfLine && charIndex === 0)) {\n delete this.styles[lineIndex][index];\n }\n }\n }\n var styleCarriedOver = false;\n if (somethingAdded && !isEndOfLine) {\n // if is end of line, the extra style we copied\n // is probably not something we want\n this.styles[lineIndex + qty] = newLineStyles;\n styleCarriedOver = true;\n }\n if (styleCarriedOver) {\n // skip the last line of since we already prepared it.\n qty--;\n }\n // for the all the lines or all the other lines\n // we clone current char style onto the next (otherwise empty) line\n while (qty > 0) {\n if (copiedStyle && copiedStyle[qty - 1]) {\n this.styles[lineIndex + qty] = { 0: clone(copiedStyle[qty - 1]) };\n }\n else if (currentCharStyle) {\n this.styles[lineIndex + qty] = { 0: clone(currentCharStyle) };\n }\n else {\n delete this.styles[lineIndex + qty];\n }\n qty--;\n }\n this._forceClearCache = true;\n },\n\n /**\n * Inserts style object for a given line/char index\n * @param {Number} lineIndex Index of a line\n * @param {Number} charIndex Index of a char\n * @param {Number} quantity number Style object to insert, if given\n * @param {Array} copiedStyle array of style objects\n */\n insertCharStyleObject: function(lineIndex, charIndex, quantity, copiedStyle) {\n if (!this.styles) {\n this.styles = {};\n }\n var currentLineStyles = this.styles[lineIndex],\n currentLineStylesCloned = currentLineStyles ? clone(currentLineStyles) : {};\n\n quantity || (quantity = 1);\n // shift all char styles by quantity forward\n // 0,1,2,3 -> (charIndex=2) -> 0,1,3,4 -> (insert 2) -> 0,1,2,3,4\n for (var index in currentLineStylesCloned) {\n var numericIndex = parseInt(index, 10);\n if (numericIndex >= charIndex) {\n currentLineStyles[numericIndex + quantity] = currentLineStylesCloned[numericIndex];\n // only delete the style if there was nothing moved there\n if (!currentLineStylesCloned[numericIndex - quantity]) {\n delete currentLineStyles[numericIndex];\n }\n }\n }\n this._forceClearCache = true;\n if (copiedStyle) {\n while (quantity--) {\n if (!Object.keys(copiedStyle[quantity]).length) {\n continue;\n }\n if (!this.styles[lineIndex]) {\n this.styles[lineIndex] = {};\n }\n this.styles[lineIndex][charIndex + quantity] = clone(copiedStyle[quantity]);\n }\n return;\n }\n if (!currentLineStyles) {\n return;\n }\n var newStyle = currentLineStyles[charIndex ? charIndex - 1 : 1];\n while (newStyle && quantity--) {\n this.styles[lineIndex][charIndex + quantity] = clone(newStyle);\n }\n },\n\n /**\n * Inserts style object(s)\n * @param {Array} insertedText Characters at the location where style is inserted\n * @param {Number} start cursor index for inserting style\n * @param {Array} [copiedStyle] array of style objects to insert.\n */\n insertNewStyleBlock: function(insertedText, start, copiedStyle) {\n var cursorLoc = this.get2DCursorLocation(start, true),\n addedLines = [0], linesLength = 0;\n // get an array of how many char per lines are being added.\n for (var i = 0; i < insertedText.length; i++) {\n if (insertedText[i] === '\\n') {\n linesLength++;\n addedLines[linesLength] = 0;\n }\n else {\n addedLines[linesLength]++;\n }\n }\n // for the first line copy the style from the current char position.\n if (addedLines[0] > 0) {\n this.insertCharStyleObject(cursorLoc.lineIndex, cursorLoc.charIndex, addedLines[0], copiedStyle);\n copiedStyle = copiedStyle && copiedStyle.slice(addedLines[0] + 1);\n }\n linesLength && this.insertNewlineStyleObject(\n cursorLoc.lineIndex, cursorLoc.charIndex + addedLines[0], linesLength);\n for (var i = 1; i < linesLength; i++) {\n if (addedLines[i] > 0) {\n this.insertCharStyleObject(cursorLoc.lineIndex + i, 0, addedLines[i], copiedStyle);\n }\n else if (copiedStyle) {\n // this test is required in order to close #6841\n // when a pasted buffer begins with a newline then\n // this.styles[cursorLoc.lineIndex + i] and copiedStyle[0]\n // may be undefined for some reason\n if (this.styles[cursorLoc.lineIndex + i] && copiedStyle[0]) {\n this.styles[cursorLoc.lineIndex + i][0] = copiedStyle[0];\n }\n }\n copiedStyle = copiedStyle && copiedStyle.slice(addedLines[i] + 1);\n }\n // we use i outside the loop to get it like linesLength\n if (addedLines[i] > 0) {\n this.insertCharStyleObject(cursorLoc.lineIndex + i, 0, addedLines[i], copiedStyle);\n }\n },\n\n /**\n * Set the selectionStart and selectionEnd according to the new position of cursor\n * mimic the key - mouse navigation when shift is pressed.\n */\n setSelectionStartEndWithShift: function(start, end, newSelection) {\n if (newSelection <= start) {\n if (end === start) {\n this._selectionDirection = 'left';\n }\n else if (this._selectionDirection === 'right') {\n this._selectionDirection = 'left';\n this.selectionEnd = start;\n }\n this.selectionStart = newSelection;\n }\n else if (newSelection > start && newSelection < end) {\n if (this._selectionDirection === 'right') {\n this.selectionEnd = newSelection;\n }\n else {\n this.selectionStart = newSelection;\n }\n }\n else {\n // newSelection is > selection start and end\n if (end === start) {\n this._selectionDirection = 'right';\n }\n else if (this._selectionDirection === 'left') {\n this._selectionDirection = 'right';\n this.selectionStart = end;\n }\n this.selectionEnd = newSelection;\n }\n },\n\n setSelectionInBoundaries: function() {\n var length = this.text.length;\n if (this.selectionStart > length) {\n this.selectionStart = length;\n }\n else if (this.selectionStart < 0) {\n this.selectionStart = 0;\n }\n if (this.selectionEnd > length) {\n this.selectionEnd = length;\n }\n else if (this.selectionEnd < 0) {\n this.selectionEnd = 0;\n }\n }\n });\n})();\n\n\nfabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.prototype */ {\n /**\n * Initializes \"dbclick\" event handler\n */\n initDoubleClickSimulation: function() {\n\n // for double click\n this.__lastClickTime = +new Date();\n\n // for triple click\n this.__lastLastClickTime = +new Date();\n\n this.__lastPointer = { };\n\n this.on('mousedown', this.onMouseDown);\n },\n\n /**\n * Default event handler to simulate triple click\n * @private\n */\n onMouseDown: function(options) {\n if (!this.canvas) {\n return;\n }\n this.__newClickTime = +new Date();\n var newPointer = options.pointer;\n if (this.isTripleClick(newPointer)) {\n this.fire('tripleclick', options);\n this._stopEvent(options.e);\n }\n this.__lastLastClickTime = this.__lastClickTime;\n this.__lastClickTime = this.__newClickTime;\n this.__lastPointer = newPointer;\n this.__lastIsEditing = this.isEditing;\n this.__lastSelected = this.selected;\n },\n\n isTripleClick: function(newPointer) {\n return this.__newClickTime - this.__lastClickTime < 500 &&\n this.__lastClickTime - this.__lastLastClickTime < 500 &&\n this.__lastPointer.x === newPointer.x &&\n this.__lastPointer.y === newPointer.y;\n },\n\n /**\n * @private\n */\n _stopEvent: function(e) {\n e.preventDefault && e.preventDefault();\n e.stopPropagation && e.stopPropagation();\n },\n\n /**\n * Initializes event handlers related to cursor or selection\n */\n initCursorSelectionHandlers: function() {\n this.initMousedownHandler();\n this.initMouseupHandler();\n this.initClicks();\n },\n\n /**\n * Default handler for double click, select a word\n */\n doubleClickHandler: function(options) {\n if (!this.isEditing) {\n return;\n }\n this.selectWord(this.getSelectionStartFromPointer(options.e));\n },\n\n /**\n * Default handler for triple click, select a line\n */\n tripleClickHandler: function(options) {\n if (!this.isEditing) {\n return;\n }\n this.selectLine(this.getSelectionStartFromPointer(options.e));\n },\n\n /**\n * Initializes double and triple click event handlers\n */\n initClicks: function() {\n this.on('mousedblclick', this.doubleClickHandler);\n this.on('tripleclick', this.tripleClickHandler);\n },\n\n /**\n * Default event handler for the basic functionalities needed on _mouseDown\n * can be overridden to do something different.\n * Scope of this implementation is: find the click position, set selectionStart\n * find selectionEnd, initialize the drawing of either cursor or selection area\n * initializing a mousedDown on a text area will cancel fabricjs knowledge of\n * current compositionMode. It will be set to false.\n */\n _mouseDownHandler: function(options) {\n if (!this.canvas || !this.editable || (options.e.button && options.e.button !== 1)) {\n return;\n }\n\n this.__isMousedown = true;\n\n if (this.selected) {\n this.inCompositionMode = false;\n this.setCursorByClick(options.e);\n }\n\n if (this.isEditing) {\n this.__selectionStartOnMouseDown = this.selectionStart;\n if (this.selectionStart === this.selectionEnd) {\n this.abortCursorAnimation();\n }\n this.renderCursorOrSelection();\n }\n },\n\n /**\n * Default event handler for the basic functionalities needed on mousedown:before\n * can be overridden to do something different.\n * Scope of this implementation is: verify the object is already selected when mousing down\n */\n _mouseDownHandlerBefore: function(options) {\n if (!this.canvas || !this.editable || (options.e.button && options.e.button !== 1)) {\n return;\n }\n // we want to avoid that an object that was selected and then becomes unselectable,\n // may trigger editing mode in some way.\n this.selected = this === this.canvas._activeObject;\n },\n\n /**\n * Initializes \"mousedown\" event handler\n */\n initMousedownHandler: function() {\n this.on('mousedown', this._mouseDownHandler);\n this.on('mousedown:before', this._mouseDownHandlerBefore);\n },\n\n /**\n * Initializes \"mouseup\" event handler\n */\n initMouseupHandler: function() {\n this.on('mouseup', this.mouseUpHandler);\n },\n\n /**\n * standard handler for mouse up, overridable\n * @private\n */\n mouseUpHandler: function(options) {\n this.__isMousedown = false;\n if (!this.editable || this.group ||\n (options.transform && options.transform.actionPerformed) ||\n (options.e.button && options.e.button !== 1)) {\n return;\n }\n\n if (this.canvas) {\n var currentActive = this.canvas._activeObject;\n if (currentActive && currentActive !== this) {\n // avoid running this logic when there is an active object\n // this because is possible with shift click and fast clicks,\n // to rapidly deselect and reselect this object and trigger an enterEdit\n return;\n }\n }\n\n if (this.__lastSelected && !this.__corner) {\n this.selected = false;\n this.__lastSelected = false;\n this.enterEditing(options.e);\n if (this.selectionStart === this.selectionEnd) {\n this.initDelayedCursor(true);\n }\n else {\n this.renderCursorOrSelection();\n }\n }\n else {\n this.selected = true;\n }\n },\n\n /**\n * Changes cursor location in a text depending on passed pointer (x/y) object\n * @param {Event} e Event object\n */\n setCursorByClick: function(e) {\n var newSelection = this.getSelectionStartFromPointer(e),\n start = this.selectionStart, end = this.selectionEnd;\n if (e.shiftKey) {\n this.setSelectionStartEndWithShift(start, end, newSelection);\n }\n else {\n this.selectionStart = newSelection;\n this.selectionEnd = newSelection;\n }\n if (this.isEditing) {\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n },\n\n /**\n * Returns index of a character corresponding to where an object was clicked\n * @param {Event} e Event object\n * @return {Number} Index of a character\n */\n getSelectionStartFromPointer: function(e) {\n var mouseOffset = this.getLocalPointer(e),\n prevWidth = 0,\n width = 0,\n height = 0,\n charIndex = 0,\n lineIndex = 0,\n lineLeftOffset,\n line;\n for (var i = 0, len = this._textLines.length; i < len; i++) {\n if (height <= mouseOffset.y) {\n height += this.getHeightOfLine(i) * this.scaleY;\n lineIndex = i;\n if (i > 0) {\n charIndex += this._textLines[i - 1].length + this.missingNewlineOffset(i - 1);\n }\n }\n else {\n break;\n }\n }\n lineLeftOffset = this._getLineLeftOffset(lineIndex);\n width = lineLeftOffset * this.scaleX;\n line = this._textLines[lineIndex];\n // handling of RTL: in order to get things work correctly,\n // we assume RTL writing is mirrored compared to LTR writing.\n // so in position detection we mirror the X offset, and when is time\n // of rendering it, we mirror it again.\n if (this.direction === 'rtl') {\n mouseOffset.x = this.width * this.scaleX - mouseOffset.x + width;\n }\n for (var j = 0, jlen = line.length; j < jlen; j++) {\n prevWidth = width;\n // i removed something about flipX here, check.\n width += this.__charBounds[lineIndex][j].kernedWidth * this.scaleX;\n if (width <= mouseOffset.x) {\n charIndex++;\n }\n else {\n break;\n }\n }\n return this._getNewSelectionStartFromOffset(mouseOffset, prevWidth, width, charIndex, jlen);\n },\n\n /**\n * @private\n */\n _getNewSelectionStartFromOffset: function(mouseOffset, prevWidth, width, index, jlen) {\n // we need Math.abs because when width is after the last char, the offset is given as 1, while is 0\n var distanceBtwLastCharAndCursor = mouseOffset.x - prevWidth,\n distanceBtwNextCharAndCursor = width - mouseOffset.x,\n offset = distanceBtwNextCharAndCursor > distanceBtwLastCharAndCursor ||\n distanceBtwNextCharAndCursor < 0 ? 0 : 1,\n newSelectionStart = index + offset;\n // if object is horizontally flipped, mirror cursor location from the end\n if (this.flipX) {\n newSelectionStart = jlen - newSelectionStart;\n }\n\n if (newSelectionStart > this._text.length) {\n newSelectionStart = this._text.length;\n }\n\n return newSelectionStart;\n }\n});\n\n\nfabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.prototype */ {\n\n /**\n * Initializes hidden textarea (needed to bring up keyboard in iOS)\n */\n initHiddenTextarea: function() {\n this.hiddenTextarea = fabric.document.createElement('textarea');\n this.hiddenTextarea.setAttribute('autocapitalize', 'off');\n this.hiddenTextarea.setAttribute('autocorrect', 'off');\n this.hiddenTextarea.setAttribute('autocomplete', 'off');\n this.hiddenTextarea.setAttribute('spellcheck', 'false');\n this.hiddenTextarea.setAttribute('data-fabric-hiddentextarea', '');\n this.hiddenTextarea.setAttribute('wrap', 'off');\n var style = this._calcTextareaPosition();\n // line-height: 1px; was removed from the style to fix this:\n // https://bugs.chromium.org/p/chromium/issues/detail?id=870966\n this.hiddenTextarea.style.cssText = 'position: absolute; top: ' + style.top +\n '; left: ' + style.left + '; z-index: -999; opacity: 0; width: 1px; height: 1px; font-size: 1px;' +\n ' paddingーtop: ' + style.fontSize + ';';\n\n if (this.hiddenTextareaContainer) {\n this.hiddenTextareaContainer.appendChild(this.hiddenTextarea);\n }\n else {\n fabric.document.body.appendChild(this.hiddenTextarea);\n }\n\n fabric.util.addListener(this.hiddenTextarea, 'keydown', this.onKeyDown.bind(this));\n fabric.util.addListener(this.hiddenTextarea, 'keyup', this.onKeyUp.bind(this));\n fabric.util.addListener(this.hiddenTextarea, 'input', this.onInput.bind(this));\n fabric.util.addListener(this.hiddenTextarea, 'copy', this.copy.bind(this));\n fabric.util.addListener(this.hiddenTextarea, 'cut', this.copy.bind(this));\n fabric.util.addListener(this.hiddenTextarea, 'paste', this.paste.bind(this));\n fabric.util.addListener(this.hiddenTextarea, 'compositionstart', this.onCompositionStart.bind(this));\n fabric.util.addListener(this.hiddenTextarea, 'compositionupdate', this.onCompositionUpdate.bind(this));\n fabric.util.addListener(this.hiddenTextarea, 'compositionend', this.onCompositionEnd.bind(this));\n\n if (!this._clickHandlerInitialized && this.canvas) {\n fabric.util.addListener(this.canvas.upperCanvasEl, 'click', this.onClick.bind(this));\n this._clickHandlerInitialized = true;\n }\n },\n\n /**\n * For functionalities on keyDown\n * Map a special key to a function of the instance/prototype\n * If you need different behaviour for ESC or TAB or arrows, you have to change\n * this map setting the name of a function that you build on the fabric.Itext or\n * your prototype.\n * the map change will affect all Instances unless you need for only some text Instances\n * in that case you have to clone this object and assign your Instance.\n * this.keysMap = fabric.util.object.clone(this.keysMap);\n * The function must be in fabric.Itext.prototype.myFunction And will receive event as args[0]\n */\n keysMap: {\n 9: 'exitEditing',\n 27: 'exitEditing',\n 33: 'moveCursorUp',\n 34: 'moveCursorDown',\n 35: 'moveCursorRight',\n 36: 'moveCursorLeft',\n 37: 'moveCursorLeft',\n 38: 'moveCursorUp',\n 39: 'moveCursorRight',\n 40: 'moveCursorDown',\n },\n\n keysMapRtl: {\n 9: 'exitEditing',\n 27: 'exitEditing',\n 33: 'moveCursorUp',\n 34: 'moveCursorDown',\n 35: 'moveCursorLeft',\n 36: 'moveCursorRight',\n 37: 'moveCursorRight',\n 38: 'moveCursorUp',\n 39: 'moveCursorLeft',\n 40: 'moveCursorDown',\n },\n\n /**\n * For functionalities on keyUp + ctrl || cmd\n */\n ctrlKeysMapUp: {\n 67: 'copy',\n 88: 'cut'\n },\n\n /**\n * For functionalities on keyDown + ctrl || cmd\n */\n ctrlKeysMapDown: {\n 65: 'selectAll'\n },\n\n onClick: function() {\n // No need to trigger click event here, focus is enough to have the keyboard appear on Android\n this.hiddenTextarea && this.hiddenTextarea.focus();\n },\n\n /**\n * Handles keydown event\n * only used for arrows and combination of modifier keys.\n * @param {Event} e Event object\n */\n onKeyDown: function(e) {\n if (!this.isEditing) {\n return;\n }\n var keyMap = this.direction === 'rtl' ? this.keysMapRtl : this.keysMap;\n if (e.keyCode in keyMap) {\n this[keyMap[e.keyCode]](e);\n }\n else if ((e.keyCode in this.ctrlKeysMapDown) && (e.ctrlKey || e.metaKey)) {\n this[this.ctrlKeysMapDown[e.keyCode]](e);\n }\n else {\n return;\n }\n e.stopImmediatePropagation();\n e.preventDefault();\n if (e.keyCode >= 33 && e.keyCode <= 40) {\n // if i press an arrow key just update selection\n this.inCompositionMode = false;\n this.clearContextTop();\n this.renderCursorOrSelection();\n }\n else {\n this.canvas && this.canvas.requestRenderAll();\n }\n },\n\n /**\n * Handles keyup event\n * We handle KeyUp because ie11 and edge have difficulties copy/pasting\n * if a copy/cut event fired, keyup is dismissed\n * @param {Event} e Event object\n */\n onKeyUp: function(e) {\n if (!this.isEditing || this._copyDone || this.inCompositionMode) {\n this._copyDone = false;\n return;\n }\n if ((e.keyCode in this.ctrlKeysMapUp) && (e.ctrlKey || e.metaKey)) {\n this[this.ctrlKeysMapUp[e.keyCode]](e);\n }\n else {\n return;\n }\n e.stopImmediatePropagation();\n e.preventDefault();\n this.canvas && this.canvas.requestRenderAll();\n },\n\n /**\n * Handles onInput event\n * @param {Event} e Event object\n */\n onInput: function(e) {\n var fromPaste = this.fromPaste;\n this.fromPaste = false;\n e && e.stopPropagation();\n if (!this.isEditing) {\n return;\n }\n // decisions about style changes.\n var nextText = this._splitTextIntoLines(this.hiddenTextarea.value).graphemeText,\n charCount = this._text.length,\n nextCharCount = nextText.length,\n removedText, insertedText,\n charDiff = nextCharCount - charCount,\n selectionStart = this.selectionStart, selectionEnd = this.selectionEnd,\n selection = selectionStart !== selectionEnd,\n copiedStyle, removeFrom, removeTo;\n if (this.hiddenTextarea.value === '') {\n this.styles = { };\n this.updateFromTextArea();\n this.fire('changed');\n if (this.canvas) {\n this.canvas.fire('text:changed', { target: this });\n this.canvas.requestRenderAll();\n }\n return;\n }\n\n var textareaSelection = this.fromStringToGraphemeSelection(\n this.hiddenTextarea.selectionStart,\n this.hiddenTextarea.selectionEnd,\n this.hiddenTextarea.value\n );\n var backDelete = selectionStart > textareaSelection.selectionStart;\n\n if (selection) {\n removedText = this._text.slice(selectionStart, selectionEnd);\n charDiff += selectionEnd - selectionStart;\n }\n else if (nextCharCount < charCount) {\n if (backDelete) {\n removedText = this._text.slice(selectionEnd + charDiff, selectionEnd);\n }\n else {\n removedText = this._text.slice(selectionStart, selectionStart - charDiff);\n }\n }\n insertedText = nextText.slice(textareaSelection.selectionEnd - charDiff, textareaSelection.selectionEnd);\n if (removedText && removedText.length) {\n if (insertedText.length) {\n // let's copy some style before deleting.\n // we want to copy the style before the cursor OR the style at the cursor if selection\n // is bigger than 0.\n copiedStyle = this.getSelectionStyles(selectionStart, selectionStart + 1, false);\n // now duplicate the style one for each inserted text.\n copiedStyle = insertedText.map(function() {\n // this return an array of references, but that is fine since we are\n // copying the style later.\n return copiedStyle[0];\n });\n }\n if (selection) {\n removeFrom = selectionStart;\n removeTo = selectionEnd;\n }\n else if (backDelete) {\n // detect differences between forwardDelete and backDelete\n removeFrom = selectionEnd - removedText.length;\n removeTo = selectionEnd;\n }\n else {\n removeFrom = selectionEnd;\n removeTo = selectionEnd + removedText.length;\n }\n this.removeStyleFromTo(removeFrom, removeTo);\n }\n if (insertedText.length) {\n if (fromPaste && insertedText.join('') === fabric.copiedText && !fabric.disableStyleCopyPaste) {\n copiedStyle = fabric.copiedTextStyle;\n }\n this.insertNewStyleBlock(insertedText, selectionStart, copiedStyle);\n }\n this.updateFromTextArea();\n this.fire('changed');\n if (this.canvas) {\n this.canvas.fire('text:changed', { target: this });\n this.canvas.requestRenderAll();\n }\n },\n /**\n * Composition start\n */\n onCompositionStart: function() {\n this.inCompositionMode = true;\n },\n\n /**\n * Composition end\n */\n onCompositionEnd: function() {\n this.inCompositionMode = false;\n },\n\n // /**\n // * Composition update\n // */\n onCompositionUpdate: function(e) {\n this.compositionStart = e.target.selectionStart;\n this.compositionEnd = e.target.selectionEnd;\n this.updateTextareaPosition();\n },\n\n /**\n * Copies selected text\n * @param {Event} e Event object\n */\n copy: function() {\n if (this.selectionStart === this.selectionEnd) {\n //do not cut-copy if no selection\n return;\n }\n\n fabric.copiedText = this.getSelectedText();\n if (!fabric.disableStyleCopyPaste) {\n fabric.copiedTextStyle = this.getSelectionStyles(this.selectionStart, this.selectionEnd, true);\n }\n else {\n fabric.copiedTextStyle = null;\n }\n this._copyDone = true;\n },\n\n /**\n * Pastes text\n * @param {Event} e Event object\n */\n paste: function() {\n this.fromPaste = true;\n },\n\n /**\n * @private\n * @param {Event} e Event object\n * @return {Object} Clipboard data object\n */\n _getClipboardData: function(e) {\n return (e && e.clipboardData) || fabric.window.clipboardData;\n },\n\n /**\n * Finds the width in pixels before the cursor on the same line\n * @private\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @return {Number} widthBeforeCursor width before cursor\n */\n _getWidthBeforeCursor: function(lineIndex, charIndex) {\n var widthBeforeCursor = this._getLineLeftOffset(lineIndex), bound;\n\n if (charIndex > 0) {\n bound = this.__charBounds[lineIndex][charIndex - 1];\n widthBeforeCursor += bound.left + bound.width;\n }\n return widthBeforeCursor;\n },\n\n /**\n * Gets start offset of a selection\n * @param {Event} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n getDownCursorOffset: function(e, isRight) {\n var selectionProp = this._getSelectionForOffset(e, isRight),\n cursorLocation = this.get2DCursorLocation(selectionProp),\n lineIndex = cursorLocation.lineIndex;\n // if on last line, down cursor goes to end of line\n if (lineIndex === this._textLines.length - 1 || e.metaKey || e.keyCode === 34) {\n // move to the end of a text\n return this._text.length - selectionProp;\n }\n var charIndex = cursorLocation.charIndex,\n widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex),\n indexOnOtherLine = this._getIndexOnLine(lineIndex + 1, widthBeforeCursor),\n textAfterCursor = this._textLines[lineIndex].slice(charIndex);\n return textAfterCursor.length + indexOnOtherLine + 1 + this.missingNewlineOffset(lineIndex);\n },\n\n /**\n * private\n * Helps finding if the offset should be counted from Start or End\n * @param {Event} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n _getSelectionForOffset: function(e, isRight) {\n if (e.shiftKey && this.selectionStart !== this.selectionEnd && isRight) {\n return this.selectionEnd;\n }\n else {\n return this.selectionStart;\n }\n },\n\n /**\n * @param {Event} e Event object\n * @param {Boolean} isRight\n * @return {Number}\n */\n getUpCursorOffset: function(e, isRight) {\n var selectionProp = this._getSelectionForOffset(e, isRight),\n cursorLocation = this.get2DCursorLocation(selectionProp),\n lineIndex = cursorLocation.lineIndex;\n if (lineIndex === 0 || e.metaKey || e.keyCode === 33) {\n // if on first line, up cursor goes to start of line\n return -selectionProp;\n }\n var charIndex = cursorLocation.charIndex,\n widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex),\n indexOnOtherLine = this._getIndexOnLine(lineIndex - 1, widthBeforeCursor),\n textBeforeCursor = this._textLines[lineIndex].slice(0, charIndex),\n missingNewlineOffset = this.missingNewlineOffset(lineIndex - 1);\n // return a negative offset\n return -this._textLines[lineIndex - 1].length\n + indexOnOtherLine - textBeforeCursor.length + (1 - missingNewlineOffset);\n },\n\n /**\n * for a given width it founds the matching character.\n * @private\n */\n _getIndexOnLine: function(lineIndex, width) {\n\n var line = this._textLines[lineIndex],\n lineLeftOffset = this._getLineLeftOffset(lineIndex),\n widthOfCharsOnLine = lineLeftOffset,\n indexOnLine = 0, charWidth, foundMatch;\n\n for (var j = 0, jlen = line.length; j < jlen; j++) {\n charWidth = this.__charBounds[lineIndex][j].width;\n widthOfCharsOnLine += charWidth;\n if (widthOfCharsOnLine > width) {\n foundMatch = true;\n var leftEdge = widthOfCharsOnLine - charWidth,\n rightEdge = widthOfCharsOnLine,\n offsetFromLeftEdge = Math.abs(leftEdge - width),\n offsetFromRightEdge = Math.abs(rightEdge - width);\n\n indexOnLine = offsetFromRightEdge < offsetFromLeftEdge ? j : (j - 1);\n break;\n }\n }\n\n // reached end\n if (!foundMatch) {\n indexOnLine = line.length - 1;\n }\n\n return indexOnLine;\n },\n\n\n /**\n * Moves cursor down\n * @param {Event} e Event object\n */\n moveCursorDown: function(e) {\n if (this.selectionStart >= this._text.length && this.selectionEnd >= this._text.length) {\n return;\n }\n this._moveCursorUpOrDown('Down', e);\n },\n\n /**\n * Moves cursor up\n * @param {Event} e Event object\n */\n moveCursorUp: function(e) {\n if (this.selectionStart === 0 && this.selectionEnd === 0) {\n return;\n }\n this._moveCursorUpOrDown('Up', e);\n },\n\n /**\n * Moves cursor up or down, fires the events\n * @param {String} direction 'Up' or 'Down'\n * @param {Event} e Event object\n */\n _moveCursorUpOrDown: function(direction, e) {\n // getUpCursorOffset\n // getDownCursorOffset\n var action = 'get' + direction + 'CursorOffset',\n offset = this[action](e, this._selectionDirection === 'right');\n if (e.shiftKey) {\n this.moveCursorWithShift(offset);\n }\n else {\n this.moveCursorWithoutShift(offset);\n }\n if (offset !== 0) {\n this.setSelectionInBoundaries();\n this.abortCursorAnimation();\n this._currentCursorOpacity = 1;\n this.initDelayedCursor();\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n },\n\n /**\n * Moves cursor with shift\n * @param {Number} offset\n */\n moveCursorWithShift: function(offset) {\n var newSelection = this._selectionDirection === 'left'\n ? this.selectionStart + offset\n : this.selectionEnd + offset;\n this.setSelectionStartEndWithShift(this.selectionStart, this.selectionEnd, newSelection);\n return offset !== 0;\n },\n\n /**\n * Moves cursor up without shift\n * @param {Number} offset\n */\n moveCursorWithoutShift: function(offset) {\n if (offset < 0) {\n this.selectionStart += offset;\n this.selectionEnd = this.selectionStart;\n }\n else {\n this.selectionEnd += offset;\n this.selectionStart = this.selectionEnd;\n }\n return offset !== 0;\n },\n\n /**\n * Moves cursor left\n * @param {Event} e Event object\n */\n moveCursorLeft: function(e) {\n if (this.selectionStart === 0 && this.selectionEnd === 0) {\n return;\n }\n this._moveCursorLeftOrRight('Left', e);\n },\n\n /**\n * @private\n * @return {Boolean} true if a change happened\n */\n _move: function(e, prop, direction) {\n var newValue;\n if (e.altKey) {\n newValue = this['findWordBoundary' + direction](this[prop]);\n }\n else if (e.metaKey || e.keyCode === 35 || e.keyCode === 36 ) {\n newValue = this['findLineBoundary' + direction](this[prop]);\n }\n else {\n this[prop] += direction === 'Left' ? -1 : 1;\n return true;\n }\n if (typeof newValue !== 'undefined' && this[prop] !== newValue) {\n this[prop] = newValue;\n return true;\n }\n },\n\n /**\n * @private\n */\n _moveLeft: function(e, prop) {\n return this._move(e, prop, 'Left');\n },\n\n /**\n * @private\n */\n _moveRight: function(e, prop) {\n return this._move(e, prop, 'Right');\n },\n\n /**\n * Moves cursor left without keeping selection\n * @param {Event} e\n */\n moveCursorLeftWithoutShift: function(e) {\n var change = true;\n this._selectionDirection = 'left';\n\n // only move cursor when there is no selection,\n // otherwise we discard it, and leave cursor on same place\n if (this.selectionEnd === this.selectionStart && this.selectionStart !== 0) {\n change = this._moveLeft(e, 'selectionStart');\n\n }\n this.selectionEnd = this.selectionStart;\n return change;\n },\n\n /**\n * Moves cursor left while keeping selection\n * @param {Event} e\n */\n moveCursorLeftWithShift: function(e) {\n if (this._selectionDirection === 'right' && this.selectionStart !== this.selectionEnd) {\n return this._moveLeft(e, 'selectionEnd');\n }\n else if (this.selectionStart !== 0){\n this._selectionDirection = 'left';\n return this._moveLeft(e, 'selectionStart');\n }\n },\n\n /**\n * Moves cursor right\n * @param {Event} e Event object\n */\n moveCursorRight: function(e) {\n if (this.selectionStart >= this._text.length && this.selectionEnd >= this._text.length) {\n return;\n }\n this._moveCursorLeftOrRight('Right', e);\n },\n\n /**\n * Moves cursor right or Left, fires event\n * @param {String} direction 'Left', 'Right'\n * @param {Event} e Event object\n */\n _moveCursorLeftOrRight: function(direction, e) {\n var actionName = 'moveCursor' + direction + 'With';\n this._currentCursorOpacity = 1;\n\n if (e.shiftKey) {\n actionName += 'Shift';\n }\n else {\n actionName += 'outShift';\n }\n if (this[actionName](e)) {\n this.abortCursorAnimation();\n this.initDelayedCursor();\n this._fireSelectionChanged();\n this._updateTextarea();\n }\n },\n\n /**\n * Moves cursor right while keeping selection\n * @param {Event} e\n */\n moveCursorRightWithShift: function(e) {\n if (this._selectionDirection === 'left' && this.selectionStart !== this.selectionEnd) {\n return this._moveRight(e, 'selectionStart');\n }\n else if (this.selectionEnd !== this._text.length) {\n this._selectionDirection = 'right';\n return this._moveRight(e, 'selectionEnd');\n }\n },\n\n /**\n * Moves cursor right without keeping selection\n * @param {Event} e Event object\n */\n moveCursorRightWithoutShift: function(e) {\n var changed = true;\n this._selectionDirection = 'right';\n\n if (this.selectionStart === this.selectionEnd) {\n changed = this._moveRight(e, 'selectionStart');\n this.selectionEnd = this.selectionStart;\n }\n else {\n this.selectionStart = this.selectionEnd;\n }\n return changed;\n },\n\n /**\n * Removes characters from start/end\n * start/end ar per grapheme position in _text array.\n *\n * @param {Number} start\n * @param {Number} end default to start + 1\n */\n removeChars: function(start, end) {\n if (typeof end === 'undefined') {\n end = start + 1;\n }\n this.removeStyleFromTo(start, end);\n this._text.splice(start, end - start);\n this.text = this._text.join('');\n this.set('dirty', true);\n if (this._shouldClearDimensionCache()) {\n this.initDimensions();\n this.setCoords();\n }\n this._removeExtraneousStyles();\n },\n\n /**\n * insert characters at start position, before start position.\n * start equal 1 it means the text get inserted between actual grapheme 0 and 1\n * if style array is provided, it must be as the same length of text in graphemes\n * if end is provided and is bigger than start, old text is replaced.\n * start/end ar per grapheme position in _text array.\n *\n * @param {String} text text to insert\n * @param {Array} style array of style objects\n * @param {Number} start\n * @param {Number} end default to start + 1\n */\n insertChars: function(text, style, start, end) {\n if (typeof end === 'undefined') {\n end = start;\n }\n if (end > start) {\n this.removeStyleFromTo(start, end);\n }\n var graphemes = fabric.util.string.graphemeSplit(text);\n this.insertNewStyleBlock(graphemes, start, style);\n this._text = [].concat(this._text.slice(0, start), graphemes, this._text.slice(end));\n this.text = this._text.join('');\n this.set('dirty', true);\n if (this._shouldClearDimensionCache()) {\n this.initDimensions();\n this.setCoords();\n }\n this._removeExtraneousStyles();\n },\n\n});\n\n\n/* _TO_SVG_START_ */\n(function() {\n var toFixed = fabric.util.toFixed,\n multipleSpacesRegex = / +/g;\n\n fabric.util.object.extend(fabric.Text.prototype, /** @lends fabric.Text.prototype */ {\n\n /**\n * Returns SVG representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n _toSVG: function() {\n var offsets = this._getSVGLeftTopOffsets(),\n textAndBg = this._getSVGTextAndBg(offsets.textTop, offsets.textLeft);\n return this._wrapSVGTextAndBg(textAndBg);\n },\n\n /**\n * Returns svg representation of an instance\n * @param {Function} [reviver] Method for further parsing of svg representation.\n * @return {String} svg representation of an instance\n */\n toSVG: function(reviver) {\n return this._createBaseSVGMarkup(\n this._toSVG(),\n { reviver: reviver, noStyle: true, withShadow: true }\n );\n },\n\n /**\n * @private\n */\n _getSVGLeftTopOffsets: function() {\n return {\n textLeft: -this.width / 2,\n textTop: -this.height / 2,\n lineTop: this.getHeightOfLine(0)\n };\n },\n\n /**\n * @private\n */\n _wrapSVGTextAndBg: function(textAndBg) {\n var noShadow = true,\n textDecoration = this.getSvgTextDecoration(this);\n return [\n textAndBg.textBgRects.join(''),\n '\\t\\t',\n textAndBg.textSpans.join(''),\n '\\n'\n ];\n },\n\n /**\n * @private\n * @param {Number} textTopOffset Text top offset\n * @param {Number} textLeftOffset Text left offset\n * @return {Object}\n */\n _getSVGTextAndBg: function(textTopOffset, textLeftOffset) {\n var textSpans = [],\n textBgRects = [],\n height = textTopOffset, lineOffset;\n // bounding-box background\n this._setSVGBg(textBgRects);\n\n // text and text-background\n for (var i = 0, len = this._textLines.length; i < len; i++) {\n lineOffset = this._getLineLeftOffset(i);\n if (this.textBackgroundColor || this.styleHas('textBackgroundColor', i)) {\n this._setSVGTextLineBg(textBgRects, i, textLeftOffset + lineOffset, height);\n }\n this._setSVGTextLineText(textSpans, i, textLeftOffset + lineOffset, height);\n height += this.getHeightOfLine(i);\n }\n\n return {\n textSpans: textSpans,\n textBgRects: textBgRects\n };\n },\n\n /**\n * @private\n */\n _createTextCharSpan: function(_char, styleDecl, left, top) {\n var shouldUseWhitespace = _char !== _char.trim() || _char.match(multipleSpacesRegex),\n styleProps = this.getSvgSpanStyles(styleDecl, shouldUseWhitespace),\n fillStyles = styleProps ? 'style=\"' + styleProps + '\"' : '',\n dy = styleDecl.deltaY, dySpan = '',\n NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS;\n if (dy) {\n dySpan = ' dy=\"' + toFixed(dy, NUM_FRACTION_DIGITS) + '\" ';\n }\n return [\n '',\n fabric.util.string.escapeXml(_char),\n ''\n ].join('');\n },\n\n _setSVGTextLineText: function(textSpans, lineIndex, textLeftOffset, textTopOffset) {\n // set proper line offset\n var lineHeight = this.getHeightOfLine(lineIndex),\n isJustify = this.textAlign.indexOf('justify') !== -1,\n actualStyle,\n nextStyle,\n charsToRender = '',\n charBox, style,\n boxWidth = 0,\n line = this._textLines[lineIndex],\n timeToRender;\n\n textTopOffset += lineHeight * (1 - this._fontSizeFraction) / this.lineHeight;\n for (var i = 0, len = line.length - 1; i <= len; i++) {\n timeToRender = i === len || this.charSpacing;\n charsToRender += line[i];\n charBox = this.__charBounds[lineIndex][i];\n if (boxWidth === 0) {\n textLeftOffset += charBox.kernedWidth - charBox.width;\n boxWidth += charBox.width;\n }\n else {\n boxWidth += charBox.kernedWidth;\n }\n if (isJustify && !timeToRender) {\n if (this._reSpaceAndTab.test(line[i])) {\n timeToRender = true;\n }\n }\n if (!timeToRender) {\n // if we have charSpacing, we render char by char\n actualStyle = actualStyle || this.getCompleteStyleDeclaration(lineIndex, i);\n nextStyle = this.getCompleteStyleDeclaration(lineIndex, i + 1);\n timeToRender = fabric.util.hasStyleChanged(actualStyle, nextStyle, true);\n }\n if (timeToRender) {\n style = this._getStyleDeclaration(lineIndex, i) || { };\n textSpans.push(this._createTextCharSpan(charsToRender, style, textLeftOffset, textTopOffset));\n charsToRender = '';\n actualStyle = nextStyle;\n textLeftOffset += boxWidth;\n boxWidth = 0;\n }\n }\n },\n\n _pushTextBgRect: function(textBgRects, color, left, top, width, height) {\n var NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS;\n textBgRects.push(\n '\\t\\t\\n');\n },\n\n _setSVGTextLineBg: function(textBgRects, i, leftOffset, textTopOffset) {\n var line = this._textLines[i],\n heightOfLine = this.getHeightOfLine(i) / this.lineHeight,\n boxWidth = 0,\n boxStart = 0,\n charBox, currentColor,\n lastColor = this.getValueOfPropertyAt(i, 0, 'textBackgroundColor');\n for (var j = 0, jlen = line.length; j < jlen; j++) {\n charBox = this.__charBounds[i][j];\n currentColor = this.getValueOfPropertyAt(i, j, 'textBackgroundColor');\n if (currentColor !== lastColor) {\n lastColor && this._pushTextBgRect(textBgRects, lastColor, leftOffset + boxStart,\n textTopOffset, boxWidth, heightOfLine);\n boxStart = charBox.left;\n boxWidth = charBox.width;\n lastColor = currentColor;\n }\n else {\n boxWidth += charBox.kernedWidth;\n }\n }\n currentColor && this._pushTextBgRect(textBgRects, currentColor, leftOffset + boxStart,\n textTopOffset, boxWidth, heightOfLine);\n },\n\n /**\n * Adobe Illustrator (at least CS5) is unable to render rgba()-based fill values\n * we work around it by \"moving\" alpha channel into opacity attribute and setting fill's alpha to 1\n *\n * @private\n * @param {*} value\n * @return {String}\n */\n _getFillAttributes: function(value) {\n var fillColor = (value && typeof value === 'string') ? new fabric.Color(value) : '';\n if (!fillColor || !fillColor.getSource() || fillColor.getAlpha() === 1) {\n return 'fill=\"' + value + '\"';\n }\n return 'opacity=\"' + fillColor.getAlpha() + '\" fill=\"' + fillColor.setAlpha(1).toRgb() + '\"';\n },\n\n /**\n * @private\n */\n _getSVGLineTopOffset: function(lineIndex) {\n var lineTopOffset = 0, lastHeight = 0;\n for (var j = 0; j < lineIndex; j++) {\n lineTopOffset += this.getHeightOfLine(j);\n }\n lastHeight = this.getHeightOfLine(j);\n return {\n lineTop: lineTopOffset,\n offset: (this._fontSizeMult - this._fontSizeFraction) * lastHeight / (this.lineHeight * this._fontSizeMult)\n };\n },\n\n /**\n * Returns styles-string for svg-export\n * @param {Boolean} skipShadow a boolean to skip shadow filter output\n * @return {String}\n */\n getSvgStyles: function(skipShadow) {\n var svgStyle = fabric.Object.prototype.getSvgStyles.call(this, skipShadow);\n return svgStyle + ' white-space: pre;';\n },\n });\n})();\n/* _TO_SVG_END_ */\n\n\n(function(global) {\n\n 'use strict';\n\n var fabric = global.fabric || (global.fabric = {});\n\n /**\n * Textbox class, based on IText, allows the user to resize the text rectangle\n * and wraps lines automatically. Textboxes have their Y scaling locked, the\n * user can only change width. Height is adjusted automatically based on the\n * wrapping of lines.\n * @class fabric.Textbox\n * @extends fabric.IText\n * @mixes fabric.Observable\n * @return {fabric.Textbox} thisArg\n * @see {@link fabric.Textbox#initialize} for constructor definition\n */\n fabric.Textbox = fabric.util.createClass(fabric.IText, fabric.Observable, {\n\n /**\n * Type of an object\n * @type String\n * @default\n */\n type: 'textbox',\n\n /**\n * Minimum width of textbox, in pixels.\n * @type Number\n * @default\n */\n minWidth: 20,\n\n /**\n * Minimum calculated width of a textbox, in pixels.\n * fixed to 2 so that an empty textbox cannot go to 0\n * and is still selectable without text.\n * @type Number\n * @default\n */\n dynamicMinWidth: 2,\n\n /**\n * Cached array of text wrapping.\n * @type Array\n */\n __cachedLines: null,\n\n /**\n * Override standard Object class values\n */\n lockScalingFlip: true,\n\n /**\n * Override standard Object class values\n * Textbox needs this on false\n */\n noScaleCache: false,\n\n /**\n * Properties which when set cause object to change dimensions\n * @type Object\n * @private\n */\n _dimensionAffectingProps: fabric.Text.prototype._dimensionAffectingProps.concat('width'),\n\n /**\n * Use this regular expression to split strings in breakable lines\n * @private\n */\n _wordJoiners: /[ \\t\\r]/,\n\n /**\n * Use this boolean property in order to split strings that have no white space concept.\n * this is a cheap way to help with chinese/japanese\n * @type Boolean\n * @since 2.6.0\n */\n splitByGrapheme: false,\n\n /**\n * Unlike superclass's version of this function, Textbox does not update\n * its width.\n * @private\n * @override\n */\n initDimensions: function() {\n if (this.__skipDimension) {\n return;\n }\n this.isEditing && this.initDelayedCursor();\n this.clearContextTop();\n this._clearCache();\n // clear dynamicMinWidth as it will be different after we re-wrap line\n this.dynamicMinWidth = 0;\n // wrap lines\n this._styleMap = this._generateStyleMap(this._splitText());\n // if after wrapping, the width is smaller than dynamicMinWidth, change the width and re-wrap\n if (this.dynamicMinWidth > this.width) {\n this._set('width', this.dynamicMinWidth);\n }\n if (this.textAlign.indexOf('justify') !== -1) {\n // once text is measured we need to make space fatter to make justified text.\n this.enlargeSpaces();\n }\n // clear cache and re-calculate height\n this.height = this.calcTextHeight();\n this.saveState({ propertySet: '_dimensionAffectingProps' });\n },\n\n /**\n * Generate an object that translates the style object so that it is\n * broken up by visual lines (new lines and automatic wrapping).\n * The original text styles object is broken up by actual lines (new lines only),\n * which is only sufficient for Text / IText\n * @private\n */\n _generateStyleMap: function(textInfo) {\n var realLineCount = 0,\n realLineCharCount = 0,\n charCount = 0,\n map = {};\n\n for (var i = 0; i < textInfo.graphemeLines.length; i++) {\n if (textInfo.graphemeText[charCount] === '\\n' && i > 0) {\n realLineCharCount = 0;\n charCount++;\n realLineCount++;\n }\n else if (!this.splitByGrapheme && this._reSpaceAndTab.test(textInfo.graphemeText[charCount]) && i > 0) {\n // this case deals with space's that are removed from end of lines when wrapping\n realLineCharCount++;\n charCount++;\n }\n\n map[i] = { line: realLineCount, offset: realLineCharCount };\n\n charCount += textInfo.graphemeLines[i].length;\n realLineCharCount += textInfo.graphemeLines[i].length;\n }\n\n return map;\n },\n\n /**\n * Returns true if object has a style property or has it on a specified line\n * @param {Number} lineIndex\n * @return {Boolean}\n */\n styleHas: function(property, lineIndex) {\n if (this._styleMap && !this.isWrapping) {\n var map = this._styleMap[lineIndex];\n if (map) {\n lineIndex = map.line;\n }\n }\n return fabric.Text.prototype.styleHas.call(this, property, lineIndex);\n },\n\n /**\n * Returns true if object has no styling or no styling in a line\n * @param {Number} lineIndex , lineIndex is on wrapped lines.\n * @return {Boolean}\n */\n isEmptyStyles: function(lineIndex) {\n if (!this.styles) {\n return true;\n }\n var offset = 0, nextLineIndex = lineIndex + 1, nextOffset, obj, shouldLimit = false,\n map = this._styleMap[lineIndex], mapNextLine = this._styleMap[lineIndex + 1];\n if (map) {\n lineIndex = map.line;\n offset = map.offset;\n }\n if (mapNextLine) {\n nextLineIndex = mapNextLine.line;\n shouldLimit = nextLineIndex === lineIndex;\n nextOffset = mapNextLine.offset;\n }\n obj = typeof lineIndex === 'undefined' ? this.styles : { line: this.styles[lineIndex] };\n for (var p1 in obj) {\n for (var p2 in obj[p1]) {\n if (p2 >= offset && (!shouldLimit || p2 < nextOffset)) {\n // eslint-disable-next-line no-unused-vars\n for (var p3 in obj[p1][p2]) {\n return false;\n }\n }\n }\n }\n return true;\n },\n\n /**\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @private\n */\n _getStyleDeclaration: function(lineIndex, charIndex) {\n if (this._styleMap && !this.isWrapping) {\n var map = this._styleMap[lineIndex];\n if (!map) {\n return null;\n }\n lineIndex = map.line;\n charIndex = map.offset + charIndex;\n }\n return this.callSuper('_getStyleDeclaration', lineIndex, charIndex);\n },\n\n /**\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @param {Object} style\n * @private\n */\n _setStyleDeclaration: function(lineIndex, charIndex, style) {\n var map = this._styleMap[lineIndex];\n lineIndex = map.line;\n charIndex = map.offset + charIndex;\n\n this.styles[lineIndex][charIndex] = style;\n },\n\n /**\n * @param {Number} lineIndex\n * @param {Number} charIndex\n * @private\n */\n _deleteStyleDeclaration: function(lineIndex, charIndex) {\n var map = this._styleMap[lineIndex];\n lineIndex = map.line;\n charIndex = map.offset + charIndex;\n delete this.styles[lineIndex][charIndex];\n },\n\n /**\n * probably broken need a fix\n * Returns the real style line that correspond to the wrapped lineIndex line\n * Used just to verify if the line does exist or not.\n * @param {Number} lineIndex\n * @returns {Boolean} if the line exists or not\n * @private\n */\n _getLineStyle: function(lineIndex) {\n var map = this._styleMap[lineIndex];\n return !!this.styles[map.line];\n },\n\n /**\n * Set the line style to an empty object so that is initialized\n * @param {Number} lineIndex\n * @param {Object} style\n * @private\n */\n _setLineStyle: function(lineIndex) {\n var map = this._styleMap[lineIndex];\n this.styles[map.line] = {};\n },\n\n /**\n * Wraps text using the 'width' property of Textbox. First this function\n * splits text on newlines, so we preserve newlines entered by the user.\n * Then it wraps each line using the width of the Textbox by calling\n * _wrapLine().\n * @param {Array} lines The string array of text that is split into lines\n * @param {Number} desiredWidth width you want to wrap to\n * @returns {Array} Array of lines\n */\n _wrapText: function(lines, desiredWidth) {\n var wrapped = [], i;\n this.isWrapping = true;\n for (i = 0; i < lines.length; i++) {\n wrapped = wrapped.concat(this._wrapLine(lines[i], i, desiredWidth));\n }\n this.isWrapping = false;\n return wrapped;\n },\n\n /**\n * Helper function to measure a string of text, given its lineIndex and charIndex offset\n * it gets called when charBounds are not available yet.\n * @param {CanvasRenderingContext2D} ctx\n * @param {String} text\n * @param {number} lineIndex\n * @param {number} charOffset\n * @returns {number}\n * @private\n */\n _measureWord: function(word, lineIndex, charOffset) {\n var width = 0, prevGrapheme, skipLeft = true;\n charOffset = charOffset || 0;\n for (var i = 0, len = word.length; i < len; i++) {\n var box = this._getGraphemeBox(word[i], lineIndex, i + charOffset, prevGrapheme, skipLeft);\n width += box.kernedWidth;\n prevGrapheme = word[i];\n }\n return width;\n },\n\n /**\n * Wraps a line of text using the width of the Textbox and a context.\n * @param {Array} line The grapheme array that represent the line\n * @param {Number} lineIndex\n * @param {Number} desiredWidth width you want to wrap the line to\n * @param {Number} reservedSpace space to remove from wrapping for custom functionalities\n * @returns {Array} Array of line(s) into which the given text is wrapped\n * to.\n */\n _wrapLine: function(_line, lineIndex, desiredWidth, reservedSpace) {\n var lineWidth = 0,\n splitByGrapheme = this.splitByGrapheme,\n graphemeLines = [],\n line = [],\n // spaces in different languages?\n words = splitByGrapheme ? fabric.util.string.graphemeSplit(_line) : _line.split(this._wordJoiners),\n word = '',\n offset = 0,\n infix = splitByGrapheme ? '' : ' ',\n wordWidth = 0,\n infixWidth = 0,\n largestWordWidth = 0,\n lineJustStarted = true,\n additionalSpace = this._getWidthOfCharSpacing(),\n reservedSpace = reservedSpace || 0;\n // fix a difference between split and graphemeSplit\n if (words.length === 0) {\n words.push([]);\n }\n desiredWidth -= reservedSpace;\n for (var i = 0; i < words.length; i++) {\n // if using splitByGrapheme words are already in graphemes.\n word = splitByGrapheme ? words[i] : fabric.util.string.graphemeSplit(words[i]);\n wordWidth = this._measureWord(word, lineIndex, offset);\n offset += word.length;\n\n lineWidth += infixWidth + wordWidth - additionalSpace;\n if (lineWidth > desiredWidth && !lineJustStarted) {\n graphemeLines.push(line);\n line = [];\n lineWidth = wordWidth;\n lineJustStarted = true;\n }\n else {\n lineWidth += additionalSpace;\n }\n\n if (!lineJustStarted && !splitByGrapheme) {\n line.push(infix);\n }\n line = line.concat(word);\n\n infixWidth = splitByGrapheme ? 0 : this._measureWord([infix], lineIndex, offset);\n offset++;\n lineJustStarted = false;\n // keep track of largest word\n if (wordWidth > largestWordWidth) {\n largestWordWidth = wordWidth;\n }\n }\n\n i && graphemeLines.push(line);\n\n if (largestWordWidth + reservedSpace > this.dynamicMinWidth) {\n this.dynamicMinWidth = largestWordWidth - additionalSpace + reservedSpace;\n }\n return graphemeLines;\n },\n\n /**\n * Detect if the text line is ended with an hard break\n * text and itext do not have wrapping, return false\n * @param {Number} lineIndex text to split\n * @return {Boolean}\n */\n isEndOfWrapping: function(lineIndex) {\n if (!this._styleMap[lineIndex + 1]) {\n // is last line, return true;\n return true;\n }\n if (this._styleMap[lineIndex + 1].line !== this._styleMap[lineIndex].line) {\n // this is last line before a line break, return true;\n return true;\n }\n return false;\n },\n\n /**\n * Detect if a line has a linebreak and so we need to account for it when moving\n * and counting style.\n * @return Number\n */\n missingNewlineOffset: function(lineIndex) {\n if (this.splitByGrapheme) {\n return this.isEndOfWrapping(lineIndex) ? 1 : 0;\n }\n return 1;\n },\n\n /**\n * Gets lines of text to render in the Textbox. This function calculates\n * text wrapping on the fly every time it is called.\n * @param {String} text text to split\n * @returns {Array} Array of lines in the Textbox.\n * @override\n */\n _splitTextIntoLines: function(text) {\n var newText = fabric.Text.prototype._splitTextIntoLines.call(this, text),\n graphemeLines = this._wrapText(newText.lines, this.width),\n lines = new Array(graphemeLines.length);\n for (var i = 0; i < graphemeLines.length; i++) {\n lines[i] = graphemeLines[i].join('');\n }\n newText.lines = lines;\n newText.graphemeLines = graphemeLines;\n return newText;\n },\n\n getMinWidth: function() {\n return Math.max(this.minWidth, this.dynamicMinWidth);\n },\n\n _removeExtraneousStyles: function() {\n var linesToKeep = {};\n for (var prop in this._styleMap) {\n if (this._textLines[prop]) {\n linesToKeep[this._styleMap[prop].line] = 1;\n }\n }\n for (var prop in this.styles) {\n if (!linesToKeep[prop]) {\n delete this.styles[prop];\n }\n }\n },\n\n /**\n * Returns object representation of an instance\n * @method toObject\n * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output\n * @return {Object} object representation of an instance\n */\n toObject: function(propertiesToInclude) {\n return this.callSuper('toObject', ['minWidth', 'splitByGrapheme'].concat(propertiesToInclude));\n }\n });\n\n /**\n * Returns fabric.Textbox instance from an object representation\n * @static\n * @memberOf fabric.Textbox\n * @param {Object} object Object to create an instance from\n * @param {Function} [callback] Callback to invoke when an fabric.Textbox instance is created\n */\n fabric.Textbox.fromObject = function(object, callback) {\n var styles = fabric.util.stylesFromArray(object.styles, object.text);\n //copy object to prevent mutation\n var objCopy = Object.assign({}, object, { styles: styles });\n return fabric.Object._fromObject('Textbox', objCopy, callback, 'text');\n };\n})(typeof exports !== 'undefined' ? exports : this);\n\n\n(function() {\n\n var controlsUtils = fabric.controlsUtils,\n scaleSkewStyleHandler = controlsUtils.scaleSkewCursorStyleHandler,\n scaleStyleHandler = controlsUtils.scaleCursorStyleHandler,\n scalingEqually = controlsUtils.scalingEqually,\n scalingYOrSkewingX = controlsUtils.scalingYOrSkewingX,\n scalingXOrSkewingY = controlsUtils.scalingXOrSkewingY,\n scaleOrSkewActionName = controlsUtils.scaleOrSkewActionName,\n objectControls = fabric.Object.prototype.controls;\n\n objectControls.ml = new fabric.Control({\n x: -0.5,\n y: 0,\n cursorStyleHandler: scaleSkewStyleHandler,\n actionHandler: scalingXOrSkewingY,\n getActionName: scaleOrSkewActionName,\n });\n\n objectControls.mr = new fabric.Control({\n x: 0.5,\n y: 0,\n cursorStyleHandler: scaleSkewStyleHandler,\n actionHandler: scalingXOrSkewingY,\n getActionName: scaleOrSkewActionName,\n });\n\n objectControls.mb = new fabric.Control({\n x: 0,\n y: 0.5,\n cursorStyleHandler: scaleSkewStyleHandler,\n actionHandler: scalingYOrSkewingX,\n getActionName: scaleOrSkewActionName,\n });\n\n objectControls.mt = new fabric.Control({\n x: 0,\n y: -0.5,\n cursorStyleHandler: scaleSkewStyleHandler,\n actionHandler: scalingYOrSkewingX,\n getActionName: scaleOrSkewActionName,\n });\n\n objectControls.tl = new fabric.Control({\n x: -0.5,\n y: -0.5,\n cursorStyleHandler: scaleStyleHandler,\n actionHandler: scalingEqually\n });\n\n objectControls.tr = new fabric.Control({\n x: 0.5,\n y: -0.5,\n cursorStyleHandler: scaleStyleHandler,\n actionHandler: scalingEqually\n });\n\n objectControls.bl = new fabric.Control({\n x: -0.5,\n y: 0.5,\n cursorStyleHandler: scaleStyleHandler,\n actionHandler: scalingEqually\n });\n\n objectControls.br = new fabric.Control({\n x: 0.5,\n y: 0.5,\n cursorStyleHandler: scaleStyleHandler,\n actionHandler: scalingEqually\n });\n\n objectControls.mtr = new fabric.Control({\n x: 0,\n y: -0.5,\n actionHandler: controlsUtils.rotationWithSnapping,\n cursorStyleHandler: controlsUtils.rotationStyleHandler,\n offsetY: -40,\n withConnection: true,\n actionName: 'rotate',\n });\n\n if (fabric.Textbox) {\n // this is breaking the prototype inheritance, no time / ideas to fix it.\n // is important to document that if you want to have all objects to have a\n // specific custom control, you have to add it to Object prototype and to Textbox\n // prototype. The controls are shared as references. So changes to control `tr`\n // can still apply to all objects if needed.\n var textBoxControls = fabric.Textbox.prototype.controls = { };\n\n textBoxControls.mtr = objectControls.mtr;\n textBoxControls.tr = objectControls.tr;\n textBoxControls.br = objectControls.br;\n textBoxControls.tl = objectControls.tl;\n textBoxControls.bl = objectControls.bl;\n textBoxControls.mt = objectControls.mt;\n textBoxControls.mb = objectControls.mb;\n\n textBoxControls.mr = new fabric.Control({\n x: 0.5,\n y: 0,\n actionHandler: controlsUtils.changeWidth,\n cursorStyleHandler: scaleSkewStyleHandler,\n actionName: 'resizing',\n });\n\n textBoxControls.ml = new fabric.Control({\n x: -0.5,\n y: 0,\n actionHandler: controlsUtils.changeWidth,\n cursorStyleHandler: scaleSkewStyleHandler,\n actionName: 'resizing',\n });\n }\n})();\n\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","/*\nTurbo 7.2.4\nCopyright © 2022 37signals LLC\n */\n(function () {\n if (window.Reflect === undefined ||\n window.customElements === undefined ||\n window.customElements.polyfillWrapFlushCallback) {\n return;\n }\n const BuiltInHTMLElement = HTMLElement;\n const wrapperForTheName = {\n HTMLElement: function HTMLElement() {\n return Reflect.construct(BuiltInHTMLElement, [], this.constructor);\n },\n };\n window.HTMLElement = wrapperForTheName[\"HTMLElement\"];\n HTMLElement.prototype = BuiltInHTMLElement.prototype;\n HTMLElement.prototype.constructor = HTMLElement;\n Object.setPrototypeOf(HTMLElement, BuiltInHTMLElement);\n})();\n\n/**\n * The MIT License (MIT)\n * \n * Copyright (c) 2019 Javan Makhmali\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n(function(prototype) {\n if (typeof prototype.requestSubmit == \"function\") return\n\n prototype.requestSubmit = function(submitter) {\n if (submitter) {\n validateSubmitter(submitter, this);\n submitter.click();\n } else {\n submitter = document.createElement(\"input\");\n submitter.type = \"submit\";\n submitter.hidden = true;\n this.appendChild(submitter);\n submitter.click();\n this.removeChild(submitter);\n }\n };\n\n function validateSubmitter(submitter, form) {\n submitter instanceof HTMLElement || raise(TypeError, \"parameter 1 is not of type 'HTMLElement'\");\n submitter.type == \"submit\" || raise(TypeError, \"The specified element is not a submit button\");\n submitter.form == form || raise(DOMException, \"The specified element is not owned by this form element\", \"NotFoundError\");\n }\n\n function raise(errorConstructor, message, name) {\n throw new errorConstructor(\"Failed to execute 'requestSubmit' on 'HTMLFormElement': \" + message + \".\", name)\n }\n})(HTMLFormElement.prototype);\n\nconst submittersByForm = new WeakMap();\nfunction findSubmitterFromClickTarget(target) {\n const element = target instanceof Element ? target : target instanceof Node ? target.parentElement : null;\n const candidate = element ? element.closest(\"input, button\") : null;\n return (candidate === null || candidate === void 0 ? void 0 : candidate.type) == \"submit\" ? candidate : null;\n}\nfunction clickCaptured(event) {\n const submitter = findSubmitterFromClickTarget(event.target);\n if (submitter && submitter.form) {\n submittersByForm.set(submitter.form, submitter);\n }\n}\n(function () {\n if (\"submitter\" in Event.prototype)\n return;\n let prototype;\n if (\"SubmitEvent\" in window && /Apple Computer/.test(navigator.vendor)) {\n prototype = window.SubmitEvent.prototype;\n }\n else if (\"SubmitEvent\" in window) {\n return;\n }\n else {\n prototype = window.Event.prototype;\n }\n addEventListener(\"click\", clickCaptured, true);\n Object.defineProperty(prototype, \"submitter\", {\n get() {\n if (this.type == \"submit\" && this.target instanceof HTMLFormElement) {\n return submittersByForm.get(this.target);\n }\n },\n });\n})();\n\nvar FrameLoadingStyle;\n(function (FrameLoadingStyle) {\n FrameLoadingStyle[\"eager\"] = \"eager\";\n FrameLoadingStyle[\"lazy\"] = \"lazy\";\n})(FrameLoadingStyle || (FrameLoadingStyle = {}));\nclass FrameElement extends HTMLElement {\n constructor() {\n super();\n this.loaded = Promise.resolve();\n this.delegate = new FrameElement.delegateConstructor(this);\n }\n static get observedAttributes() {\n return [\"disabled\", \"complete\", \"loading\", \"src\"];\n }\n connectedCallback() {\n this.delegate.connect();\n }\n disconnectedCallback() {\n this.delegate.disconnect();\n }\n reload() {\n return this.delegate.sourceURLReloaded();\n }\n attributeChangedCallback(name) {\n if (name == \"loading\") {\n this.delegate.loadingStyleChanged();\n }\n else if (name == \"complete\") {\n this.delegate.completeChanged();\n }\n else if (name == \"src\") {\n this.delegate.sourceURLChanged();\n }\n else {\n this.delegate.disabledChanged();\n }\n }\n get src() {\n return this.getAttribute(\"src\");\n }\n set src(value) {\n if (value) {\n this.setAttribute(\"src\", value);\n }\n else {\n this.removeAttribute(\"src\");\n }\n }\n get loading() {\n return frameLoadingStyleFromString(this.getAttribute(\"loading\") || \"\");\n }\n set loading(value) {\n if (value) {\n this.setAttribute(\"loading\", value);\n }\n else {\n this.removeAttribute(\"loading\");\n }\n }\n get disabled() {\n return this.hasAttribute(\"disabled\");\n }\n set disabled(value) {\n if (value) {\n this.setAttribute(\"disabled\", \"\");\n }\n else {\n this.removeAttribute(\"disabled\");\n }\n }\n get autoscroll() {\n return this.hasAttribute(\"autoscroll\");\n }\n set autoscroll(value) {\n if (value) {\n this.setAttribute(\"autoscroll\", \"\");\n }\n else {\n this.removeAttribute(\"autoscroll\");\n }\n }\n get complete() {\n return !this.delegate.isLoading;\n }\n get isActive() {\n return this.ownerDocument === document && !this.isPreview;\n }\n get isPreview() {\n var _a, _b;\n return (_b = (_a = this.ownerDocument) === null || _a === void 0 ? void 0 : _a.documentElement) === null || _b === void 0 ? void 0 : _b.hasAttribute(\"data-turbo-preview\");\n }\n}\nfunction frameLoadingStyleFromString(style) {\n switch (style.toLowerCase()) {\n case \"lazy\":\n return FrameLoadingStyle.lazy;\n default:\n return FrameLoadingStyle.eager;\n }\n}\n\nfunction expandURL(locatable) {\n return new URL(locatable.toString(), document.baseURI);\n}\nfunction getAnchor(url) {\n let anchorMatch;\n if (url.hash) {\n return url.hash.slice(1);\n }\n else if ((anchorMatch = url.href.match(/#(.*)$/))) {\n return anchorMatch[1];\n }\n}\nfunction getAction(form, submitter) {\n const action = (submitter === null || submitter === void 0 ? void 0 : submitter.getAttribute(\"formaction\")) || form.getAttribute(\"action\") || form.action;\n return expandURL(action);\n}\nfunction getExtension(url) {\n return (getLastPathComponent(url).match(/\\.[^.]*$/) || [])[0] || \"\";\n}\nfunction isHTML(url) {\n return !!getExtension(url).match(/^(?:|\\.(?:htm|html|xhtml|php))$/);\n}\nfunction isPrefixedBy(baseURL, url) {\n const prefix = getPrefix(url);\n return baseURL.href === expandURL(prefix).href || baseURL.href.startsWith(prefix);\n}\nfunction locationIsVisitable(location, rootLocation) {\n return isPrefixedBy(location, rootLocation) && isHTML(location);\n}\nfunction getRequestURL(url) {\n const anchor = getAnchor(url);\n return anchor != null ? url.href.slice(0, -(anchor.length + 1)) : url.href;\n}\nfunction toCacheKey(url) {\n return getRequestURL(url);\n}\nfunction urlsAreEqual(left, right) {\n return expandURL(left).href == expandURL(right).href;\n}\nfunction getPathComponents(url) {\n return url.pathname.split(\"/\").slice(1);\n}\nfunction getLastPathComponent(url) {\n return getPathComponents(url).slice(-1)[0];\n}\nfunction getPrefix(url) {\n return addTrailingSlash(url.origin + url.pathname);\n}\nfunction addTrailingSlash(value) {\n return value.endsWith(\"/\") ? value : value + \"/\";\n}\n\nclass FetchResponse {\n constructor(response) {\n this.response = response;\n }\n get succeeded() {\n return this.response.ok;\n }\n get failed() {\n return !this.succeeded;\n }\n get clientError() {\n return this.statusCode >= 400 && this.statusCode <= 499;\n }\n get serverError() {\n return this.statusCode >= 500 && this.statusCode <= 599;\n }\n get redirected() {\n return this.response.redirected;\n }\n get location() {\n return expandURL(this.response.url);\n }\n get isHTML() {\n return this.contentType && this.contentType.match(/^(?:text\\/([^\\s;,]+\\b)?html|application\\/xhtml\\+xml)\\b/);\n }\n get statusCode() {\n return this.response.status;\n }\n get contentType() {\n return this.header(\"Content-Type\");\n }\n get responseText() {\n return this.response.clone().text();\n }\n get responseHTML() {\n if (this.isHTML) {\n return this.response.clone().text();\n }\n else {\n return Promise.resolve(undefined);\n }\n }\n header(name) {\n return this.response.headers.get(name);\n }\n}\n\nfunction isAction(action) {\n return action == \"advance\" || action == \"replace\" || action == \"restore\";\n}\n\nfunction activateScriptElement(element) {\n if (element.getAttribute(\"data-turbo-eval\") == \"false\") {\n return element;\n }\n else {\n const createdScriptElement = document.createElement(\"script\");\n const cspNonce = getMetaContent(\"csp-nonce\");\n if (cspNonce) {\n createdScriptElement.nonce = cspNonce;\n }\n createdScriptElement.textContent = element.textContent;\n createdScriptElement.async = false;\n copyElementAttributes(createdScriptElement, element);\n return createdScriptElement;\n }\n}\nfunction copyElementAttributes(destinationElement, sourceElement) {\n for (const { name, value } of sourceElement.attributes) {\n destinationElement.setAttribute(name, value);\n }\n}\nfunction createDocumentFragment(html) {\n const template = document.createElement(\"template\");\n template.innerHTML = html;\n return template.content;\n}\nfunction dispatch(eventName, { target, cancelable, detail } = {}) {\n const event = new CustomEvent(eventName, {\n cancelable,\n bubbles: true,\n detail,\n });\n if (target && target.isConnected) {\n target.dispatchEvent(event);\n }\n else {\n document.documentElement.dispatchEvent(event);\n }\n return event;\n}\nfunction nextAnimationFrame() {\n return new Promise((resolve) => requestAnimationFrame(() => resolve()));\n}\nfunction nextEventLoopTick() {\n return new Promise((resolve) => setTimeout(() => resolve(), 0));\n}\nfunction nextMicrotask() {\n return Promise.resolve();\n}\nfunction parseHTMLDocument(html = \"\") {\n return new DOMParser().parseFromString(html, \"text/html\");\n}\nfunction unindent(strings, ...values) {\n const lines = interpolate(strings, values).replace(/^\\n/, \"\").split(\"\\n\");\n const match = lines[0].match(/^\\s+/);\n const indent = match ? match[0].length : 0;\n return lines.map((line) => line.slice(indent)).join(\"\\n\");\n}\nfunction interpolate(strings, values) {\n return strings.reduce((result, string, i) => {\n const value = values[i] == undefined ? \"\" : values[i];\n return result + string + value;\n }, \"\");\n}\nfunction uuid() {\n return Array.from({ length: 36 })\n .map((_, i) => {\n if (i == 8 || i == 13 || i == 18 || i == 23) {\n return \"-\";\n }\n else if (i == 14) {\n return \"4\";\n }\n else if (i == 19) {\n return (Math.floor(Math.random() * 4) + 8).toString(16);\n }\n else {\n return Math.floor(Math.random() * 15).toString(16);\n }\n })\n .join(\"\");\n}\nfunction getAttribute(attributeName, ...elements) {\n for (const value of elements.map((element) => element === null || element === void 0 ? void 0 : element.getAttribute(attributeName))) {\n if (typeof value == \"string\")\n return value;\n }\n return null;\n}\nfunction hasAttribute(attributeName, ...elements) {\n return elements.some((element) => element && element.hasAttribute(attributeName));\n}\nfunction markAsBusy(...elements) {\n for (const element of elements) {\n if (element.localName == \"turbo-frame\") {\n element.setAttribute(\"busy\", \"\");\n }\n element.setAttribute(\"aria-busy\", \"true\");\n }\n}\nfunction clearBusyState(...elements) {\n for (const element of elements) {\n if (element.localName == \"turbo-frame\") {\n element.removeAttribute(\"busy\");\n }\n element.removeAttribute(\"aria-busy\");\n }\n}\nfunction waitForLoad(element, timeoutInMilliseconds = 2000) {\n return new Promise((resolve) => {\n const onComplete = () => {\n element.removeEventListener(\"error\", onComplete);\n element.removeEventListener(\"load\", onComplete);\n resolve();\n };\n element.addEventListener(\"load\", onComplete, { once: true });\n element.addEventListener(\"error\", onComplete, { once: true });\n setTimeout(resolve, timeoutInMilliseconds);\n });\n}\nfunction getHistoryMethodForAction(action) {\n switch (action) {\n case \"replace\":\n return history.replaceState;\n case \"advance\":\n case \"restore\":\n return history.pushState;\n }\n}\nfunction getVisitAction(...elements) {\n const action = getAttribute(\"data-turbo-action\", ...elements);\n return isAction(action) ? action : null;\n}\nfunction getMetaElement(name) {\n return document.querySelector(`meta[name=\"${name}\"]`);\n}\nfunction getMetaContent(name) {\n const element = getMetaElement(name);\n return element && element.content;\n}\nfunction setMetaContent(name, content) {\n let element = getMetaElement(name);\n if (!element) {\n element = document.createElement(\"meta\");\n element.setAttribute(\"name\", name);\n document.head.appendChild(element);\n }\n element.setAttribute(\"content\", content);\n return element;\n}\n\nvar FetchMethod;\n(function (FetchMethod) {\n FetchMethod[FetchMethod[\"get\"] = 0] = \"get\";\n FetchMethod[FetchMethod[\"post\"] = 1] = \"post\";\n FetchMethod[FetchMethod[\"put\"] = 2] = \"put\";\n FetchMethod[FetchMethod[\"patch\"] = 3] = \"patch\";\n FetchMethod[FetchMethod[\"delete\"] = 4] = \"delete\";\n})(FetchMethod || (FetchMethod = {}));\nfunction fetchMethodFromString(method) {\n switch (method.toLowerCase()) {\n case \"get\":\n return FetchMethod.get;\n case \"post\":\n return FetchMethod.post;\n case \"put\":\n return FetchMethod.put;\n case \"patch\":\n return FetchMethod.patch;\n case \"delete\":\n return FetchMethod.delete;\n }\n}\nclass FetchRequest {\n constructor(delegate, method, location, body = new URLSearchParams(), target = null) {\n this.abortController = new AbortController();\n this.resolveRequestPromise = (_value) => { };\n this.delegate = delegate;\n this.method = method;\n this.headers = this.defaultHeaders;\n this.body = body;\n this.url = location;\n this.target = target;\n }\n get location() {\n return this.url;\n }\n get params() {\n return this.url.searchParams;\n }\n get entries() {\n return this.body ? Array.from(this.body.entries()) : [];\n }\n cancel() {\n this.abortController.abort();\n }\n async perform() {\n var _a, _b;\n const { fetchOptions } = this;\n (_b = (_a = this.delegate).prepareHeadersForRequest) === null || _b === void 0 ? void 0 : _b.call(_a, this.headers, this);\n await this.allowRequestToBeIntercepted(fetchOptions);\n try {\n this.delegate.requestStarted(this);\n const response = await fetch(this.url.href, fetchOptions);\n return await this.receive(response);\n }\n catch (error) {\n if (error.name !== \"AbortError\") {\n if (this.willDelegateErrorHandling(error)) {\n this.delegate.requestErrored(this, error);\n }\n throw error;\n }\n }\n finally {\n this.delegate.requestFinished(this);\n }\n }\n async receive(response) {\n const fetchResponse = new FetchResponse(response);\n const event = dispatch(\"turbo:before-fetch-response\", {\n cancelable: true,\n detail: { fetchResponse },\n target: this.target,\n });\n if (event.defaultPrevented) {\n this.delegate.requestPreventedHandlingResponse(this, fetchResponse);\n }\n else if (fetchResponse.succeeded) {\n this.delegate.requestSucceededWithResponse(this, fetchResponse);\n }\n else {\n this.delegate.requestFailedWithResponse(this, fetchResponse);\n }\n return fetchResponse;\n }\n get fetchOptions() {\n var _a;\n return {\n method: FetchMethod[this.method].toUpperCase(),\n credentials: \"same-origin\",\n headers: this.headers,\n redirect: \"follow\",\n body: this.isIdempotent ? null : this.body,\n signal: this.abortSignal,\n referrer: (_a = this.delegate.referrer) === null || _a === void 0 ? void 0 : _a.href,\n };\n }\n get defaultHeaders() {\n return {\n Accept: \"text/html, application/xhtml+xml\",\n };\n }\n get isIdempotent() {\n return this.method == FetchMethod.get;\n }\n get abortSignal() {\n return this.abortController.signal;\n }\n acceptResponseType(mimeType) {\n this.headers[\"Accept\"] = [mimeType, this.headers[\"Accept\"]].join(\", \");\n }\n async allowRequestToBeIntercepted(fetchOptions) {\n const requestInterception = new Promise((resolve) => (this.resolveRequestPromise = resolve));\n const event = dispatch(\"turbo:before-fetch-request\", {\n cancelable: true,\n detail: {\n fetchOptions,\n url: this.url,\n resume: this.resolveRequestPromise,\n },\n target: this.target,\n });\n if (event.defaultPrevented)\n await requestInterception;\n }\n willDelegateErrorHandling(error) {\n const event = dispatch(\"turbo:fetch-request-error\", {\n target: this.target,\n cancelable: true,\n detail: { request: this, error: error },\n });\n return !event.defaultPrevented;\n }\n}\n\nclass AppearanceObserver {\n constructor(delegate, element) {\n this.started = false;\n this.intersect = (entries) => {\n const lastEntry = entries.slice(-1)[0];\n if (lastEntry === null || lastEntry === void 0 ? void 0 : lastEntry.isIntersecting) {\n this.delegate.elementAppearedInViewport(this.element);\n }\n };\n this.delegate = delegate;\n this.element = element;\n this.intersectionObserver = new IntersectionObserver(this.intersect);\n }\n start() {\n if (!this.started) {\n this.started = true;\n this.intersectionObserver.observe(this.element);\n }\n }\n stop() {\n if (this.started) {\n this.started = false;\n this.intersectionObserver.unobserve(this.element);\n }\n }\n}\n\nclass StreamMessage {\n constructor(fragment) {\n this.fragment = importStreamElements(fragment);\n }\n static wrap(message) {\n if (typeof message == \"string\") {\n return new this(createDocumentFragment(message));\n }\n else {\n return message;\n }\n }\n}\nStreamMessage.contentType = \"text/vnd.turbo-stream.html\";\nfunction importStreamElements(fragment) {\n for (const element of fragment.querySelectorAll(\"turbo-stream\")) {\n const streamElement = document.importNode(element, true);\n for (const inertScriptElement of streamElement.templateElement.content.querySelectorAll(\"script\")) {\n inertScriptElement.replaceWith(activateScriptElement(inertScriptElement));\n }\n element.replaceWith(streamElement);\n }\n return fragment;\n}\n\nvar FormSubmissionState;\n(function (FormSubmissionState) {\n FormSubmissionState[FormSubmissionState[\"initialized\"] = 0] = \"initialized\";\n FormSubmissionState[FormSubmissionState[\"requesting\"] = 1] = \"requesting\";\n FormSubmissionState[FormSubmissionState[\"waiting\"] = 2] = \"waiting\";\n FormSubmissionState[FormSubmissionState[\"receiving\"] = 3] = \"receiving\";\n FormSubmissionState[FormSubmissionState[\"stopping\"] = 4] = \"stopping\";\n FormSubmissionState[FormSubmissionState[\"stopped\"] = 5] = \"stopped\";\n})(FormSubmissionState || (FormSubmissionState = {}));\nvar FormEnctype;\n(function (FormEnctype) {\n FormEnctype[\"urlEncoded\"] = \"application/x-www-form-urlencoded\";\n FormEnctype[\"multipart\"] = \"multipart/form-data\";\n FormEnctype[\"plain\"] = \"text/plain\";\n})(FormEnctype || (FormEnctype = {}));\nfunction formEnctypeFromString(encoding) {\n switch (encoding.toLowerCase()) {\n case FormEnctype.multipart:\n return FormEnctype.multipart;\n case FormEnctype.plain:\n return FormEnctype.plain;\n default:\n return FormEnctype.urlEncoded;\n }\n}\nclass FormSubmission {\n constructor(delegate, formElement, submitter, mustRedirect = false) {\n this.state = FormSubmissionState.initialized;\n this.delegate = delegate;\n this.formElement = formElement;\n this.submitter = submitter;\n this.formData = buildFormData(formElement, submitter);\n this.location = expandURL(this.action);\n if (this.method == FetchMethod.get) {\n mergeFormDataEntries(this.location, [...this.body.entries()]);\n }\n this.fetchRequest = new FetchRequest(this, this.method, this.location, this.body, this.formElement);\n this.mustRedirect = mustRedirect;\n }\n static confirmMethod(message, _element, _submitter) {\n return Promise.resolve(confirm(message));\n }\n get method() {\n var _a;\n const method = ((_a = this.submitter) === null || _a === void 0 ? void 0 : _a.getAttribute(\"formmethod\")) || this.formElement.getAttribute(\"method\") || \"\";\n return fetchMethodFromString(method.toLowerCase()) || FetchMethod.get;\n }\n get action() {\n var _a;\n const formElementAction = typeof this.formElement.action === \"string\" ? this.formElement.action : null;\n if ((_a = this.submitter) === null || _a === void 0 ? void 0 : _a.hasAttribute(\"formaction\")) {\n return this.submitter.getAttribute(\"formaction\") || \"\";\n }\n else {\n return this.formElement.getAttribute(\"action\") || formElementAction || \"\";\n }\n }\n get body() {\n if (this.enctype == FormEnctype.urlEncoded || this.method == FetchMethod.get) {\n return new URLSearchParams(this.stringFormData);\n }\n else {\n return this.formData;\n }\n }\n get enctype() {\n var _a;\n return formEnctypeFromString(((_a = this.submitter) === null || _a === void 0 ? void 0 : _a.getAttribute(\"formenctype\")) || this.formElement.enctype);\n }\n get isIdempotent() {\n return this.fetchRequest.isIdempotent;\n }\n get stringFormData() {\n return [...this.formData].reduce((entries, [name, value]) => {\n return entries.concat(typeof value == \"string\" ? [[name, value]] : []);\n }, []);\n }\n async start() {\n const { initialized, requesting } = FormSubmissionState;\n const confirmationMessage = getAttribute(\"data-turbo-confirm\", this.submitter, this.formElement);\n if (typeof confirmationMessage === \"string\") {\n const answer = await FormSubmission.confirmMethod(confirmationMessage, this.formElement, this.submitter);\n if (!answer) {\n return;\n }\n }\n if (this.state == initialized) {\n this.state = requesting;\n return this.fetchRequest.perform();\n }\n }\n stop() {\n const { stopping, stopped } = FormSubmissionState;\n if (this.state != stopping && this.state != stopped) {\n this.state = stopping;\n this.fetchRequest.cancel();\n return true;\n }\n }\n prepareHeadersForRequest(headers, request) {\n if (!request.isIdempotent) {\n const token = getCookieValue(getMetaContent(\"csrf-param\")) || getMetaContent(\"csrf-token\");\n if (token) {\n headers[\"X-CSRF-Token\"] = token;\n }\n }\n if (this.requestAcceptsTurboStreamResponse(request)) {\n request.acceptResponseType(StreamMessage.contentType);\n }\n }\n requestStarted(_request) {\n var _a;\n this.state = FormSubmissionState.waiting;\n (_a = this.submitter) === null || _a === void 0 ? void 0 : _a.setAttribute(\"disabled\", \"\");\n dispatch(\"turbo:submit-start\", {\n target: this.formElement,\n detail: { formSubmission: this },\n });\n this.delegate.formSubmissionStarted(this);\n }\n requestPreventedHandlingResponse(request, response) {\n this.result = { success: response.succeeded, fetchResponse: response };\n }\n requestSucceededWithResponse(request, response) {\n if (response.clientError || response.serverError) {\n this.delegate.formSubmissionFailedWithResponse(this, response);\n }\n else if (this.requestMustRedirect(request) && responseSucceededWithoutRedirect(response)) {\n const error = new Error(\"Form responses must redirect to another location\");\n this.delegate.formSubmissionErrored(this, error);\n }\n else {\n this.state = FormSubmissionState.receiving;\n this.result = { success: true, fetchResponse: response };\n this.delegate.formSubmissionSucceededWithResponse(this, response);\n }\n }\n requestFailedWithResponse(request, response) {\n this.result = { success: false, fetchResponse: response };\n this.delegate.formSubmissionFailedWithResponse(this, response);\n }\n requestErrored(request, error) {\n this.result = { success: false, error };\n this.delegate.formSubmissionErrored(this, error);\n }\n requestFinished(_request) {\n var _a;\n this.state = FormSubmissionState.stopped;\n (_a = this.submitter) === null || _a === void 0 ? void 0 : _a.removeAttribute(\"disabled\");\n dispatch(\"turbo:submit-end\", {\n target: this.formElement,\n detail: Object.assign({ formSubmission: this }, this.result),\n });\n this.delegate.formSubmissionFinished(this);\n }\n requestMustRedirect(request) {\n return !request.isIdempotent && this.mustRedirect;\n }\n requestAcceptsTurboStreamResponse(request) {\n return !request.isIdempotent || hasAttribute(\"data-turbo-stream\", this.submitter, this.formElement);\n }\n}\nfunction buildFormData(formElement, submitter) {\n const formData = new FormData(formElement);\n const name = submitter === null || submitter === void 0 ? void 0 : submitter.getAttribute(\"name\");\n const value = submitter === null || submitter === void 0 ? void 0 : submitter.getAttribute(\"value\");\n if (name) {\n formData.append(name, value || \"\");\n }\n return formData;\n}\nfunction getCookieValue(cookieName) {\n if (cookieName != null) {\n const cookies = document.cookie ? document.cookie.split(\"; \") : [];\n const cookie = cookies.find((cookie) => cookie.startsWith(cookieName));\n if (cookie) {\n const value = cookie.split(\"=\").slice(1).join(\"=\");\n return value ? decodeURIComponent(value) : undefined;\n }\n }\n}\nfunction responseSucceededWithoutRedirect(response) {\n return response.statusCode == 200 && !response.redirected;\n}\nfunction mergeFormDataEntries(url, entries) {\n const searchParams = new URLSearchParams();\n for (const [name, value] of entries) {\n if (value instanceof File)\n continue;\n searchParams.append(name, value);\n }\n url.search = searchParams.toString();\n return url;\n}\n\nclass Snapshot {\n constructor(element) {\n this.element = element;\n }\n get activeElement() {\n return this.element.ownerDocument.activeElement;\n }\n get children() {\n return [...this.element.children];\n }\n hasAnchor(anchor) {\n return this.getElementForAnchor(anchor) != null;\n }\n getElementForAnchor(anchor) {\n return anchor ? this.element.querySelector(`[id='${anchor}'], a[name='${anchor}']`) : null;\n }\n get isConnected() {\n return this.element.isConnected;\n }\n get firstAutofocusableElement() {\n const inertDisabledOrHidden = \"[inert], :disabled, [hidden], details:not([open]), dialog:not([open])\";\n for (const element of this.element.querySelectorAll(\"[autofocus]\")) {\n if (element.closest(inertDisabledOrHidden) == null)\n return element;\n else\n continue;\n }\n return null;\n }\n get permanentElements() {\n return queryPermanentElementsAll(this.element);\n }\n getPermanentElementById(id) {\n return getPermanentElementById(this.element, id);\n }\n getPermanentElementMapForSnapshot(snapshot) {\n const permanentElementMap = {};\n for (const currentPermanentElement of this.permanentElements) {\n const { id } = currentPermanentElement;\n const newPermanentElement = snapshot.getPermanentElementById(id);\n if (newPermanentElement) {\n permanentElementMap[id] = [currentPermanentElement, newPermanentElement];\n }\n }\n return permanentElementMap;\n }\n}\nfunction getPermanentElementById(node, id) {\n return node.querySelector(`#${id}[data-turbo-permanent]`);\n}\nfunction queryPermanentElementsAll(node) {\n return node.querySelectorAll(\"[id][data-turbo-permanent]\");\n}\n\nclass FormSubmitObserver {\n constructor(delegate, eventTarget) {\n this.started = false;\n this.submitCaptured = () => {\n this.eventTarget.removeEventListener(\"submit\", this.submitBubbled, false);\n this.eventTarget.addEventListener(\"submit\", this.submitBubbled, false);\n };\n this.submitBubbled = ((event) => {\n if (!event.defaultPrevented) {\n const form = event.target instanceof HTMLFormElement ? event.target : undefined;\n const submitter = event.submitter || undefined;\n if (form &&\n submissionDoesNotDismissDialog(form, submitter) &&\n submissionDoesNotTargetIFrame(form, submitter) &&\n this.delegate.willSubmitForm(form, submitter)) {\n event.preventDefault();\n event.stopImmediatePropagation();\n this.delegate.formSubmitted(form, submitter);\n }\n }\n });\n this.delegate = delegate;\n this.eventTarget = eventTarget;\n }\n start() {\n if (!this.started) {\n this.eventTarget.addEventListener(\"submit\", this.submitCaptured, true);\n this.started = true;\n }\n }\n stop() {\n if (this.started) {\n this.eventTarget.removeEventListener(\"submit\", this.submitCaptured, true);\n this.started = false;\n }\n }\n}\nfunction submissionDoesNotDismissDialog(form, submitter) {\n const method = (submitter === null || submitter === void 0 ? void 0 : submitter.getAttribute(\"formmethod\")) || form.getAttribute(\"method\");\n return method != \"dialog\";\n}\nfunction submissionDoesNotTargetIFrame(form, submitter) {\n const target = (submitter === null || submitter === void 0 ? void 0 : submitter.getAttribute(\"formtarget\")) || form.target;\n for (const element of document.getElementsByName(target)) {\n if (element instanceof HTMLIFrameElement)\n return false;\n }\n return true;\n}\n\nclass View {\n constructor(delegate, element) {\n this.resolveRenderPromise = (_value) => { };\n this.resolveInterceptionPromise = (_value) => { };\n this.delegate = delegate;\n this.element = element;\n }\n scrollToAnchor(anchor) {\n const element = this.snapshot.getElementForAnchor(anchor);\n if (element) {\n this.scrollToElement(element);\n this.focusElement(element);\n }\n else {\n this.scrollToPosition({ x: 0, y: 0 });\n }\n }\n scrollToAnchorFromLocation(location) {\n this.scrollToAnchor(getAnchor(location));\n }\n scrollToElement(element) {\n element.scrollIntoView();\n }\n focusElement(element) {\n if (element instanceof HTMLElement) {\n if (element.hasAttribute(\"tabindex\")) {\n element.focus();\n }\n else {\n element.setAttribute(\"tabindex\", \"-1\");\n element.focus();\n element.removeAttribute(\"tabindex\");\n }\n }\n }\n scrollToPosition({ x, y }) {\n this.scrollRoot.scrollTo(x, y);\n }\n scrollToTop() {\n this.scrollToPosition({ x: 0, y: 0 });\n }\n get scrollRoot() {\n return window;\n }\n async render(renderer) {\n const { isPreview, shouldRender, newSnapshot: snapshot } = renderer;\n if (shouldRender) {\n try {\n this.renderPromise = new Promise((resolve) => (this.resolveRenderPromise = resolve));\n this.renderer = renderer;\n await this.prepareToRenderSnapshot(renderer);\n const renderInterception = new Promise((resolve) => (this.resolveInterceptionPromise = resolve));\n const options = { resume: this.resolveInterceptionPromise, render: this.renderer.renderElement };\n const immediateRender = this.delegate.allowsImmediateRender(snapshot, options);\n if (!immediateRender)\n await renderInterception;\n await this.renderSnapshot(renderer);\n this.delegate.viewRenderedSnapshot(snapshot, isPreview);\n this.delegate.preloadOnLoadLinksForView(this.element);\n this.finishRenderingSnapshot(renderer);\n }\n finally {\n delete this.renderer;\n this.resolveRenderPromise(undefined);\n delete this.renderPromise;\n }\n }\n else {\n this.invalidate(renderer.reloadReason);\n }\n }\n invalidate(reason) {\n this.delegate.viewInvalidated(reason);\n }\n async prepareToRenderSnapshot(renderer) {\n this.markAsPreview(renderer.isPreview);\n await renderer.prepareToRender();\n }\n markAsPreview(isPreview) {\n if (isPreview) {\n this.element.setAttribute(\"data-turbo-preview\", \"\");\n }\n else {\n this.element.removeAttribute(\"data-turbo-preview\");\n }\n }\n async renderSnapshot(renderer) {\n await renderer.render();\n }\n finishRenderingSnapshot(renderer) {\n renderer.finishRendering();\n }\n}\n\nclass FrameView extends View {\n invalidate() {\n this.element.innerHTML = \"\";\n }\n get snapshot() {\n return new Snapshot(this.element);\n }\n}\n\nclass LinkInterceptor {\n constructor(delegate, element) {\n this.clickBubbled = (event) => {\n if (this.respondsToEventTarget(event.target)) {\n this.clickEvent = event;\n }\n else {\n delete this.clickEvent;\n }\n };\n this.linkClicked = ((event) => {\n if (this.clickEvent && this.respondsToEventTarget(event.target) && event.target instanceof Element) {\n if (this.delegate.shouldInterceptLinkClick(event.target, event.detail.url, event.detail.originalEvent)) {\n this.clickEvent.preventDefault();\n event.preventDefault();\n this.delegate.linkClickIntercepted(event.target, event.detail.url, event.detail.originalEvent);\n }\n }\n delete this.clickEvent;\n });\n this.willVisit = ((_event) => {\n delete this.clickEvent;\n });\n this.delegate = delegate;\n this.element = element;\n }\n start() {\n this.element.addEventListener(\"click\", this.clickBubbled);\n document.addEventListener(\"turbo:click\", this.linkClicked);\n document.addEventListener(\"turbo:before-visit\", this.willVisit);\n }\n stop() {\n this.element.removeEventListener(\"click\", this.clickBubbled);\n document.removeEventListener(\"turbo:click\", this.linkClicked);\n document.removeEventListener(\"turbo:before-visit\", this.willVisit);\n }\n respondsToEventTarget(target) {\n const element = target instanceof Element ? target : target instanceof Node ? target.parentElement : null;\n return element && element.closest(\"turbo-frame, html\") == this.element;\n }\n}\n\nclass LinkClickObserver {\n constructor(delegate, eventTarget) {\n this.started = false;\n this.clickCaptured = () => {\n this.eventTarget.removeEventListener(\"click\", this.clickBubbled, false);\n this.eventTarget.addEventListener(\"click\", this.clickBubbled, false);\n };\n this.clickBubbled = (event) => {\n if (event instanceof MouseEvent && this.clickEventIsSignificant(event)) {\n const target = (event.composedPath && event.composedPath()[0]) || event.target;\n const link = this.findLinkFromClickTarget(target);\n if (link && doesNotTargetIFrame(link)) {\n const location = this.getLocationForLink(link);\n if (this.delegate.willFollowLinkToLocation(link, location, event)) {\n event.preventDefault();\n this.delegate.followedLinkToLocation(link, location);\n }\n }\n }\n };\n this.delegate = delegate;\n this.eventTarget = eventTarget;\n }\n start() {\n if (!this.started) {\n this.eventTarget.addEventListener(\"click\", this.clickCaptured, true);\n this.started = true;\n }\n }\n stop() {\n if (this.started) {\n this.eventTarget.removeEventListener(\"click\", this.clickCaptured, true);\n this.started = false;\n }\n }\n clickEventIsSignificant(event) {\n return !((event.target && event.target.isContentEditable) ||\n event.defaultPrevented ||\n event.which > 1 ||\n event.altKey ||\n event.ctrlKey ||\n event.metaKey ||\n event.shiftKey);\n }\n findLinkFromClickTarget(target) {\n if (target instanceof Element) {\n return target.closest(\"a[href]:not([target^=_]):not([download])\");\n }\n }\n getLocationForLink(link) {\n return expandURL(link.getAttribute(\"href\") || \"\");\n }\n}\nfunction doesNotTargetIFrame(anchor) {\n for (const element of document.getElementsByName(anchor.target)) {\n if (element instanceof HTMLIFrameElement)\n return false;\n }\n return true;\n}\n\nclass FormLinkClickObserver {\n constructor(delegate, element) {\n this.delegate = delegate;\n this.linkInterceptor = new LinkClickObserver(this, element);\n }\n start() {\n this.linkInterceptor.start();\n }\n stop() {\n this.linkInterceptor.stop();\n }\n willFollowLinkToLocation(link, location, originalEvent) {\n return (this.delegate.willSubmitFormLinkToLocation(link, location, originalEvent) &&\n link.hasAttribute(\"data-turbo-method\"));\n }\n followedLinkToLocation(link, location) {\n const action = location.href;\n const form = document.createElement(\"form\");\n form.setAttribute(\"data-turbo\", \"true\");\n form.setAttribute(\"action\", action);\n form.setAttribute(\"hidden\", \"\");\n const method = link.getAttribute(\"data-turbo-method\");\n if (method)\n form.setAttribute(\"method\", method);\n const turboFrame = link.getAttribute(\"data-turbo-frame\");\n if (turboFrame)\n form.setAttribute(\"data-turbo-frame\", turboFrame);\n const turboAction = link.getAttribute(\"data-turbo-action\");\n if (turboAction)\n form.setAttribute(\"data-turbo-action\", turboAction);\n const turboConfirm = link.getAttribute(\"data-turbo-confirm\");\n if (turboConfirm)\n form.setAttribute(\"data-turbo-confirm\", turboConfirm);\n const turboStream = link.hasAttribute(\"data-turbo-stream\");\n if (turboStream)\n form.setAttribute(\"data-turbo-stream\", \"\");\n this.delegate.submittedFormLinkToLocation(link, location, form);\n document.body.appendChild(form);\n form.addEventListener(\"turbo:submit-end\", () => form.remove(), { once: true });\n requestAnimationFrame(() => form.requestSubmit());\n }\n}\n\nclass Bardo {\n constructor(delegate, permanentElementMap) {\n this.delegate = delegate;\n this.permanentElementMap = permanentElementMap;\n }\n static preservingPermanentElements(delegate, permanentElementMap, callback) {\n const bardo = new this(delegate, permanentElementMap);\n bardo.enter();\n callback();\n bardo.leave();\n }\n enter() {\n for (const id in this.permanentElementMap) {\n const [currentPermanentElement, newPermanentElement] = this.permanentElementMap[id];\n this.delegate.enteringBardo(currentPermanentElement, newPermanentElement);\n this.replaceNewPermanentElementWithPlaceholder(newPermanentElement);\n }\n }\n leave() {\n for (const id in this.permanentElementMap) {\n const [currentPermanentElement] = this.permanentElementMap[id];\n this.replaceCurrentPermanentElementWithClone(currentPermanentElement);\n this.replacePlaceholderWithPermanentElement(currentPermanentElement);\n this.delegate.leavingBardo(currentPermanentElement);\n }\n }\n replaceNewPermanentElementWithPlaceholder(permanentElement) {\n const placeholder = createPlaceholderForPermanentElement(permanentElement);\n permanentElement.replaceWith(placeholder);\n }\n replaceCurrentPermanentElementWithClone(permanentElement) {\n const clone = permanentElement.cloneNode(true);\n permanentElement.replaceWith(clone);\n }\n replacePlaceholderWithPermanentElement(permanentElement) {\n const placeholder = this.getPlaceholderById(permanentElement.id);\n placeholder === null || placeholder === void 0 ? void 0 : placeholder.replaceWith(permanentElement);\n }\n getPlaceholderById(id) {\n return this.placeholders.find((element) => element.content == id);\n }\n get placeholders() {\n return [...document.querySelectorAll(\"meta[name=turbo-permanent-placeholder][content]\")];\n }\n}\nfunction createPlaceholderForPermanentElement(permanentElement) {\n const element = document.createElement(\"meta\");\n element.setAttribute(\"name\", \"turbo-permanent-placeholder\");\n element.setAttribute(\"content\", permanentElement.id);\n return element;\n}\n\nclass Renderer {\n constructor(currentSnapshot, newSnapshot, renderElement, isPreview, willRender = true) {\n this.activeElement = null;\n this.currentSnapshot = currentSnapshot;\n this.newSnapshot = newSnapshot;\n this.isPreview = isPreview;\n this.willRender = willRender;\n this.renderElement = renderElement;\n this.promise = new Promise((resolve, reject) => (this.resolvingFunctions = { resolve, reject }));\n }\n get shouldRender() {\n return true;\n }\n get reloadReason() {\n return;\n }\n prepareToRender() {\n return;\n }\n finishRendering() {\n if (this.resolvingFunctions) {\n this.resolvingFunctions.resolve();\n delete this.resolvingFunctions;\n }\n }\n preservingPermanentElements(callback) {\n Bardo.preservingPermanentElements(this, this.permanentElementMap, callback);\n }\n focusFirstAutofocusableElement() {\n const element = this.connectedSnapshot.firstAutofocusableElement;\n if (elementIsFocusable(element)) {\n element.focus();\n }\n }\n enteringBardo(currentPermanentElement) {\n if (this.activeElement)\n return;\n if (currentPermanentElement.contains(this.currentSnapshot.activeElement)) {\n this.activeElement = this.currentSnapshot.activeElement;\n }\n }\n leavingBardo(currentPermanentElement) {\n if (currentPermanentElement.contains(this.activeElement) && this.activeElement instanceof HTMLElement) {\n this.activeElement.focus();\n this.activeElement = null;\n }\n }\n get connectedSnapshot() {\n return this.newSnapshot.isConnected ? this.newSnapshot : this.currentSnapshot;\n }\n get currentElement() {\n return this.currentSnapshot.element;\n }\n get newElement() {\n return this.newSnapshot.element;\n }\n get permanentElementMap() {\n return this.currentSnapshot.getPermanentElementMapForSnapshot(this.newSnapshot);\n }\n}\nfunction elementIsFocusable(element) {\n return element && typeof element.focus == \"function\";\n}\n\nclass FrameRenderer extends Renderer {\n constructor(delegate, currentSnapshot, newSnapshot, renderElement, isPreview, willRender = true) {\n super(currentSnapshot, newSnapshot, renderElement, isPreview, willRender);\n this.delegate = delegate;\n }\n static renderElement(currentElement, newElement) {\n var _a;\n const destinationRange = document.createRange();\n destinationRange.selectNodeContents(currentElement);\n destinationRange.deleteContents();\n const frameElement = newElement;\n const sourceRange = (_a = frameElement.ownerDocument) === null || _a === void 0 ? void 0 : _a.createRange();\n if (sourceRange) {\n sourceRange.selectNodeContents(frameElement);\n currentElement.appendChild(sourceRange.extractContents());\n }\n }\n get shouldRender() {\n return true;\n }\n async render() {\n await nextAnimationFrame();\n this.preservingPermanentElements(() => {\n this.loadFrameElement();\n });\n this.scrollFrameIntoView();\n await nextAnimationFrame();\n this.focusFirstAutofocusableElement();\n await nextAnimationFrame();\n this.activateScriptElements();\n }\n loadFrameElement() {\n this.delegate.willRenderFrame(this.currentElement, this.newElement);\n this.renderElement(this.currentElement, this.newElement);\n }\n scrollFrameIntoView() {\n if (this.currentElement.autoscroll || this.newElement.autoscroll) {\n const element = this.currentElement.firstElementChild;\n const block = readScrollLogicalPosition(this.currentElement.getAttribute(\"data-autoscroll-block\"), \"end\");\n const behavior = readScrollBehavior(this.currentElement.getAttribute(\"data-autoscroll-behavior\"), \"auto\");\n if (element) {\n element.scrollIntoView({ block, behavior });\n return true;\n }\n }\n return false;\n }\n activateScriptElements() {\n for (const inertScriptElement of this.newScriptElements) {\n const activatedScriptElement = activateScriptElement(inertScriptElement);\n inertScriptElement.replaceWith(activatedScriptElement);\n }\n }\n get newScriptElements() {\n return this.currentElement.querySelectorAll(\"script\");\n }\n}\nfunction readScrollLogicalPosition(value, defaultValue) {\n if (value == \"end\" || value == \"start\" || value == \"center\" || value == \"nearest\") {\n return value;\n }\n else {\n return defaultValue;\n }\n}\nfunction readScrollBehavior(value, defaultValue) {\n if (value == \"auto\" || value == \"smooth\") {\n return value;\n }\n else {\n return defaultValue;\n }\n}\n\nclass ProgressBar {\n constructor() {\n this.hiding = false;\n this.value = 0;\n this.visible = false;\n this.trickle = () => {\n this.setValue(this.value + Math.random() / 100);\n };\n this.stylesheetElement = this.createStylesheetElement();\n this.progressElement = this.createProgressElement();\n this.installStylesheetElement();\n this.setValue(0);\n }\n static get defaultCSS() {\n return unindent `\n .turbo-progress-bar {\n position: fixed;\n display: block;\n top: 0;\n left: 0;\n height: 3px;\n background: #0076ff;\n z-index: 2147483647;\n transition:\n width ${ProgressBar.animationDuration}ms ease-out,\n opacity ${ProgressBar.animationDuration / 2}ms ${ProgressBar.animationDuration / 2}ms ease-in;\n transform: translate3d(0, 0, 0);\n }\n `;\n }\n show() {\n if (!this.visible) {\n this.visible = true;\n this.installProgressElement();\n this.startTrickling();\n }\n }\n hide() {\n if (this.visible && !this.hiding) {\n this.hiding = true;\n this.fadeProgressElement(() => {\n this.uninstallProgressElement();\n this.stopTrickling();\n this.visible = false;\n this.hiding = false;\n });\n }\n }\n setValue(value) {\n this.value = value;\n this.refresh();\n }\n installStylesheetElement() {\n document.head.insertBefore(this.stylesheetElement, document.head.firstChild);\n }\n installProgressElement() {\n this.progressElement.style.width = \"0\";\n this.progressElement.style.opacity = \"1\";\n document.documentElement.insertBefore(this.progressElement, document.body);\n this.refresh();\n }\n fadeProgressElement(callback) {\n this.progressElement.style.opacity = \"0\";\n setTimeout(callback, ProgressBar.animationDuration * 1.5);\n }\n uninstallProgressElement() {\n if (this.progressElement.parentNode) {\n document.documentElement.removeChild(this.progressElement);\n }\n }\n startTrickling() {\n if (!this.trickleInterval) {\n this.trickleInterval = window.setInterval(this.trickle, ProgressBar.animationDuration);\n }\n }\n stopTrickling() {\n window.clearInterval(this.trickleInterval);\n delete this.trickleInterval;\n }\n refresh() {\n requestAnimationFrame(() => {\n this.progressElement.style.width = `${10 + this.value * 90}%`;\n });\n }\n createStylesheetElement() {\n const element = document.createElement(\"style\");\n element.type = \"text/css\";\n element.textContent = ProgressBar.defaultCSS;\n if (this.cspNonce) {\n element.nonce = this.cspNonce;\n }\n return element;\n }\n createProgressElement() {\n const element = document.createElement(\"div\");\n element.className = \"turbo-progress-bar\";\n return element;\n }\n get cspNonce() {\n return getMetaContent(\"csp-nonce\");\n }\n}\nProgressBar.animationDuration = 300;\n\nclass HeadSnapshot extends Snapshot {\n constructor() {\n super(...arguments);\n this.detailsByOuterHTML = this.children\n .filter((element) => !elementIsNoscript(element))\n .map((element) => elementWithoutNonce(element))\n .reduce((result, element) => {\n const { outerHTML } = element;\n const details = outerHTML in result\n ? result[outerHTML]\n : {\n type: elementType(element),\n tracked: elementIsTracked(element),\n elements: [],\n };\n return Object.assign(Object.assign({}, result), { [outerHTML]: Object.assign(Object.assign({}, details), { elements: [...details.elements, element] }) });\n }, {});\n }\n get trackedElementSignature() {\n return Object.keys(this.detailsByOuterHTML)\n .filter((outerHTML) => this.detailsByOuterHTML[outerHTML].tracked)\n .join(\"\");\n }\n getScriptElementsNotInSnapshot(snapshot) {\n return this.getElementsMatchingTypeNotInSnapshot(\"script\", snapshot);\n }\n getStylesheetElementsNotInSnapshot(snapshot) {\n return this.getElementsMatchingTypeNotInSnapshot(\"stylesheet\", snapshot);\n }\n getElementsMatchingTypeNotInSnapshot(matchedType, snapshot) {\n return Object.keys(this.detailsByOuterHTML)\n .filter((outerHTML) => !(outerHTML in snapshot.detailsByOuterHTML))\n .map((outerHTML) => this.detailsByOuterHTML[outerHTML])\n .filter(({ type }) => type == matchedType)\n .map(({ elements: [element] }) => element);\n }\n get provisionalElements() {\n return Object.keys(this.detailsByOuterHTML).reduce((result, outerHTML) => {\n const { type, tracked, elements } = this.detailsByOuterHTML[outerHTML];\n if (type == null && !tracked) {\n return [...result, ...elements];\n }\n else if (elements.length > 1) {\n return [...result, ...elements.slice(1)];\n }\n else {\n return result;\n }\n }, []);\n }\n getMetaValue(name) {\n const element = this.findMetaElementByName(name);\n return element ? element.getAttribute(\"content\") : null;\n }\n findMetaElementByName(name) {\n return Object.keys(this.detailsByOuterHTML).reduce((result, outerHTML) => {\n const { elements: [element], } = this.detailsByOuterHTML[outerHTML];\n return elementIsMetaElementWithName(element, name) ? element : result;\n }, undefined);\n }\n}\nfunction elementType(element) {\n if (elementIsScript(element)) {\n return \"script\";\n }\n else if (elementIsStylesheet(element)) {\n return \"stylesheet\";\n }\n}\nfunction elementIsTracked(element) {\n return element.getAttribute(\"data-turbo-track\") == \"reload\";\n}\nfunction elementIsScript(element) {\n const tagName = element.localName;\n return tagName == \"script\";\n}\nfunction elementIsNoscript(element) {\n const tagName = element.localName;\n return tagName == \"noscript\";\n}\nfunction elementIsStylesheet(element) {\n const tagName = element.localName;\n return tagName == \"style\" || (tagName == \"link\" && element.getAttribute(\"rel\") == \"stylesheet\");\n}\nfunction elementIsMetaElementWithName(element, name) {\n const tagName = element.localName;\n return tagName == \"meta\" && element.getAttribute(\"name\") == name;\n}\nfunction elementWithoutNonce(element) {\n if (element.hasAttribute(\"nonce\")) {\n element.setAttribute(\"nonce\", \"\");\n }\n return element;\n}\n\nclass PageSnapshot extends Snapshot {\n constructor(element, headSnapshot) {\n super(element);\n this.headSnapshot = headSnapshot;\n }\n static fromHTMLString(html = \"\") {\n return this.fromDocument(parseHTMLDocument(html));\n }\n static fromElement(element) {\n return this.fromDocument(element.ownerDocument);\n }\n static fromDocument({ head, body }) {\n return new this(body, new HeadSnapshot(head));\n }\n clone() {\n const clonedElement = this.element.cloneNode(true);\n const selectElements = this.element.querySelectorAll(\"select\");\n const clonedSelectElements = clonedElement.querySelectorAll(\"select\");\n for (const [index, source] of selectElements.entries()) {\n const clone = clonedSelectElements[index];\n for (const option of clone.selectedOptions)\n option.selected = false;\n for (const option of source.selectedOptions)\n clone.options[option.index].selected = true;\n }\n for (const clonedPasswordInput of clonedElement.querySelectorAll('input[type=\"password\"]')) {\n clonedPasswordInput.value = \"\";\n }\n return new PageSnapshot(clonedElement, this.headSnapshot);\n }\n get headElement() {\n return this.headSnapshot.element;\n }\n get rootLocation() {\n var _a;\n const root = (_a = this.getSetting(\"root\")) !== null && _a !== void 0 ? _a : \"/\";\n return expandURL(root);\n }\n get cacheControlValue() {\n return this.getSetting(\"cache-control\");\n }\n get isPreviewable() {\n return this.cacheControlValue != \"no-preview\";\n }\n get isCacheable() {\n return this.cacheControlValue != \"no-cache\";\n }\n get isVisitable() {\n return this.getSetting(\"visit-control\") != \"reload\";\n }\n getSetting(name) {\n return this.headSnapshot.getMetaValue(`turbo-${name}`);\n }\n}\n\nvar TimingMetric;\n(function (TimingMetric) {\n TimingMetric[\"visitStart\"] = \"visitStart\";\n TimingMetric[\"requestStart\"] = \"requestStart\";\n TimingMetric[\"requestEnd\"] = \"requestEnd\";\n TimingMetric[\"visitEnd\"] = \"visitEnd\";\n})(TimingMetric || (TimingMetric = {}));\nvar VisitState;\n(function (VisitState) {\n VisitState[\"initialized\"] = \"initialized\";\n VisitState[\"started\"] = \"started\";\n VisitState[\"canceled\"] = \"canceled\";\n VisitState[\"failed\"] = \"failed\";\n VisitState[\"completed\"] = \"completed\";\n})(VisitState || (VisitState = {}));\nconst defaultOptions = {\n action: \"advance\",\n historyChanged: false,\n visitCachedSnapshot: () => { },\n willRender: true,\n updateHistory: true,\n shouldCacheSnapshot: true,\n acceptsStreamResponse: false,\n};\nvar SystemStatusCode;\n(function (SystemStatusCode) {\n SystemStatusCode[SystemStatusCode[\"networkFailure\"] = 0] = \"networkFailure\";\n SystemStatusCode[SystemStatusCode[\"timeoutFailure\"] = -1] = \"timeoutFailure\";\n SystemStatusCode[SystemStatusCode[\"contentTypeMismatch\"] = -2] = \"contentTypeMismatch\";\n})(SystemStatusCode || (SystemStatusCode = {}));\nclass Visit {\n constructor(delegate, location, restorationIdentifier, options = {}) {\n this.identifier = uuid();\n this.timingMetrics = {};\n this.followedRedirect = false;\n this.historyChanged = false;\n this.scrolled = false;\n this.shouldCacheSnapshot = true;\n this.acceptsStreamResponse = false;\n this.snapshotCached = false;\n this.state = VisitState.initialized;\n this.delegate = delegate;\n this.location = location;\n this.restorationIdentifier = restorationIdentifier || uuid();\n const { action, historyChanged, referrer, snapshot, snapshotHTML, response, visitCachedSnapshot, willRender, updateHistory, shouldCacheSnapshot, acceptsStreamResponse, } = Object.assign(Object.assign({}, defaultOptions), options);\n this.action = action;\n this.historyChanged = historyChanged;\n this.referrer = referrer;\n this.snapshot = snapshot;\n this.snapshotHTML = snapshotHTML;\n this.response = response;\n this.isSamePage = this.delegate.locationWithActionIsSamePage(this.location, this.action);\n this.visitCachedSnapshot = visitCachedSnapshot;\n this.willRender = willRender;\n this.updateHistory = updateHistory;\n this.scrolled = !willRender;\n this.shouldCacheSnapshot = shouldCacheSnapshot;\n this.acceptsStreamResponse = acceptsStreamResponse;\n }\n get adapter() {\n return this.delegate.adapter;\n }\n get view() {\n return this.delegate.view;\n }\n get history() {\n return this.delegate.history;\n }\n get restorationData() {\n return this.history.getRestorationDataForIdentifier(this.restorationIdentifier);\n }\n get silent() {\n return this.isSamePage;\n }\n start() {\n if (this.state == VisitState.initialized) {\n this.recordTimingMetric(TimingMetric.visitStart);\n this.state = VisitState.started;\n this.adapter.visitStarted(this);\n this.delegate.visitStarted(this);\n }\n }\n cancel() {\n if (this.state == VisitState.started) {\n if (this.request) {\n this.request.cancel();\n }\n this.cancelRender();\n this.state = VisitState.canceled;\n }\n }\n complete() {\n if (this.state == VisitState.started) {\n this.recordTimingMetric(TimingMetric.visitEnd);\n this.state = VisitState.completed;\n this.followRedirect();\n if (!this.followedRedirect) {\n this.adapter.visitCompleted(this);\n this.delegate.visitCompleted(this);\n }\n }\n }\n fail() {\n if (this.state == VisitState.started) {\n this.state = VisitState.failed;\n this.adapter.visitFailed(this);\n }\n }\n changeHistory() {\n var _a;\n if (!this.historyChanged && this.updateHistory) {\n const actionForHistory = this.location.href === ((_a = this.referrer) === null || _a === void 0 ? void 0 : _a.href) ? \"replace\" : this.action;\n const method = getHistoryMethodForAction(actionForHistory);\n this.history.update(method, this.location, this.restorationIdentifier);\n this.historyChanged = true;\n }\n }\n issueRequest() {\n if (this.hasPreloadedResponse()) {\n this.simulateRequest();\n }\n else if (this.shouldIssueRequest() && !this.request) {\n this.request = new FetchRequest(this, FetchMethod.get, this.location);\n this.request.perform();\n }\n }\n simulateRequest() {\n if (this.response) {\n this.startRequest();\n this.recordResponse();\n this.finishRequest();\n }\n }\n startRequest() {\n this.recordTimingMetric(TimingMetric.requestStart);\n this.adapter.visitRequestStarted(this);\n }\n recordResponse(response = this.response) {\n this.response = response;\n if (response) {\n const { statusCode } = response;\n if (isSuccessful(statusCode)) {\n this.adapter.visitRequestCompleted(this);\n }\n else {\n this.adapter.visitRequestFailedWithStatusCode(this, statusCode);\n }\n }\n }\n finishRequest() {\n this.recordTimingMetric(TimingMetric.requestEnd);\n this.adapter.visitRequestFinished(this);\n }\n loadResponse() {\n if (this.response) {\n const { statusCode, responseHTML } = this.response;\n this.render(async () => {\n if (this.shouldCacheSnapshot)\n this.cacheSnapshot();\n if (this.view.renderPromise)\n await this.view.renderPromise;\n if (isSuccessful(statusCode) && responseHTML != null) {\n await this.view.renderPage(PageSnapshot.fromHTMLString(responseHTML), false, this.willRender, this);\n this.performScroll();\n this.adapter.visitRendered(this);\n this.complete();\n }\n else {\n await this.view.renderError(PageSnapshot.fromHTMLString(responseHTML), this);\n this.adapter.visitRendered(this);\n this.fail();\n }\n });\n }\n }\n getCachedSnapshot() {\n const snapshot = this.view.getCachedSnapshotForLocation(this.location) || this.getPreloadedSnapshot();\n if (snapshot && (!getAnchor(this.location) || snapshot.hasAnchor(getAnchor(this.location)))) {\n if (this.action == \"restore\" || snapshot.isPreviewable) {\n return snapshot;\n }\n }\n }\n getPreloadedSnapshot() {\n if (this.snapshotHTML) {\n return PageSnapshot.fromHTMLString(this.snapshotHTML);\n }\n }\n hasCachedSnapshot() {\n return this.getCachedSnapshot() != null;\n }\n loadCachedSnapshot() {\n const snapshot = this.getCachedSnapshot();\n if (snapshot) {\n const isPreview = this.shouldIssueRequest();\n this.render(async () => {\n this.cacheSnapshot();\n if (this.isSamePage) {\n this.adapter.visitRendered(this);\n }\n else {\n if (this.view.renderPromise)\n await this.view.renderPromise;\n await this.view.renderPage(snapshot, isPreview, this.willRender, this);\n this.performScroll();\n this.adapter.visitRendered(this);\n if (!isPreview) {\n this.complete();\n }\n }\n });\n }\n }\n followRedirect() {\n var _a;\n if (this.redirectedToLocation && !this.followedRedirect && ((_a = this.response) === null || _a === void 0 ? void 0 : _a.redirected)) {\n this.adapter.visitProposedToLocation(this.redirectedToLocation, {\n action: \"replace\",\n response: this.response,\n });\n this.followedRedirect = true;\n }\n }\n goToSamePageAnchor() {\n if (this.isSamePage) {\n this.render(async () => {\n this.cacheSnapshot();\n this.performScroll();\n this.changeHistory();\n this.adapter.visitRendered(this);\n });\n }\n }\n prepareHeadersForRequest(headers, request) {\n if (this.acceptsStreamResponse) {\n request.acceptResponseType(StreamMessage.contentType);\n }\n }\n requestStarted() {\n this.startRequest();\n }\n requestPreventedHandlingResponse(_request, _response) { }\n async requestSucceededWithResponse(request, response) {\n const responseHTML = await response.responseHTML;\n const { redirected, statusCode } = response;\n if (responseHTML == undefined) {\n this.recordResponse({\n statusCode: SystemStatusCode.contentTypeMismatch,\n redirected,\n });\n }\n else {\n this.redirectedToLocation = response.redirected ? response.location : undefined;\n this.recordResponse({ statusCode: statusCode, responseHTML, redirected });\n }\n }\n async requestFailedWithResponse(request, response) {\n const responseHTML = await response.responseHTML;\n const { redirected, statusCode } = response;\n if (responseHTML == undefined) {\n this.recordResponse({\n statusCode: SystemStatusCode.contentTypeMismatch,\n redirected,\n });\n }\n else {\n this.recordResponse({ statusCode: statusCode, responseHTML, redirected });\n }\n }\n requestErrored(_request, _error) {\n this.recordResponse({\n statusCode: SystemStatusCode.networkFailure,\n redirected: false,\n });\n }\n requestFinished() {\n this.finishRequest();\n }\n performScroll() {\n if (!this.scrolled && !this.view.forceReloaded) {\n if (this.action == \"restore\") {\n this.scrollToRestoredPosition() || this.scrollToAnchor() || this.view.scrollToTop();\n }\n else {\n this.scrollToAnchor() || this.view.scrollToTop();\n }\n if (this.isSamePage) {\n this.delegate.visitScrolledToSamePageLocation(this.view.lastRenderedLocation, this.location);\n }\n this.scrolled = true;\n }\n }\n scrollToRestoredPosition() {\n const { scrollPosition } = this.restorationData;\n if (scrollPosition) {\n this.view.scrollToPosition(scrollPosition);\n return true;\n }\n }\n scrollToAnchor() {\n const anchor = getAnchor(this.location);\n if (anchor != null) {\n this.view.scrollToAnchor(anchor);\n return true;\n }\n }\n recordTimingMetric(metric) {\n this.timingMetrics[metric] = new Date().getTime();\n }\n getTimingMetrics() {\n return Object.assign({}, this.timingMetrics);\n }\n getHistoryMethodForAction(action) {\n switch (action) {\n case \"replace\":\n return history.replaceState;\n case \"advance\":\n case \"restore\":\n return history.pushState;\n }\n }\n hasPreloadedResponse() {\n return typeof this.response == \"object\";\n }\n shouldIssueRequest() {\n if (this.isSamePage) {\n return false;\n }\n else if (this.action == \"restore\") {\n return !this.hasCachedSnapshot();\n }\n else {\n return this.willRender;\n }\n }\n cacheSnapshot() {\n if (!this.snapshotCached) {\n this.view.cacheSnapshot(this.snapshot).then((snapshot) => snapshot && this.visitCachedSnapshot(snapshot));\n this.snapshotCached = true;\n }\n }\n async render(callback) {\n this.cancelRender();\n await new Promise((resolve) => {\n this.frame = requestAnimationFrame(() => resolve());\n });\n await callback();\n delete this.frame;\n }\n cancelRender() {\n if (this.frame) {\n cancelAnimationFrame(this.frame);\n delete this.frame;\n }\n }\n}\nfunction isSuccessful(statusCode) {\n return statusCode >= 200 && statusCode < 300;\n}\n\nclass BrowserAdapter {\n constructor(session) {\n this.progressBar = new ProgressBar();\n this.showProgressBar = () => {\n this.progressBar.show();\n };\n this.session = session;\n }\n visitProposedToLocation(location, options) {\n this.navigator.startVisit(location, (options === null || options === void 0 ? void 0 : options.restorationIdentifier) || uuid(), options);\n }\n visitStarted(visit) {\n this.location = visit.location;\n visit.loadCachedSnapshot();\n visit.issueRequest();\n visit.goToSamePageAnchor();\n }\n visitRequestStarted(visit) {\n this.progressBar.setValue(0);\n if (visit.hasCachedSnapshot() || visit.action != \"restore\") {\n this.showVisitProgressBarAfterDelay();\n }\n else {\n this.showProgressBar();\n }\n }\n visitRequestCompleted(visit) {\n visit.loadResponse();\n }\n visitRequestFailedWithStatusCode(visit, statusCode) {\n switch (statusCode) {\n case SystemStatusCode.networkFailure:\n case SystemStatusCode.timeoutFailure:\n case SystemStatusCode.contentTypeMismatch:\n return this.reload({\n reason: \"request_failed\",\n context: {\n statusCode,\n },\n });\n default:\n return visit.loadResponse();\n }\n }\n visitRequestFinished(_visit) {\n this.progressBar.setValue(1);\n this.hideVisitProgressBar();\n }\n visitCompleted(_visit) { }\n pageInvalidated(reason) {\n this.reload(reason);\n }\n visitFailed(_visit) { }\n visitRendered(_visit) { }\n formSubmissionStarted(_formSubmission) {\n this.progressBar.setValue(0);\n this.showFormProgressBarAfterDelay();\n }\n formSubmissionFinished(_formSubmission) {\n this.progressBar.setValue(1);\n this.hideFormProgressBar();\n }\n showVisitProgressBarAfterDelay() {\n this.visitProgressBarTimeout = window.setTimeout(this.showProgressBar, this.session.progressBarDelay);\n }\n hideVisitProgressBar() {\n this.progressBar.hide();\n if (this.visitProgressBarTimeout != null) {\n window.clearTimeout(this.visitProgressBarTimeout);\n delete this.visitProgressBarTimeout;\n }\n }\n showFormProgressBarAfterDelay() {\n if (this.formProgressBarTimeout == null) {\n this.formProgressBarTimeout = window.setTimeout(this.showProgressBar, this.session.progressBarDelay);\n }\n }\n hideFormProgressBar() {\n this.progressBar.hide();\n if (this.formProgressBarTimeout != null) {\n window.clearTimeout(this.formProgressBarTimeout);\n delete this.formProgressBarTimeout;\n }\n }\n reload(reason) {\n var _a;\n dispatch(\"turbo:reload\", { detail: reason });\n window.location.href = ((_a = this.location) === null || _a === void 0 ? void 0 : _a.toString()) || window.location.href;\n }\n get navigator() {\n return this.session.navigator;\n }\n}\n\nclass CacheObserver {\n constructor() {\n this.started = false;\n this.removeStaleElements = ((_event) => {\n const staleElements = [...document.querySelectorAll('[data-turbo-cache=\"false\"]')];\n for (const element of staleElements) {\n element.remove();\n }\n });\n }\n start() {\n if (!this.started) {\n this.started = true;\n addEventListener(\"turbo:before-cache\", this.removeStaleElements, false);\n }\n }\n stop() {\n if (this.started) {\n this.started = false;\n removeEventListener(\"turbo:before-cache\", this.removeStaleElements, false);\n }\n }\n}\n\nclass FrameRedirector {\n constructor(session, element) {\n this.session = session;\n this.element = element;\n this.linkInterceptor = new LinkInterceptor(this, element);\n this.formSubmitObserver = new FormSubmitObserver(this, element);\n }\n start() {\n this.linkInterceptor.start();\n this.formSubmitObserver.start();\n }\n stop() {\n this.linkInterceptor.stop();\n this.formSubmitObserver.stop();\n }\n shouldInterceptLinkClick(element, _location, _event) {\n return this.shouldRedirect(element);\n }\n linkClickIntercepted(element, url, event) {\n const frame = this.findFrameElement(element);\n if (frame) {\n frame.delegate.linkClickIntercepted(element, url, event);\n }\n }\n willSubmitForm(element, submitter) {\n return (element.closest(\"turbo-frame\") == null &&\n this.shouldSubmit(element, submitter) &&\n this.shouldRedirect(element, submitter));\n }\n formSubmitted(element, submitter) {\n const frame = this.findFrameElement(element, submitter);\n if (frame) {\n frame.delegate.formSubmitted(element, submitter);\n }\n }\n shouldSubmit(form, submitter) {\n var _a;\n const action = getAction(form, submitter);\n const meta = this.element.ownerDocument.querySelector(`meta[name=\"turbo-root\"]`);\n const rootLocation = expandURL((_a = meta === null || meta === void 0 ? void 0 : meta.content) !== null && _a !== void 0 ? _a : \"/\");\n return this.shouldRedirect(form, submitter) && locationIsVisitable(action, rootLocation);\n }\n shouldRedirect(element, submitter) {\n const isNavigatable = element instanceof HTMLFormElement\n ? this.session.submissionIsNavigatable(element, submitter)\n : this.session.elementIsNavigatable(element);\n if (isNavigatable) {\n const frame = this.findFrameElement(element, submitter);\n return frame ? frame != element.closest(\"turbo-frame\") : false;\n }\n else {\n return false;\n }\n }\n findFrameElement(element, submitter) {\n const id = (submitter === null || submitter === void 0 ? void 0 : submitter.getAttribute(\"data-turbo-frame\")) || element.getAttribute(\"data-turbo-frame\");\n if (id && id != \"_top\") {\n const frame = this.element.querySelector(`#${id}:not([disabled])`);\n if (frame instanceof FrameElement) {\n return frame;\n }\n }\n }\n}\n\nclass History {\n constructor(delegate) {\n this.restorationIdentifier = uuid();\n this.restorationData = {};\n this.started = false;\n this.pageLoaded = false;\n this.onPopState = (event) => {\n if (this.shouldHandlePopState()) {\n const { turbo } = event.state || {};\n if (turbo) {\n this.location = new URL(window.location.href);\n const { restorationIdentifier } = turbo;\n this.restorationIdentifier = restorationIdentifier;\n this.delegate.historyPoppedToLocationWithRestorationIdentifier(this.location, restorationIdentifier);\n }\n }\n };\n this.onPageLoad = async (_event) => {\n await nextMicrotask();\n this.pageLoaded = true;\n };\n this.delegate = delegate;\n }\n start() {\n if (!this.started) {\n addEventListener(\"popstate\", this.onPopState, false);\n addEventListener(\"load\", this.onPageLoad, false);\n this.started = true;\n this.replace(new URL(window.location.href));\n }\n }\n stop() {\n if (this.started) {\n removeEventListener(\"popstate\", this.onPopState, false);\n removeEventListener(\"load\", this.onPageLoad, false);\n this.started = false;\n }\n }\n push(location, restorationIdentifier) {\n this.update(history.pushState, location, restorationIdentifier);\n }\n replace(location, restorationIdentifier) {\n this.update(history.replaceState, location, restorationIdentifier);\n }\n update(method, location, restorationIdentifier = uuid()) {\n const state = { turbo: { restorationIdentifier } };\n method.call(history, state, \"\", location.href);\n this.location = location;\n this.restorationIdentifier = restorationIdentifier;\n }\n getRestorationDataForIdentifier(restorationIdentifier) {\n return this.restorationData[restorationIdentifier] || {};\n }\n updateRestorationData(additionalData) {\n const { restorationIdentifier } = this;\n const restorationData = this.restorationData[restorationIdentifier];\n this.restorationData[restorationIdentifier] = Object.assign(Object.assign({}, restorationData), additionalData);\n }\n assumeControlOfScrollRestoration() {\n var _a;\n if (!this.previousScrollRestoration) {\n this.previousScrollRestoration = (_a = history.scrollRestoration) !== null && _a !== void 0 ? _a : \"auto\";\n history.scrollRestoration = \"manual\";\n }\n }\n relinquishControlOfScrollRestoration() {\n if (this.previousScrollRestoration) {\n history.scrollRestoration = this.previousScrollRestoration;\n delete this.previousScrollRestoration;\n }\n }\n shouldHandlePopState() {\n return this.pageIsLoaded();\n }\n pageIsLoaded() {\n return this.pageLoaded || document.readyState == \"complete\";\n }\n}\n\nclass Navigator {\n constructor(delegate) {\n this.delegate = delegate;\n }\n proposeVisit(location, options = {}) {\n if (this.delegate.allowsVisitingLocationWithAction(location, options.action)) {\n if (locationIsVisitable(location, this.view.snapshot.rootLocation)) {\n this.delegate.visitProposedToLocation(location, options);\n }\n else {\n window.location.href = location.toString();\n }\n }\n }\n startVisit(locatable, restorationIdentifier, options = {}) {\n this.stop();\n this.currentVisit = new Visit(this, expandURL(locatable), restorationIdentifier, Object.assign({ referrer: this.location }, options));\n this.currentVisit.start();\n }\n submitForm(form, submitter) {\n this.stop();\n this.formSubmission = new FormSubmission(this, form, submitter, true);\n this.formSubmission.start();\n }\n stop() {\n if (this.formSubmission) {\n this.formSubmission.stop();\n delete this.formSubmission;\n }\n if (this.currentVisit) {\n this.currentVisit.cancel();\n delete this.currentVisit;\n }\n }\n get adapter() {\n return this.delegate.adapter;\n }\n get view() {\n return this.delegate.view;\n }\n get history() {\n return this.delegate.history;\n }\n formSubmissionStarted(formSubmission) {\n if (typeof this.adapter.formSubmissionStarted === \"function\") {\n this.adapter.formSubmissionStarted(formSubmission);\n }\n }\n async formSubmissionSucceededWithResponse(formSubmission, fetchResponse) {\n if (formSubmission == this.formSubmission) {\n const responseHTML = await fetchResponse.responseHTML;\n if (responseHTML) {\n const shouldCacheSnapshot = formSubmission.method == FetchMethod.get;\n if (!shouldCacheSnapshot) {\n this.view.clearSnapshotCache();\n }\n const { statusCode, redirected } = fetchResponse;\n const action = this.getActionForFormSubmission(formSubmission);\n const visitOptions = {\n action,\n shouldCacheSnapshot,\n response: { statusCode, responseHTML, redirected },\n };\n this.proposeVisit(fetchResponse.location, visitOptions);\n }\n }\n }\n async formSubmissionFailedWithResponse(formSubmission, fetchResponse) {\n const responseHTML = await fetchResponse.responseHTML;\n if (responseHTML) {\n const snapshot = PageSnapshot.fromHTMLString(responseHTML);\n if (fetchResponse.serverError) {\n await this.view.renderError(snapshot, this.currentVisit);\n }\n else {\n await this.view.renderPage(snapshot, false, true, this.currentVisit);\n }\n this.view.scrollToTop();\n this.view.clearSnapshotCache();\n }\n }\n formSubmissionErrored(formSubmission, error) {\n console.error(error);\n }\n formSubmissionFinished(formSubmission) {\n if (typeof this.adapter.formSubmissionFinished === \"function\") {\n this.adapter.formSubmissionFinished(formSubmission);\n }\n }\n visitStarted(visit) {\n this.delegate.visitStarted(visit);\n }\n visitCompleted(visit) {\n this.delegate.visitCompleted(visit);\n }\n locationWithActionIsSamePage(location, action) {\n const anchor = getAnchor(location);\n const currentAnchor = getAnchor(this.view.lastRenderedLocation);\n const isRestorationToTop = action === \"restore\" && typeof anchor === \"undefined\";\n return (action !== \"replace\" &&\n getRequestURL(location) === getRequestURL(this.view.lastRenderedLocation) &&\n (isRestorationToTop || (anchor != null && anchor !== currentAnchor)));\n }\n visitScrolledToSamePageLocation(oldURL, newURL) {\n this.delegate.visitScrolledToSamePageLocation(oldURL, newURL);\n }\n get location() {\n return this.history.location;\n }\n get restorationIdentifier() {\n return this.history.restorationIdentifier;\n }\n getActionForFormSubmission(formSubmission) {\n const { formElement, submitter } = formSubmission;\n const action = getAttribute(\"data-turbo-action\", submitter, formElement);\n return isAction(action) ? action : \"advance\";\n }\n}\n\nvar PageStage;\n(function (PageStage) {\n PageStage[PageStage[\"initial\"] = 0] = \"initial\";\n PageStage[PageStage[\"loading\"] = 1] = \"loading\";\n PageStage[PageStage[\"interactive\"] = 2] = \"interactive\";\n PageStage[PageStage[\"complete\"] = 3] = \"complete\";\n})(PageStage || (PageStage = {}));\nclass PageObserver {\n constructor(delegate) {\n this.stage = PageStage.initial;\n this.started = false;\n this.interpretReadyState = () => {\n const { readyState } = this;\n if (readyState == \"interactive\") {\n this.pageIsInteractive();\n }\n else if (readyState == \"complete\") {\n this.pageIsComplete();\n }\n };\n this.pageWillUnload = () => {\n this.delegate.pageWillUnload();\n };\n this.delegate = delegate;\n }\n start() {\n if (!this.started) {\n if (this.stage == PageStage.initial) {\n this.stage = PageStage.loading;\n }\n document.addEventListener(\"readystatechange\", this.interpretReadyState, false);\n addEventListener(\"pagehide\", this.pageWillUnload, false);\n this.started = true;\n }\n }\n stop() {\n if (this.started) {\n document.removeEventListener(\"readystatechange\", this.interpretReadyState, false);\n removeEventListener(\"pagehide\", this.pageWillUnload, false);\n this.started = false;\n }\n }\n pageIsInteractive() {\n if (this.stage == PageStage.loading) {\n this.stage = PageStage.interactive;\n this.delegate.pageBecameInteractive();\n }\n }\n pageIsComplete() {\n this.pageIsInteractive();\n if (this.stage == PageStage.interactive) {\n this.stage = PageStage.complete;\n this.delegate.pageLoaded();\n }\n }\n get readyState() {\n return document.readyState;\n }\n}\n\nclass ScrollObserver {\n constructor(delegate) {\n this.started = false;\n this.onScroll = () => {\n this.updatePosition({ x: window.pageXOffset, y: window.pageYOffset });\n };\n this.delegate = delegate;\n }\n start() {\n if (!this.started) {\n addEventListener(\"scroll\", this.onScroll, false);\n this.onScroll();\n this.started = true;\n }\n }\n stop() {\n if (this.started) {\n removeEventListener(\"scroll\", this.onScroll, false);\n this.started = false;\n }\n }\n updatePosition(position) {\n this.delegate.scrollPositionChanged(position);\n }\n}\n\nclass StreamMessageRenderer {\n render({ fragment }) {\n Bardo.preservingPermanentElements(this, getPermanentElementMapForFragment(fragment), () => document.documentElement.appendChild(fragment));\n }\n enteringBardo(currentPermanentElement, newPermanentElement) {\n newPermanentElement.replaceWith(currentPermanentElement.cloneNode(true));\n }\n leavingBardo() { }\n}\nfunction getPermanentElementMapForFragment(fragment) {\n const permanentElementsInDocument = queryPermanentElementsAll(document.documentElement);\n const permanentElementMap = {};\n for (const permanentElementInDocument of permanentElementsInDocument) {\n const { id } = permanentElementInDocument;\n for (const streamElement of fragment.querySelectorAll(\"turbo-stream\")) {\n const elementInStream = getPermanentElementById(streamElement.templateElement.content, id);\n if (elementInStream) {\n permanentElementMap[id] = [permanentElementInDocument, elementInStream];\n }\n }\n }\n return permanentElementMap;\n}\n\nclass StreamObserver {\n constructor(delegate) {\n this.sources = new Set();\n this.started = false;\n this.inspectFetchResponse = ((event) => {\n const response = fetchResponseFromEvent(event);\n if (response && fetchResponseIsStream(response)) {\n event.preventDefault();\n this.receiveMessageResponse(response);\n }\n });\n this.receiveMessageEvent = (event) => {\n if (this.started && typeof event.data == \"string\") {\n this.receiveMessageHTML(event.data);\n }\n };\n this.delegate = delegate;\n }\n start() {\n if (!this.started) {\n this.started = true;\n addEventListener(\"turbo:before-fetch-response\", this.inspectFetchResponse, false);\n }\n }\n stop() {\n if (this.started) {\n this.started = false;\n removeEventListener(\"turbo:before-fetch-response\", this.inspectFetchResponse, false);\n }\n }\n connectStreamSource(source) {\n if (!this.streamSourceIsConnected(source)) {\n this.sources.add(source);\n source.addEventListener(\"message\", this.receiveMessageEvent, false);\n }\n }\n disconnectStreamSource(source) {\n if (this.streamSourceIsConnected(source)) {\n this.sources.delete(source);\n source.removeEventListener(\"message\", this.receiveMessageEvent, false);\n }\n }\n streamSourceIsConnected(source) {\n return this.sources.has(source);\n }\n async receiveMessageResponse(response) {\n const html = await response.responseHTML;\n if (html) {\n this.receiveMessageHTML(html);\n }\n }\n receiveMessageHTML(html) {\n this.delegate.receivedMessageFromStream(StreamMessage.wrap(html));\n }\n}\nfunction fetchResponseFromEvent(event) {\n var _a;\n const fetchResponse = (_a = event.detail) === null || _a === void 0 ? void 0 : _a.fetchResponse;\n if (fetchResponse instanceof FetchResponse) {\n return fetchResponse;\n }\n}\nfunction fetchResponseIsStream(response) {\n var _a;\n const contentType = (_a = response.contentType) !== null && _a !== void 0 ? _a : \"\";\n return contentType.startsWith(StreamMessage.contentType);\n}\n\nclass ErrorRenderer extends Renderer {\n static renderElement(currentElement, newElement) {\n const { documentElement, body } = document;\n documentElement.replaceChild(newElement, body);\n }\n async render() {\n this.replaceHeadAndBody();\n this.activateScriptElements();\n }\n replaceHeadAndBody() {\n const { documentElement, head } = document;\n documentElement.replaceChild(this.newHead, head);\n this.renderElement(this.currentElement, this.newElement);\n }\n activateScriptElements() {\n for (const replaceableElement of this.scriptElements) {\n const parentNode = replaceableElement.parentNode;\n if (parentNode) {\n const element = activateScriptElement(replaceableElement);\n parentNode.replaceChild(element, replaceableElement);\n }\n }\n }\n get newHead() {\n return this.newSnapshot.headSnapshot.element;\n }\n get scriptElements() {\n return document.documentElement.querySelectorAll(\"script\");\n }\n}\n\nclass PageRenderer extends Renderer {\n static renderElement(currentElement, newElement) {\n if (document.body && newElement instanceof HTMLBodyElement) {\n document.body.replaceWith(newElement);\n }\n else {\n document.documentElement.appendChild(newElement);\n }\n }\n get shouldRender() {\n return this.newSnapshot.isVisitable && this.trackedElementsAreIdentical;\n }\n get reloadReason() {\n if (!this.newSnapshot.isVisitable) {\n return {\n reason: \"turbo_visit_control_is_reload\",\n };\n }\n if (!this.trackedElementsAreIdentical) {\n return {\n reason: \"tracked_element_mismatch\",\n };\n }\n }\n async prepareToRender() {\n await this.mergeHead();\n }\n async render() {\n if (this.willRender) {\n this.replaceBody();\n }\n }\n finishRendering() {\n super.finishRendering();\n if (!this.isPreview) {\n this.focusFirstAutofocusableElement();\n }\n }\n get currentHeadSnapshot() {\n return this.currentSnapshot.headSnapshot;\n }\n get newHeadSnapshot() {\n return this.newSnapshot.headSnapshot;\n }\n get newElement() {\n return this.newSnapshot.element;\n }\n async mergeHead() {\n const newStylesheetElements = this.copyNewHeadStylesheetElements();\n this.copyNewHeadScriptElements();\n this.removeCurrentHeadProvisionalElements();\n this.copyNewHeadProvisionalElements();\n await newStylesheetElements;\n }\n replaceBody() {\n this.preservingPermanentElements(() => {\n this.activateNewBody();\n this.assignNewBody();\n });\n }\n get trackedElementsAreIdentical() {\n return this.currentHeadSnapshot.trackedElementSignature == this.newHeadSnapshot.trackedElementSignature;\n }\n async copyNewHeadStylesheetElements() {\n const loadingElements = [];\n for (const element of this.newHeadStylesheetElements) {\n loadingElements.push(waitForLoad(element));\n document.head.appendChild(element);\n }\n await Promise.all(loadingElements);\n }\n copyNewHeadScriptElements() {\n for (const element of this.newHeadScriptElements) {\n document.head.appendChild(activateScriptElement(element));\n }\n }\n removeCurrentHeadProvisionalElements() {\n for (const element of this.currentHeadProvisionalElements) {\n document.head.removeChild(element);\n }\n }\n copyNewHeadProvisionalElements() {\n for (const element of this.newHeadProvisionalElements) {\n document.head.appendChild(element);\n }\n }\n activateNewBody() {\n document.adoptNode(this.newElement);\n this.activateNewBodyScriptElements();\n }\n activateNewBodyScriptElements() {\n for (const inertScriptElement of this.newBodyScriptElements) {\n const activatedScriptElement = activateScriptElement(inertScriptElement);\n inertScriptElement.replaceWith(activatedScriptElement);\n }\n }\n assignNewBody() {\n this.renderElement(this.currentElement, this.newElement);\n }\n get newHeadStylesheetElements() {\n return this.newHeadSnapshot.getStylesheetElementsNotInSnapshot(this.currentHeadSnapshot);\n }\n get newHeadScriptElements() {\n return this.newHeadSnapshot.getScriptElementsNotInSnapshot(this.currentHeadSnapshot);\n }\n get currentHeadProvisionalElements() {\n return this.currentHeadSnapshot.provisionalElements;\n }\n get newHeadProvisionalElements() {\n return this.newHeadSnapshot.provisionalElements;\n }\n get newBodyScriptElements() {\n return this.newElement.querySelectorAll(\"script\");\n }\n}\n\nclass SnapshotCache {\n constructor(size) {\n this.keys = [];\n this.snapshots = {};\n this.size = size;\n }\n has(location) {\n return toCacheKey(location) in this.snapshots;\n }\n get(location) {\n if (this.has(location)) {\n const snapshot = this.read(location);\n this.touch(location);\n return snapshot;\n }\n }\n put(location, snapshot) {\n this.write(location, snapshot);\n this.touch(location);\n return snapshot;\n }\n clear() {\n this.snapshots = {};\n }\n read(location) {\n return this.snapshots[toCacheKey(location)];\n }\n write(location, snapshot) {\n this.snapshots[toCacheKey(location)] = snapshot;\n }\n touch(location) {\n const key = toCacheKey(location);\n const index = this.keys.indexOf(key);\n if (index > -1)\n this.keys.splice(index, 1);\n this.keys.unshift(key);\n this.trim();\n }\n trim() {\n for (const key of this.keys.splice(this.size)) {\n delete this.snapshots[key];\n }\n }\n}\n\nclass PageView extends View {\n constructor() {\n super(...arguments);\n this.snapshotCache = new SnapshotCache(10);\n this.lastRenderedLocation = new URL(location.href);\n this.forceReloaded = false;\n }\n renderPage(snapshot, isPreview = false, willRender = true, visit) {\n const renderer = new PageRenderer(this.snapshot, snapshot, PageRenderer.renderElement, isPreview, willRender);\n if (!renderer.shouldRender) {\n this.forceReloaded = true;\n }\n else {\n visit === null || visit === void 0 ? void 0 : visit.changeHistory();\n }\n return this.render(renderer);\n }\n renderError(snapshot, visit) {\n visit === null || visit === void 0 ? void 0 : visit.changeHistory();\n const renderer = new ErrorRenderer(this.snapshot, snapshot, ErrorRenderer.renderElement, false);\n return this.render(renderer);\n }\n clearSnapshotCache() {\n this.snapshotCache.clear();\n }\n async cacheSnapshot(snapshot = this.snapshot) {\n if (snapshot.isCacheable) {\n this.delegate.viewWillCacheSnapshot();\n const { lastRenderedLocation: location } = this;\n await nextEventLoopTick();\n const cachedSnapshot = snapshot.clone();\n this.snapshotCache.put(location, cachedSnapshot);\n return cachedSnapshot;\n }\n }\n getCachedSnapshotForLocation(location) {\n return this.snapshotCache.get(location);\n }\n get snapshot() {\n return PageSnapshot.fromElement(this.element);\n }\n}\n\nclass Preloader {\n constructor(delegate) {\n this.selector = \"a[data-turbo-preload]\";\n this.delegate = delegate;\n }\n get snapshotCache() {\n return this.delegate.navigator.view.snapshotCache;\n }\n start() {\n if (document.readyState === \"loading\") {\n return document.addEventListener(\"DOMContentLoaded\", () => {\n this.preloadOnLoadLinksForView(document.body);\n });\n }\n else {\n this.preloadOnLoadLinksForView(document.body);\n }\n }\n preloadOnLoadLinksForView(element) {\n for (const link of element.querySelectorAll(this.selector)) {\n this.preloadURL(link);\n }\n }\n async preloadURL(link) {\n const location = new URL(link.href);\n if (this.snapshotCache.has(location)) {\n return;\n }\n try {\n const response = await fetch(location.toString(), { headers: { \"VND.PREFETCH\": \"true\", Accept: \"text/html\" } });\n const responseText = await response.text();\n const snapshot = PageSnapshot.fromHTMLString(responseText);\n this.snapshotCache.put(location, snapshot);\n }\n catch (_) {\n }\n }\n}\n\nclass Session {\n constructor() {\n this.navigator = new Navigator(this);\n this.history = new History(this);\n this.preloader = new Preloader(this);\n this.view = new PageView(this, document.documentElement);\n this.adapter = new BrowserAdapter(this);\n this.pageObserver = new PageObserver(this);\n this.cacheObserver = new CacheObserver();\n this.linkClickObserver = new LinkClickObserver(this, window);\n this.formSubmitObserver = new FormSubmitObserver(this, document);\n this.scrollObserver = new ScrollObserver(this);\n this.streamObserver = new StreamObserver(this);\n this.formLinkClickObserver = new FormLinkClickObserver(this, document.documentElement);\n this.frameRedirector = new FrameRedirector(this, document.documentElement);\n this.streamMessageRenderer = new StreamMessageRenderer();\n this.drive = true;\n this.enabled = true;\n this.progressBarDelay = 500;\n this.started = false;\n this.formMode = \"on\";\n }\n start() {\n if (!this.started) {\n this.pageObserver.start();\n this.cacheObserver.start();\n this.formLinkClickObserver.start();\n this.linkClickObserver.start();\n this.formSubmitObserver.start();\n this.scrollObserver.start();\n this.streamObserver.start();\n this.frameRedirector.start();\n this.history.start();\n this.preloader.start();\n this.started = true;\n this.enabled = true;\n }\n }\n disable() {\n this.enabled = false;\n }\n stop() {\n if (this.started) {\n this.pageObserver.stop();\n this.cacheObserver.stop();\n this.formLinkClickObserver.stop();\n this.linkClickObserver.stop();\n this.formSubmitObserver.stop();\n this.scrollObserver.stop();\n this.streamObserver.stop();\n this.frameRedirector.stop();\n this.history.stop();\n this.started = false;\n }\n }\n registerAdapter(adapter) {\n this.adapter = adapter;\n }\n visit(location, options = {}) {\n const frameElement = options.frame ? document.getElementById(options.frame) : null;\n if (frameElement instanceof FrameElement) {\n frameElement.src = location.toString();\n frameElement.loaded;\n }\n else {\n this.navigator.proposeVisit(expandURL(location), options);\n }\n }\n connectStreamSource(source) {\n this.streamObserver.connectStreamSource(source);\n }\n disconnectStreamSource(source) {\n this.streamObserver.disconnectStreamSource(source);\n }\n renderStreamMessage(message) {\n this.streamMessageRenderer.render(StreamMessage.wrap(message));\n }\n clearCache() {\n this.view.clearSnapshotCache();\n }\n setProgressBarDelay(delay) {\n this.progressBarDelay = delay;\n }\n setFormMode(mode) {\n this.formMode = mode;\n }\n get location() {\n return this.history.location;\n }\n get restorationIdentifier() {\n return this.history.restorationIdentifier;\n }\n historyPoppedToLocationWithRestorationIdentifier(location, restorationIdentifier) {\n if (this.enabled) {\n this.navigator.startVisit(location, restorationIdentifier, {\n action: \"restore\",\n historyChanged: true,\n });\n }\n else {\n this.adapter.pageInvalidated({\n reason: \"turbo_disabled\",\n });\n }\n }\n scrollPositionChanged(position) {\n this.history.updateRestorationData({ scrollPosition: position });\n }\n willSubmitFormLinkToLocation(link, location) {\n return this.elementIsNavigatable(link) && locationIsVisitable(location, this.snapshot.rootLocation);\n }\n submittedFormLinkToLocation() { }\n willFollowLinkToLocation(link, location, event) {\n return (this.elementIsNavigatable(link) &&\n locationIsVisitable(location, this.snapshot.rootLocation) &&\n this.applicationAllowsFollowingLinkToLocation(link, location, event));\n }\n followedLinkToLocation(link, location) {\n const action = this.getActionForLink(link);\n const acceptsStreamResponse = link.hasAttribute(\"data-turbo-stream\");\n this.visit(location.href, { action, acceptsStreamResponse });\n }\n allowsVisitingLocationWithAction(location, action) {\n return this.locationWithActionIsSamePage(location, action) || this.applicationAllowsVisitingLocation(location);\n }\n visitProposedToLocation(location, options) {\n extendURLWithDeprecatedProperties(location);\n this.adapter.visitProposedToLocation(location, options);\n }\n visitStarted(visit) {\n if (!visit.acceptsStreamResponse) {\n markAsBusy(document.documentElement);\n }\n extendURLWithDeprecatedProperties(visit.location);\n if (!visit.silent) {\n this.notifyApplicationAfterVisitingLocation(visit.location, visit.action);\n }\n }\n visitCompleted(visit) {\n clearBusyState(document.documentElement);\n this.notifyApplicationAfterPageLoad(visit.getTimingMetrics());\n }\n locationWithActionIsSamePage(location, action) {\n return this.navigator.locationWithActionIsSamePage(location, action);\n }\n visitScrolledToSamePageLocation(oldURL, newURL) {\n this.notifyApplicationAfterVisitingSamePageLocation(oldURL, newURL);\n }\n willSubmitForm(form, submitter) {\n const action = getAction(form, submitter);\n return (this.submissionIsNavigatable(form, submitter) &&\n locationIsVisitable(expandURL(action), this.snapshot.rootLocation));\n }\n formSubmitted(form, submitter) {\n this.navigator.submitForm(form, submitter);\n }\n pageBecameInteractive() {\n this.view.lastRenderedLocation = this.location;\n this.notifyApplicationAfterPageLoad();\n }\n pageLoaded() {\n this.history.assumeControlOfScrollRestoration();\n }\n pageWillUnload() {\n this.history.relinquishControlOfScrollRestoration();\n }\n receivedMessageFromStream(message) {\n this.renderStreamMessage(message);\n }\n viewWillCacheSnapshot() {\n var _a;\n if (!((_a = this.navigator.currentVisit) === null || _a === void 0 ? void 0 : _a.silent)) {\n this.notifyApplicationBeforeCachingSnapshot();\n }\n }\n allowsImmediateRender({ element }, options) {\n const event = this.notifyApplicationBeforeRender(element, options);\n const { defaultPrevented, detail: { render }, } = event;\n if (this.view.renderer && render) {\n this.view.renderer.renderElement = render;\n }\n return !defaultPrevented;\n }\n viewRenderedSnapshot(_snapshot, _isPreview) {\n this.view.lastRenderedLocation = this.history.location;\n this.notifyApplicationAfterRender();\n }\n preloadOnLoadLinksForView(element) {\n this.preloader.preloadOnLoadLinksForView(element);\n }\n viewInvalidated(reason) {\n this.adapter.pageInvalidated(reason);\n }\n frameLoaded(frame) {\n this.notifyApplicationAfterFrameLoad(frame);\n }\n frameRendered(fetchResponse, frame) {\n this.notifyApplicationAfterFrameRender(fetchResponse, frame);\n }\n applicationAllowsFollowingLinkToLocation(link, location, ev) {\n const event = this.notifyApplicationAfterClickingLinkToLocation(link, location, ev);\n return !event.defaultPrevented;\n }\n applicationAllowsVisitingLocation(location) {\n const event = this.notifyApplicationBeforeVisitingLocation(location);\n return !event.defaultPrevented;\n }\n notifyApplicationAfterClickingLinkToLocation(link, location, event) {\n return dispatch(\"turbo:click\", {\n target: link,\n detail: { url: location.href, originalEvent: event },\n cancelable: true,\n });\n }\n notifyApplicationBeforeVisitingLocation(location) {\n return dispatch(\"turbo:before-visit\", {\n detail: { url: location.href },\n cancelable: true,\n });\n }\n notifyApplicationAfterVisitingLocation(location, action) {\n return dispatch(\"turbo:visit\", { detail: { url: location.href, action } });\n }\n notifyApplicationBeforeCachingSnapshot() {\n return dispatch(\"turbo:before-cache\");\n }\n notifyApplicationBeforeRender(newBody, options) {\n return dispatch(\"turbo:before-render\", {\n detail: Object.assign({ newBody }, options),\n cancelable: true,\n });\n }\n notifyApplicationAfterRender() {\n return dispatch(\"turbo:render\");\n }\n notifyApplicationAfterPageLoad(timing = {}) {\n return dispatch(\"turbo:load\", {\n detail: { url: this.location.href, timing },\n });\n }\n notifyApplicationAfterVisitingSamePageLocation(oldURL, newURL) {\n dispatchEvent(new HashChangeEvent(\"hashchange\", {\n oldURL: oldURL.toString(),\n newURL: newURL.toString(),\n }));\n }\n notifyApplicationAfterFrameLoad(frame) {\n return dispatch(\"turbo:frame-load\", { target: frame });\n }\n notifyApplicationAfterFrameRender(fetchResponse, frame) {\n return dispatch(\"turbo:frame-render\", {\n detail: { fetchResponse },\n target: frame,\n cancelable: true,\n });\n }\n submissionIsNavigatable(form, submitter) {\n if (this.formMode == \"off\") {\n return false;\n }\n else {\n const submitterIsNavigatable = submitter ? this.elementIsNavigatable(submitter) : true;\n if (this.formMode == \"optin\") {\n return submitterIsNavigatable && form.closest('[data-turbo=\"true\"]') != null;\n }\n else {\n return submitterIsNavigatable && this.elementIsNavigatable(form);\n }\n }\n }\n elementIsNavigatable(element) {\n const container = element.closest(\"[data-turbo]\");\n const withinFrame = element.closest(\"turbo-frame\");\n if (this.drive || withinFrame) {\n if (container) {\n return container.getAttribute(\"data-turbo\") != \"false\";\n }\n else {\n return true;\n }\n }\n else {\n if (container) {\n return container.getAttribute(\"data-turbo\") == \"true\";\n }\n else {\n return false;\n }\n }\n }\n getActionForLink(link) {\n const action = link.getAttribute(\"data-turbo-action\");\n return isAction(action) ? action : \"advance\";\n }\n get snapshot() {\n return this.view.snapshot;\n }\n}\nfunction extendURLWithDeprecatedProperties(url) {\n Object.defineProperties(url, deprecatedLocationPropertyDescriptors);\n}\nconst deprecatedLocationPropertyDescriptors = {\n absoluteURL: {\n get() {\n return this.toString();\n },\n },\n};\n\nclass Cache {\n constructor(session) {\n this.session = session;\n }\n clear() {\n this.session.clearCache();\n }\n resetCacheControl() {\n this.setCacheControl(\"\");\n }\n exemptPageFromCache() {\n this.setCacheControl(\"no-cache\");\n }\n exemptPageFromPreview() {\n this.setCacheControl(\"no-preview\");\n }\n setCacheControl(value) {\n setMetaContent(\"turbo-cache-control\", value);\n }\n}\n\nconst StreamActions = {\n after() {\n this.targetElements.forEach((e) => { var _a; return (_a = e.parentElement) === null || _a === void 0 ? void 0 : _a.insertBefore(this.templateContent, e.nextSibling); });\n },\n append() {\n this.removeDuplicateTargetChildren();\n this.targetElements.forEach((e) => e.append(this.templateContent));\n },\n before() {\n this.targetElements.forEach((e) => { var _a; return (_a = e.parentElement) === null || _a === void 0 ? void 0 : _a.insertBefore(this.templateContent, e); });\n },\n prepend() {\n this.removeDuplicateTargetChildren();\n this.targetElements.forEach((e) => e.prepend(this.templateContent));\n },\n remove() {\n this.targetElements.forEach((e) => e.remove());\n },\n replace() {\n this.targetElements.forEach((e) => e.replaceWith(this.templateContent));\n },\n update() {\n this.targetElements.forEach((e) => e.replaceChildren(this.templateContent));\n },\n};\n\nconst session = new Session();\nconst cache = new Cache(session);\nconst { navigator: navigator$1 } = session;\nfunction start() {\n session.start();\n}\nfunction registerAdapter(adapter) {\n session.registerAdapter(adapter);\n}\nfunction visit(location, options) {\n session.visit(location, options);\n}\nfunction connectStreamSource(source) {\n session.connectStreamSource(source);\n}\nfunction disconnectStreamSource(source) {\n session.disconnectStreamSource(source);\n}\nfunction renderStreamMessage(message) {\n session.renderStreamMessage(message);\n}\nfunction clearCache() {\n console.warn(\"Please replace `Turbo.clearCache()` with `Turbo.cache.clear()`. The top-level function is deprecated and will be removed in a future version of Turbo.`\");\n session.clearCache();\n}\nfunction setProgressBarDelay(delay) {\n session.setProgressBarDelay(delay);\n}\nfunction setConfirmMethod(confirmMethod) {\n FormSubmission.confirmMethod = confirmMethod;\n}\nfunction setFormMode(mode) {\n session.setFormMode(mode);\n}\n\nvar Turbo = /*#__PURE__*/Object.freeze({\n __proto__: null,\n navigator: navigator$1,\n session: session,\n cache: cache,\n PageRenderer: PageRenderer,\n PageSnapshot: PageSnapshot,\n FrameRenderer: FrameRenderer,\n start: start,\n registerAdapter: registerAdapter,\n visit: visit,\n connectStreamSource: connectStreamSource,\n disconnectStreamSource: disconnectStreamSource,\n renderStreamMessage: renderStreamMessage,\n clearCache: clearCache,\n setProgressBarDelay: setProgressBarDelay,\n setConfirmMethod: setConfirmMethod,\n setFormMode: setFormMode,\n StreamActions: StreamActions\n});\n\nclass FrameController {\n constructor(element) {\n this.fetchResponseLoaded = (_fetchResponse) => { };\n this.currentFetchRequest = null;\n this.resolveVisitPromise = () => { };\n this.connected = false;\n this.hasBeenLoaded = false;\n this.ignoredAttributes = new Set();\n this.action = null;\n this.visitCachedSnapshot = ({ element }) => {\n const frame = element.querySelector(\"#\" + this.element.id);\n if (frame && this.previousFrameElement) {\n frame.replaceChildren(...this.previousFrameElement.children);\n }\n delete this.previousFrameElement;\n };\n this.element = element;\n this.view = new FrameView(this, this.element);\n this.appearanceObserver = new AppearanceObserver(this, this.element);\n this.formLinkClickObserver = new FormLinkClickObserver(this, this.element);\n this.linkInterceptor = new LinkInterceptor(this, this.element);\n this.restorationIdentifier = uuid();\n this.formSubmitObserver = new FormSubmitObserver(this, this.element);\n }\n connect() {\n if (!this.connected) {\n this.connected = true;\n if (this.loadingStyle == FrameLoadingStyle.lazy) {\n this.appearanceObserver.start();\n }\n else {\n this.loadSourceURL();\n }\n this.formLinkClickObserver.start();\n this.linkInterceptor.start();\n this.formSubmitObserver.start();\n }\n }\n disconnect() {\n if (this.connected) {\n this.connected = false;\n this.appearanceObserver.stop();\n this.formLinkClickObserver.stop();\n this.linkInterceptor.stop();\n this.formSubmitObserver.stop();\n }\n }\n disabledChanged() {\n if (this.loadingStyle == FrameLoadingStyle.eager) {\n this.loadSourceURL();\n }\n }\n sourceURLChanged() {\n if (this.isIgnoringChangesTo(\"src\"))\n return;\n if (this.element.isConnected) {\n this.complete = false;\n }\n if (this.loadingStyle == FrameLoadingStyle.eager || this.hasBeenLoaded) {\n this.loadSourceURL();\n }\n }\n sourceURLReloaded() {\n const { src } = this.element;\n this.ignoringChangesToAttribute(\"complete\", () => {\n this.element.removeAttribute(\"complete\");\n });\n this.element.src = null;\n this.element.src = src;\n return this.element.loaded;\n }\n completeChanged() {\n if (this.isIgnoringChangesTo(\"complete\"))\n return;\n this.loadSourceURL();\n }\n loadingStyleChanged() {\n if (this.loadingStyle == FrameLoadingStyle.lazy) {\n this.appearanceObserver.start();\n }\n else {\n this.appearanceObserver.stop();\n this.loadSourceURL();\n }\n }\n async loadSourceURL() {\n if (this.enabled && this.isActive && !this.complete && this.sourceURL) {\n this.element.loaded = this.visit(expandURL(this.sourceURL));\n this.appearanceObserver.stop();\n await this.element.loaded;\n this.hasBeenLoaded = true;\n }\n }\n async loadResponse(fetchResponse) {\n if (fetchResponse.redirected || (fetchResponse.succeeded && fetchResponse.isHTML)) {\n this.sourceURL = fetchResponse.response.url;\n }\n try {\n const html = await fetchResponse.responseHTML;\n if (html) {\n const { body } = parseHTMLDocument(html);\n const newFrameElement = await this.extractForeignFrameElement(body);\n if (newFrameElement) {\n const snapshot = new Snapshot(newFrameElement);\n const renderer = new FrameRenderer(this, this.view.snapshot, snapshot, FrameRenderer.renderElement, false, false);\n if (this.view.renderPromise)\n await this.view.renderPromise;\n this.changeHistory();\n await this.view.render(renderer);\n this.complete = true;\n session.frameRendered(fetchResponse, this.element);\n session.frameLoaded(this.element);\n this.fetchResponseLoaded(fetchResponse);\n }\n else if (this.willHandleFrameMissingFromResponse(fetchResponse)) {\n console.warn(`A matching frame for #${this.element.id} was missing from the response, transforming into full-page Visit.`);\n this.visitResponse(fetchResponse.response);\n }\n }\n }\n catch (error) {\n console.error(error);\n this.view.invalidate();\n }\n finally {\n this.fetchResponseLoaded = () => { };\n }\n }\n elementAppearedInViewport(_element) {\n this.loadSourceURL();\n }\n willSubmitFormLinkToLocation(link) {\n return this.shouldInterceptNavigation(link);\n }\n submittedFormLinkToLocation(link, _location, form) {\n const frame = this.findFrameElement(link);\n if (frame)\n form.setAttribute(\"data-turbo-frame\", frame.id);\n }\n shouldInterceptLinkClick(element, _location, _event) {\n return this.shouldInterceptNavigation(element);\n }\n linkClickIntercepted(element, location) {\n this.navigateFrame(element, location);\n }\n willSubmitForm(element, submitter) {\n return element.closest(\"turbo-frame\") == this.element && this.shouldInterceptNavigation(element, submitter);\n }\n formSubmitted(element, submitter) {\n if (this.formSubmission) {\n this.formSubmission.stop();\n }\n this.formSubmission = new FormSubmission(this, element, submitter);\n const { fetchRequest } = this.formSubmission;\n this.prepareHeadersForRequest(fetchRequest.headers, fetchRequest);\n this.formSubmission.start();\n }\n prepareHeadersForRequest(headers, request) {\n var _a;\n headers[\"Turbo-Frame\"] = this.id;\n if ((_a = this.currentNavigationElement) === null || _a === void 0 ? void 0 : _a.hasAttribute(\"data-turbo-stream\")) {\n request.acceptResponseType(StreamMessage.contentType);\n }\n }\n requestStarted(_request) {\n markAsBusy(this.element);\n }\n requestPreventedHandlingResponse(_request, _response) {\n this.resolveVisitPromise();\n }\n async requestSucceededWithResponse(request, response) {\n await this.loadResponse(response);\n this.resolveVisitPromise();\n }\n async requestFailedWithResponse(request, response) {\n console.error(response);\n await this.loadResponse(response);\n this.resolveVisitPromise();\n }\n requestErrored(request, error) {\n console.error(error);\n this.resolveVisitPromise();\n }\n requestFinished(_request) {\n clearBusyState(this.element);\n }\n formSubmissionStarted({ formElement }) {\n markAsBusy(formElement, this.findFrameElement(formElement));\n }\n formSubmissionSucceededWithResponse(formSubmission, response) {\n const frame = this.findFrameElement(formSubmission.formElement, formSubmission.submitter);\n frame.delegate.proposeVisitIfNavigatedWithAction(frame, formSubmission.formElement, formSubmission.submitter);\n frame.delegate.loadResponse(response);\n }\n formSubmissionFailedWithResponse(formSubmission, fetchResponse) {\n this.element.delegate.loadResponse(fetchResponse);\n }\n formSubmissionErrored(formSubmission, error) {\n console.error(error);\n }\n formSubmissionFinished({ formElement }) {\n clearBusyState(formElement, this.findFrameElement(formElement));\n }\n allowsImmediateRender({ element: newFrame }, options) {\n const event = dispatch(\"turbo:before-frame-render\", {\n target: this.element,\n detail: Object.assign({ newFrame }, options),\n cancelable: true,\n });\n const { defaultPrevented, detail: { render }, } = event;\n if (this.view.renderer && render) {\n this.view.renderer.renderElement = render;\n }\n return !defaultPrevented;\n }\n viewRenderedSnapshot(_snapshot, _isPreview) { }\n preloadOnLoadLinksForView(element) {\n session.preloadOnLoadLinksForView(element);\n }\n viewInvalidated() { }\n willRenderFrame(currentElement, _newElement) {\n this.previousFrameElement = currentElement.cloneNode(true);\n }\n async visit(url) {\n var _a;\n const request = new FetchRequest(this, FetchMethod.get, url, new URLSearchParams(), this.element);\n (_a = this.currentFetchRequest) === null || _a === void 0 ? void 0 : _a.cancel();\n this.currentFetchRequest = request;\n return new Promise((resolve) => {\n this.resolveVisitPromise = () => {\n this.resolveVisitPromise = () => { };\n this.currentFetchRequest = null;\n resolve();\n };\n request.perform();\n });\n }\n navigateFrame(element, url, submitter) {\n const frame = this.findFrameElement(element, submitter);\n this.pageSnapshot = PageSnapshot.fromElement(frame).clone();\n frame.delegate.proposeVisitIfNavigatedWithAction(frame, element, submitter);\n this.withCurrentNavigationElement(element, () => {\n frame.src = url;\n });\n }\n proposeVisitIfNavigatedWithAction(frame, element, submitter) {\n this.action = getVisitAction(submitter, element, frame);\n if (isAction(this.action)) {\n const { visitCachedSnapshot } = frame.delegate;\n frame.delegate.fetchResponseLoaded = (fetchResponse) => {\n if (frame.src) {\n const { statusCode, redirected } = fetchResponse;\n const responseHTML = frame.ownerDocument.documentElement.outerHTML;\n const response = { statusCode, redirected, responseHTML };\n const options = {\n response,\n visitCachedSnapshot,\n willRender: false,\n updateHistory: false,\n restorationIdentifier: this.restorationIdentifier,\n snapshot: this.pageSnapshot,\n };\n if (this.action)\n options.action = this.action;\n session.visit(frame.src, options);\n }\n };\n }\n }\n changeHistory() {\n if (this.action) {\n const method = getHistoryMethodForAction(this.action);\n session.history.update(method, expandURL(this.element.src || \"\"), this.restorationIdentifier);\n }\n }\n willHandleFrameMissingFromResponse(fetchResponse) {\n this.element.setAttribute(\"complete\", \"\");\n const response = fetchResponse.response;\n const visit = async (url, options = {}) => {\n if (url instanceof Response) {\n this.visitResponse(url);\n }\n else {\n session.visit(url, options);\n }\n };\n const event = dispatch(\"turbo:frame-missing\", {\n target: this.element,\n detail: { response, visit },\n cancelable: true,\n });\n return !event.defaultPrevented;\n }\n async visitResponse(response) {\n const wrapped = new FetchResponse(response);\n const responseHTML = await wrapped.responseHTML;\n const { location, redirected, statusCode } = wrapped;\n return session.visit(location, { response: { redirected, statusCode, responseHTML } });\n }\n findFrameElement(element, submitter) {\n var _a;\n const id = getAttribute(\"data-turbo-frame\", submitter, element) || this.element.getAttribute(\"target\");\n return (_a = getFrameElementById(id)) !== null && _a !== void 0 ? _a : this.element;\n }\n async extractForeignFrameElement(container) {\n let element;\n const id = CSS.escape(this.id);\n try {\n element = activateElement(container.querySelector(`turbo-frame#${id}`), this.sourceURL);\n if (element) {\n return element;\n }\n element = activateElement(container.querySelector(`turbo-frame[src][recurse~=${id}]`), this.sourceURL);\n if (element) {\n await element.loaded;\n return await this.extractForeignFrameElement(element);\n }\n }\n catch (error) {\n console.error(error);\n return new FrameElement();\n }\n return null;\n }\n formActionIsVisitable(form, submitter) {\n const action = getAction(form, submitter);\n return locationIsVisitable(expandURL(action), this.rootLocation);\n }\n shouldInterceptNavigation(element, submitter) {\n const id = getAttribute(\"data-turbo-frame\", submitter, element) || this.element.getAttribute(\"target\");\n if (element instanceof HTMLFormElement && !this.formActionIsVisitable(element, submitter)) {\n return false;\n }\n if (!this.enabled || id == \"_top\") {\n return false;\n }\n if (id) {\n const frameElement = getFrameElementById(id);\n if (frameElement) {\n return !frameElement.disabled;\n }\n }\n if (!session.elementIsNavigatable(element)) {\n return false;\n }\n if (submitter && !session.elementIsNavigatable(submitter)) {\n return false;\n }\n return true;\n }\n get id() {\n return this.element.id;\n }\n get enabled() {\n return !this.element.disabled;\n }\n get sourceURL() {\n if (this.element.src) {\n return this.element.src;\n }\n }\n set sourceURL(sourceURL) {\n this.ignoringChangesToAttribute(\"src\", () => {\n this.element.src = sourceURL !== null && sourceURL !== void 0 ? sourceURL : null;\n });\n }\n get loadingStyle() {\n return this.element.loading;\n }\n get isLoading() {\n return this.formSubmission !== undefined || this.resolveVisitPromise() !== undefined;\n }\n get complete() {\n return this.element.hasAttribute(\"complete\");\n }\n set complete(value) {\n this.ignoringChangesToAttribute(\"complete\", () => {\n if (value) {\n this.element.setAttribute(\"complete\", \"\");\n }\n else {\n this.element.removeAttribute(\"complete\");\n }\n });\n }\n get isActive() {\n return this.element.isActive && this.connected;\n }\n get rootLocation() {\n var _a;\n const meta = this.element.ownerDocument.querySelector(`meta[name=\"turbo-root\"]`);\n const root = (_a = meta === null || meta === void 0 ? void 0 : meta.content) !== null && _a !== void 0 ? _a : \"/\";\n return expandURL(root);\n }\n isIgnoringChangesTo(attributeName) {\n return this.ignoredAttributes.has(attributeName);\n }\n ignoringChangesToAttribute(attributeName, callback) {\n this.ignoredAttributes.add(attributeName);\n callback();\n this.ignoredAttributes.delete(attributeName);\n }\n withCurrentNavigationElement(element, callback) {\n this.currentNavigationElement = element;\n callback();\n delete this.currentNavigationElement;\n }\n}\nfunction getFrameElementById(id) {\n if (id != null) {\n const element = document.getElementById(id);\n if (element instanceof FrameElement) {\n return element;\n }\n }\n}\nfunction activateElement(element, currentURL) {\n if (element) {\n const src = element.getAttribute(\"src\");\n if (src != null && currentURL != null && urlsAreEqual(src, currentURL)) {\n throw new Error(`Matching element has a source URL which references itself`);\n }\n if (element.ownerDocument !== document) {\n element = document.importNode(element, true);\n }\n if (element instanceof FrameElement) {\n element.connectedCallback();\n element.disconnectedCallback();\n return element;\n }\n }\n}\n\nclass StreamElement extends HTMLElement {\n static async renderElement(newElement) {\n await newElement.performAction();\n }\n async connectedCallback() {\n try {\n await this.render();\n }\n catch (error) {\n console.error(error);\n }\n finally {\n this.disconnect();\n }\n }\n async render() {\n var _a;\n return ((_a = this.renderPromise) !== null && _a !== void 0 ? _a : (this.renderPromise = (async () => {\n const event = this.beforeRenderEvent;\n if (this.dispatchEvent(event)) {\n await nextAnimationFrame();\n await event.detail.render(this);\n }\n })()));\n }\n disconnect() {\n try {\n this.remove();\n }\n catch (_a) { }\n }\n removeDuplicateTargetChildren() {\n this.duplicateChildren.forEach((c) => c.remove());\n }\n get duplicateChildren() {\n var _a;\n const existingChildren = this.targetElements.flatMap((e) => [...e.children]).filter((c) => !!c.id);\n const newChildrenIds = [...(((_a = this.templateContent) === null || _a === void 0 ? void 0 : _a.children) || [])].filter((c) => !!c.id).map((c) => c.id);\n return existingChildren.filter((c) => newChildrenIds.includes(c.id));\n }\n get performAction() {\n if (this.action) {\n const actionFunction = StreamActions[this.action];\n if (actionFunction) {\n return actionFunction;\n }\n this.raise(\"unknown action\");\n }\n this.raise(\"action attribute is missing\");\n }\n get targetElements() {\n if (this.target) {\n return this.targetElementsById;\n }\n else if (this.targets) {\n return this.targetElementsByQuery;\n }\n else {\n this.raise(\"target or targets attribute is missing\");\n }\n }\n get templateContent() {\n return this.templateElement.content.cloneNode(true);\n }\n get templateElement() {\n if (this.firstElementChild === null) {\n const template = this.ownerDocument.createElement(\"template\");\n this.appendChild(template);\n return template;\n }\n else if (this.firstElementChild instanceof HTMLTemplateElement) {\n return this.firstElementChild;\n }\n this.raise(\"first child element must be a