667 lines
17 KiB
JavaScript
667 lines
17 KiB
JavaScript
|
import FillStylePattern from './FillStylePattern';
|
||
|
import FillStyleLinearGradient from './FillStyleLinearGradient';
|
||
|
import FillStyleRadialGradient from './FillStyleRadialGradient';
|
||
|
import GImage from '../env/image.js';
|
||
|
import {
|
||
|
ArrayBufferToBase64,
|
||
|
Base64ToUint8ClampedArray
|
||
|
} from '../env/tool.js';
|
||
|
|
||
|
export default class CanvasRenderingContext2D {
|
||
|
|
||
|
_drawCommands = '';
|
||
|
|
||
|
_globalAlpha = 1.0;
|
||
|
|
||
|
_fillStyle = 'rgb(0,0,0)';
|
||
|
_strokeStyle = 'rgb(0,0,0)';
|
||
|
|
||
|
_lineWidth = 1;
|
||
|
_lineCap = 'butt';
|
||
|
_lineJoin = 'miter';
|
||
|
|
||
|
_miterLimit = 10;
|
||
|
|
||
|
_globalCompositeOperation = 'source-over';
|
||
|
|
||
|
_textAlign = 'start';
|
||
|
_textBaseline = 'alphabetic';
|
||
|
|
||
|
_font = '10px sans-serif';
|
||
|
|
||
|
_savedGlobalAlpha = [];
|
||
|
|
||
|
timer = null;
|
||
|
componentId = null;
|
||
|
|
||
|
_notCommitDrawImageCache = [];
|
||
|
_needRedrawImageCache = [];
|
||
|
_redrawCommands = '';
|
||
|
_autoSaveContext = true;
|
||
|
// _imageMap = new GHashMap();
|
||
|
// _textureMap = new GHashMap();
|
||
|
|
||
|
constructor() {
|
||
|
this.className = 'CanvasRenderingContext2D';
|
||
|
//this.save()
|
||
|
}
|
||
|
|
||
|
setFillStyle(value) {
|
||
|
this.fillStyle = value;
|
||
|
}
|
||
|
|
||
|
set fillStyle(value) {
|
||
|
this._fillStyle = value;
|
||
|
|
||
|
if (typeof(value) == 'string') {
|
||
|
this._drawCommands = this._drawCommands.concat("F" + value + ";");
|
||
|
} else if (value instanceof FillStylePattern) {
|
||
|
const image = value._img;
|
||
|
if (!image.complete) {
|
||
|
image.onload = () => {
|
||
|
var index = this._needRedrawImageCache.indexOf(image);
|
||
|
if (index > -1) {
|
||
|
this._needRedrawImageCache.splice(index, 1);
|
||
|
CanvasRenderingContext2D.GBridge.bindImageTexture(this.componentId, image.src, image._id);
|
||
|
this._redrawflush(true);
|
||
|
}
|
||
|
}
|
||
|
this._notCommitDrawImageCache.push(image);
|
||
|
} else {
|
||
|
CanvasRenderingContext2D.GBridge.bindImageTexture(this.componentId, image.src, image._id);
|
||
|
}
|
||
|
|
||
|
//CanvasRenderingContext2D.GBridge.bindImageTexture(this.componentId, image.src, image._id);
|
||
|
this._drawCommands = this._drawCommands.concat("G" + image._id + "," + value._style + ";");
|
||
|
} else if (value instanceof FillStyleLinearGradient) {
|
||
|
var command = "D" + value._start_pos._x.toFixed(2) + "," + value._start_pos._y.toFixed(2) + "," +
|
||
|
value._end_pos._x.toFixed(2) + "," + value._end_pos._y.toFixed(2) + "," +
|
||
|
value._stop_count;
|
||
|
for (var i = 0; i < value._stop_count; ++i) {
|
||
|
command += ("," + value._stops[i]._pos + "," + value._stops[i]._color);
|
||
|
}
|
||
|
this._drawCommands = this._drawCommands.concat(command + ";");
|
||
|
} else if (value instanceof FillStyleRadialGradient) {
|
||
|
var command = "H" + value._start_pos._x.toFixed(2) + "," + value._start_pos._y.toFixed(2) + "," + value._start_pos._r
|
||
|
.toFixed(2) + "," +
|
||
|
value._end_pos._x.toFixed(2) + "," + value._end_pos._y.toFixed(2) + "," + value._end_pos._r.toFixed(2) + "," +
|
||
|
value._stop_count;
|
||
|
for (var i = 0; i < value._stop_count; ++i) {
|
||
|
command += ("," + value._stops[i]._pos + "," + value._stops[i]._color);
|
||
|
}
|
||
|
this._drawCommands = this._drawCommands.concat(command + ";");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
get fillStyle() {
|
||
|
return this._fillStyle;
|
||
|
}
|
||
|
|
||
|
get globalAlpha() {
|
||
|
return this._globalAlpha;
|
||
|
}
|
||
|
|
||
|
setGlobalAlpha(value) {
|
||
|
this.globalAlpha = value;
|
||
|
}
|
||
|
|
||
|
set globalAlpha(value) {
|
||
|
this._globalAlpha = value;
|
||
|
this._drawCommands = this._drawCommands.concat("a" + value.toFixed(2) + ";");
|
||
|
}
|
||
|
|
||
|
|
||
|
get strokeStyle() {
|
||
|
return this._strokeStyle;
|
||
|
}
|
||
|
|
||
|
setStrokeStyle(value) {
|
||
|
this.strokeStyle = value;
|
||
|
}
|
||
|
|
||
|
set strokeStyle(value) {
|
||
|
|
||
|
this._strokeStyle = value;
|
||
|
|
||
|
if (typeof(value) == 'string') {
|
||
|
this._drawCommands = this._drawCommands.concat("S" + value + ";");
|
||
|
} else if (value instanceof FillStylePattern) {
|
||
|
CanvasRenderingContext2D.GBridge.bindImageTexture(this.componentId, image.src, image._id);
|
||
|
this._drawCommands = this._drawCommands.concat("G" + image._id + "," + value._style + ";");
|
||
|
} else if (value instanceof FillStyleLinearGradient) {
|
||
|
var command = "D" + value._start_pos._x.toFixed(2) + "," + value._start_pos._y.toFixed(2) + "," +
|
||
|
value._end_pos._x.toFixed(2) + "," + value._end_pos._y.toFixed(2) + "," +
|
||
|
value._stop_count;
|
||
|
|
||
|
for (var i = 0; i < value._stop_count; ++i) {
|
||
|
command += ("," + value._stops[i]._pos + "," + value._stops[i]._color);
|
||
|
}
|
||
|
this._drawCommands = this._drawCommands.concat(command + ";");
|
||
|
} else if (value instanceof FillStyleRadialGradient) {
|
||
|
var command = "H" + value._start_pos._x.toFixed(2) + "," + value._start_pos._y.toFixed(2) + "," + value._start_pos._r
|
||
|
.toFixed(2) + "," +
|
||
|
value._end_pos._x.toFixed(2) + "," + value._end_pos._y + ",".toFixed(2) + value._end_pos._r.toFixed(2) + "," +
|
||
|
value._stop_count;
|
||
|
|
||
|
for (var i = 0; i < value._stop_count; ++i) {
|
||
|
command += ("," + value._stops[i]._pos + "," + value._stops[i]._color);
|
||
|
}
|
||
|
this._drawCommands = this._drawCommands.concat(command + ";");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
get lineWidth() {
|
||
|
return this._lineWidth;
|
||
|
}
|
||
|
|
||
|
setLineWidth(value) {
|
||
|
this.lineWidth = value;
|
||
|
}
|
||
|
|
||
|
set lineWidth(value) {
|
||
|
this._lineWidth = value;
|
||
|
this._drawCommands = this._drawCommands.concat("W" + value + ";");
|
||
|
}
|
||
|
|
||
|
get lineCap() {
|
||
|
return this._lineCap;
|
||
|
}
|
||
|
|
||
|
setLineCap(value) {
|
||
|
this.lineCap = value;
|
||
|
}
|
||
|
|
||
|
set lineCap(value) {
|
||
|
this._lineCap = value;
|
||
|
this._drawCommands = this._drawCommands.concat("C" + value + ";");
|
||
|
}
|
||
|
|
||
|
get lineJoin() {
|
||
|
return this._lineJoin;
|
||
|
}
|
||
|
|
||
|
setLineJoin(value) {
|
||
|
this.lineJoin = value
|
||
|
}
|
||
|
|
||
|
set lineJoin(value) {
|
||
|
this._lineJoin = value;
|
||
|
this._drawCommands = this._drawCommands.concat("J" + value + ";");
|
||
|
}
|
||
|
|
||
|
get miterLimit() {
|
||
|
return this._miterLimit;
|
||
|
}
|
||
|
|
||
|
setMiterLimit(value) {
|
||
|
this.miterLimit = value
|
||
|
}
|
||
|
|
||
|
set miterLimit(value) {
|
||
|
this._miterLimit = value;
|
||
|
this._drawCommands = this._drawCommands.concat("M" + value + ";");
|
||
|
}
|
||
|
|
||
|
get globalCompositeOperation() {
|
||
|
return this._globalCompositeOperation;
|
||
|
}
|
||
|
|
||
|
set globalCompositeOperation(value) {
|
||
|
|
||
|
this._globalCompositeOperation = value;
|
||
|
let mode = 0;
|
||
|
switch (value) {
|
||
|
case "source-over":
|
||
|
mode = 0;
|
||
|
break;
|
||
|
case "source-atop":
|
||
|
mode = 5;
|
||
|
break;
|
||
|
case "source-in":
|
||
|
mode = 0;
|
||
|
break;
|
||
|
case "source-out":
|
||
|
mode = 2;
|
||
|
break;
|
||
|
case "destination-over":
|
||
|
mode = 4;
|
||
|
break;
|
||
|
case "destination-atop":
|
||
|
mode = 4;
|
||
|
break;
|
||
|
case "destination-in":
|
||
|
mode = 4;
|
||
|
break;
|
||
|
case "destination-out":
|
||
|
mode = 3;
|
||
|
break;
|
||
|
case "lighter":
|
||
|
mode = 1;
|
||
|
break;
|
||
|
case "copy":
|
||
|
mode = 2;
|
||
|
break;
|
||
|
case "xor":
|
||
|
mode = 6;
|
||
|
break;
|
||
|
default:
|
||
|
mode = 0;
|
||
|
}
|
||
|
|
||
|
this._drawCommands = this._drawCommands.concat("B" + mode + ";");
|
||
|
}
|
||
|
|
||
|
get textAlign() {
|
||
|
return this._textAlign;
|
||
|
}
|
||
|
|
||
|
setTextAlign(value) {
|
||
|
this.textAlign = value
|
||
|
}
|
||
|
|
||
|
set textAlign(value) {
|
||
|
|
||
|
this._textAlign = value;
|
||
|
let Align = 0;
|
||
|
switch (value) {
|
||
|
case "start":
|
||
|
Align = 0;
|
||
|
break;
|
||
|
case "end":
|
||
|
Align = 1;
|
||
|
break;
|
||
|
case "left":
|
||
|
Align = 2;
|
||
|
break;
|
||
|
case "center":
|
||
|
Align = 3;
|
||
|
break;
|
||
|
case "right":
|
||
|
Align = 4;
|
||
|
break;
|
||
|
default:
|
||
|
Align = 0;
|
||
|
}
|
||
|
|
||
|
this._drawCommands = this._drawCommands.concat("A" + Align + ";");
|
||
|
}
|
||
|
|
||
|
get textBaseline() {
|
||
|
return this._textBaseline;
|
||
|
}
|
||
|
|
||
|
setTextBaseline(value) {
|
||
|
this.textBaseline = value
|
||
|
}
|
||
|
|
||
|
set textBaseline(value) {
|
||
|
this._textBaseline = value;
|
||
|
let baseline = 0;
|
||
|
switch (value) {
|
||
|
case "alphabetic":
|
||
|
baseline = 0;
|
||
|
break;
|
||
|
case "middle":
|
||
|
baseline = 1;
|
||
|
break;
|
||
|
case "top":
|
||
|
baseline = 2;
|
||
|
break;
|
||
|
case "hanging":
|
||
|
baseline = 3;
|
||
|
break;
|
||
|
case "bottom":
|
||
|
baseline = 4;
|
||
|
break;
|
||
|
case "ideographic":
|
||
|
baseline = 5;
|
||
|
break;
|
||
|
default:
|
||
|
baseline = 0;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
this._drawCommands = this._drawCommands.concat("E" + baseline + ";");
|
||
|
}
|
||
|
|
||
|
get font() {
|
||
|
return this._font;
|
||
|
}
|
||
|
|
||
|
setFontSize(size) {
|
||
|
var str = this._font;
|
||
|
var strs = str.trim().split(/\s+/);
|
||
|
for (var i = 0; i < strs.length; i++) {
|
||
|
var values = ["normal", "italic", "oblique", "normal", "small-caps", "normal", "bold",
|
||
|
"bolder", "lighter", "100", "200", "300", "400", "500", "600", "700", "800", "900",
|
||
|
"normal", "ultra-condensed", "extra-condensed", "condensed", "semi-condensed",
|
||
|
"semi-expanded", "expanded", "extra-expanded", "ultra-expanded"
|
||
|
];
|
||
|
|
||
|
if (-1 == values.indexOf(strs[i].trim())) {
|
||
|
if (typeof size === 'string') {
|
||
|
strs[i] = size;
|
||
|
} else if (typeof size === 'number') {
|
||
|
strs[i] = String(size) + 'px';
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
this.font = strs.join(" ");
|
||
|
}
|
||
|
|
||
|
set font(value) {
|
||
|
this._font = value;
|
||
|
this._drawCommands = this._drawCommands.concat("j" + value + ";");
|
||
|
}
|
||
|
|
||
|
setTransform(a, b, c, d, tx, ty) {
|
||
|
this._drawCommands = this._drawCommands.concat("t" +
|
||
|
(a === 1 ? "1" : a.toFixed(2)) + "," +
|
||
|
(b === 0 ? "0" : b.toFixed(2)) + "," +
|
||
|
(c === 0 ? "0" : c.toFixed(2)) + "," +
|
||
|
(d === 1 ? "1" : d.toFixed(2)) + "," + tx.toFixed(2) + "," + ty.toFixed(2) + ";");
|
||
|
}
|
||
|
|
||
|
transform(a, b, c, d, tx, ty) {
|
||
|
this._drawCommands = this._drawCommands.concat("f" +
|
||
|
(a === 1 ? "1" : a.toFixed(2)) + "," +
|
||
|
(b === 0 ? "0" : b.toFixed(2)) + "," +
|
||
|
(c === 0 ? "0" : c.toFixed(2)) + "," +
|
||
|
(d === 1 ? "1" : d.toFixed(2)) + "," + tx + "," + ty + ";");
|
||
|
}
|
||
|
|
||
|
resetTransform() {
|
||
|
this._drawCommands = this._drawCommands.concat("m;");
|
||
|
}
|
||
|
|
||
|
scale(a, d) {
|
||
|
this._drawCommands = this._drawCommands.concat("k" + a.toFixed(2) + "," +
|
||
|
d.toFixed(2) + ";");
|
||
|
}
|
||
|
|
||
|
rotate(angle) {
|
||
|
this._drawCommands = this._drawCommands
|
||
|
.concat("r" + angle.toFixed(6) + ";");
|
||
|
}
|
||
|
|
||
|
translate(tx, ty) {
|
||
|
this._drawCommands = this._drawCommands.concat("l" + tx.toFixed(2) + "," + ty.toFixed(2) + ";");
|
||
|
}
|
||
|
|
||
|
save() {
|
||
|
this._savedGlobalAlpha.push(this._globalAlpha);
|
||
|
this._drawCommands = this._drawCommands.concat("v;");
|
||
|
}
|
||
|
|
||
|
restore() {
|
||
|
this._drawCommands = this._drawCommands.concat("e;");
|
||
|
this._globalAlpha = this._savedGlobalAlpha.pop();
|
||
|
}
|
||
|
|
||
|
createPattern(img, pattern) {
|
||
|
if (typeof img === 'string') {
|
||
|
var imgObj = new GImage();
|
||
|
imgObj.src = img;
|
||
|
img = imgObj;
|
||
|
}
|
||
|
return new FillStylePattern(img, pattern);
|
||
|
}
|
||
|
|
||
|
createLinearGradient(x0, y0, x1, y1) {
|
||
|
return new FillStyleLinearGradient(x0, y0, x1, y1);
|
||
|
}
|
||
|
|
||
|
createRadialGradient = function(x0, y0, r0, x1, y1, r1) {
|
||
|
return new FillStyleRadialGradient(x0, y0, r0, x1, y1, r1);
|
||
|
};
|
||
|
|
||
|
createCircularGradient = function(x0, y0, r0) {
|
||
|
return new FillStyleRadialGradient(x0, y0, 0, x0, y0, r0);
|
||
|
};
|
||
|
|
||
|
strokeRect(x, y, w, h) {
|
||
|
this._drawCommands = this._drawCommands.concat("s" + x + "," + y + "," + w + "," + h + ";");
|
||
|
}
|
||
|
|
||
|
|
||
|
clearRect(x, y, w, h) {
|
||
|
this._drawCommands = this._drawCommands.concat("c" + x + "," + y + "," + w +
|
||
|
"," + h + ";");
|
||
|
}
|
||
|
|
||
|
clip() {
|
||
|
this._drawCommands = this._drawCommands.concat("p;");
|
||
|
}
|
||
|
|
||
|
resetClip() {
|
||
|
this._drawCommands = this._drawCommands.concat("q;");
|
||
|
}
|
||
|
|
||
|
closePath() {
|
||
|
this._drawCommands = this._drawCommands.concat("o;");
|
||
|
}
|
||
|
|
||
|
moveTo(x, y) {
|
||
|
this._drawCommands = this._drawCommands.concat("g" + x.toFixed(2) + "," + y.toFixed(2) + ";");
|
||
|
}
|
||
|
|
||
|
lineTo(x, y) {
|
||
|
this._drawCommands = this._drawCommands.concat("i" + x.toFixed(2) + "," + y.toFixed(2) + ";");
|
||
|
}
|
||
|
|
||
|
quadraticCurveTo = function(cpx, cpy, x, y) {
|
||
|
this._drawCommands = this._drawCommands.concat("u" + cpx + "," + cpy + "," + x + "," + y + ";");
|
||
|
}
|
||
|
|
||
|
bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y, ) {
|
||
|
this._drawCommands = this._drawCommands.concat(
|
||
|
"z" + cp1x.toFixed(2) + "," + cp1y.toFixed(2) + "," + cp2x.toFixed(2) + "," + cp2y.toFixed(2) + "," +
|
||
|
x.toFixed(2) + "," + y.toFixed(2) + ";");
|
||
|
}
|
||
|
|
||
|
arcTo(x1, y1, x2, y2, radius) {
|
||
|
this._drawCommands = this._drawCommands.concat("h" + x1 + "," + y1 + "," + x2 + "," + y2 + "," + radius + ";");
|
||
|
}
|
||
|
|
||
|
beginPath() {
|
||
|
this._drawCommands = this._drawCommands.concat("b;");
|
||
|
}
|
||
|
|
||
|
|
||
|
fillRect(x, y, w, h) {
|
||
|
this._drawCommands = this._drawCommands.concat("n" + x + "," + y + "," + w +
|
||
|
"," + h + ";");
|
||
|
}
|
||
|
|
||
|
rect(x, y, w, h) {
|
||
|
this._drawCommands = this._drawCommands.concat("w" + x + "," + y + "," + w + "," + h + ";");
|
||
|
}
|
||
|
|
||
|
fill() {
|
||
|
this._drawCommands = this._drawCommands.concat("L;");
|
||
|
}
|
||
|
|
||
|
stroke(path) {
|
||
|
this._drawCommands = this._drawCommands.concat("x;");
|
||
|
}
|
||
|
|
||
|
arc(x, y, radius, startAngle, endAngle, anticlockwise) {
|
||
|
|
||
|
let ianticlockwise = 0;
|
||
|
if (anticlockwise) {
|
||
|
ianticlockwise = 1;
|
||
|
}
|
||
|
|
||
|
this._drawCommands = this._drawCommands.concat(
|
||
|
"y" + x.toFixed(2) + "," + y.toFixed(2) + "," +
|
||
|
radius.toFixed(2) + "," + startAngle + "," + endAngle + "," + ianticlockwise +
|
||
|
";"
|
||
|
);
|
||
|
}
|
||
|
|
||
|
fillText(text, x, y) {
|
||
|
let tmptext = text.replace(/!/g, "!!");
|
||
|
tmptext = tmptext.replace(/,/g, "!,");
|
||
|
tmptext = tmptext.replace(/;/g, "!;");
|
||
|
this._drawCommands = this._drawCommands.concat("T" + tmptext + "," + x + "," + y + ",0.0;");
|
||
|
}
|
||
|
|
||
|
strokeText = function(text, x, y) {
|
||
|
let tmptext = text.replace(/!/g, "!!");
|
||
|
tmptext = tmptext.replace(/,/g, "!,");
|
||
|
tmptext = tmptext.replace(/;/g, "!;");
|
||
|
this._drawCommands = this._drawCommands.concat("U" + tmptext + "," + x + "," + y + ",0.0;");
|
||
|
}
|
||
|
|
||
|
measureText(text) {
|
||
|
return CanvasRenderingContext2D.GBridge.measureText(text, this.font, this.componentId);
|
||
|
}
|
||
|
|
||
|
isPointInPath = function(x, y) {
|
||
|
throw new Error('GCanvas not supported yet');
|
||
|
}
|
||
|
|
||
|
drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh) {
|
||
|
if (typeof image === 'string') {
|
||
|
var imgObj = new GImage();
|
||
|
imgObj.src = image;
|
||
|
image = imgObj;
|
||
|
}
|
||
|
if (image instanceof GImage) {
|
||
|
if (!image.complete) {
|
||
|
imgObj.onload = () => {
|
||
|
var index = this._needRedrawImageCache.indexOf(image);
|
||
|
if (index > -1) {
|
||
|
this._needRedrawImageCache.splice(index, 1);
|
||
|
CanvasRenderingContext2D.GBridge.bindImageTexture(this.componentId, image.src, image._id);
|
||
|
this._redrawflush(true);
|
||
|
}
|
||
|
}
|
||
|
this._notCommitDrawImageCache.push(image);
|
||
|
} else {
|
||
|
CanvasRenderingContext2D.GBridge.bindImageTexture(this.componentId, image.src, image._id);
|
||
|
}
|
||
|
var srcArgs = [image, sx, sy, sw, sh, dx, dy, dw, dh];
|
||
|
var args = [];
|
||
|
for (var arg in srcArgs) {
|
||
|
if (typeof(srcArgs[arg]) != 'undefined') {
|
||
|
args.push(srcArgs[arg]);
|
||
|
}
|
||
|
}
|
||
|
this.__drawImage.apply(this, args);
|
||
|
//this.__drawImage(image,sx, sy, sw, sh, dx, dy, dw, dh);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
__drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh) {
|
||
|
const numArgs = arguments.length;
|
||
|
|
||
|
function drawImageCommands() {
|
||
|
|
||
|
if (numArgs === 3) {
|
||
|
const x = parseFloat(sx) || 0.0;
|
||
|
const y = parseFloat(sy) || 0.0;
|
||
|
|
||
|
return ("d" + image._id + ",0,0," +
|
||
|
image.width + "," + image.height + "," +
|
||
|
x + "," + y + "," + image.width + "," + image.height + ";");
|
||
|
} else if (numArgs === 5) {
|
||
|
const x = parseFloat(sx) || 0.0;
|
||
|
const y = parseFloat(sy) || 0.0;
|
||
|
const width = parseInt(sw) || image.width;
|
||
|
const height = parseInt(sh) || image.height;
|
||
|
|
||
|
return ("d" + image._id + ",0,0," +
|
||
|
image.width + "," + image.height + "," +
|
||
|
x + "," + y + "," + width + "," + height + ";");
|
||
|
} else if (numArgs === 9) {
|
||
|
sx = parseFloat(sx) || 0.0;
|
||
|
sy = parseFloat(sy) || 0.0;
|
||
|
sw = parseInt(sw) || image.width;
|
||
|
sh = parseInt(sh) || image.height;
|
||
|
dx = parseFloat(dx) || 0.0;
|
||
|
dy = parseFloat(dy) || 0.0;
|
||
|
dw = parseInt(dw) || image.width;
|
||
|
dh = parseInt(dh) || image.height;
|
||
|
|
||
|
return ("d" + image._id + "," +
|
||
|
sx + "," + sy + "," + sw + "," + sh + "," +
|
||
|
dx + "," + dy + "," + dw + "," + dh + ";");
|
||
|
}
|
||
|
}
|
||
|
this._drawCommands += drawImageCommands();
|
||
|
}
|
||
|
|
||
|
_flush(reserve, callback) {
|
||
|
const commands = this._drawCommands;
|
||
|
this._drawCommands = '';
|
||
|
CanvasRenderingContext2D.GBridge.render2d(this.componentId, commands, callback);
|
||
|
this._needRender = false;
|
||
|
}
|
||
|
|
||
|
_redrawflush(reserve, callback) {
|
||
|
const commands = this._redrawCommands;
|
||
|
CanvasRenderingContext2D.GBridge.render2d(this.componentId, commands, callback);
|
||
|
if (this._needRedrawImageCache.length == 0) {
|
||
|
this._redrawCommands = '';
|
||
|
}
|
||
|
}
|
||
|
|
||
|
draw(reserve, callback) {
|
||
|
if (!reserve) {
|
||
|
this._globalAlpha = this._savedGlobalAlpha.pop();
|
||
|
this._savedGlobalAlpha.push(this._globalAlpha);
|
||
|
this._redrawCommands = this._drawCommands;
|
||
|
this._needRedrawImageCache = this._notCommitDrawImageCache;
|
||
|
if (this._autoSaveContext) {
|
||
|
this._drawCommands = ("v;" + this._drawCommands);
|
||
|
this._autoSaveContext = false;
|
||
|
} else {
|
||
|
this._drawCommands = ("e;X;v;" + this._drawCommands);
|
||
|
}
|
||
|
} else {
|
||
|
this._needRedrawImageCache = this._needRedrawImageCache.concat(this._notCommitDrawImageCache);
|
||
|
this._redrawCommands += this._drawCommands;
|
||
|
if (this._autoSaveContext) {
|
||
|
this._drawCommands = ("v;" + this._drawCommands);
|
||
|
this._autoSaveContext = false;
|
||
|
}
|
||
|
}
|
||
|
this._notCommitDrawImageCache = [];
|
||
|
if (this._flush) {
|
||
|
this._flush(reserve, callback);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
getImageData(x, y, w, h, callback) {
|
||
|
CanvasRenderingContext2D.GBridge.getImageData(this.componentId, x, y, w, h, function(res) {
|
||
|
res.data = Base64ToUint8ClampedArray(res.data);
|
||
|
if (typeof(callback) == 'function') {
|
||
|
callback(res);
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
putImageData(data, x, y, w, h, callback) {
|
||
|
if (data instanceof Uint8ClampedArray) {
|
||
|
data = ArrayBufferToBase64(data);
|
||
|
CanvasRenderingContext2D.GBridge.putImageData(this.componentId, data, x, y, w, h, function(res) {
|
||
|
if (typeof(callback) == 'function') {
|
||
|
callback(res);
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
|
||
|
toTempFilePath(x, y, width, height, destWidth, destHeight, fileType, quality, callback) {
|
||
|
CanvasRenderingContext2D.GBridge.toTempFilePath(this.componentId, x, y, width, height, destWidth, destHeight,
|
||
|
fileType, quality,
|
||
|
function(res) {
|
||
|
if (typeof(callback) == 'function') {
|
||
|
callback(res);
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
}
|