UNPKG

vue-poster-editor

Version:

A poster editor based on Vue.js

287 lines (223 loc) 9.26 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _jquery = require('jquery'); var _jquery2 = _interopRequireDefault(_jquery); var _bluebird = require('bluebird'); var _bluebird2 = _interopRequireDefault(_bluebird); var _utils = require('../utils/utils'); var _utils2 = _interopRequireDefault(_utils); var _vueInherit = require('../utils/vue-inherit'); var _vueInherit2 = _interopRequireDefault(_vueInherit); var _transform = require('../utils/transform'); var _transform2 = _interopRequireDefault(_transform); var _canvas = require('../utils/canvas'); var _editorElementEditorMask = require('./editor-element-editor-mask'); var _editorElementEditorMask2 = _interopRequireDefault(_editorElementEditorMask); var _editorMaskEditor = require('./editor-mask-editor.html'); var _editorMaskEditor2 = _interopRequireDefault(_editorMaskEditor); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } exports.default = (0, _vueInherit2.default)(_editorElementEditorMask2.default, { template: _editorMaskEditor2.default, props: ['model', 'currentElement', 'currentLayout', 'global'], data: function data() { return { type: 'masker' }; }, computed: { modelTransform: function modelTransform() { return this.editModelInner.transform; }, editModelTransform: function editModelTransform() { return this.editModel.transform; }, maskTransform: function maskTransform() { var transform = new _transform2.default(); var zoom = this.zoom; var editModelInner = this.editModelInner; var editModel = this.editModel; transform.rotation = editModelInner.rotation - editModel.rotation; var rotate = editModel.rotate; var xOffset = (editModel.width - editModelInner.width) / 2; var yOffset = (editModel.height - editModelInner.height) / 2; var dx = editModel.left - editModelInner.left + xOffset; var dy = editModel.top - editModelInner.top + yOffset; var sin = Math.sin(rotate / 180 * Math.PI); var cos = Math.cos(rotate / 180 * Math.PI); transform.position.x = (xOffset - (dx * cos + dy * sin)) * zoom; transform.position.y = (yOffset - (dy * cos - dx * sin)) * zoom; return transform; }, innerStyle: function innerStyle() { var result = { position: 'absolute', zIndex: 2, height: this.zoom * this.editModelInner.height + 'px', width: this.zoom * this.editModelInner.width + 'px', left: '1px', top: '1px', borderRadius: this.borderRadius, transform: this.maskTransform.toString() }; this.$events.$emit('editor.croper.update', result); return result; } }, methods: { activeInnerEdit: function activeInnerEdit(e) { var editModelInner = this.editModelInner; this.editor.focusElement(editModelInner); editModelInner.active = true; this.$events.$emit('imageCroper.activeInner', e); }, activeOuterEdit: function activeOuterEdit(e) { var _this = this; (0, _jquery2.default)(this.$el).off('mousedown'); setTimeout(function () { _this.$events.$emit('transform.drag', e); }, 0); }, getContext: function getContext() { if (this.$context) { return this.$context; } var canvas = (0, _canvas.createCanvas)(100, 100); this.$context = canvas.getContext('2d'); var bgImg = new Image(); bgImg.crossOrigin = 'Anonymous'; this.$bgImg = bgImg; bgImg.style.cssText = 'width:100%; height:100%; opacity:0.5;'; var shell = (0, _jquery2.default)('.editor-mask-editor-main', this.$el); shell.html('').append(bgImg).append(canvas); return this.$context; }, render: function render() { var _this2 = this; var context = this.getContext(); var editModelInner = this.editModelInner; var fitCrossOrigin = this.options.fitCrossOrigin; return _bluebird2.default.all([_utils2.default.loadImage(editModelInner.url, fitCrossOrigin), _utils2.default.loadImage(editModelInner.mask, fitCrossOrigin)]).spread(function (image, mask) { context.$img = image; context.$mask = mask; _this2.$bgImg.src = image.src; _this2.updateStage(); return context; }); }, updateStage: function updateStage() { var context = this.getContext(); var canvas = context.canvas; var mask = context.$mask; var img = context.$img; if (!mask) { return; } var editModel = this.editModel; var editModelInner = this.editModelInner; var zoom = this.zoom; var position = this.maskTransform.position; var imageWidth = editModel.width, imageHeight = editModel.height; var width = editModelInner.width, height = editModelInner.height; var x = position.x, y = position.y; var canvasWidth = Math.round(imageWidth); var canvasHeight = Math.round(imageHeight); canvas.width = canvasWidth; canvas.height = canvasHeight; context.clearRect(0, 0, canvasWidth, canvasHeight); var imageCenter = { x: x / zoom + width / 2, y: y / zoom + height / 2 }; var imageSize = { width: width, height: height }; context.globalAlpha = 1; (0, _canvas.drawImageToCanvas)(canvas, mask, imageCenter, imageSize, this.maskTransform.rotation, 'source-over'); context.globalCompositeOperation = 'source-in'; context.drawImage(img, 0, 0, imageWidth, imageHeight); } }, watch: { 'editModel.width': function editModelWidth() { this.updateStage(); }, 'editModel.height': function editModelHeight() { this.updateStage(); }, 'editModel.left': function editModelLeft() { this.updateStage(); }, 'editModel.top': function editModelTop() { this.updateStage(); }, 'editModel.rotate': function editModelRotate() { this.updateStage(); }, 'editModelInner.width': function editModelInnerWidth() { this.updateStage(); }, 'editModelInner.height': function editModelInnerHeight() { this.updateStage(); }, 'editModelInner.left': function editModelInnerLeft() { this.updateStage(); }, 'editModelInner.top': function editModelInnerTop() { this.updateStage(); }, 'editModelInner.rotate': function editModelInnerRotate() { this.updateStage(); } }, events: { 'editor.click': function editorClick(e) { e.preventDefault(); if (this.clickLocked && !this.scaling) { var point = this.editor.pointFromEvent(e); var rect = _utils2.default.getElementRect(this.editModel, 1); if (!_utils2.default.pointInRect(point.x, point.y, rect)) { this.save(); } } }, 'imageCroper.scale': function imageCroperScale(scale) { this.scaling = true; var model = this.model, editModel = this.editModel; var originWidth = model.$naturalWidth; var originHeight = model.$naturalHeight; var newWidth = originWidth * scale; var newHeight = originHeight * scale; var leftDiff = (editModel.width - newWidth) / 2; var topDiff = (editModel.height - newHeight) / 2; editModel.width = newWidth; editModel.height = newHeight; editModel.left = editModel.left + leftDiff; editModel.top = editModel.top + topDiff; }, 'imageCroper.scaleEnd': function imageCroperScaleEnd() { delete this.scaling; }, 'imageCroper.activeInner': function imageCroperActiveInner() { this.editor.focusElement(this.editModelInner); if (!this.editModelInner.active) { this.activeInnerEdit(); } }, 'imageCroper.activeOuter': function imageCroperActiveOuter() { if (this.editModelInner.active) { this.editor.focusElement(this.editModel); } } }, mounted: function mounted() { this.render(); } }); module.exports = exports['default'];