123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220 |
- /**
- * mxAsyncCanvas
- */
- /**
- * Extends mxAbstractCanvas2D
- */
- function mxAsyncCanvas(htmlCanvas)
- {
- mxAbstractCanvas2D.call(this);
- this.htmlCanvas = htmlCanvas;
- htmlCanvas.images = htmlCanvas.images || [];
- htmlCanvas.subCanvas = htmlCanvas.subCanvas || [];
- };
- /**
- * Extends mxAbstractCanvas2D
- */
- mxUtils.extend(mxAsyncCanvas, mxAbstractCanvas2D);
- /**
- * Variable: htmlCanvas
- *
- * The canvas instance this object is obtaining async resources for
- */
- mxAsyncCanvas.prototype.htmlCanvas = null;
- /**
- * Variable: canvasIndex
- *
- * The current index into the canvas sub-canvas array being processed
- */
- mxAsyncCanvas.prototype.canvasIndex = 0;
- /**
- * Variable: ctx
- *
- * Holds the current canvas context
- */
- mxAsyncCanvas.prototype.waitCounter = 0;
- /**
- * Variable: ctx
- *
- * Holds the current canvas context
- */
- mxAsyncCanvas.prototype.onComplete = null;
- mxAsyncCanvas.prototype.incWaitCounter = function()
- {
- this.waitCounter++;
- };
-
- mxAsyncCanvas.prototype.decWaitCounter = function()
- {
- this.waitCounter--;
-
- if (this.waitCounter == 0 && this.onComplete != null)
- {
- this.onComplete();
- this.onComplete = null;
- }
- };
- mxAsyncCanvas.prototype.updateFont = function()
- {
- var style = '';
-
- if ((this.state.fontStyle & mxConstants.FONT_BOLD) == mxConstants.FONT_BOLD)
- {
- style += 'bold ';
- }
-
- if ((this.state.fontStyle & mxConstants.FONT_ITALIC) == mxConstants.FONT_ITALIC)
- {
- style += 'italic ';
- }
-
- this.ctx.font = style + this.state.fontSize + 'px ' + this.state.fontFamily;
- };
- mxAsyncCanvas.prototype.rotate = function(theta, flipH, flipV, cx, cy)
- {
- };
- mxAsyncCanvas.prototype.setAlpha = function(alpha)
- {
- this.state.alpha = alpha;
- };
- mxAsyncCanvas.prototype.setFontColor = function(value)
- {
- this.state.fontColor = value;
- };
- mxAsyncCanvas.prototype.setFontBackgroundColor = function(value)
- {
- if (value == mxConstants.NONE)
- {
- value = null;
- }
-
- this.state.fontBackgroundColor = value;
- };
- mxAsyncCanvas.prototype.setFontBorderColor = function(value)
- {
- if (value == mxConstants.NONE)
- {
- value = null;
- }
-
- this.state.fontBorderColor = value;
- };
- mxAsyncCanvas.prototype.setFontSize = function(value)
- {
- this.state.fontSize = value;
- };
- mxAsyncCanvas.prototype.setFontFamily = function(value)
- {
- this.state.fontFamily = value;
- };
- mxAsyncCanvas.prototype.setFontStyle = function(value)
- {
- this.state.fontStyle = value;
- };
- mxAsyncCanvas.prototype.rect = function(x, y, w, h) {};
- mxAsyncCanvas.prototype.roundrect = function(x, y, w, h, dx, dy) {};
- mxAsyncCanvas.prototype.ellipse = function(x, y, w, h) {};
- //Redirect can be implemented via a hook
- mxAsyncCanvas.prototype.rewriteImageSource = function(src)
- {
- if (src.substring(0, 7) == 'http://' || src.substring(0, 8) == 'https://')
- {
- src = '/proxy?url=' + encodeURIComponent(src);
- }
-
- return src;
- };
- mxAsyncCanvas.prototype.image = function(x, y, w, h, src, aspect, flipH, flipV)
- {
- src = this.rewriteImageSource(src);
- var image = this.htmlCanvas.images[src];
-
- if (image == null)
- {
- var image = new Image();
-
- image.onload = mxUtils.bind(this, function()
- {
- this.decWaitCounter();
- });
-
- image.onerror = mxUtils.bind(this, function()
- {
- this.decWaitCounter();
- // TODO null the image out? this.htmlCanvas.images[src] = null;
- });
- this.incWaitCounter();
- this.htmlCanvas.images[src] = image;
- image.src = src;
- }
- };
- mxAsyncCanvas.prototype.fill = function() {};
- mxAsyncCanvas.prototype.stroke = function() {};
- mxAsyncCanvas.prototype.fillAndStroke = function() {};
-
- mxAsyncCanvas.prototype.text = function(x, y, w, h, str, align, valign, wrap, format, overflow, clip, rotation)
- {
- if (str == null || str.length == 0)
- {
- return;
- }
- var sc = this.state.scale;
- if (format == 'html' && typeof html2canvas === 'function')
- {
- this.incWaitCounter();
- var canvasIndex = this.canvasIndex++;
-
- html2canvas(str,
- {
- onrendered: mxUtils.bind(this, function(canvas)
- {
- this.htmlCanvas.subCanvas[canvasIndex] = canvas;
- this.decWaitCounter();
- }),
- scale: sc,
- logging: true
- });
- }
- };
- mxAsyncCanvas.prototype.finish = function(handler)
- {
- // TODO: Check if waitCounter updates need a monitor. Question is
- // if image load-handler can be executed in parallel leading to
- // race conditions when updating the "shared" waitCounter.
- if (this.waitCounter == 0)
- {
- handler();
- }
- else
- {
- this.onComplete = handler;
- }
- };
|