blob: 53ea1785e473df5b323f2add9ea67a7a492894da [file] [log] [blame]
/**
* VML Painter.
*
* @module zrender/vml/Painter
*/
import zrLog from '../core/log';
import * as vmlCore from './core';
import { each } from '../core/util';
function parseInt10(val) {
return parseInt(val, 10);
}
/**
* @alias module:zrender/vml/Painter
*/
function VMLPainter(root, storage) {
vmlCore.initVML();
this.root = root;
this.storage = storage;
var vmlViewport = document.createElement('div');
var vmlRoot = document.createElement('div');
vmlViewport.style.cssText = 'display:inline-block;overflow:hidden;position:relative;width:300px;height:150px;';
vmlRoot.style.cssText = 'position:absolute;left:0;top:0;';
root.appendChild(vmlViewport);
this._vmlRoot = vmlRoot;
this._vmlViewport = vmlViewport;
this.resize(); // Modify storage
var oldDelFromStorage = storage.delFromStorage;
var oldAddToStorage = storage.addToStorage;
storage.delFromStorage = function (el) {
oldDelFromStorage.call(storage, el);
if (el) {
el.onRemove && el.onRemove(vmlRoot);
}
};
storage.addToStorage = function (el) {
// Displayable already has a vml node
el.onAdd && el.onAdd(vmlRoot);
oldAddToStorage.call(storage, el);
};
this._firstPaint = true;
}
VMLPainter.prototype = {
constructor: VMLPainter,
getType: function () {
return 'vml';
},
/**
* @return {HTMLDivElement}
*/
getViewportRoot: function () {
return this._vmlViewport;
},
getViewportRootOffset: function () {
var viewportRoot = this.getViewportRoot();
if (viewportRoot) {
return {
offsetLeft: viewportRoot.offsetLeft || 0,
offsetTop: viewportRoot.offsetTop || 0
};
}
},
/**
* 刷新
*/
refresh: function () {
var list = this.storage.getDisplayList(true, true);
this._paintList(list);
},
_paintList: function (list) {
var vmlRoot = this._vmlRoot;
for (var i = 0; i < list.length; i++) {
var el = list[i];
if (el.invisible || el.ignore) {
if (!el.__alreadyNotVisible) {
el.onRemove(vmlRoot);
} // Set as already invisible
el.__alreadyNotVisible = true;
} else {
if (el.__alreadyNotVisible) {
el.onAdd(vmlRoot);
}
el.__alreadyNotVisible = false;
if (el.__dirty) {
el.beforeBrush && el.beforeBrush();
(el.brushVML || el.brush).call(el, vmlRoot);
el.afterBrush && el.afterBrush();
}
}
el.__dirty = false;
}
if (this._firstPaint) {
// Detached from document at first time
// to avoid page refreshing too many times
// FIXME 如果每次都先 removeChild 可能会导致一些填充和描边的效果改变
this._vmlViewport.appendChild(vmlRoot);
this._firstPaint = false;
}
},
resize: function (width, height) {
var width = width == null ? this._getWidth() : width;
var height = height == null ? this._getHeight() : height;
if (this._width != width || this._height != height) {
this._width = width;
this._height = height;
var vmlViewportStyle = this._vmlViewport.style;
vmlViewportStyle.width = width + 'px';
vmlViewportStyle.height = height + 'px';
}
},
dispose: function () {
this.root.innerHTML = '';
this._vmlRoot = this._vmlViewport = this.storage = null;
},
getWidth: function () {
return this._width;
},
getHeight: function () {
return this._height;
},
clear: function () {
if (this._vmlViewport) {
this.root.removeChild(this._vmlViewport);
}
},
_getWidth: function () {
var root = this.root;
var stl = root.currentStyle;
return (root.clientWidth || parseInt10(stl.width)) - parseInt10(stl.paddingLeft) - parseInt10(stl.paddingRight) | 0;
},
_getHeight: function () {
var root = this.root;
var stl = root.currentStyle;
return (root.clientHeight || parseInt10(stl.height)) - parseInt10(stl.paddingTop) - parseInt10(stl.paddingBottom) | 0;
}
}; // Not supported methods
function createMethodNotSupport(method) {
return function () {
zrLog('In IE8.0 VML mode painter not support method "' + method + '"');
};
} // Unsupported methods
each(['getLayer', 'insertLayer', 'eachLayer', 'eachBuiltinLayer', 'eachOtherLayer', 'getLayers', 'modLayer', 'delLayer', 'clearLayer', 'toDataURL', 'pathToImage'], function (name) {
VMLPainter.prototype[name] = createMethodNotSupport(name);
});
export default VMLPainter;