Skip to content
This repository has been archived by the owner on Jul 29, 2019. It is now read-only.

IE performance improvements #3425 #3489

Merged
merged 5 commits into from
Sep 29, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion lib/network/modules/InteractionHandler.js
Original file line number Diff line number Diff line change
Expand Up @@ -393,7 +393,7 @@ class InteractionHandler {
let diffY = pointer.y - this.drag.pointer.y;

this.body.view.translation = {x:this.drag.translation.x + diffX, y:this.drag.translation.y + diffY};
this.body.emitter.emit('_redraw');
this.body.emitter.emit('_requestRedraw');
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's it???? This resolves the IE issue??? Wow....

}
}
}
Expand Down
82 changes: 41 additions & 41 deletions lib/network/modules/components/shared/Label.js
Original file line number Diff line number Diff line change
Expand Up @@ -338,20 +338,27 @@ class Label {
if (this.elementOptions.label && viewFontSize < this.elementOptions.scaling.label.drawThreshold - 1)
return;

// This ensures that there will not be HUGE letters on screen
// by setting an upper limit on the visible text size (regardless of zoomLevel)
if (viewFontSize >= this.elementOptions.scaling.label.maxVisible) {
viewFontSize = Number(this.elementOptions.scaling.label.maxVisible) / this.body.view.scale;
}

// update the size cache if required
this.calculateLabelSize(ctx, selected, hover, x, y, baseline);
this._drawBackground(ctx, this.size.left, this.size.top);
this._drawText(ctx, x, this.size.yLine, baseline, viewFontSize);

this._drawBackground(ctx); // create the fontfill background
this._drawText(ctx, selected, hover, x, y, baseline);
}


/**
* Draws the label background
* @param {CanvasRenderingContext2D} ctx
* @param {number} x
* @param {number} y
* @private
*/
_drawBackground(ctx) {
_drawBackground(ctx, x, y) {
if (this.fontOptions.background !== undefined && this.fontOptions.background !== "none") {
ctx.fillStyle = this.fontOptions.background;

Expand All @@ -369,11 +376,11 @@ class Label {
ctx.fillRect(-this.size.width * 0.5, lineMargin, this.size.width, this.size.height);
break;
default:
ctx.fillRect(this.size.left, this.size.top - 0.5*lineMargin, this.size.width, this.size.height);
ctx.fillRect(x, y - 0.5*lineMargin, this.size.width, this.size.height);
break;
}
} else {
ctx.fillRect(this.size.left, this.size.top - 0.5*lineMargin, this.size.width, this.size.height);
ctx.fillRect(x, y - 0.5*lineMargin, this.size.width, this.size.height);
}
}
}
Expand All @@ -382,49 +389,39 @@ class Label {
/**
*
* @param {CanvasRenderingContext2D} ctx
* @param {boolean} selected
* @param {boolean} hover
* @param {number} x
* @param {number} y
* @param {string} [baseline='middle']
* @param {number} viewFontSize
* @private
*/
_drawText(ctx, selected, hover, x, y, baseline = 'middle') {
let fontSize = this.fontOptions.size;
let viewFontSize = fontSize * this.body.view.scale;
_drawText(ctx, x, y, baseline = 'middle', viewFontSize) {

// This ensures that there will not be HUGE letters on screen
// by setting an upper limit on the visible text size (regardless of zoomLevel)
if (viewFontSize >= this.elementOptions.scaling.label.maxVisible) {
// TODO: Does this actually do anything?
fontSize = Number(this.elementOptions.scaling.label.maxVisible) / this.body.view.scale;
}

let yLine = this.size.yLine;
[x, yLine] = this._setAlignment(ctx, x, yLine, baseline);
[x, y] = this._setAlignment(ctx, x, y, baseline);

ctx.textAlign = 'left';
x = x - this.size.width / 2; // Shift label 1/2-distance to the left
if ((this.fontOptions.valign) && (this.size.height > this.size.labelHeight)) {
if (this.fontOptions.valign === 'top') {
yLine -= (this.size.height - this.size.labelHeight) / 2;
y -= (this.size.height - this.size.labelHeight) / 2;
}
if (this.fontOptions.valign === 'bottom') {
yLine += (this.size.height - this.size.labelHeight) / 2;
y += (this.size.height - this.size.labelHeight) / 2;
}
}

// draw the text
for (let i = 0; i < this.lineCount; i++) {
if (this.lines[i] && this.lines[i].blocks) {
let line = this.lines[i];
if (line && line.blocks) {
let width = 0;
if (this.isEdgeLabel || this.fontOptions.align === 'center') {
width += (this.size.width - this.lines[i].width) / 2
width += (this.size.width - line.width) / 2
} else if (this.fontOptions.align === 'right') {
width += (this.size.width - this.lines[i].width)
width += (this.size.width - line.width)
}
for (let j = 0; j < this.lines[i].blocks.length; j++) {
let block = this.lines[i].blocks[j];
for (let j = 0; j < line.blocks.length; j++) {
let block = line.blocks[j];
ctx.font = block.font;
let [fontColor, strokeColor] = this._getColor(block.color, viewFontSize, block.strokeColor);
if (block.strokeWidth > 0) {
Expand All @@ -435,12 +432,12 @@ class Label {
ctx.fillStyle = fontColor;

if (block.strokeWidth > 0) {
ctx.strokeText(block.text, x + width, yLine + block.vadjust);
ctx.strokeText(block.text, x + width, y + block.vadjust);
}
ctx.fillText(block.text, x + width, yLine + block.vadjust);
ctx.fillText(block.text, x + width, y + block.vadjust);
width += block.width;
}
yLine += this.lines[i].height;
y += line.height;
}
}
}
Expand All @@ -449,26 +446,26 @@ class Label {
*
* @param {CanvasRenderingContext2D} ctx
* @param {number} x
* @param {number} yLine
* @param {number} y
* @param {string} baseline
* @returns {Array.<number>}
* @private
*/
_setAlignment(ctx, x, yLine, baseline) {
_setAlignment(ctx, x, y, baseline) {
// check for label alignment (for edges)
// TODO: make alignment for nodes
if (this.isEdgeLabel && this.fontOptions.align !== 'horizontal' && this.pointToSelf === false) {
x = 0;
yLine = 0;
y = 0;

let lineMargin = 2;
if (this.fontOptions.align === 'top') {
ctx.textBaseline = 'alphabetic';
yLine -= 2 * lineMargin; // distance from edge, required because we use alphabetic. Alphabetic has less difference between browsers
y -= 2 * lineMargin; // distance from edge, required because we use alphabetic. Alphabetic has less difference between browsers
}
else if (this.fontOptions.align === 'bottom') {
ctx.textBaseline = 'hanging';
yLine += 2 * lineMargin;// distance from edge, required because we use hanging. Hanging has less difference between browsers
y += 2 * lineMargin;// distance from edge, required because we use hanging. Hanging has less difference between browsers
}
else {
ctx.textBaseline = 'middle';
Expand All @@ -477,7 +474,7 @@ class Label {
else {
ctx.textBaseline = baseline;
}
return [x,yLine];
return [x,y];
}

/**
Expand Down Expand Up @@ -528,9 +525,7 @@ class Label {
* @param {'middle'|'hanging'} [baseline='middle']
*/
calculateLabelSize(ctx, selected, hover, x = 0, y = 0, baseline = 'middle') {
if (this.labelDirty === true) {
this._processLabel(ctx, selected, hover);
}
this._processLabel(ctx, selected, hover);
this.size.left = x - this.size.width * 0.5;
this.size.top = y - this.size.height * 0.5;
this.size.yLine = y + (1 - this.lineCount) * 0.5 * this.fontOptions.size;
Expand All @@ -539,7 +534,6 @@ class Label {
this.size.top += 4; // distance from node, required because we use hanging. Hanging has less difference between browsers
this.size.yLine += 4; // distance from node
}
this.labelDirty = false;
}


Expand Down Expand Up @@ -598,7 +592,7 @@ class Label {
* @returns {boolean}
*/
differentState(selected, hover) {
return ((selected !== this.fontOptions.selectedState) && (hover !== this.fontOptions.hoverState));
return ((selected !== this.selectedState) || (hover !== this.hoverState));
}


Expand Down Expand Up @@ -626,6 +620,10 @@ class Label {
* @private
*/
_processLabel(ctx, selected, hover) {

if(this.labelDirty === false && !this.differentState(selected,hover))
return;

let state = this._processLabelText(ctx, selected, hover, this.elementOptions.label);

if ((this.fontOptions.minWdt > 0) && (state.width < this.fontOptions.minWdt)) {
Expand All @@ -643,6 +641,8 @@ class Label {
this.size.height = state.height;
this.selectedState = selected;
this.hoverState = hover;

this.labelDirty = false;
}
}

Expand Down