UNPKG

linkmore-design

Version:

🌈 🚀lm组件库。🚀

125 lines (124 loc) 4.45 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _configProvider = _interopRequireDefault(require("../config-provider")); var _classnames = _interopRequireDefault(require("classnames")); var _react = _interopRequireWildcard(require("react")); /** * 返回当前显示设备的物理像素分辨率与CSS像素分辨率之比 * * @param context * @see api 有些废弃了,其实类型 CanvasRenderingContext2D */ const getPixelRatio = context => { if (!context) { return 1; } const backingStore = context.backingStorePixelRatio || context.webkitBackingStorePixelRatio || context.mozBackingStorePixelRatio || context.msBackingStorePixelRatio || context.oBackingStorePixelRatio || 1; return (window.devicePixelRatio || 1) / backingStore; }; const WaterMark = props => { const { children, style, className, markStyle, markClassName, // antd 内容层 zIndex 基本上在 10 以下 https://github.com/ant-design/ant-design/blob/6192403b2ce517c017f9e58a32d58774921c10cd/components/style/themes/default.less#L335 zIndex = 9, gapX = 212, gapY = 222, width = 120, height = 64, rotate = -22, // 默认旋转 -22 度 image, content, offsetLeft, offsetTop, fontStyle = 'normal', fontWeight = 'normal', fontColor = 'rgba(0,0,0,.15)', fontSize = 16, fontFamily = 'sans-serif', prefixCls: customizePrefixCls } = props; const { getPrefixCls } = (0, _react.useContext)(_configProvider.default.ConfigContext); const prefixCls = getPrefixCls('pro-layout-watermark', customizePrefixCls); const wrapperCls = (0, _classnames.default)(`${prefixCls}-wrapper`, className); const waterMakrCls = (0, _classnames.default)(prefixCls, markClassName); const [base64Url, setBase64Url] = (0, _react.useState)(''); (0, _react.useEffect)(() => { const canvas = document.createElement('canvas'); const ctx = canvas.getContext('2d'); const ratio = getPixelRatio(ctx); const canvasWidth = `${(gapX + width) * ratio}px`; const canvasHeight = `${(gapY + height) * ratio}px`; const canvasOffsetLeft = offsetLeft || gapX / 2; const canvasOffsetTop = offsetTop || gapY / 2; canvas.setAttribute('width', canvasWidth); canvas.setAttribute('height', canvasHeight); if (ctx) { // 旋转字符 rotate ctx.translate(canvasOffsetLeft * ratio, canvasOffsetTop * ratio); ctx.rotate(Math.PI / 180 * Number(rotate)); const markWidth = width * ratio; const markHeight = height * ratio; if (image) { const img = new Image(); img.crossOrigin = 'anonymous'; img.referrerPolicy = 'no-referrer'; img.src = image; img.onload = () => { ctx.drawImage(img, 0, 0, markWidth, markHeight); setBase64Url(canvas.toDataURL()); }; } else if (content) { const markSize = Number(fontSize) * ratio; ctx.font = `${fontStyle} normal ${fontWeight} ${markSize}px/${markHeight}px ${fontFamily}`; ctx.fillStyle = fontColor; if (Array.isArray(content)) { content?.forEach((item, index) => ctx.fillText(item, 0, index * markSize)); } else { ctx.fillText(content, 0, 0); } setBase64Url(canvas.toDataURL()); } } else { // eslint-disable-next-line no-console console.error('当前环境不支持Canvas'); } }, [gapX, gapY, offsetLeft, offsetTop, rotate, fontStyle, fontWeight, width, height, fontFamily, fontColor, image, content, fontSize]); return /*#__PURE__*/_react.default.createElement("div", { style: { position: 'relative', ...style }, className: wrapperCls }, children, /*#__PURE__*/_react.default.createElement("div", { className: waterMakrCls, style: { zIndex, position: 'absolute', left: 0, top: 0, width: '100%', height: '100%', backgroundSize: `${gapX + width}px`, pointerEvents: 'none', backgroundRepeat: 'repeat', ...(base64Url ? { backgroundImage: `url('${base64Url}')` } : {}), ...markStyle } })); }; var _default = WaterMark; exports.default = _default;