149 lines
6.2 KiB
JavaScript
149 lines
6.2 KiB
JavaScript
"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.WaterMark = void 0;
|
|
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
|
|
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
var _proProvider = require("@ant-design/pro-provider");
|
|
var _antd = require("antd");
|
|
var _classnames = _interopRequireDefault(require("classnames"));
|
|
var _react = _interopRequireWildcard(require("react"));
|
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
/**
|
|
* 返回当前显示设备的物理像素分辨率与CSS像素分辨率之比
|
|
*
|
|
* @param context
|
|
* @see api 有些废弃了,其实类型 CanvasRenderingContext2D
|
|
*/
|
|
var getPixelRatio = function getPixelRatio(context) {
|
|
if (!context) {
|
|
return 1;
|
|
}
|
|
var backingStore = context.backingStorePixelRatio || context.webkitBackingStorePixelRatio || context.mozBackingStorePixelRatio || context.msBackingStorePixelRatio || context.oBackingStorePixelRatio || 1;
|
|
return (window.devicePixelRatio || 1) / backingStore;
|
|
};
|
|
var WaterMark = exports.WaterMark = function WaterMark(props) {
|
|
var _useToken = (0, _proProvider.useToken)(),
|
|
token = _useToken.token;
|
|
var children = props.children,
|
|
style = props.style,
|
|
className = props.className,
|
|
markStyle = props.markStyle,
|
|
markClassName = props.markClassName,
|
|
_props$zIndex = props.zIndex,
|
|
zIndex = _props$zIndex === void 0 ? 9 : _props$zIndex,
|
|
_props$gapX = props.gapX,
|
|
gapX = _props$gapX === void 0 ? 212 : _props$gapX,
|
|
_props$gapY = props.gapY,
|
|
gapY = _props$gapY === void 0 ? 222 : _props$gapY,
|
|
_props$width = props.width,
|
|
width = _props$width === void 0 ? 120 : _props$width,
|
|
_props$height = props.height,
|
|
height = _props$height === void 0 ? 64 : _props$height,
|
|
_props$rotate = props.rotate,
|
|
rotate = _props$rotate === void 0 ? -22 : _props$rotate,
|
|
image = props.image,
|
|
offsetLeft = props.offsetLeft,
|
|
outOffsetTop = props.offsetTop,
|
|
_props$fontStyle = props.fontStyle,
|
|
fontStyle = _props$fontStyle === void 0 ? 'normal' : _props$fontStyle,
|
|
_props$fontWeight = props.fontWeight,
|
|
fontWeight = _props$fontWeight === void 0 ? 'normal' : _props$fontWeight,
|
|
_props$fontColor = props.fontColor,
|
|
fontColor = _props$fontColor === void 0 ? token.colorFill : _props$fontColor,
|
|
_props$fontSize = props.fontSize,
|
|
fontSize = _props$fontSize === void 0 ? 16 : _props$fontSize,
|
|
_props$fontFamily = props.fontFamily,
|
|
fontFamily = _props$fontFamily === void 0 ? 'sans-serif' : _props$fontFamily,
|
|
customizePrefixCls = props.prefixCls;
|
|
var _useContext = (0, _react.useContext)(_antd.ConfigProvider.ConfigContext),
|
|
getPrefixCls = _useContext.getPrefixCls;
|
|
var prefixCls = getPrefixCls('pro-layout-watermark', customizePrefixCls);
|
|
var wrapperCls = (0, _classnames.default)("".concat(prefixCls, "-wrapper"), className);
|
|
var waterMarkCls = (0, _classnames.default)(prefixCls, markClassName);
|
|
var _useState = (0, _react.useState)(''),
|
|
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
|
|
base64Url = _useState2[0],
|
|
setBase64Url = _useState2[1];
|
|
(0, _react.useEffect)(function () {
|
|
var canvas = document.createElement('canvas');
|
|
var ctx = canvas.getContext('2d');
|
|
var ratio = getPixelRatio(ctx);
|
|
var canvasWidth = "".concat((gapX + width) * ratio, "px");
|
|
var canvasHeight = "".concat((gapY + height) * ratio, "px");
|
|
var canvasOffsetLeft = offsetLeft || gapX / 2;
|
|
var canvasOffsetTop = outOffsetTop || gapY / 2;
|
|
canvas.setAttribute('width', canvasWidth);
|
|
canvas.setAttribute('height', canvasHeight);
|
|
if (!ctx) {
|
|
// eslint-disable-next-line no-console
|
|
console.error('当前环境不支持Canvas');
|
|
return;
|
|
}
|
|
|
|
// 旋转字符 rotate
|
|
ctx.translate(canvasOffsetLeft * ratio, canvasOffsetTop * ratio);
|
|
ctx.rotate(Math.PI / 180 * Number(rotate));
|
|
var markWidth = width * ratio;
|
|
var markHeight = height * ratio;
|
|
var writeContent = function writeContent(contentText) {
|
|
var offsetTop = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
|
|
var markSize = Number(fontSize) * ratio;
|
|
ctx.font = "".concat(fontStyle, " normal ").concat(fontWeight, " ").concat(markSize, "px/").concat(markHeight, "px ").concat(fontFamily);
|
|
ctx.fillStyle = fontColor;
|
|
if (Array.isArray(contentText)) {
|
|
contentText === null || contentText === void 0 || contentText.forEach(function (item, index) {
|
|
return ctx.fillText(item, 0, index * markSize + offsetTop);
|
|
});
|
|
} else {
|
|
ctx.fillText(contentText, 0, offsetTop ? offsetTop + markSize : 0);
|
|
}
|
|
setBase64Url(canvas.toDataURL());
|
|
};
|
|
if (image) {
|
|
var img = new Image();
|
|
img.crossOrigin = 'anonymous';
|
|
img.referrerPolicy = 'no-referrer';
|
|
img.src = image;
|
|
img.onload = function () {
|
|
ctx.drawImage(img, 0, 0, markWidth, markHeight);
|
|
setBase64Url(canvas.toDataURL());
|
|
if (props.content) {
|
|
writeContent(props.content, img.height + 8);
|
|
return;
|
|
}
|
|
};
|
|
return;
|
|
}
|
|
if (props.content) {
|
|
writeContent(props.content);
|
|
return;
|
|
}
|
|
}, [gapX, gapY, offsetLeft, outOffsetTop, rotate, fontStyle, fontWeight, width, height, fontFamily, fontColor, image, props.content, fontSize]);
|
|
return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
style: (0, _objectSpread2.default)({
|
|
position: 'relative'
|
|
}, style),
|
|
className: wrapperCls,
|
|
children: [children, /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
className: waterMarkCls,
|
|
style: (0, _objectSpread2.default)((0, _objectSpread2.default)({
|
|
zIndex: zIndex,
|
|
position: 'absolute',
|
|
left: 0,
|
|
top: 0,
|
|
width: '100%',
|
|
height: '100%',
|
|
backgroundSize: "".concat(gapX + width, "px"),
|
|
pointerEvents: 'none',
|
|
backgroundRepeat: 'repeat'
|
|
}, base64Url ? {
|
|
backgroundImage: "url('".concat(base64Url, "')")
|
|
} : {}), markStyle)
|
|
})]
|
|
});
|
|
}; |