NuclearDispersionSystem/ant-design-vue-jeecg/node_modules/@antv/g/lib/shapes/text.js

277 lines
6.6 KiB
Java
Raw Normal View History

2023-09-14 14:47:11 +08:00
var Util = require('../util/index');
var Shape = require('../core/shape');
var CText = function CText(cfg) {
CText.superclass.constructor.call(this, cfg);
};
CText.ATTRS = {
x: 0,
y: 0,
text: null,
fontSize: 12,
fontFamily: 'sans-serif',
fontStyle: 'normal',
fontWeight: 'normal',
fontVariant: 'normal',
textAlign: 'start',
textBaseline: 'bottom',
lineHeight: null,
textArr: null
};
Util.extend(CText, Shape);
Util.augment(CText, {
canFill: true,
canStroke: true,
type: 'text',
getDefaultAttrs: function getDefaultAttrs() {
return {
lineWidth: 1,
lineCount: 1,
fontSize: 12,
fontFamily: 'sans-serif',
fontStyle: 'normal',
fontWeight: 'normal',
fontVariant: 'normal',
textAlign: 'start',
textBaseline: 'bottom'
};
},
initTransform: function initTransform() {
var fontSize = this._attrs.fontSize;
if (fontSize && +fontSize < 12) {
// 小于 12 像素的文本进行 scale 处理
this.transform([['t', -1 * this._attrs.x, -1 * this._attrs.y], ['s', +fontSize / 12, +fontSize / 12], ['t', this._attrs.x, this._attrs.y]]);
}
},
_assembleFont: function _assembleFont() {
// var self = this;
var attrs = this._attrs;
var fontSize = attrs.fontSize;
var fontFamily = attrs.fontFamily;
var fontWeight = attrs.fontWeight;
var fontStyle = attrs.fontStyle; // self.attr('fontStyle');
var fontVariant = attrs.fontVariant; // self.attr('fontVariant');
// self.attr('font', [fontStyle, fontVariant, fontWeight, fontSize + 'px', fontFamily].join(' '));
attrs.font = [fontStyle, fontVariant, fontWeight, fontSize + 'px', fontFamily].join(' ');
},
_setAttrText: function _setAttrText() {
var attrs = this._attrs;
var text = attrs.text;
var textArr = null;
if (Util.isString(text)) {
if (text.indexOf('\n') !== -1) {
textArr = text.split('\n');
var lineCount = textArr.length;
attrs.lineCount = lineCount;
} else {
attrs.lineCount = 1;
}
}
attrs.textArr = textArr;
},
_getTextHeight: function _getTextHeight() {
var attrs = this._attrs;
var lineCount = attrs.lineCount;
var fontSize = attrs.fontSize * 1;
if (lineCount > 1) {
var spaceingY = this._getSpaceingY();
return fontSize * lineCount + spaceingY * (lineCount - 1);
}
return fontSize;
},
isHitBox: function isHitBox() {
return false;
},
calculateBox: function calculateBox() {
var self = this;
var attrs = self._attrs;
var cfg = this._cfg;
if (!cfg.attrs || cfg.hasUpdate) {
this._assembleFont();
this._setAttrText();
}
if (!attrs.textArr) {
this._setAttrText();
}
var x = attrs.x;
var y = attrs.y;
var width = self.measureText(); // attrs.width
if (!width) {
// 如果width不存在四点共其实点
return {
minX: x,
minY: y,
maxX: x,
maxY: y
};
}
var height = self._getTextHeight(); // attrs.height
var textAlign = attrs.textAlign;
var textBaseline = attrs.textBaseline;
var lineWidth = self.getHitLineWidth();
var point = {
x: x,
y: y - height
};
if (textAlign) {
if (textAlign === 'end' || textAlign === 'right') {
point.x -= width;
} else if (textAlign === 'center') {
point.x -= width / 2;
}
}
if (textBaseline) {
if (textBaseline === 'top') {
point.y += height;
} else if (textBaseline === 'middle') {
point.y += height / 2;
}
}
this.set('startPoint', point);
var halfWidth = lineWidth / 2;
return {
minX: point.x - halfWidth,
minY: point.y - halfWidth,
maxX: point.x + width + halfWidth,
maxY: point.y + height + halfWidth
};
},
_getSpaceingY: function _getSpaceingY() {
var attrs = this._attrs;
var lineHeight = attrs.lineHeight;
var fontSize = attrs.fontSize * 1;
return lineHeight ? lineHeight - fontSize : fontSize * 0.14;
},
drawInner: function drawInner(context) {
var self = this;
var attrs = self._attrs;
var cfg = this._cfg;
if (!cfg.attrs || cfg.hasUpdate) {
this._assembleFont();
this._setAttrText();
}
context.font = attrs.font;
var text = attrs.text;
if (!text) {
return;
}
var textArr = attrs.textArr;
var x = attrs.x;
var y = attrs.y;
context.beginPath();
if (self.hasStroke()) {
var strokeOpacity = attrs.strokeOpacity;
if (!Util.isNil(strokeOpacity) && strokeOpacity !== 1) {
context.globalAlpha = strokeOpacity;
}
if (textArr) {
self._drawTextArr(context, false);
} else {
context.strokeText(text, x, y);
}
context.globalAlpha = 1;
}
if (self.hasFill()) {
var fillOpacity = attrs.fillOpacity;
if (!Util.isNil(fillOpacity) && fillOpacity !== 1) {
context.globalAlpha = fillOpacity;
}
if (textArr) {
self._drawTextArr(context, true);
} else {
context.fillText(text, x, y);
}
}
cfg.hasUpdate = false;
},
_drawTextArr: function _drawTextArr(context, fill) {
var textArr = this._attrs.textArr;
var textBaseline = this._attrs.textBaseline;
var fontSize = this._attrs.fontSize * 1;
var spaceingY = this._getSpaceingY();
var x = this._attrs.x;
var y = this._attrs.y;
var box = this.getBBox();
var height = box.maxY - box.minY;
var subY;
Util.each(textArr, function (subText, index) {
subY = y + index * (spaceingY + fontSize) - height + fontSize; // bottom;
if (textBaseline === 'middle') subY += height - fontSize - (height - fontSize) / 2;
if (textBaseline === 'top') subY += height - fontSize;
if (fill) {
context.fillText(subText, x, subY);
} else {
context.strokeText(subText, x, subY);
}
});
},
measureText: function measureText() {
var self = this;
var attrs = self._attrs;
var text = attrs.text;
var font = attrs.font;
var textArr = attrs.textArr;
var measureWidth;
var width = 0;
if (Util.isNil(text)) return undefined;
var context = document.createElement('canvas').getContext('2d');
context.save();
context.font = font;
if (textArr) {
Util.each(textArr, function (subText) {
measureWidth = context.measureText(subText).width;
if (width < measureWidth) {
width = measureWidth;
}
context.restore();
});
} else {
width = context.measureText(text).width;
context.restore();
}
return width;
}
});
module.exports = CText;