From 62facd690586bca7e5af0815cbffc630aeb736bd Mon Sep 17 00:00:00 2001 From: fxy060608 Date: Thu, 18 Apr 2019 19:59:30 +0800 Subject: [PATCH] =?UTF-8?q?feat(h5):=20canvas=20=E9=AB=98=E6=B8=85?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/view/components/canvas/hidpi.js | 168 ++++ src/core/view/components/canvas/index.vue | 898 +++++++++++----------- 2 files changed, 623 insertions(+), 443 deletions(-) create mode 100644 src/core/view/components/canvas/hidpi.js diff --git a/src/core/view/components/canvas/hidpi.js b/src/core/view/components/canvas/hidpi.js new file mode 100644 index 000000000..14fb45b27 --- /dev/null +++ b/src/core/view/components/canvas/hidpi.js @@ -0,0 +1,168 @@ +const pixelRatio = (function () { + const canvas = document.createElement('canvas') + const context = canvas.getContext('2d') + const backingStore = context.backingStorePixelRatio || + context.webkitBackingStorePixelRatio || + context.mozBackingStorePixelRatio || + context.msBackingStorePixelRatio || + context.oBackingStorePixelRatio || + context.backingStorePixelRatio || 1 + return (window.devicePixelRatio || 1) / backingStore +})() + +const forEach = function (obj, func) { + for (let key in obj) { + if (obj.hasOwnProperty(key)) { + func(obj[key], key) + } + } +} +const ratioArgs = { + 'fillRect': 'all', + 'clearRect': 'all', + 'strokeRect': 'all', + 'moveTo': 'all', + 'lineTo': 'all', + 'arc': [0, 1, 2], + 'arcTo': 'all', + 'bezierCurveTo': 'all', + 'isPointinPath': 'all', + 'isPointinStroke': 'all', + 'quadraticCurveTo': 'all', + 'rect': 'all', + 'translate': 'all', + 'createRadialGradient': 'all', + 'createLinearGradient': 'all', + 'setTransform': [4, 5] +} +if (pixelRatio !== 1) { + const proto = CanvasRenderingContext2D.prototype + + forEach(ratioArgs, function (value, key) { + proto[key] = (function (_super) { + return function () { + if (this.__ignore__) { + return _super.apply(this, arguments) + } + + let args = Array.prototype.slice.call(arguments) + + if (value === 'all') { + args = args.map(function (a) { + return a * pixelRatio + }) + } else if (Array.isArray(value)) { + for (let i = 0; i < value.length; i++) { + args[value[i]] *= pixelRatio + } + } + return _super.apply(this, args) + } + })(proto[key]) + }) + + proto.stroke = (function (_super) { + return function () { + if (this.__ignore__) { + return _super.apply(this, arguments) + } + this.lineWidth *= pixelRatio + _super.apply(this, arguments) + this.lineWidth /= pixelRatio + } + })(proto.stroke) + + proto.fillText = (function (_super) { + return function () { + if (this.__ignore__) { + return _super.apply(this, arguments) + } + const args = Array.prototype.slice.call(arguments) + + args[1] *= pixelRatio + args[2] *= pixelRatio + + this.font = this.font.replace( + /(\d+)(px|em|rem|pt)/g, + function (w, m, u) { + return (m * pixelRatio) + u + } + ) + + _super.apply(this, args) + + this.font = this.font.replace( + /(\d+)(px|em|rem|pt)/g, + function (w, m, u) { + return (m / pixelRatio) + u + } + ) + } + })(proto.fillText) + + proto.strokeText = (function (_super) { + return function () { + if (this.__ignore__) { + return _super.apply(this, arguments) + } + var args = Array.prototype.slice.call(arguments) + + args[1] *= pixelRatio // x + args[2] *= pixelRatio // y + + this.font = this.font.replace( + /(\d+)(px|em|rem|pt)/g, + function (w, m, u) { + return (m * pixelRatio) + u + } + ) + + _super.apply(this, args) + + this.font = this.font.replace( + /(\d+)(px|em|rem|pt)/g, + function (w, m, u) { + return (m / pixelRatio) + u + } + ) + } + })(proto.strokeText) + + proto.drawImageByCanvas = (function (_super) { + return function (canvas, srcx, srcy, srcw, srch, desx, desy, desw, desh, isScale) { + if (this.__ignore__) { + return _super.apply(this, arguments) + } + srcx *= pixelRatio + srcy *= pixelRatio + srcw *= pixelRatio + srch *= pixelRatio + desx *= pixelRatio + desy *= pixelRatio + desw = isScale ? desw * pixelRatio : desw + desh = isScale ? desh * pixelRatio : desh + _super.call(this, canvas, srcx, srcy, srcw, srch, desx, desy, desw, desh) + } + })(proto.drawImage) + + proto.drawImage = (function (_super) { + return function () { + if (this.__ignore__) { + return _super.apply(this, arguments) + } + this.scale(pixelRatio, pixelRatio) + _super.apply(this, arguments) + this.scale(1 / pixelRatio, 1 / pixelRatio) + } + })(proto.drawImage) +} + +export function wrapper (canvas) { + canvas.style.height = canvas.height + 'px' + canvas.style.width = canvas.width + 'px' + canvas.width *= pixelRatio + canvas.height *= pixelRatio + + console.log(canvas.width) + console.log(canvas.height) +} diff --git a/src/core/view/components/canvas/index.vue b/src/core/view/components/canvas/index.vue index ec7db333b..c8ccf5ff7 100644 --- a/src/core/view/components/canvas/index.vue +++ b/src/core/view/components/canvas/index.vue @@ -1,450 +1,462 @@ -