watermark-js-plus
Version:
watermark for the browser
285 lines (282 loc) • 12.7 kB
JavaScript
import { isUndefined, getMultiLineData } from './index.js';
var initialOptions = {
width: 300,
height: 300,
rotate: 45,
layout: 'default',
auxiliaryLine: false,
translatePlacement: 'middle',
contentType: 'text',
content: 'hello watermark-js-plus',
textType: 'fill',
imageWidth: 0,
imageHeight: 0,
lineHeight: 30,
zIndex: 2147483647,
backgroundPosition: '0 0',
backgroundRepeat: 'repeat',
fontSize: '20px',
fontFamily: 'sans-serif',
fontStyle: '',
fontVariant: '',
fontColor: '#000',
fontWeight: 'normal',
filter: 'none',
letterSpacing: '0px',
wordSpacing: '0px',
globalAlpha: 0.5,
mode: 'default',
mutationObserve: true,
monitorProtection: false,
movable: false,
parent: 'body',
onSuccess: function () { },
onBeforeDestroy: function () { },
onDestroyed: function () { },
onObserveError: function () { },
};
var generateRecommendOptions = function (canvas, options, args) {
var ctx = canvas.getContext('2d');
if (ctx === null) {
throw new Error('get context error');
}
ctx.font = "".concat(options.fontStyle, " ").concat(options.fontVariant, " ").concat(options.fontWeight, " ").concat(options.fontSize, " ").concat(options.fontFamily);
ctx.filter = options.filter;
ctx.letterSpacing = options.letterSpacing;
ctx.wordSpacing = options.wordSpacing;
if (options === null || options === void 0 ? void 0 : options.rotate) {
options.rotate = (360 - (options.rotate % 360)) * (Math.PI / 180);
}
if (isUndefined(args.textRowMaxWidth)) {
options.textRowMaxWidth = options.width;
}
var result = {
image: {
rect: {
width: options.imageWidth,
height: options.imageHeight,
},
position: {
x: 0,
y: 0,
},
},
textLine: {
data: [],
yOffsetValue: 0,
},
advancedStyleParams: {
linear: {
x0: 0,
x1: 0,
},
radial: {
x0: 0,
y0: 0,
r0: 0,
x1: 0,
y1: 0,
r1: 0,
},
conic: {
x: 0,
y: 0,
startAngle: 0,
},
pattern: {},
},
};
switch (options.contentType) {
case 'text':
result.textLine.data = [options.content];
break;
case 'multi-line-text':
result.textLine.data = getMultiLineData(ctx, options.content, options.textRowMaxWidth);
break;
// case 'image':
// break
// case 'rich-text':
// break
}
var translateX = options.width / 2;
var translateY = options.height / 2;
var textBaseline = 'middle';
var textAlign = 'center';
if (!isUndefined(args === null || args === void 0 ? void 0 : args.translateX) && !isUndefined(args === null || args === void 0 ? void 0 : args.translateY)) {
translateX = args === null || args === void 0 ? void 0 : args.translateX;
translateY = args === null || args === void 0 ? void 0 : args.translateY;
textBaseline = 'top';
textAlign = 'left';
}
else {
// default middle
// translateX = options.width / 2
// translateY = options.height / 2
// TextBaselineType = 'middle'
// textAlign = 'center'
result.advancedStyleParams.linear.x0 = -options.width / 2;
result.advancedStyleParams.linear.x1 = options.width / 2;
// result.advancedStyleParams.radial.x0 = 0
// result.advancedStyleParams.radial.y0 = 0
result.advancedStyleParams.radial.r0 = 0;
// result.advancedStyleParams.radial.x1 = 0
// result.advancedStyleParams.radial.y1 = 0
result.advancedStyleParams.radial.r1 = options.width / 2;
// result.advancedStyleParams.conic.x = 0
// result.advancedStyleParams.conic.y = 0
}
switch (args.translatePlacement) {
case 'top':
translateX = options.width / 2;
translateY = 0;
textBaseline = 'top';
// textAlign = 'center'
result.advancedStyleParams.linear.x0 = -options.width / 2;
result.advancedStyleParams.linear.x1 = options.width / 2;
// result.advancedStyleParams.radial.x0 = 0
result.advancedStyleParams.radial.y0 = (result.textLine.data.length * options.lineHeight) / 2;
// result.advancedStyleParams.radial.r0 = 0
// result.advancedStyleParams.radial.x1 = 0
// result.advancedStyleParams.radial.y1 = 0
result.advancedStyleParams.radial.y1 = (result.textLine.data.length * options.lineHeight) / 2;
// result.advancedStyleParams.radial.r1 = options.width / 2
// result.advancedStyleParams.conic.x = 0
result.advancedStyleParams.conic.y = (result.textLine.data.length * options.lineHeight) / 2;
break;
case 'top-start':
translateX = 0;
translateY = 0;
textBaseline = 'top';
textAlign = 'start';
result.advancedStyleParams.linear.x0 = 0;
result.advancedStyleParams.linear.x1 = options.width;
result.advancedStyleParams.radial.x0 = options.width / 2;
result.advancedStyleParams.radial.y0 = (result.textLine.data.length * options.lineHeight) / 2;
// result.advancedStyleParams.radial.r0 = 0
result.advancedStyleParams.radial.x1 = options.width / 2;
result.advancedStyleParams.radial.y1 = (result.textLine.data.length * options.lineHeight) / 2;
// result.advancedStyleParams.radial.r1 = options.width / 2
result.advancedStyleParams.conic.x = options.width / 2;
result.advancedStyleParams.conic.y = (result.textLine.data.length * options.lineHeight) / 2;
break;
case 'top-end':
translateX = options.width;
translateY = 0;
textBaseline = 'top';
textAlign = 'end';
result.advancedStyleParams.linear.x0 = 0;
result.advancedStyleParams.linear.x1 = -options.width;
result.advancedStyleParams.radial.x0 = -options.width / 2;
result.advancedStyleParams.radial.y0 = (result.textLine.data.length * options.lineHeight) / 2;
// result.advancedStyleParams.radial.r0 = 0
result.advancedStyleParams.radial.x1 = -options.width / 2;
result.advancedStyleParams.radial.y1 = (result.textLine.data.length * options.lineHeight) / 2;
// result.advancedStyleParams.radial.r1 = options.width / 2
result.advancedStyleParams.conic.x = -options.width / 2;
result.advancedStyleParams.conic.y = (result.textLine.data.length * options.lineHeight) / 2;
break;
case 'bottom':
translateX = options.width / 2;
translateY = options.height;
textBaseline = 'bottom';
// textAlign = 'center'
result.advancedStyleParams.linear.x0 = -options.width / 2;
result.advancedStyleParams.linear.x1 = options.width / 2;
// result.advancedStyleParams.radial.x0 = 0
result.advancedStyleParams.radial.y0 = (-result.textLine.data.length * options.lineHeight) / 2;
// result.advancedStyleParams.radial.r0 = 0
// result.advancedStyleParams.radial.x1 = 0
result.advancedStyleParams.radial.y1 = (-result.textLine.data.length * options.lineHeight) / 2;
// result.advancedStyleParams.radial.r1 = options.width / 2
result.advancedStyleParams.conic.x = 0;
result.advancedStyleParams.conic.y = (-result.textLine.data.length * options.lineHeight) / 2;
break;
case 'bottom-start':
translateX = 0;
translateY = options.height;
textBaseline = 'bottom';
textAlign = 'start';
result.advancedStyleParams.linear.x0 = 0;
result.advancedStyleParams.linear.x1 = options.width;
result.advancedStyleParams.radial.x0 = options.width / 2;
result.advancedStyleParams.radial.y0 = (-result.textLine.data.length * options.lineHeight) / 2;
// result.advancedStyleParams.radial.r0 = 0
result.advancedStyleParams.radial.x1 = options.width / 2;
result.advancedStyleParams.radial.y1 = (-result.textLine.data.length * options.lineHeight) / 2;
// result.advancedStyleParams.radial.r1 = options.width / 2
result.advancedStyleParams.conic.x = options.width / 2;
result.advancedStyleParams.conic.y = (-result.textLine.data.length * options.lineHeight) / 2;
break;
case 'bottom-end':
translateX = options.width;
translateY = options.height;
textBaseline = 'bottom';
textAlign = 'end';
result.advancedStyleParams.linear.x0 = 0;
result.advancedStyleParams.linear.x1 = -options.width;
result.advancedStyleParams.radial.x0 = -options.width / 2;
result.advancedStyleParams.radial.y0 = (-result.textLine.data.length * options.lineHeight) / 2;
// result.advancedStyleParams.radial.r0 = 0
result.advancedStyleParams.radial.x1 = -options.width / 2;
result.advancedStyleParams.radial.y1 = (-result.textLine.data.length * options.lineHeight) / 2;
// result.advancedStyleParams.radial.r1 = options.width / 2
result.advancedStyleParams.conic.x = -options.width / 2;
result.advancedStyleParams.conic.y = (-result.textLine.data.length * options.lineHeight) / 2;
break;
case 'left':
translateX = 0;
translateY = options.height / 2;
// TextBaselineType = 'middle'
textAlign = 'start';
result.advancedStyleParams.linear.x0 = 0;
result.advancedStyleParams.linear.x1 = options.width;
result.advancedStyleParams.radial.x0 = options.width / 2;
// result.advancedStyleParams.radial.y0 = 0
// result.advancedStyleParams.radial.r0 = 0
result.advancedStyleParams.radial.x1 = options.width / 2;
// result.advancedStyleParams.radial.y1 = 0
// result.advancedStyleParams.radial.r1 = options.width / 2
result.advancedStyleParams.conic.x = options.width / 2;
result.advancedStyleParams.conic.y = 0;
break;
case 'right':
translateX = options.width;
translateY = options.height / 2;
// TextBaselineType = 'middle'
textAlign = 'end';
result.advancedStyleParams.linear.x0 = 0;
result.advancedStyleParams.linear.x1 = -options.width;
result.advancedStyleParams.radial.x0 = -options.width / 2;
// result.advancedStyleParams.radial.y0 = 0
// result.advancedStyleParams.radial.r0 = 0
result.advancedStyleParams.radial.x1 = -options.width / 2;
// result.advancedStyleParams.radial.y1 = 0
// result.advancedStyleParams.radial.r1 = options.width / 2
result.advancedStyleParams.conic.x = -options.width / 2;
result.advancedStyleParams.conic.y = 0;
break;
}
options.translateX = translateX;
options.translateY = translateY;
isUndefined(args === null || args === void 0 ? void 0 : args.textBaseline) && (options.textBaseline = textBaseline);
isUndefined(args === null || args === void 0 ? void 0 : args.textAlign) && (options.textAlign = textAlign);
if (['text', 'multi-line-text'].includes(options.contentType)) {
switch (options.textBaseline) {
case 'middle':
result.textLine.yOffsetValue = ((result.textLine.data.length - 1) * options.lineHeight) / 2;
break;
case 'bottom':
case 'alphabetic':
case 'ideographic':
result.textLine.yOffsetValue =
(result.textLine.data.length - 1) * options.lineHeight + (options.lineHeight - parseInt(options.fontSize)) / 2;
break;
case 'top':
case 'hanging':
result.textLine.yOffsetValue = -options.lineHeight / 2 + parseInt(options.fontSize) / 2;
break;
}
}
return result;
};
export { generateRecommendOptions, initialOptions };