2015-04-28 14:59:00 +00:00
|
|
|
|
/*
|
|
|
|
|
* (c) Copyright Ascensio System SIA 2010-2015
|
|
|
|
|
*
|
|
|
|
|
* This program is a free software product. You can redistribute it and/or
|
|
|
|
|
* modify it under the terms of the GNU Affero General Public License (AGPL)
|
|
|
|
|
* version 3 as published by the Free Software Foundation. In accordance with
|
|
|
|
|
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
|
|
|
|
|
* that Ascensio System SIA expressly excludes the warranty of non-infringement
|
|
|
|
|
* of any third-party rights.
|
|
|
|
|
*
|
|
|
|
|
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
|
|
|
|
|
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
|
|
|
|
|
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
|
|
|
|
|
*
|
|
|
|
|
* You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia,
|
|
|
|
|
* EU, LV-1021.
|
|
|
|
|
*
|
|
|
|
|
* The interactive user interfaces in modified source and object code versions
|
|
|
|
|
* of the Program must display Appropriate Legal Notices, as required under
|
|
|
|
|
* Section 5 of the GNU AGPL version 3.
|
|
|
|
|
*
|
|
|
|
|
* Pursuant to Section 7(b) of the License you must retain the original Product
|
|
|
|
|
* logo when distributing the program. Pursuant to Section 7(e) we decline to
|
|
|
|
|
* grant you any rights under trademark law for use of our trademarks.
|
|
|
|
|
*
|
|
|
|
|
* All the Product's GUI elements, including illustrations and icon sets, as
|
|
|
|
|
* well as technical writing content are licensed under the terms of the
|
|
|
|
|
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
|
|
|
|
|
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
"use strict";
|
|
|
|
|
var g_fontManager2 = null;
|
|
|
|
|
function CClipManager() {
|
|
|
|
|
this.clipRects = [];
|
|
|
|
|
this.curRect = new _rect();
|
|
|
|
|
this.BaseObject = null;
|
|
|
|
|
this.AddRect = function (x, y, w, h) {
|
|
|
|
|
var _count = this.clipRects.length;
|
|
|
|
|
if (0 == _count) {
|
|
|
|
|
this.curRect.x = x;
|
|
|
|
|
this.curRect.y = y;
|
|
|
|
|
this.curRect.w = w;
|
|
|
|
|
this.curRect.h = h;
|
|
|
|
|
var _r = new _rect();
|
|
|
|
|
_r.x = x;
|
|
|
|
|
_r.y = y;
|
|
|
|
|
_r.w = w;
|
|
|
|
|
_r.h = h;
|
|
|
|
|
this.clipRects[_count] = _r;
|
|
|
|
|
this.BaseObject.SetClip(this.curRect);
|
|
|
|
|
} else {
|
|
|
|
|
this.BaseObject.RemoveClip();
|
|
|
|
|
var _r = new _rect();
|
|
|
|
|
_r.x = x;
|
|
|
|
|
_r.y = y;
|
|
|
|
|
_r.w = w;
|
|
|
|
|
_r.h = h;
|
|
|
|
|
this.clipRects[_count] = _r;
|
|
|
|
|
this.curRect = this.IntersectRect(this.curRect, _r);
|
|
|
|
|
this.BaseObject.SetClip(this.curRect);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
this.RemoveRect = function () {
|
|
|
|
|
var _count = this.clipRects.length;
|
|
|
|
|
if (0 != _count) {
|
|
|
|
|
this.clipRects.splice(_count - 1, 1);
|
|
|
|
|
--_count;
|
|
|
|
|
this.BaseObject.RemoveClip();
|
|
|
|
|
if (0 != _count) {
|
|
|
|
|
this.curRect.x = this.clipRects[0].x;
|
|
|
|
|
this.curRect.y = this.clipRects[0].y;
|
|
|
|
|
this.curRect.w = this.clipRects[0].w;
|
|
|
|
|
this.curRect.h = this.clipRects[0].h;
|
|
|
|
|
for (var i = 1; i < _count; i++) {
|
|
|
|
|
this.curRect = this.IntersectRect(this.curRect, this.clipRects[i]);
|
|
|
|
|
}
|
|
|
|
|
this.BaseObject.SetClip(this.curRect);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
this.IntersectRect = function (r1, r2) {
|
|
|
|
|
var res = new _rect();
|
|
|
|
|
res.x = Math.max(r1.x, r2.x);
|
|
|
|
|
res.y = Math.max(r1.y, r2.y);
|
|
|
|
|
res.w = Math.min(r1.x + r1.w, r2.x + r2.w) - res.x;
|
|
|
|
|
res.h = Math.min(r1.y + r1.h, r2.y + r2.h) - res.y;
|
|
|
|
|
if (0 > res.w) {
|
|
|
|
|
res.w = 0;
|
|
|
|
|
}
|
|
|
|
|
if (0 > res.h) {
|
|
|
|
|
res.h = 0;
|
|
|
|
|
}
|
|
|
|
|
return res;
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
function CPen() {
|
|
|
|
|
this.Color = {
|
|
|
|
|
R: 255,
|
|
|
|
|
G: 255,
|
|
|
|
|
B: 255,
|
|
|
|
|
A: 255
|
|
|
|
|
};
|
|
|
|
|
this.Style = 0;
|
|
|
|
|
this.LineCap = 0;
|
|
|
|
|
this.LineJoin = 0;
|
|
|
|
|
this.LineWidth = 1;
|
|
|
|
|
}
|
|
|
|
|
function CBrush() {
|
|
|
|
|
this.Color1 = {
|
|
|
|
|
R: 255,
|
|
|
|
|
G: 255,
|
|
|
|
|
B: 255,
|
|
|
|
|
A: 255
|
|
|
|
|
};
|
|
|
|
|
this.Color2 = {
|
|
|
|
|
R: 255,
|
|
|
|
|
G: 255,
|
|
|
|
|
B: 255,
|
|
|
|
|
A: 255
|
|
|
|
|
};
|
|
|
|
|
this.Type = 0;
|
|
|
|
|
}
|
|
|
|
|
var MATRIX_ORDER_PREPEND = 0;
|
|
|
|
|
var MATRIX_ORDER_APPEND = 1;
|
|
|
|
|
var bIsChrome = AscBrowser.isChrome;
|
|
|
|
|
var bIsSafari = AscBrowser.isSafari;
|
|
|
|
|
var bIsIE = AscBrowser.isIE;
|
|
|
|
|
var bIsAndroid = AscBrowser.isAndroid;
|
|
|
|
|
function deg2rad(deg) {
|
|
|
|
|
return deg * Math.PI / 180;
|
|
|
|
|
}
|
|
|
|
|
function rad2deg(rad) {
|
|
|
|
|
return rad * 180 / Math.PI;
|
|
|
|
|
}
|
|
|
|
|
function CMatrix() {
|
|
|
|
|
this.sx = 1;
|
|
|
|
|
this.shx = 0;
|
|
|
|
|
this.shy = 0;
|
|
|
|
|
this.sy = 1;
|
|
|
|
|
this.tx = 0;
|
|
|
|
|
this.ty = 0;
|
|
|
|
|
}
|
|
|
|
|
CMatrix.prototype = {
|
|
|
|
|
Reset: function () {
|
|
|
|
|
this.sx = 1;
|
|
|
|
|
this.shx = 0;
|
|
|
|
|
this.shy = 0;
|
|
|
|
|
this.sy = 1;
|
|
|
|
|
this.tx = 0;
|
|
|
|
|
this.ty = 0;
|
|
|
|
|
},
|
|
|
|
|
Multiply: function (matrix, order) {
|
|
|
|
|
if (MATRIX_ORDER_PREPEND == order) {
|
|
|
|
|
var m = new CMatrix();
|
|
|
|
|
m.sx = matrix.sx;
|
|
|
|
|
m.shx = matrix.shx;
|
|
|
|
|
m.shy = matrix.shy;
|
|
|
|
|
m.sy = matrix.sy;
|
|
|
|
|
m.tx = matrix.tx;
|
|
|
|
|
m.ty = matrix.ty;
|
|
|
|
|
m.Multiply(this, MATRIX_ORDER_APPEND);
|
|
|
|
|
this.sx = m.sx;
|
|
|
|
|
this.shx = m.shx;
|
|
|
|
|
this.shy = m.shy;
|
|
|
|
|
this.sy = m.sy;
|
|
|
|
|
this.tx = m.tx;
|
|
|
|
|
this.ty = m.ty;
|
|
|
|
|
} else {
|
|
|
|
|
var t0 = this.sx * matrix.sx + this.shy * matrix.shx;
|
|
|
|
|
var t2 = this.shx * matrix.sx + this.sy * matrix.shx;
|
|
|
|
|
var t4 = this.tx * matrix.sx + this.ty * matrix.shx + matrix.tx;
|
|
|
|
|
this.shy = this.sx * matrix.shy + this.shy * matrix.sy;
|
|
|
|
|
this.sy = this.shx * matrix.shy + this.sy * matrix.sy;
|
|
|
|
|
this.ty = this.tx * matrix.shy + this.ty * matrix.sy + matrix.ty;
|
|
|
|
|
this.sx = t0;
|
|
|
|
|
this.shx = t2;
|
|
|
|
|
this.tx = t4;
|
|
|
|
|
}
|
|
|
|
|
return this;
|
|
|
|
|
},
|
|
|
|
|
Translate: function (x, y, order) {
|
|
|
|
|
var m = new CMatrix();
|
|
|
|
|
m.tx = x;
|
|
|
|
|
m.ty = y;
|
|
|
|
|
this.Multiply(m, order);
|
|
|
|
|
},
|
|
|
|
|
Scale: function (x, y, order) {
|
|
|
|
|
var m = new CMatrix();
|
|
|
|
|
m.sx = x;
|
|
|
|
|
m.sy = y;
|
|
|
|
|
this.Multiply(m, order);
|
|
|
|
|
},
|
|
|
|
|
Rotate: function (a, order) {
|
|
|
|
|
var m = new CMatrix();
|
|
|
|
|
var rad = deg2rad(a);
|
|
|
|
|
m.sx = Math.cos(rad);
|
|
|
|
|
m.shx = Math.sin(rad);
|
|
|
|
|
m.shy = -Math.sin(rad);
|
|
|
|
|
m.sy = Math.cos(rad);
|
|
|
|
|
this.Multiply(m, order);
|
|
|
|
|
},
|
|
|
|
|
RotateAt: function (a, x, y, order) {
|
|
|
|
|
this.Translate(-x, -y, order);
|
|
|
|
|
this.Rotate(a, order);
|
|
|
|
|
this.Translate(x, y, order);
|
|
|
|
|
},
|
|
|
|
|
Determinant: function () {
|
|
|
|
|
return this.sx * this.sy - this.shy * this.shx;
|
|
|
|
|
},
|
|
|
|
|
Invert: function () {
|
|
|
|
|
var det = this.Determinant();
|
|
|
|
|
if (0.0001 > Math.abs(det)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
var d = 1 / det;
|
|
|
|
|
var t0 = this.sy * d;
|
|
|
|
|
this.sy = this.sx * d;
|
|
|
|
|
this.shy = -this.shy * d;
|
|
|
|
|
this.shx = -this.shx * d;
|
|
|
|
|
var t4 = -this.tx * t0 - this.ty * this.shx;
|
|
|
|
|
this.ty = -this.tx * this.shy - this.ty * this.sy;
|
|
|
|
|
this.sx = t0;
|
|
|
|
|
this.tx = t4;
|
|
|
|
|
return this;
|
|
|
|
|
},
|
|
|
|
|
TransformPointX: function (x, y) {
|
|
|
|
|
return x * this.sx + y * this.shx + this.tx;
|
|
|
|
|
},
|
|
|
|
|
TransformPointY: function (x, y) {
|
|
|
|
|
return x * this.shy + y * this.sy + this.ty;
|
|
|
|
|
},
|
|
|
|
|
GetRotation: function () {
|
|
|
|
|
var x1 = 0;
|
|
|
|
|
var y1 = 0;
|
|
|
|
|
var x2 = 1;
|
|
|
|
|
var y2 = 0;
|
|
|
|
|
this.TransformPoint(x1, y1);
|
|
|
|
|
this.TransformPoint(x2, y2);
|
|
|
|
|
var a = Math.atan2(y2 - y1, x2 - x1);
|
|
|
|
|
return rad2deg(a);
|
|
|
|
|
},
|
|
|
|
|
CreateDublicate: function () {
|
|
|
|
|
var m = new CMatrix();
|
|
|
|
|
m.sx = this.sx;
|
|
|
|
|
m.shx = this.shx;
|
|
|
|
|
m.shy = this.shy;
|
|
|
|
|
m.sy = this.sy;
|
|
|
|
|
m.tx = this.tx;
|
|
|
|
|
m.ty = this.ty;
|
|
|
|
|
return m;
|
|
|
|
|
},
|
|
|
|
|
IsIdentity: function () {
|
|
|
|
|
if (this.sx == 1 && this.shx == 0 && this.shy == 0 && this.sy == 1 && this.tx == 0 && this.ty == 0) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
},
|
|
|
|
|
IsIdentity2: function () {
|
|
|
|
|
if (this.sx == 1 && this.shx == 0 && this.shy == 0 && this.sy == 1) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
function CMatrixL() {
|
|
|
|
|
this.sx = 1;
|
|
|
|
|
this.shx = 0;
|
|
|
|
|
this.shy = 0;
|
|
|
|
|
this.sy = 1;
|
|
|
|
|
this.tx = 0;
|
|
|
|
|
this.ty = 0;
|
|
|
|
|
}
|
|
|
|
|
CMatrixL.prototype = {
|
|
|
|
|
CreateDublicate: function () {
|
|
|
|
|
var m = new CMatrixL();
|
|
|
|
|
m.sx = this.sx;
|
|
|
|
|
m.shx = this.shx;
|
|
|
|
|
m.shy = this.shy;
|
|
|
|
|
m.sy = this.sy;
|
|
|
|
|
m.tx = this.tx;
|
|
|
|
|
m.ty = this.ty;
|
|
|
|
|
return m;
|
|
|
|
|
},
|
|
|
|
|
Reset: function () {
|
|
|
|
|
this.sx = 1;
|
|
|
|
|
this.shx = 0;
|
|
|
|
|
this.shy = 0;
|
|
|
|
|
this.sy = 1;
|
|
|
|
|
this.tx = 0;
|
|
|
|
|
this.ty = 0;
|
|
|
|
|
},
|
|
|
|
|
TransformPointX: function (x, y) {
|
|
|
|
|
return x * this.sx + y * this.shx + this.tx;
|
|
|
|
|
},
|
|
|
|
|
TransformPointY: function (x, y) {
|
|
|
|
|
return x * this.shy + y * this.sy + this.ty;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
function CGlobalMatrixTransformer() {
|
|
|
|
|
this.TranslateAppend = function (m, _tx, _ty) {
|
|
|
|
|
m.tx += _tx;
|
|
|
|
|
m.ty += _ty;
|
|
|
|
|
};
|
|
|
|
|
this.ScaleAppend = function (m, _sx, _sy) {
|
|
|
|
|
m.sx *= _sx;
|
|
|
|
|
m.shx *= _sx;
|
|
|
|
|
m.shy *= _sy;
|
|
|
|
|
m.sy *= _sy;
|
|
|
|
|
m.tx *= _sx;
|
|
|
|
|
m.ty *= _sy;
|
|
|
|
|
};
|
|
|
|
|
this.RotateRadAppend = function (m, _rad) {
|
|
|
|
|
var _sx = Math.cos(_rad);
|
|
|
|
|
var _shx = Math.sin(_rad);
|
|
|
|
|
var _shy = -Math.sin(_rad);
|
|
|
|
|
var _sy = Math.cos(_rad);
|
|
|
|
|
var t0 = m.sx * _sx + m.shy * _shx;
|
|
|
|
|
var t2 = m.shx * _sx + m.sy * _shx;
|
|
|
|
|
var t4 = m.tx * _sx + m.ty * _shx;
|
|
|
|
|
m.shy = m.sx * _shy + m.shy * _sy;
|
|
|
|
|
m.sy = m.shx * _shy + m.sy * _sy;
|
|
|
|
|
m.ty = m.tx * _shy + m.ty * _sy;
|
|
|
|
|
m.sx = t0;
|
|
|
|
|
m.shx = t2;
|
|
|
|
|
m.tx = t4;
|
|
|
|
|
};
|
|
|
|
|
this.MultiplyAppend = function (m1, m2) {
|
|
|
|
|
var t0 = m1.sx * m2.sx + m1.shy * m2.shx;
|
|
|
|
|
var t2 = m1.shx * m2.sx + m1.sy * m2.shx;
|
|
|
|
|
var t4 = m1.tx * m2.sx + m1.ty * m2.shx + m2.tx;
|
|
|
|
|
m1.shy = m1.sx * m2.shy + m1.shy * m2.sy;
|
|
|
|
|
m1.sy = m1.shx * m2.shy + m1.sy * m2.sy;
|
|
|
|
|
m1.ty = m1.tx * m2.shy + m1.ty * m2.sy + m2.ty;
|
|
|
|
|
m1.sx = t0;
|
|
|
|
|
m1.shx = t2;
|
|
|
|
|
m1.tx = t4;
|
|
|
|
|
};
|
|
|
|
|
this.Invert = function (m) {
|
|
|
|
|
var newM = m.CreateDublicate();
|
|
|
|
|
var det = newM.sx * newM.sy - newM.shy * newM.shx;
|
|
|
|
|
if (0.0001 > Math.abs(det)) {
|
|
|
|
|
return newM;
|
|
|
|
|
}
|
|
|
|
|
var d = 1 / det;
|
|
|
|
|
var t0 = newM.sy * d;
|
|
|
|
|
newM.sy = newM.sx * d;
|
|
|
|
|
newM.shy = -newM.shy * d;
|
|
|
|
|
newM.shx = -newM.shx * d;
|
|
|
|
|
var t4 = -newM.tx * t0 - newM.ty * newM.shx;
|
|
|
|
|
newM.ty = -newM.tx * newM.shy - newM.ty * newM.sy;
|
|
|
|
|
newM.sx = t0;
|
|
|
|
|
newM.tx = t4;
|
|
|
|
|
return newM;
|
|
|
|
|
};
|
|
|
|
|
this.MultiplyAppendInvert = function (m1, m2) {
|
|
|
|
|
var m = this.Invert(m2);
|
|
|
|
|
this.MultiplyAppend(m1, m);
|
|
|
|
|
};
|
|
|
|
|
this.MultiplyPrepend = function (m1, m2) {
|
|
|
|
|
var m = new CMatrixL();
|
|
|
|
|
m.sx = m2.sx;
|
|
|
|
|
m.shx = m2.shx;
|
|
|
|
|
m.shy = m2.shy;
|
|
|
|
|
m.sy = m2.sy;
|
|
|
|
|
m.tx = m2.tx;
|
|
|
|
|
m.ty = m2.ty;
|
|
|
|
|
this.MultiplyAppend(m, m1);
|
|
|
|
|
m1.sx = m.sx;
|
|
|
|
|
m1.shx = m.shx;
|
|
|
|
|
m1.shy = m.shy;
|
|
|
|
|
m1.sy = m.sy;
|
|
|
|
|
m1.tx = m.tx;
|
|
|
|
|
m1.ty = m.ty;
|
|
|
|
|
};
|
|
|
|
|
this.CreateDublicateM = function (matrix) {
|
|
|
|
|
var m = new CMatrixL();
|
|
|
|
|
m.sx = matrix.sx;
|
|
|
|
|
m.shx = matrix.shx;
|
|
|
|
|
m.shy = matrix.shy;
|
|
|
|
|
m.sy = matrix.sy;
|
|
|
|
|
m.tx = matrix.tx;
|
|
|
|
|
m.ty = matrix.ty;
|
|
|
|
|
};
|
|
|
|
|
this.IsIdentity = function (m) {
|
|
|
|
|
if (m.sx == 1 && m.shx == 0 && m.shy == 0 && m.sy == 1 && m.tx == 0 && m.ty == 0) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
};
|
|
|
|
|
this.IsIdentity2 = function (m) {
|
|
|
|
|
if (m.sx == 1 && m.shx == 0 && m.shy == 0 && m.sy == 1) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
var global_MatrixTransformer = new CGlobalMatrixTransformer();
|
|
|
|
|
var global_map_bounds_shape = {};
|
|
|
|
|
global_map_bounds_shape["heart"] = true;
|
|
|
|
|
function CGraphics() {
|
|
|
|
|
this.m_oContext = null;
|
|
|
|
|
this.m_dWidthMM = 0;
|
|
|
|
|
this.m_dHeightMM = 0;
|
|
|
|
|
this.m_lWidthPix = 0;
|
|
|
|
|
this.m_lHeightPix = 0;
|
|
|
|
|
this.m_dDpiX = 96;
|
|
|
|
|
this.m_dDpiY = 96;
|
|
|
|
|
this.m_bIsBreak = false;
|
|
|
|
|
this.textBB_l = 10000;
|
|
|
|
|
this.textBB_t = 10000;
|
|
|
|
|
this.textBB_r = -10000;
|
|
|
|
|
this.textBB_b = -10000;
|
|
|
|
|
this.m_oPen = new CPen();
|
|
|
|
|
this.m_oBrush = new CBrush();
|
|
|
|
|
this.m_oFontManager = null;
|
|
|
|
|
this.m_bIsFillTextCanvasColor = 0;
|
|
|
|
|
this.m_oCoordTransform = new CMatrixL();
|
|
|
|
|
this.m_oBaseTransform = new CMatrixL();
|
|
|
|
|
this.m_oTransform = new CMatrixL();
|
|
|
|
|
this.m_oFullTransform = new CMatrixL();
|
|
|
|
|
this.m_oInvertFullTransform = new CMatrixL();
|
|
|
|
|
this.ArrayPoints = null;
|
|
|
|
|
this.m_oCurFont = {
|
|
|
|
|
Name: "",
|
|
|
|
|
FontSize: 10,
|
|
|
|
|
Bold: false,
|
|
|
|
|
Italic: false
|
|
|
|
|
};
|
|
|
|
|
this.m_oTextPr = null;
|
|
|
|
|
this.m_oGrFonts = new CGrRFonts();
|
|
|
|
|
this.m_oLastFont = new CFontSetup();
|
|
|
|
|
this.LastFontOriginInfo = {
|
|
|
|
|
Name: "",
|
|
|
|
|
Replace: null
|
|
|
|
|
};
|
|
|
|
|
this.m_bIntegerGrid = true;
|
|
|
|
|
this.ClipManager = new CClipManager();
|
|
|
|
|
this.ClipManager.BaseObject = this;
|
|
|
|
|
this.TextureFillTransformScaleX = 1;
|
|
|
|
|
this.TextureFillTransformScaleY = 1;
|
|
|
|
|
this.IsThumbnail = false;
|
|
|
|
|
this.GrState = new CGrState();
|
|
|
|
|
this.GrState.Parent = this;
|
|
|
|
|
this.globalAlpha = 1;
|
|
|
|
|
this.TextClipRect = null;
|
|
|
|
|
this.IsClipContext = false;
|
|
|
|
|
this.IsUseFonts2 = false;
|
|
|
|
|
this.m_oFontManager2 = null;
|
|
|
|
|
this.m_oLastFont2 = null;
|
|
|
|
|
this.ClearMode = false;
|
|
|
|
|
this.IsRetina = false;
|
|
|
|
|
}
|
|
|
|
|
CGraphics.prototype = {
|
|
|
|
|
init: function (context, width_px, height_px, width_mm, height_mm) {
|
|
|
|
|
this.m_oContext = context;
|
|
|
|
|
this.m_lHeightPix = height_px;
|
|
|
|
|
this.m_lWidthPix = width_px;
|
|
|
|
|
this.m_dWidthMM = width_mm;
|
|
|
|
|
this.m_dHeightMM = height_mm;
|
|
|
|
|
this.m_dDpiX = 25.4 * this.m_lWidthPix / this.m_dWidthMM;
|
|
|
|
|
this.m_dDpiY = 25.4 * this.m_lHeightPix / this.m_dHeightMM;
|
|
|
|
|
this.m_oCoordTransform.sx = this.m_dDpiX / 25.4;
|
|
|
|
|
this.m_oCoordTransform.sy = this.m_dDpiY / 25.4;
|
|
|
|
|
this.TextureFillTransformScaleX = 1 / this.m_oCoordTransform.sx;
|
|
|
|
|
this.TextureFillTransformScaleY = 1 / this.m_oCoordTransform.sy;
|
|
|
|
|
this.m_oLastFont.Clear();
|
|
|
|
|
this.m_oContext.save();
|
|
|
|
|
},
|
|
|
|
|
EndDraw: function () {},
|
|
|
|
|
put_GlobalAlpha: function (enable, alpha) {
|
|
|
|
|
if (false === enable) {
|
|
|
|
|
this.globalAlpha = 1;
|
|
|
|
|
this.m_oContext.globalAlpha = 1;
|
|
|
|
|
} else {
|
|
|
|
|
this.globalAlpha = alpha;
|
|
|
|
|
this.m_oContext.globalAlpha = alpha;
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
Start_GlobalAlpha: function () {},
|
|
|
|
|
End_GlobalAlpha: function () {
|
|
|
|
|
if (false === this.m_bIntegerGrid) {
|
|
|
|
|
this.m_oContext.setTransform(1, 0, 0, 1, 0, 0);
|
|
|
|
|
}
|
|
|
|
|
this.b_color1(255, 255, 255, 140);
|
|
|
|
|
this.m_oContext.fillRect(0, 0, this.m_lWidthPix, this.m_lHeightPix);
|
|
|
|
|
this.m_oContext.beginPath();
|
|
|
|
|
if (false === this.m_bIntegerGrid) {
|
|
|
|
|
this.m_oContext.setTransform(this.m_oFullTransform.sx, this.m_oFullTransform.shy, this.m_oFullTransform.shx, this.m_oFullTransform.sy, this.m_oFullTransform.tx, this.m_oFullTransform.ty);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
p_color: function (r, g, b, a) {
|
|
|
|
|
var _c = this.m_oPen.Color;
|
|
|
|
|
_c.R = r;
|
|
|
|
|
_c.G = g;
|
|
|
|
|
_c.B = b;
|
|
|
|
|
_c.A = a;
|
|
|
|
|
this.m_oContext.strokeStyle = "rgba(" + _c.R + "," + _c.G + "," + _c.B + "," + (_c.A / 255) + ")";
|
|
|
|
|
},
|
|
|
|
|
p_width: function (w) {
|
|
|
|
|
this.m_oPen.LineWidth = w / 1000;
|
|
|
|
|
if (!this.m_bIntegerGrid) {
|
|
|
|
|
if (0 != this.m_oPen.LineWidth) {
|
|
|
|
|
this.m_oContext.lineWidth = this.m_oPen.LineWidth;
|
|
|
|
|
} else {
|
|
|
|
|
var _x1 = this.m_oFullTransform.TransformPointX(0, 0);
|
|
|
|
|
var _y1 = this.m_oFullTransform.TransformPointY(0, 0);
|
|
|
|
|
var _x2 = this.m_oFullTransform.TransformPointX(1, 1);
|
|
|
|
|
var _y2 = this.m_oFullTransform.TransformPointY(1, 1);
|
|
|
|
|
var _koef = Math.sqrt(((_x2 - _x1) * (_x2 - _x1) + (_y2 - _y1) * (_y2 - _y1)) / 2);
|
|
|
|
|
this.m_oContext.lineWidth = 1 / _koef;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
if (0 != this.m_oPen.LineWidth) {
|
|
|
|
|
var _m = this.m_oFullTransform;
|
|
|
|
|
var x = _m.sx + _m.shx;
|
|
|
|
|
var y = _m.sy + _m.shy;
|
|
|
|
|
var koef = Math.sqrt((x * x + y * y) / 2);
|
|
|
|
|
this.m_oContext.lineWidth = this.m_oPen.LineWidth * koef;
|
|
|
|
|
} else {
|
|
|
|
|
this.m_oContext.lineWidth = 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
b_color1: function (r, g, b, a) {
|
|
|
|
|
var _c = this.m_oBrush.Color1;
|
|
|
|
|
_c.R = r;
|
|
|
|
|
_c.G = g;
|
|
|
|
|
_c.B = b;
|
|
|
|
|
_c.A = a;
|
|
|
|
|
this.m_oContext.fillStyle = "rgba(" + _c.R + "," + _c.G + "," + _c.B + "," + (_c.A / 255) + ")";
|
|
|
|
|
this.m_bIsFillTextCanvasColor = 0;
|
|
|
|
|
},
|
|
|
|
|
b_color2: function (r, g, b, a) {
|
|
|
|
|
var _c = this.m_oBrush.Color2;
|
|
|
|
|
_c.R = r;
|
|
|
|
|
_c.G = g;
|
|
|
|
|
_c.B = b;
|
|
|
|
|
_c.A = a;
|
|
|
|
|
},
|
|
|
|
|
transform: function (sx, shy, shx, sy, tx, ty) {
|
|
|
|
|
var _t = this.m_oTransform;
|
|
|
|
|
_t.sx = sx;
|
|
|
|
|
_t.shx = shx;
|
|
|
|
|
_t.shy = shy;
|
|
|
|
|
_t.sy = sy;
|
|
|
|
|
_t.tx = tx;
|
|
|
|
|
_t.ty = ty;
|
|
|
|
|
this.CalculateFullTransform();
|
|
|
|
|
if (false === this.m_bIntegerGrid) {
|
|
|
|
|
var _ft = this.m_oFullTransform;
|
|
|
|
|
this.m_oContext.setTransform(_ft.sx, _ft.shy, _ft.shx, _ft.sy, _ft.tx, _ft.ty);
|
|
|
|
|
}
|
|
|
|
|
if (null != this.m_oFontManager) {
|
|
|
|
|
this.m_oFontManager.SetTextMatrix(_t.sx, _t.shy, _t.shx, _t.sy, _t.tx, _t.ty);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
CalculateFullTransform: function (isInvertNeed) {
|
|
|
|
|
var _ft = this.m_oFullTransform;
|
|
|
|
|
var _t = this.m_oTransform;
|
|
|
|
|
_ft.sx = _t.sx;
|
|
|
|
|
_ft.shx = _t.shx;
|
|
|
|
|
_ft.shy = _t.shy;
|
|
|
|
|
_ft.sy = _t.sy;
|
|
|
|
|
_ft.tx = _t.tx;
|
|
|
|
|
_ft.ty = _t.ty;
|
|
|
|
|
global_MatrixTransformer.MultiplyAppend(_ft, this.m_oCoordTransform);
|
|
|
|
|
var _it = this.m_oInvertFullTransform;
|
|
|
|
|
_it.sx = _ft.sx;
|
|
|
|
|
_it.shx = _ft.shx;
|
|
|
|
|
_it.shy = _ft.shy;
|
|
|
|
|
_it.sy = _ft.sy;
|
|
|
|
|
_it.tx = _ft.tx;
|
|
|
|
|
_it.ty = _ft.ty;
|
|
|
|
|
if (false !== isInvertNeed) {
|
|
|
|
|
global_MatrixTransformer.MultiplyAppendInvert(_it, _t);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
_s: function () {
|
|
|
|
|
this.m_oContext.beginPath();
|
|
|
|
|
},
|
|
|
|
|
_e: function () {
|
|
|
|
|
this.m_oContext.beginPath();
|
|
|
|
|
},
|
|
|
|
|
_z: function () {
|
|
|
|
|
this.m_oContext.closePath();
|
|
|
|
|
},
|
|
|
|
|
_m: function (x, y) {
|
|
|
|
|
if (false === this.m_bIntegerGrid) {
|
|
|
|
|
this.m_oContext.moveTo(x, y);
|
|
|
|
|
if (this.ArrayPoints != null) {
|
|
|
|
|
this.ArrayPoints[this.ArrayPoints.length] = {
|
|
|
|
|
x: x,
|
|
|
|
|
y: y
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
var _x = (this.m_oFullTransform.TransformPointX(x, y)) >> 0;
|
|
|
|
|
var _y = (this.m_oFullTransform.TransformPointY(x, y)) >> 0;
|
|
|
|
|
this.m_oContext.moveTo(_x + 0.5, _y + 0.5);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
_l: function (x, y) {
|
|
|
|
|
if (false === this.m_bIntegerGrid) {
|
|
|
|
|
this.m_oContext.lineTo(x, y);
|
|
|
|
|
if (this.ArrayPoints != null) {
|
|
|
|
|
this.ArrayPoints[this.ArrayPoints.length] = {
|
|
|
|
|
x: x,
|
|
|
|
|
y: y
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
var _x = (this.m_oFullTransform.TransformPointX(x, y)) >> 0;
|
|
|
|
|
var _y = (this.m_oFullTransform.TransformPointY(x, y)) >> 0;
|
|
|
|
|
this.m_oContext.lineTo(_x + 0.5, _y + 0.5);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
_c: function (x1, y1, x2, y2, x3, y3) {
|
|
|
|
|
if (false === this.m_bIntegerGrid) {
|
|
|
|
|
this.m_oContext.bezierCurveTo(x1, y1, x2, y2, x3, y3);
|
|
|
|
|
if (this.ArrayPoints != null) {
|
|
|
|
|
this.ArrayPoints[this.ArrayPoints.length] = {
|
|
|
|
|
x: x1,
|
|
|
|
|
y: y1
|
|
|
|
|
};
|
|
|
|
|
this.ArrayPoints[this.ArrayPoints.length] = {
|
|
|
|
|
x: x2,
|
|
|
|
|
y: y2
|
|
|
|
|
};
|
|
|
|
|
this.ArrayPoints[this.ArrayPoints.length] = {
|
|
|
|
|
x: x3,
|
|
|
|
|
y: y3
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
var _x1 = (this.m_oFullTransform.TransformPointX(x1, y1)) >> 0;
|
|
|
|
|
var _y1 = (this.m_oFullTransform.TransformPointY(x1, y1)) >> 0;
|
|
|
|
|
var _x2 = (this.m_oFullTransform.TransformPointX(x2, y2)) >> 0;
|
|
|
|
|
var _y2 = (this.m_oFullTransform.TransformPointY(x2, y2)) >> 0;
|
|
|
|
|
var _x3 = (this.m_oFullTransform.TransformPointX(x3, y3)) >> 0;
|
|
|
|
|
var _y3 = (this.m_oFullTransform.TransformPointY(x3, y3)) >> 0;
|
|
|
|
|
this.m_oContext.bezierCurveTo(_x1 + 0.5, _y1 + 0.5, _x2 + 0.5, _y2 + 0.5, _x3 + 0.5, _y3 + 0.5);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
_c2: function (x1, y1, x2, y2) {
|
|
|
|
|
if (false === this.m_bIntegerGrid) {
|
|
|
|
|
this.m_oContext.quadraticCurveTo(x1, y1, x2, y2);
|
|
|
|
|
if (this.ArrayPoints != null) {
|
|
|
|
|
this.ArrayPoints[this.ArrayPoints.length] = {
|
|
|
|
|
x: x1,
|
|
|
|
|
y: y1
|
|
|
|
|
};
|
|
|
|
|
this.ArrayPoints[this.ArrayPoints.length] = {
|
|
|
|
|
x: x2,
|
|
|
|
|
y: y2
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
var _x1 = (this.m_oFullTransform.TransformPointX(x1, y1)) >> 0;
|
|
|
|
|
var _y1 = (this.m_oFullTransform.TransformPointY(x1, y1)) >> 0;
|
|
|
|
|
var _x2 = (this.m_oFullTransform.TransformPointX(x2, y2)) >> 0;
|
|
|
|
|
var _y2 = (this.m_oFullTransform.TransformPointY(x2, y2)) >> 0;
|
|
|
|
|
this.m_oContext.quadraticCurveTo(_x1 + 0.5, _y1 + 0.5, _x2 + 0.5, _y2 + 0.5);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
ds: function () {
|
|
|
|
|
this.m_oContext.stroke();
|
|
|
|
|
},
|
|
|
|
|
df: function () {
|
|
|
|
|
this.m_oContext.fill();
|
|
|
|
|
},
|
|
|
|
|
save: function () {
|
|
|
|
|
this.m_oContext.save();
|
|
|
|
|
},
|
|
|
|
|
restore: function () {
|
|
|
|
|
this.m_oContext.restore();
|
|
|
|
|
},
|
|
|
|
|
clip: function () {
|
|
|
|
|
this.m_oContext.clip();
|
|
|
|
|
},
|
|
|
|
|
reset: function () {
|
|
|
|
|
this.m_oTransform.Reset();
|
|
|
|
|
this.CalculateFullTransform(false);
|
|
|
|
|
if (!this.m_bIntegerGrid) {
|
|
|
|
|
this.m_oContext.setTransform(this.m_oCoordTransform.sx, 0, 0, this.m_oCoordTransform.sy, 0, 0);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
transform3: function (m, isNeedInvert) {
|
|
|
|
|
var _t = this.m_oTransform;
|
|
|
|
|
_t.sx = m.sx;
|
|
|
|
|
_t.shx = m.shx;
|
|
|
|
|
_t.shy = m.shy;
|
|
|
|
|
_t.sy = m.sy;
|
|
|
|
|
_t.tx = m.tx;
|
|
|
|
|
_t.ty = m.ty;
|
|
|
|
|
this.CalculateFullTransform(isNeedInvert);
|
|
|
|
|
if (!this.m_bIntegerGrid) {
|
|
|
|
|
var _ft = this.m_oFullTransform;
|
|
|
|
|
this.m_oContext.setTransform(_ft.sx, _ft.shy, _ft.shx, _ft.sy, _ft.tx, _ft.ty);
|
|
|
|
|
} else {
|
|
|
|
|
this.SetIntegerGrid(false);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
FreeFont: function () {
|
|
|
|
|
this.m_oFontManager.m_pFont = null;
|
|
|
|
|
},
|
|
|
|
|
drawImage2: function (img, x, y, w, h, alpha, srcRect) {
|
|
|
|
|
var isA = (undefined !== alpha && null != alpha && 255 != alpha);
|
|
|
|
|
var _oldGA = 0;
|
|
|
|
|
if (isA) {
|
|
|
|
|
_oldGA = this.m_oContext.globalAlpha;
|
|
|
|
|
this.m_oContext.globalAlpha = alpha / 255;
|
|
|
|
|
}
|
|
|
|
|
if (false === this.m_bIntegerGrid) {
|
|
|
|
|
if (!srcRect) {
|
|
|
|
|
if (!global_MatrixTransformer.IsIdentity2(this.m_oTransform)) {
|
|
|
|
|
this.m_oContext.drawImage(img, x, y, w, h);
|
|
|
|
|
} else {
|
|
|
|
|
var xx = this.m_oFullTransform.TransformPointX(x, y);
|
|
|
|
|
var yy = this.m_oFullTransform.TransformPointY(x, y);
|
|
|
|
|
var rr = this.m_oFullTransform.TransformPointX(x + w, y + h);
|
|
|
|
|
var bb = this.m_oFullTransform.TransformPointY(x + w, y + h);
|
|
|
|
|
var ww = rr - xx;
|
|
|
|
|
var hh = bb - yy;
|
|
|
|
|
if (Math.abs(img.width - ww) < 2 && Math.abs(img.height - hh) < 2) {
|
|
|
|
|
this.m_oContext.setTransform(1, 0, 0, 1, 0, 0);
|
|
|
|
|
this.m_oContext.drawImage(img, xx >> 0, yy >> 0);
|
|
|
|
|
var _ft = this.m_oFullTransform;
|
|
|
|
|
this.m_oContext.setTransform(_ft.sx, _ft.shy, _ft.shx, _ft.sy, _ft.tx, _ft.ty);
|
|
|
|
|
} else {
|
|
|
|
|
this.m_oContext.drawImage(img, x, y, w, h);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
var _w = img.width;
|
|
|
|
|
var _h = img.height;
|
|
|
|
|
if (_w > 0 && _h > 0) {
|
|
|
|
|
var __w = w;
|
|
|
|
|
var __h = h;
|
|
|
|
|
var _delW = Math.max(0, -srcRect.l) + Math.max(0, srcRect.r - 100) + 100;
|
|
|
|
|
var _delH = Math.max(0, -srcRect.t) + Math.max(0, srcRect.b - 100) + 100;
|
|
|
|
|
var _sx = 0;
|
|
|
|
|
if (srcRect.l > 0 && srcRect.l < 100) {
|
|
|
|
|
_sx = Math.min((_w * srcRect.l / 100) >> 0, _w - 1);
|
|
|
|
|
} else {
|
|
|
|
|
if (srcRect.l < 0) {
|
|
|
|
|
var _off = ((-srcRect.l / _delW) * __w);
|
|
|
|
|
x += _off;
|
|
|
|
|
w -= _off;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
var _sy = 0;
|
|
|
|
|
if (srcRect.t > 0 && srcRect.t < 100) {
|
|
|
|
|
_sy = Math.min((_h * srcRect.t / 100) >> 0, _h - 1);
|
|
|
|
|
} else {
|
|
|
|
|
if (srcRect.t < 0) {
|
|
|
|
|
var _off = ((-srcRect.t / _delH) * __h);
|
|
|
|
|
y += _off;
|
|
|
|
|
h -= _off;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
var _sr = _w;
|
|
|
|
|
if (srcRect.r > 0 && srcRect.r < 100) {
|
|
|
|
|
_sr = Math.max(Math.min((_w * srcRect.r / 100) >> 0, _w - 1), _sx);
|
|
|
|
|
} else {
|
|
|
|
|
if (srcRect.r > 100) {
|
|
|
|
|
var _off = ((srcRect.r - 100) / _delW) * __w;
|
|
|
|
|
w -= _off;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
var _sb = _h;
|
|
|
|
|
if (srcRect.b > 0 && srcRect.b < 100) {
|
|
|
|
|
_sb = Math.max(Math.min((_h * srcRect.b / 100) >> 0, _h - 1), _sy);
|
|
|
|
|
} else {
|
|
|
|
|
if (srcRect.b > 100) {
|
|
|
|
|
var _off = ((srcRect.b - 100) / _delH) * __h;
|
|
|
|
|
h -= _off;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if ((_sr - _sx) > 0 && (_sb - _sy) > 0 && w > 0 && h > 0) {
|
|
|
|
|
this.m_oContext.drawImage(img, _sx, _sy, _sr - _sx, _sb - _sy, x, y, w, h);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
this.m_oContext.drawImage(img, x, y, w, h);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
var _x1 = (this.m_oFullTransform.TransformPointX(x, y)) >> 0;
|
|
|
|
|
var _y1 = (this.m_oFullTransform.TransformPointY(x, y)) >> 0;
|
|
|
|
|
var _x2 = (this.m_oFullTransform.TransformPointX(x + w, y + h)) >> 0;
|
|
|
|
|
var _y2 = (this.m_oFullTransform.TransformPointY(x + w, y + h)) >> 0;
|
|
|
|
|
x = _x1;
|
|
|
|
|
y = _y1;
|
|
|
|
|
w = _x2 - _x1;
|
|
|
|
|
h = _y2 - _y1;
|
|
|
|
|
if (!srcRect) {
|
|
|
|
|
if (!global_MatrixTransformer.IsIdentity2(this.m_oTransform)) {
|
|
|
|
|
this.m_oContext.drawImage(img, _x1, _y1, w, h);
|
|
|
|
|
} else {
|
|
|
|
|
if (Math.abs(img.width - w) < 2 && Math.abs(img.height - h) < 2) {
|
|
|
|
|
this.m_oContext.drawImage(img, x, y);
|
|
|
|
|
} else {
|
|
|
|
|
this.m_oContext.drawImage(img, _x1, _y1, w, h);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
var _w = img.width;
|
|
|
|
|
var _h = img.height;
|
|
|
|
|
if (_w > 0 && _h > 0) {
|
|
|
|
|
var __w = w;
|
|
|
|
|
var __h = h;
|
|
|
|
|
var _delW = Math.max(0, -srcRect.l) + Math.max(0, srcRect.r - 100) + 100;
|
|
|
|
|
var _delH = Math.max(0, -srcRect.t) + Math.max(0, srcRect.b - 100) + 100;
|
|
|
|
|
var _sx = 0;
|
|
|
|
|
if (srcRect.l > 0 && srcRect.l < 100) {
|
|
|
|
|
_sx = Math.min((_w * srcRect.l / 100) >> 0, _w - 1);
|
|
|
|
|
} else {
|
|
|
|
|
if (srcRect.l < 0) {
|
|
|
|
|
var _off = ((-srcRect.l / _delW) * __w);
|
|
|
|
|
x += _off;
|
|
|
|
|
w -= _off;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
var _sy = 0;
|
|
|
|
|
if (srcRect.t > 0 && srcRect.t < 100) {
|
|
|
|
|
_sy = Math.min((_h * srcRect.t / 100) >> 0, _h - 1);
|
|
|
|
|
} else {
|
|
|
|
|
if (srcRect.t < 0) {
|
|
|
|
|
var _off = ((-srcRect.t / _delH) * __h);
|
|
|
|
|
y += _off;
|
|
|
|
|
h -= _off;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
var _sr = _w;
|
|
|
|
|
if (srcRect.r > 0 && srcRect.r < 100) {
|
|
|
|
|
_sr = Math.max(Math.min((_w * srcRect.r / 100) >> 0, _w - 1), _sx);
|
|
|
|
|
} else {
|
|
|
|
|
if (srcRect.r > 100) {
|
|
|
|
|
var _off = ((srcRect.r - 100) / _delW) * __w;
|
|
|
|
|
w -= _off;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
var _sb = _h;
|
|
|
|
|
if (srcRect.b > 0 && srcRect.b < 100) {
|
|
|
|
|
_sb = Math.max(Math.min((_h * srcRect.b / 100) >> 0, _h - 1), _sy);
|
|
|
|
|
} else {
|
|
|
|
|
if (srcRect.b > 100) {
|
|
|
|
|
var _off = ((srcRect.b - 100) / _delH) * __h;
|
|
|
|
|
h -= _off;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if ((_sr - _sx) > 0 && (_sb - _sy) > 0 && w > 0 && h > 0) {
|
|
|
|
|
this.m_oContext.drawImage(img, _sx, _sy, _sr - _sx, _sb - _sy, x, y, w, h);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
this.m_oContext.drawImage(img, x, y, w, h);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (isA) {
|
|
|
|
|
this.m_oContext.globalAlpha = _oldGA;
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
drawImage: function (img, x, y, w, h, alpha, srcRect, nativeImage) {
|
|
|
|
|
if (nativeImage) {
|
|
|
|
|
this.drawImage2(nativeImage, x, y, w, h, alpha, srcRect);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
var _img = editor.ImageLoader.map_image_index[img];
|
|
|
|
|
if (_img != undefined && _img.Status == ImageLoadStatus.Loading) {} else {
|
|
|
|
|
if (_img != undefined && _img.Image != null) {
|
|
|
|
|
this.drawImage2(_img.Image, x, y, w, h, alpha, srcRect);
|
|
|
|
|
} else {
|
|
|
|
|
var _x = x;
|
|
|
|
|
var _y = y;
|
|
|
|
|
var _r = x + w;
|
|
|
|
|
var _b = y + h;
|
|
|
|
|
var ctx = this.m_oContext;
|
|
|
|
|
var old_p = ctx.lineWidth;
|
|
|
|
|
var bIsNoIntGrid = false;
|
|
|
|
|
if (this.m_bIntegerGrid) {
|
|
|
|
|
_x = (this.m_oFullTransform.TransformPointX(x, y) >> 0) + 0.5;
|
|
|
|
|
_y = (this.m_oFullTransform.TransformPointY(x, y) >> 0) + 0.5;
|
|
|
|
|
_r = (this.m_oFullTransform.TransformPointX(x + w, y + h) >> 0) + 0.5;
|
|
|
|
|
_b = (this.m_oFullTransform.TransformPointY(x + w, y + h) >> 0) + 0.5;
|
|
|
|
|
ctx.lineWidth = 1;
|
|
|
|
|
} else {
|
|
|
|
|
if (global_MatrixTransformer.IsIdentity2(this.m_oTransform)) {
|
|
|
|
|
bIsNoIntGrid = true;
|
|
|
|
|
this.SetIntegerGrid(true);
|
|
|
|
|
_x = (this.m_oFullTransform.TransformPointX(x, y) >> 0) + 0.5;
|
|
|
|
|
_y = (this.m_oFullTransform.TransformPointY(x, y) >> 0) + 0.5;
|
|
|
|
|
_r = (this.m_oFullTransform.TransformPointX(x + w, y + h) >> 0) + 0.5;
|
|
|
|
|
_b = (this.m_oFullTransform.TransformPointY(x + w, y + h) >> 0) + 0.5;
|
|
|
|
|
ctx.lineWidth = 1;
|
|
|
|
|
} else {
|
|
|
|
|
ctx.lineWidth = 1 / this.m_oCoordTransform.sx;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
ctx.strokeStyle = "#F98C76";
|
|
|
|
|
ctx.beginPath();
|
|
|
|
|
ctx.moveTo(_x, _y);
|
|
|
|
|
ctx.lineTo(_r, _b);
|
|
|
|
|
ctx.moveTo(_r, _y);
|
|
|
|
|
ctx.lineTo(_x, _b);
|
|
|
|
|
ctx.stroke();
|
|
|
|
|
ctx.beginPath();
|
|
|
|
|
ctx.moveTo(_x, _y);
|
|
|
|
|
ctx.lineTo(_r, _y);
|
|
|
|
|
ctx.lineTo(_r, _b);
|
|
|
|
|
ctx.lineTo(_x, _b);
|
|
|
|
|
ctx.closePath();
|
|
|
|
|
ctx.stroke();
|
|
|
|
|
ctx.beginPath();
|
|
|
|
|
if (bIsNoIntGrid) {
|
|
|
|
|
this.SetIntegerGrid(false);
|
|
|
|
|
}
|
|
|
|
|
ctx.lineWidth = old_p;
|
|
|
|
|
ctx.strokeStyle = "rgba(" + this.m_oPen.Color.R + "," + this.m_oPen.Color.G + "," + this.m_oPen.Color.B + "," + (this.m_oPen.Color.A / 255) + ")";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
GetFont: function () {
|
|
|
|
|
return this.m_oCurFont;
|
|
|
|
|
},
|
|
|
|
|
font: function (font_id, font_size) {
|
|
|
|
|
window.g_font_infos[window.g_map_font_index[font_id]].LoadFont(editor.FontLoader, this.IsUseFonts2 ? this.m_oFontManager2 : this.m_oFontManager, Math.max(font_size, 1), 0, this.m_dDpiX, this.m_dDpiY, this.m_oTransform);
|
|
|
|
|
},
|
|
|
|
|
SetFont: function (font) {
|
|
|
|
|
if (null == font) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
this.m_oCurFont.Name = font.FontFamily.Name;
|
|
|
|
|
this.m_oCurFont.FontSize = font.FontSize;
|
|
|
|
|
this.m_oCurFont.Bold = font.Bold;
|
|
|
|
|
this.m_oCurFont.Italic = font.Italic;
|
|
|
|
|
var bItalic = true === font.Italic;
|
|
|
|
|
var bBold = true === font.Bold;
|
|
|
|
|
var oFontStyle = FontStyle.FontStyleRegular;
|
|
|
|
|
if (!bItalic && bBold) {
|
|
|
|
|
oFontStyle = FontStyle.FontStyleBold;
|
|
|
|
|
} else {
|
|
|
|
|
if (bItalic && !bBold) {
|
|
|
|
|
oFontStyle = FontStyle.FontStyleItalic;
|
|
|
|
|
} else {
|
|
|
|
|
if (bItalic && bBold) {
|
|
|
|
|
oFontStyle = FontStyle.FontStyleBoldItalic;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
var _last_font = this.IsUseFonts2 ? this.m_oLastFont2 : this.m_oLastFont;
|
|
|
|
|
var _font_manager = this.IsUseFonts2 ? this.m_oFontManager2 : this.m_oFontManager;
|
|
|
|
|
_last_font.SetUpName = font.FontFamily.Name;
|
|
|
|
|
_last_font.SetUpSize = font.FontSize;
|
|
|
|
|
_last_font.SetUpStyle = oFontStyle;
|
|
|
|
|
g_fontApplication.LoadFont(_last_font.SetUpName, window.g_font_loader, _font_manager, font.FontSize, oFontStyle, this.m_dDpiX, this.m_dDpiY, this.m_oTransform, this.LastFontOriginInfo);
|
|
|
|
|
var _mD = _last_font.SetUpMatrix;
|
|
|
|
|
var _mS = this.m_oTransform;
|
|
|
|
|
_mD.sx = _mS.sx;
|
|
|
|
|
_mD.sy = _mS.sy;
|
|
|
|
|
_mD.shx = _mS.shx;
|
|
|
|
|
_mD.shy = _mS.shy;
|
|
|
|
|
_mD.tx = _mS.tx;
|
|
|
|
|
_mD.ty = _mS.ty;
|
|
|
|
|
},
|
|
|
|
|
SetTextPr: function (textPr, theme) {
|
|
|
|
|
this.m_oTextPr = textPr;
|
|
|
|
|
if (theme) {
|
|
|
|
|
this.m_oGrFonts.checkFromTheme(theme.themeElements.fontScheme, this.m_oTextPr.RFonts);
|
|
|
|
|
} else {
|
|
|
|
|
this.m_oGrFonts = this.m_oTextPr.RFonts;
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
SetFontSlot: function (slot, fontSizeKoef) {
|
|
|
|
|
var _rfonts = this.m_oGrFonts;
|
|
|
|
|
var _lastFont = this.IsUseFonts2 ? this.m_oLastFont2 : this.m_oLastFont;
|
|
|
|
|
switch (slot) {
|
|
|
|
|
case fontslot_ASCII:
|
|
|
|
|
_lastFont.Name = _rfonts.Ascii.Name;
|
|
|
|
|
_lastFont.Size = this.m_oTextPr.FontSize;
|
|
|
|
|
_lastFont.Bold = this.m_oTextPr.Bold;
|
|
|
|
|
_lastFont.Italic = this.m_oTextPr.Italic;
|
|
|
|
|
break;
|
|
|
|
|
case fontslot_CS:
|
|
|
|
|
_lastFont.Name = _rfonts.CS.Name;
|
|
|
|
|
_lastFont.Size = this.m_oTextPr.FontSizeCS;
|
|
|
|
|
_lastFont.Bold = this.m_oTextPr.BoldCS;
|
|
|
|
|
_lastFont.Italic = this.m_oTextPr.ItalicCS;
|
|
|
|
|
break;
|
|
|
|
|
case fontslot_EastAsia:
|
|
|
|
|
_lastFont.Name = _rfonts.EastAsia.Name;
|
|
|
|
|
_lastFont.Size = this.m_oTextPr.FontSize;
|
|
|
|
|
_lastFont.Bold = this.m_oTextPr.Bold;
|
|
|
|
|
_lastFont.Italic = this.m_oTextPr.Italic;
|
|
|
|
|
break;
|
|
|
|
|
case fontslot_HAnsi:
|
|
|
|
|
default:
|
|
|
|
|
_lastFont.Name = _rfonts.HAnsi.Name;
|
|
|
|
|
_lastFont.Size = this.m_oTextPr.FontSize;
|
|
|
|
|
_lastFont.Bold = this.m_oTextPr.Bold;
|
|
|
|
|
_lastFont.Italic = this.m_oTextPr.Italic;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (undefined !== fontSizeKoef) {
|
|
|
|
|
_lastFont.Size *= fontSizeKoef;
|
|
|
|
|
}
|
|
|
|
|
var _style = 0;
|
|
|
|
|
if (_lastFont.Italic) {
|
|
|
|
|
_style += 2;
|
|
|
|
|
}
|
|
|
|
|
if (_lastFont.Bold) {
|
|
|
|
|
_style += 1;
|
|
|
|
|
}
|
|
|
|
|
var _font_manager = this.IsUseFonts2 ? this.m_oFontManager2 : this.m_oFontManager;
|
|
|
|
|
if (_lastFont.Name != _lastFont.SetUpName || _lastFont.Size != _lastFont.SetUpSize || _style != _lastFont.SetUpStyle) {
|
|
|
|
|
_lastFont.SetUpName = _lastFont.Name;
|
|
|
|
|
_lastFont.SetUpSize = _lastFont.Size;
|
|
|
|
|
_lastFont.SetUpStyle = _style;
|
|
|
|
|
g_fontApplication.LoadFont(_lastFont.SetUpName, window.g_font_loader, _font_manager, _lastFont.SetUpSize, _lastFont.SetUpStyle, this.m_dDpiX, this.m_dDpiY, this.m_oTransform, this.LastFontOriginInfo);
|
|
|
|
|
var _mD = _lastFont.SetUpMatrix;
|
|
|
|
|
var _mS = this.m_oTransform;
|
|
|
|
|
_mD.sx = _mS.sx;
|
|
|
|
|
_mD.sy = _mS.sy;
|
|
|
|
|
_mD.shx = _mS.shx;
|
|
|
|
|
_mD.shy = _mS.shy;
|
|
|
|
|
_mD.tx = _mS.tx;
|
|
|
|
|
_mD.ty = _mS.ty;
|
|
|
|
|
} else {
|
|
|
|
|
var _mD = _lastFont.SetUpMatrix;
|
|
|
|
|
var _mS = this.m_oTransform;
|
|
|
|
|
if (_mD.sx != _mS.sx || _mD.sy != _mS.sy || _mD.shx != _mS.shx || _mD.shy != _mS.shy || _mD.tx != _mS.tx || _mD.ty != _mS.ty) {
|
|
|
|
|
_mD.sx = _mS.sx;
|
|
|
|
|
_mD.sy = _mS.sy;
|
|
|
|
|
_mD.shx = _mS.shx;
|
|
|
|
|
_mD.shy = _mS.shy;
|
|
|
|
|
_mD.tx = _mS.tx;
|
|
|
|
|
_mD.ty = _mS.ty;
|
|
|
|
|
_font_manager.SetTextMatrix(_mD.sx, _mD.shy, _mD.shx, _mD.sy, _mD.tx, _mD.ty);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
GetTextPr: function () {
|
|
|
|
|
return this.m_oTextPr;
|
|
|
|
|
},
|
|
|
|
|
FillText: function (x, y, text) {
|
|
|
|
|
if (this.m_bIsBreak) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
var _x = this.m_oInvertFullTransform.TransformPointX(x, y);
|
|
|
|
|
var _y = this.m_oInvertFullTransform.TransformPointY(x, y);
|
|
|
|
|
var _font_manager = this.IsUseFonts2 ? this.m_oFontManager2 : this.m_oFontManager;
|
|
|
|
|
try {
|
|
|
|
|
var _code = text.charCodeAt(0);
|
|
|
|
|
if (null != this.LastFontOriginInfo.Replace) {
|
|
|
|
|
_code = g_fontApplication.GetReplaceGlyph(_code, this.LastFontOriginInfo.Replace);
|
|
|
|
|
}
|
|
|
|
|
_font_manager.LoadString4C(_code, _x, _y);
|
|
|
|
|
} catch(err) {}
|
|
|
|
|
if (false === this.m_bIntegerGrid) {
|
|
|
|
|
this.m_oContext.setTransform(1, 0, 0, 1, 0, 0);
|
|
|
|
|
}
|
|
|
|
|
var pGlyph = _font_manager.m_oGlyphString.m_pGlyphsBuffer[0];
|
|
|
|
|
if (null == pGlyph) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (null != pGlyph.oBitmap) {
|
|
|
|
|
this.private_FillGlyph(pGlyph);
|
|
|
|
|
}
|
|
|
|
|
if (false === this.m_bIntegerGrid) {
|
|
|
|
|
this.m_oContext.setTransform(this.m_oFullTransform.sx, this.m_oFullTransform.shy, this.m_oFullTransform.shx, this.m_oFullTransform.sy, this.m_oFullTransform.tx, this.m_oFullTransform.ty);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
t: function (text, x, y) {
|
|
|
|
|
if (this.m_bIsBreak) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
var _x = this.m_oInvertFullTransform.TransformPointX(x, y);
|
|
|
|
|
var _y = this.m_oInvertFullTransform.TransformPointY(x, y);
|
|
|
|
|
var _font_manager = this.IsUseFonts2 ? this.m_oFontManager2 : this.m_oFontManager;
|
|
|
|
|
try {
|
|
|
|
|
_font_manager.LoadString2(text, _x, _y);
|
|
|
|
|
} catch(err) {}
|
|
|
|
|
this.m_oContext.setTransform(1, 0, 0, 1, 0, 0);
|
|
|
|
|
while (true) {
|
|
|
|
|
var pGlyph = _font_manager.GetNextChar2();
|
|
|
|
|
if (null == pGlyph) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (null != pGlyph.oBitmap) {
|
|
|
|
|
this.private_FillGlyph(pGlyph);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (false === this.m_bIntegerGrid) {
|
|
|
|
|
this.m_oContext.setTransform(this.m_oFullTransform.sx, this.m_oFullTransform.shy, this.m_oFullTransform.shx, this.m_oFullTransform.sy, this.m_oFullTransform.tx, this.m_oFullTransform.ty);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
FillText2: function (x, y, text, cropX, cropW) {
|
|
|
|
|
if (this.m_bIsBreak) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
var _x = this.m_oInvertFullTransform.TransformPointX(x, y);
|
|
|
|
|
var _y = this.m_oInvertFullTransform.TransformPointY(x, y);
|
|
|
|
|
var _font_manager = this.IsUseFonts2 ? this.m_oFontManager2 : this.m_oFontManager;
|
|
|
|
|
try {
|
|
|
|
|
var _code = text.charCodeAt(0);
|
|
|
|
|
if (null != this.LastFontOriginInfo.Replace) {
|
|
|
|
|
_code = g_fontApplication.GetReplaceGlyph(_code, this.LastFontOriginInfo.Replace);
|
|
|
|
|
}
|
|
|
|
|
_font_manager.LoadString4C(_code, _x, _y);
|
|
|
|
|
} catch(err) {}
|
|
|
|
|
this.m_oContext.setTransform(1, 0, 0, 1, 0, 0);
|
|
|
|
|
var pGlyph = _font_manager.m_oGlyphString.m_pGlyphsBuffer[0];
|
|
|
|
|
if (null == pGlyph) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (null != pGlyph.oBitmap) {
|
|
|
|
|
this.private_FillGlyphC(pGlyph, cropX, cropW);
|
|
|
|
|
}
|
|
|
|
|
if (false === this.m_bIntegerGrid) {
|
|
|
|
|
this.m_oContext.setTransform(this.m_oFullTransform.sx, this.m_oFullTransform.shy, this.m_oFullTransform.shx, this.m_oFullTransform.sy, this.m_oFullTransform.tx, this.m_oFullTransform.ty);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
t2: function (text, x, y, cropX, cropW) {
|
|
|
|
|
if (this.m_bIsBreak) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
var _x = this.m_oInvertFullTransform.TransformPointX(x, y);
|
|
|
|
|
var _y = this.m_oInvertFullTransform.TransformPointY(x, y);
|
|
|
|
|
var _font_manager = this.IsUseFonts2 ? this.m_oFontManager2 : this.m_oFontManager;
|
|
|
|
|
try {
|
|
|
|
|
_font_manager.LoadString2(text, _x, _y);
|
|
|
|
|
} catch(err) {}
|
|
|
|
|
this.m_oContext.setTransform(1, 0, 0, 1, 0, 0);
|
|
|
|
|
while (true) {
|
|
|
|
|
var pGlyph = _font_manager.GetNextChar2();
|
|
|
|
|
if (null == pGlyph) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (null != pGlyph.oBitmap) {
|
|
|
|
|
this.private_FillGlyphC(pGlyph, cropX, cropW);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (false === this.m_bIntegerGrid) {
|
|
|
|
|
this.m_oContext.setTransform(this.m_oFullTransform.sx, this.m_oFullTransform.shy, this.m_oFullTransform.shx, this.m_oFullTransform.sy, this.m_oFullTransform.tx, this.m_oFullTransform.ty);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
FillTextCode: function (x, y, lUnicode) {
|
|
|
|
|
if (this.m_bIsBreak) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
var _x = this.m_oInvertFullTransform.TransformPointX(x, y);
|
|
|
|
|
var _y = this.m_oInvertFullTransform.TransformPointY(x, y);
|
|
|
|
|
var _font_manager = this.IsUseFonts2 ? this.m_oFontManager2 : this.m_oFontManager;
|
|
|
|
|
try {
|
|
|
|
|
if (null != this.LastFontOriginInfo.Replace) {
|
|
|
|
|
lUnicode = g_fontApplication.GetReplaceGlyph(lUnicode, this.LastFontOriginInfo.Replace);
|
|
|
|
|
}
|
|
|
|
|
_font_manager.LoadString4C(lUnicode, _x, _y);
|
|
|
|
|
} catch(err) {}
|
|
|
|
|
if (false === this.m_bIntegerGrid) {
|
|
|
|
|
this.m_oContext.setTransform(1, 0, 0, 1, 0, 0);
|
|
|
|
|
}
|
|
|
|
|
var pGlyph = _font_manager.m_oGlyphString.m_pGlyphsBuffer[0];
|
|
|
|
|
if (null == pGlyph) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (null != pGlyph.oBitmap) {
|
|
|
|
|
this.private_FillGlyph(pGlyph);
|
|
|
|
|
}
|
|
|
|
|
if (false === this.m_bIntegerGrid) {
|
|
|
|
|
this.m_oContext.setTransform(this.m_oFullTransform.sx, this.m_oFullTransform.shy, this.m_oFullTransform.shx, this.m_oFullTransform.sy, this.m_oFullTransform.tx, this.m_oFullTransform.ty);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
tg: function (text, x, y) {
|
|
|
|
|
if (this.m_bIsBreak) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
var _x = this.m_oInvertFullTransform.TransformPointX(x, y);
|
|
|
|
|
var _y = this.m_oInvertFullTransform.TransformPointY(x, y);
|
|
|
|
|
var _font_manager = this.IsUseFonts2 ? this.m_oFontManager2 : this.m_oFontManager;
|
|
|
|
|
try {
|
|
|
|
|
_font_manager.LoadString3C(text, _x, _y);
|
|
|
|
|
} catch(err) {}
|
|
|
|
|
if (false === this.m_bIntegerGrid) {
|
|
|
|
|
this.m_oContext.setTransform(1, 0, 0, 1, 0, 0);
|
|
|
|
|
}
|
|
|
|
|
var pGlyph = _font_manager.m_oGlyphString.m_pGlyphsBuffer[0];
|
|
|
|
|
if (null == pGlyph) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (null != pGlyph.oBitmap) {
|
|
|
|
|
var _a = this.m_oBrush.Color1.A;
|
|
|
|
|
if (255 != _a) {
|
|
|
|
|
this.m_oContext.globalAlpha = _a / 255;
|
|
|
|
|
}
|
|
|
|
|
this.private_FillGlyph(pGlyph);
|
|
|
|
|
if (255 != _a) {
|
|
|
|
|
this.m_oContext.globalAlpha = 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (false === this.m_bIntegerGrid) {
|
|
|
|
|
this.m_oContext.setTransform(this.m_oFullTransform.sx, this.m_oFullTransform.shy, this.m_oFullTransform.shx, this.m_oFullTransform.sy, this.m_oFullTransform.tx, this.m_oFullTransform.ty);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
charspace: function (space) {},
|
|
|
|
|
private_FillGlyph: function (pGlyph) {
|
|
|
|
|
var nW = pGlyph.oBitmap.nWidth;
|
|
|
|
|
var nH = pGlyph.oBitmap.nHeight;
|
|
|
|
|
if (0 == nW || 0 == nH) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
var _font_manager = this.IsUseFonts2 ? this.m_oFontManager2 : this.m_oFontManager;
|
|
|
|
|
var nX = (_font_manager.m_oGlyphString.m_fX + pGlyph.fX + pGlyph.oBitmap.nX) >> 0;
|
|
|
|
|
var nY = (_font_manager.m_oGlyphString.m_fY + pGlyph.fY - pGlyph.oBitmap.nY) >> 0;
|
|
|
|
|
pGlyph.oBitmap.oGlyphData.checkColor(this.m_oBrush.Color1.R, this.m_oBrush.Color1.G, this.m_oBrush.Color1.B, nW, nH);
|
|
|
|
|
if (null == this.TextClipRect) {
|
|
|
|
|
pGlyph.oBitmap.draw(this.m_oContext, nX, nY, this.TextClipRect);
|
|
|
|
|
} else {
|
|
|
|
|
pGlyph.oBitmap.drawCropInRect(this.m_oContext, nX, nY, this.TextClipRect);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
private_FillGlyphC: function (pGlyph, cropX, cropW) {
|
|
|
|
|
var nW = pGlyph.oBitmap.nWidth;
|
|
|
|
|
var nH = pGlyph.oBitmap.nHeight;
|
|
|
|
|
if (0 == nW || 0 == nH) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
var _font_manager = this.IsUseFonts2 ? this.m_oFontManager2 : this.m_oFontManager;
|
|
|
|
|
var nX = (_font_manager.m_oGlyphString.m_fX + pGlyph.fX + pGlyph.oBitmap.nX) >> 0;
|
|
|
|
|
var nY = (_font_manager.m_oGlyphString.m_fY + pGlyph.fY - pGlyph.oBitmap.nY) >> 0;
|
|
|
|
|
var d_koef = this.m_dDpiX / 25.4;
|
|
|
|
|
var cX = Math.max((cropX * d_koef) >> 0, 0);
|
|
|
|
|
var cW = Math.min((cropW * d_koef) >> 0, nW);
|
|
|
|
|
if (cW <= 0) {
|
|
|
|
|
cW = 1;
|
|
|
|
|
}
|
|
|
|
|
pGlyph.oBitmap.oGlyphData.checkColor(this.m_oBrush.Color1.R, this.m_oBrush.Color1.G, this.m_oBrush.Color1.B, nW, nH);
|
|
|
|
|
pGlyph.oBitmap.drawCrop(this.m_oContext, nX, nY, cW, nH, cX);
|
|
|
|
|
},
|
|
|
|
|
private_FillGlyph2: function (pGlyph) {
|
|
|
|
|
var i = 0;
|
|
|
|
|
var j = 0;
|
|
|
|
|
var nW = pGlyph.oBitmap.nWidth;
|
|
|
|
|
var nH = pGlyph.oBitmap.nHeight;
|
|
|
|
|
if (0 == nW || 0 == nH) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
var _font_manager = this.IsUseFonts2 ? this.m_oFontManager2 : this.m_oFontManager;
|
|
|
|
|
var nX = (_font_manager.m_oGlyphString.m_fX + pGlyph.fX + pGlyph.oBitmap.nX) >> 0;
|
|
|
|
|
var nY = (_font_manager.m_oGlyphString.m_fY + pGlyph.fY - pGlyph.oBitmap.nY) >> 0;
|
|
|
|
|
var imageData = this.m_oContext.getImageData(nX, nY, nW, nH);
|
|
|
|
|
var pPixels = imageData.data;
|
|
|
|
|
var _r = this.m_oBrush.Color1.R;
|
|
|
|
|
var _g = this.m_oBrush.Color1.G;
|
|
|
|
|
var _b = this.m_oBrush.Color1.B;
|
|
|
|
|
for (; j < nH; ++j) {
|
|
|
|
|
var indx = 4 * j * nW;
|
|
|
|
|
for (i = 0; i < nW; ++i) {
|
|
|
|
|
var weight = pGlyph.oBitmap.pData[j * pGlyph.oBitmap.nWidth + i];
|
|
|
|
|
if (255 == weight) {
|
|
|
|
|
pPixels[indx] = _r;
|
|
|
|
|
pPixels[indx + 1] = _g;
|
|
|
|
|
pPixels[indx + 2] = _b;
|
|
|
|
|
pPixels[indx + 3] = 255;
|
|
|
|
|
} else {
|
|
|
|
|
var r = pPixels[indx];
|
|
|
|
|
var g = pPixels[indx + 1];
|
|
|
|
|
var b = pPixels[indx + 2];
|
|
|
|
|
var a = pPixels[indx + 3];
|
|
|
|
|
pPixels[indx] = ((_r - r) * weight + (r << 8)) >>> 8;
|
|
|
|
|
pPixels[indx + 1] = ((_g - g) * weight + (g << 8)) >>> 8;
|
|
|
|
|
pPixels[indx + 2] = ((_b - b) * weight + (b << 8)) >>> 8;
|
|
|
|
|
pPixels[indx + 3] = (weight + a) - ((weight * a + 256) >>> 8);
|
|
|
|
|
}
|
|
|
|
|
indx += 4;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
this.m_oContext.putImageData(imageData, nX, nY);
|
|
|
|
|
},
|
|
|
|
|
SetIntegerGrid: function (param) {
|
|
|
|
|
if (true == param) {
|
|
|
|
|
this.m_bIntegerGrid = true;
|
|
|
|
|
this.m_oContext.setTransform(1, 0, 0, 1, 0, 0);
|
|
|
|
|
} else {
|
|
|
|
|
this.m_bIntegerGrid = false;
|
|
|
|
|
this.m_oContext.setTransform(this.m_oFullTransform.sx, this.m_oFullTransform.shy, this.m_oFullTransform.shx, this.m_oFullTransform.sy, this.m_oFullTransform.tx, this.m_oFullTransform.ty);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
GetIntegerGrid: function () {
|
|
|
|
|
return this.m_bIntegerGrid;
|
|
|
|
|
},
|
|
|
|
|
DrawStringASCII: function (name, size, bold, italic, text, x, y, bIsHeader) {
|
|
|
|
|
var _textProp = {
|
|
|
|
|
RFonts: {
|
|
|
|
|
Ascii: {
|
|
|
|
|
Name: name,
|
|
|
|
|
Index: -1
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
FontSize: (((size * 2 * 96 / this.m_dDpiY) + 0.5) >> 0) / 2,
|
|
|
|
|
Bold: false,
|
|
|
|
|
Italic: false
|
|
|
|
|
};
|
|
|
|
|
this.m_oTextPr = _textProp;
|
|
|
|
|
this.m_oGrFonts.Ascii.Name = this.m_oTextPr.RFonts.Ascii.Name;
|
|
|
|
|
this.m_oGrFonts.Ascii.Index = -1;
|
|
|
|
|
this.SetFontSlot(fontslot_ASCII, 1);
|
|
|
|
|
this.m_oFontManager.LoadString2(text, 0, 0);
|
|
|
|
|
var measure = this.m_oFontManager.MeasureString2();
|
|
|
|
|
var _ctx = this.m_oContext;
|
|
|
|
|
_ctx.beginPath();
|
|
|
|
|
_ctx.fillStyle = "#E1E1E1";
|
|
|
|
|
_ctx.strokeStyle = GlobalSkin.RulerOutline;
|
|
|
|
|
var __x = this.m_oFullTransform.TransformPointX(x, y) >> 0;
|
|
|
|
|
var __y = this.m_oFullTransform.TransformPointY(x, y) >> 0;
|
|
|
|
|
var __w = (measure.fWidth >> 0) + 20;
|
|
|
|
|
var __h = (measure.fHeight >> 0) + 10;
|
|
|
|
|
if (!bIsHeader) {
|
|
|
|
|
__y -= __h;
|
|
|
|
|
}
|
|
|
|
|
_ctx.rect(__x + 0.5, __y + 0.5, __w, __h);
|
|
|
|
|
_ctx.fill();
|
|
|
|
|
_ctx.stroke();
|
|
|
|
|
_ctx.beginPath();
|
|
|
|
|
this.b_color1(68, 68, 68, 255);
|
|
|
|
|
var _koef_px_to_mm = 25.4 / this.m_dDpiY;
|
|
|
|
|
if (bIsHeader) {
|
|
|
|
|
this.t(text, x + 10 * _koef_px_to_mm, y + (__h - 5) * _koef_px_to_mm);
|
|
|
|
|
} else {
|
|
|
|
|
this.t(text, x + 10 * _koef_px_to_mm, y - 5 * _koef_px_to_mm);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
DrawStringASCII2: function (name, size, bold, italic, text, x, y, bIsHeader) {
|
|
|
|
|
var _textProp = {
|
|
|
|
|
RFonts: {
|
|
|
|
|
Ascii: {
|
|
|
|
|
Name: name,
|
|
|
|
|
Index: -1
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
FontSize: (((size * 2 * 96 / this.m_dDpiY) + 0.5) >> 0) / 2,
|
|
|
|
|
Bold: false,
|
|
|
|
|
Italic: false
|
|
|
|
|
};
|
|
|
|
|
this.m_oTextPr = _textProp;
|
|
|
|
|
this.m_oGrFonts.Ascii.Name = this.m_oTextPr.RFonts.Ascii.Name;
|
|
|
|
|
this.m_oGrFonts.Ascii.Index = -1;
|
|
|
|
|
this.SetFontSlot(fontslot_ASCII, 1);
|
|
|
|
|
this.m_oFontManager.LoadString2(text, 0, 0);
|
|
|
|
|
var measure = this.m_oFontManager.MeasureString2();
|
|
|
|
|
var _ctx = this.m_oContext;
|
|
|
|
|
_ctx.beginPath();
|
|
|
|
|
_ctx.fillStyle = "#E1E1E1";
|
|
|
|
|
_ctx.strokeStyle = GlobalSkin.RulerOutline;
|
|
|
|
|
var __x = this.m_oFullTransform.TransformPointX(this.m_dWidthMM - x, y) >> 0;
|
|
|
|
|
var __y = this.m_oFullTransform.TransformPointY(this.m_dWidthMM - x, y) >> 0;
|
|
|
|
|
var __w = (measure.fWidth >> 0) + 20;
|
|
|
|
|
var __h = (measure.fHeight >> 0) + 10;
|
|
|
|
|
__x -= __w;
|
|
|
|
|
if (!bIsHeader) {
|
|
|
|
|
__y -= __h;
|
|
|
|
|
}
|
|
|
|
|
_ctx.rect(__x + 0.5, __y + 0.5, __w, __h);
|
|
|
|
|
_ctx.fill();
|
|
|
|
|
_ctx.stroke();
|
|
|
|
|
_ctx.beginPath();
|
|
|
|
|
this.b_color1(68, 68, 68, 255);
|
|
|
|
|
var _koef_px_to_mm = 25.4 / this.m_dDpiY;
|
|
|
|
|
var xPos = this.m_dWidthMM - x - (__w - 10) * _koef_px_to_mm;
|
|
|
|
|
if (bIsHeader) {
|
|
|
|
|
this.t(text, xPos, y + (__h - 5) * _koef_px_to_mm);
|
|
|
|
|
} else {
|
|
|
|
|
this.t(text, xPos, y - 5 * _koef_px_to_mm);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
DrawHeaderEdit: function (yPos, lock_type, sectionNum, bIsRepeat, type) {
|
|
|
|
|
var _y = this.m_oFullTransform.TransformPointY(0, yPos);
|
|
|
|
|
_y = (_y >> 0) + 0.5;
|
|
|
|
|
var _x = 0;
|
|
|
|
|
var _wmax = this.m_lWidthPix;
|
|
|
|
|
var _w1 = 6;
|
|
|
|
|
var _w2 = 3;
|
|
|
|
|
var ctx = this.m_oContext;
|
|
|
|
|
switch (lock_type) {
|
|
|
|
|
case locktype_None:
|
|
|
|
|
case locktype_Mine:
|
|
|
|
|
this.p_color(187, 190, 194, 255);
|
|
|
|
|
ctx.lineWidth = 1;
|
|
|
|
|
break;
|
|
|
|
|
case locktype_Other:
|
|
|
|
|
case locktype_Other2:
|
|
|
|
|
this.p_color(238, 53, 37, 255);
|
|
|
|
|
ctx.lineWidth = 1;
|
|
|
|
|
_w1 = 2;
|
|
|
|
|
_w2 = 1;
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
this.p_color(155, 187, 277, 255);
|
|
|
|
|
ctx.lineWidth = 2;
|
|
|
|
|
_w1 = 2;
|
|
|
|
|
_w2 = 1;
|
|
|
|
|
}
|
|
|
|
|
var bIsNoIntGrid = this.m_bIntegerGrid;
|
|
|
|
|
if (false == bIsNoIntGrid) {
|
|
|
|
|
this.SetIntegerGrid(true);
|
|
|
|
|
}
|
|
|
|
|
this._s();
|
|
|
|
|
while (true) {
|
|
|
|
|
if (_x > _wmax) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
ctx.moveTo(_x, _y);
|
|
|
|
|
_x += _w1;
|
|
|
|
|
ctx.lineTo(_x, _y);
|
|
|
|
|
_x += _w2;
|
|
|
|
|
}
|
|
|
|
|
this.ds();
|
|
|
|
|
var _header_text = "Header";
|
|
|
|
|
if (-1 != sectionNum) {
|
|
|
|
|
_header_text += (" -Section " + (sectionNum + 1) + "-");
|
|
|
|
|
}
|
|
|
|
|
if (type) {
|
|
|
|
|
if (type.bFirst) {
|
|
|
|
|
_header_text = "First Page " + _header_text;
|
|
|
|
|
} else {
|
|
|
|
|
if (EvenAndOddHeaders) {
|
|
|
|
|
if (type.bEven) {
|
|
|
|
|
_header_text = "Even Page " + _header_text;
|
|
|
|
|
} else {
|
|
|
|
|
_header_text = "Odd Page " + _header_text;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
this.DrawStringASCII("Courier New", 9, false, false, _header_text, 2, yPos, true);
|
|
|
|
|
if (bIsRepeat) {
|
|
|
|
|
this.DrawStringASCII2("Courier New", 9, false, false, "Same as Previous", 2, yPos, true);
|
|
|
|
|
}
|
|
|
|
|
if (false == bIsNoIntGrid) {
|
|
|
|
|
this.SetIntegerGrid(false);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
DrawFooterEdit: function (yPos, lock_type, sectionNum, bIsRepeat, type) {
|
|
|
|
|
var _y = this.m_oFullTransform.TransformPointY(0, yPos);
|
|
|
|
|
_y = (_y >> 0) + 0.5;
|
|
|
|
|
var _x = 0;
|
|
|
|
|
var _w1 = 6;
|
|
|
|
|
var _w2 = 3;
|
|
|
|
|
var ctx = this.m_oContext;
|
|
|
|
|
switch (lock_type) {
|
|
|
|
|
case locktype_None:
|
|
|
|
|
case locktype_Mine:
|
|
|
|
|
this.p_color(187, 190, 194, 255);
|
|
|
|
|
ctx.lineWidth = 1;
|
|
|
|
|
break;
|
|
|
|
|
case locktype_Other:
|
|
|
|
|
case locktype_Other2:
|
|
|
|
|
this.p_color(238, 53, 37, 255);
|
|
|
|
|
ctx.lineWidth = 1;
|
|
|
|
|
_w1 = 2;
|
|
|
|
|
_w2 = 1;
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
this.p_color(155, 187, 277, 255);
|
|
|
|
|
ctx.lineWidth = 2;
|
|
|
|
|
_w1 = 2;
|
|
|
|
|
_w2 = 1;
|
|
|
|
|
}
|
|
|
|
|
var _wmax = this.m_lWidthPix;
|
|
|
|
|
var bIsNoIntGrid = this.m_bIntegerGrid;
|
|
|
|
|
if (false == bIsNoIntGrid) {
|
|
|
|
|
this.SetIntegerGrid(true);
|
|
|
|
|
}
|
|
|
|
|
this._s();
|
|
|
|
|
while (true) {
|
|
|
|
|
if (_x > _wmax) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
ctx.moveTo(_x, _y);
|
|
|
|
|
_x += _w1;
|
|
|
|
|
ctx.lineTo(_x, _y);
|
|
|
|
|
_x += _w2;
|
|
|
|
|
}
|
|
|
|
|
this.ds();
|
|
|
|
|
var _header_text = "Footer";
|
|
|
|
|
if (-1 != sectionNum) {
|
|
|
|
|
_header_text += (" -Section " + (sectionNum + 1) + "-");
|
|
|
|
|
}
|
|
|
|
|
if (type) {
|
|
|
|
|
if (type.bFirst) {
|
|
|
|
|
_header_text = "First Page " + _header_text;
|
|
|
|
|
} else {
|
|
|
|
|
if (EvenAndOddHeaders) {
|
|
|
|
|
if (type.bEven) {
|
|
|
|
|
_header_text = "Even Page " + _header_text;
|
|
|
|
|
} else {
|
|
|
|
|
_header_text = "Odd Page " + _header_text;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
this.DrawStringASCII("Courier New", 9, false, false, _header_text, 2, yPos, false);
|
|
|
|
|
if (bIsRepeat) {
|
|
|
|
|
this.DrawStringASCII2("Courier New", 9, false, false, "Same as Previous", 2, yPos, false);
|
|
|
|
|
}
|
|
|
|
|
if (false == bIsNoIntGrid) {
|
|
|
|
|
this.SetIntegerGrid(false);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
DrawLockParagraph: function (lock_type, x, y1, y2) {},
|
|
|
|
|
DrawLockObjectRect: function (lock_type, x, y, w, h) {},
|
|
|
|
|
DrawEmptyTableLine: function (x1, y1, x2, y2) {
|
|
|
|
|
if ((!editor.isShowTableEmptyLine || editor.isViewMode) && (editor.isShowTableEmptyLineAttack === false)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
var _x1 = this.m_oFullTransform.TransformPointX(x1, y1);
|
|
|
|
|
var _y1 = this.m_oFullTransform.TransformPointY(x1, y1);
|
|
|
|
|
var _x2 = this.m_oFullTransform.TransformPointX(x2, y2);
|
|
|
|
|
var _y2 = this.m_oFullTransform.TransformPointY(x2, y2);
|
|
|
|
|
_x1 = (_x1 >> 0) + 0.5;
|
|
|
|
|
_y1 = (_y1 >> 0) + 0.5;
|
|
|
|
|
_x2 = (_x2 >> 0) + 0.5;
|
|
|
|
|
_y2 = (_y2 >> 0) + 0.5;
|
|
|
|
|
this.p_color(138, 162, 191, 255);
|
|
|
|
|
var ctx = this.m_oContext;
|
|
|
|
|
if (_x1 != _x2 && _y1 != _y2) {
|
|
|
|
|
var dKoefMMToPx = 1 / Math.max(this.m_oCoordTransform.sx, 0.001);
|
|
|
|
|
this.p_width(1000 * dKoefMMToPx);
|
|
|
|
|
this._s();
|
|
|
|
|
editor.WordControl.m_oDrawingDocument.AutoShapesTrack.AddLineDash(ctx, x1, y1, x2, y2, 2 * dKoefMMToPx, 2 * dKoefMMToPx);
|
|
|
|
|
this.ds();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
ctx.lineWidth = 1;
|
|
|
|
|
var bIsInt = this.m_bIntegerGrid;
|
|
|
|
|
if (!bIsInt) {
|
|
|
|
|
this.SetIntegerGrid(true);
|
|
|
|
|
}
|
|
|
|
|
if (_x1 == _x2) {
|
|
|
|
|
var _y = Math.min(_y1, _y2) + 0.5;
|
|
|
|
|
var _w1 = 2;
|
|
|
|
|
var _w2 = 2;
|
|
|
|
|
var _wmax = Math.max(_y1, _y2) - 0.5;
|
|
|
|
|
this._s();
|
|
|
|
|
while (true) {
|
|
|
|
|
if (_y > _wmax) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
ctx.moveTo(_x1, _y);
|
|
|
|
|
_y += _w1;
|
|
|
|
|
if (_y > _wmax) {
|
|
|
|
|
ctx.lineTo(_x1, _y - _w1 + 1);
|
|
|
|
|
} else {
|
|
|
|
|
ctx.lineTo(_x1, _y);
|
|
|
|
|
}
|
|
|
|
|
_y += _w2;
|
|
|
|
|
}
|
|
|
|
|
this.ds();
|
|
|
|
|
} else {
|
|
|
|
|
if (_y1 == _y2) {
|
|
|
|
|
var _x = Math.min(_x1, _x2) + 0.5;
|
|
|
|
|
var _w1 = 2;
|
|
|
|
|
var _w2 = 2;
|
|
|
|
|
var _wmax = Math.max(_x1, _x2) - 0.5;
|
|
|
|
|
this._s();
|
|
|
|
|
while (true) {
|
|
|
|
|
if (_x > _wmax) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
ctx.moveTo(_x, _y1);
|
|
|
|
|
_x += _w1;
|
|
|
|
|
if (_x > _wmax) {
|
|
|
|
|
ctx.lineTo(_x - _w2 + 1, _y1);
|
|
|
|
|
} else {
|
|
|
|
|
ctx.lineTo(_x, _y1);
|
|
|
|
|
}
|
|
|
|
|
_x += _w2;
|
|
|
|
|
}
|
|
|
|
|
this.ds();
|
|
|
|
|
} else {
|
|
|
|
|
this._s();
|
|
|
|
|
editor.WordControl.m_oDrawingDocument.AutoShapesTrack.AddLineDash(ctx, _x1, _y1, _x2, _y2, 2, 2);
|
|
|
|
|
this.ds();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (!bIsInt) {
|
|
|
|
|
this.SetIntegerGrid(false);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
DrawSpellingLine: function (y0, x0, x1, w) {
|
|
|
|
|
if (!editor.isViewMode) {
|
|
|
|
|
this.drawHorLine(0, y0, x0, x1, w);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
drawHorLine: function (align, y, x, r, penW) {
|
|
|
|
|
var _check_transform = global_MatrixTransformer.IsIdentity2(this.m_oTransform);
|
|
|
|
|
if (!this.m_bIntegerGrid || !_check_transform) {
|
|
|
|
|
if (_check_transform) {
|
|
|
|
|
this.SetIntegerGrid(true);
|
|
|
|
|
this.drawHorLine(align, y, x, r, penW);
|
|
|
|
|
this.SetIntegerGrid(false);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
this.p_width(penW * 1000);
|
|
|
|
|
this._s();
|
|
|
|
|
this._m(x, y);
|
|
|
|
|
this._l(r, y);
|
|
|
|
|
this.ds();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
var pen_w = ((this.m_dDpiX * penW / g_dKoef_in_to_mm) + 0.5) >> 0;
|
|
|
|
|
if (0 == pen_w) {
|
|
|
|
|
pen_w = 1;
|
|
|
|
|
}
|
|
|
|
|
var _x = (this.m_oFullTransform.TransformPointX(x, y) >> 0) + 0.5 - 0.5;
|
|
|
|
|
var _r = (this.m_oFullTransform.TransformPointX(r, y) >> 0) + 0.5 + 0.5;
|
|
|
|
|
var ctx = this.m_oContext;
|
|
|
|
|
ctx.setTransform(1, 0, 0, 1, 0, 0);
|
|
|
|
|
ctx.lineWidth = pen_w;
|
|
|
|
|
switch (align) {
|
|
|
|
|
case 0:
|
|
|
|
|
var _top = (this.m_oFullTransform.TransformPointY(x, y) >> 0) + 0.5;
|
|
|
|
|
ctx.beginPath();
|
|
|
|
|
ctx.moveTo(_x, _top + pen_w / 2 - 0.5);
|
|
|
|
|
ctx.lineTo(_r, _top + pen_w / 2 - 0.5);
|
|
|
|
|
ctx.stroke();
|
|
|
|
|
break;
|
|
|
|
|
case 1:
|
|
|
|
|
var _center = (this.m_oFullTransform.TransformPointY(x, y) >> 0) + 0.5;
|
|
|
|
|
ctx.beginPath();
|
|
|
|
|
if (0 == (pen_w % 2)) {
|
|
|
|
|
ctx.moveTo(_x, _center - 0.5);
|
|
|
|
|
ctx.lineTo(_r, _center - 0.5);
|
|
|
|
|
} else {
|
|
|
|
|
ctx.moveTo(_x, _center);
|
|
|
|
|
ctx.lineTo(_r, _center);
|
|
|
|
|
}
|
|
|
|
|
ctx.stroke();
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
var _bottom = (this.m_oFullTransform.TransformPointY(x, y) >> 0) + 0.5;
|
|
|
|
|
ctx.beginPath();
|
|
|
|
|
ctx.moveTo(_x, _bottom - pen_w / 2 + 0.5);
|
|
|
|
|
ctx.lineTo(_r, _bottom - pen_w / 2 + 0.5);
|
|
|
|
|
ctx.stroke();
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
drawHorLine2: function (align, y, x, r, penW) {
|
|
|
|
|
var _check_transform = global_MatrixTransformer.IsIdentity2(this.m_oTransform);
|
|
|
|
|
if (!this.m_bIntegerGrid || !_check_transform) {
|
|
|
|
|
if (_check_transform) {
|
|
|
|
|
this.SetIntegerGrid(true);
|
|
|
|
|
this.drawHorLine2(align, y, x, r, penW);
|
|
|
|
|
this.SetIntegerGrid(false);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
var _y1 = y - penW / 2;
|
|
|
|
|
var _y2 = _y1 + 2 * penW;
|
|
|
|
|
this.p_width(penW * 1000);
|
|
|
|
|
this._s();
|
|
|
|
|
this._m(x, _y1);
|
|
|
|
|
this._l(r, _y1);
|
|
|
|
|
this.ds();
|
|
|
|
|
this._s();
|
|
|
|
|
this._m(x, _y2);
|
|
|
|
|
this._l(r, _y2);
|
|
|
|
|
this.ds();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
var pen_w = ((this.m_dDpiX * penW / g_dKoef_in_to_mm) + 0.5) >> 0;
|
|
|
|
|
if (0 == pen_w) {
|
|
|
|
|
pen_w = 1;
|
|
|
|
|
}
|
|
|
|
|
var _x = (this.m_oFullTransform.TransformPointX(x, y) >> 0) + 0.5 - 0.5;
|
|
|
|
|
var _r = (this.m_oFullTransform.TransformPointX(r, y) >> 0) + 0.5 + 0.5;
|
|
|
|
|
var ctx = this.m_oContext;
|
|
|
|
|
ctx.lineWidth = pen_w;
|
|
|
|
|
switch (align) {
|
|
|
|
|
case 0:
|
|
|
|
|
var _top = (this.m_oFullTransform.TransformPointY(x, y) >> 0) + 0.5;
|
|
|
|
|
var _pos1 = _top + pen_w / 2 - 0.5 - pen_w;
|
|
|
|
|
var _pos2 = _pos1 + pen_w * 2;
|
|
|
|
|
ctx.beginPath();
|
|
|
|
|
ctx.moveTo(_x, _pos1);
|
|
|
|
|
ctx.lineTo(_r, _pos1);
|
|
|
|
|
ctx.stroke();
|
|
|
|
|
ctx.beginPath();
|
|
|
|
|
ctx.moveTo(_x, _pos2);
|
|
|
|
|
ctx.lineTo(_r, _pos2);
|
|
|
|
|
ctx.stroke();
|
|
|
|
|
break;
|
|
|
|
|
case 1:
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
drawVerLine: function (align, x, y, b, penW) {
|
|
|
|
|
var _check_transform = global_MatrixTransformer.IsIdentity2(this.m_oTransform);
|
|
|
|
|
if (!this.m_bIntegerGrid || !_check_transform) {
|
|
|
|
|
if (_check_transform) {
|
|
|
|
|
this.SetIntegerGrid(true);
|
|
|
|
|
this.drawVerLine(align, x, y, b, penW);
|
|
|
|
|
this.SetIntegerGrid(false);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
this.p_width(penW * 1000);
|
|
|
|
|
this._s();
|
|
|
|
|
this._m(x, y);
|
|
|
|
|
this._l(x, b);
|
|
|
|
|
this.ds();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
var pen_w = ((this.m_dDpiX * penW / g_dKoef_in_to_mm) + 0.5) >> 0;
|
|
|
|
|
if (0 == pen_w) {
|
|
|
|
|
pen_w = 1;
|
|
|
|
|
}
|
|
|
|
|
var _y = (this.m_oFullTransform.TransformPointY(x, y) >> 0) + 0.5 - 0.5;
|
|
|
|
|
var _b = (this.m_oFullTransform.TransformPointY(x, b) >> 0) + 0.5 + 0.5;
|
|
|
|
|
var ctx = this.m_oContext;
|
|
|
|
|
ctx.lineWidth = pen_w;
|
|
|
|
|
switch (align) {
|
|
|
|
|
case 0:
|
|
|
|
|
var _left = (this.m_oFullTransform.TransformPointX(x, y) >> 0) + 0.5;
|
|
|
|
|
ctx.beginPath();
|
|
|
|
|
ctx.moveTo(_left + pen_w / 2 - 0.5, _y);
|
|
|
|
|
ctx.lineTo(_left + pen_w / 2 - 0.5, _b);
|
|
|
|
|
ctx.stroke();
|
|
|
|
|
break;
|
|
|
|
|
case 1:
|
|
|
|
|
var _center = (this.m_oFullTransform.TransformPointX(x, y) >> 0) + 0.5;
|
|
|
|
|
ctx.beginPath();
|
|
|
|
|
if (0 == (pen_w % 2)) {
|
|
|
|
|
ctx.moveTo(_center - 0.5, _y);
|
|
|
|
|
ctx.lineTo(_center - 0.5, _b);
|
|
|
|
|
} else {
|
|
|
|
|
ctx.moveTo(_center, _y);
|
|
|
|
|
ctx.lineTo(_center, _b);
|
|
|
|
|
}
|
|
|
|
|
ctx.stroke();
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
var _right = (this.m_oFullTransform.TransformPointX(x, y) >> 0) + 0.5;
|
|
|
|
|
ctx.beginPath();
|
|
|
|
|
ctx.moveTo(_right - pen_w / 2 + 0.5, _y);
|
|
|
|
|
ctx.lineTo(_right - pen_w / 2 + 0.5, _b);
|
|
|
|
|
ctx.stroke();
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
drawHorLineExt: function (align, y, x, r, penW, leftMW, rightMW) {
|
|
|
|
|
var _check_transform = global_MatrixTransformer.IsIdentity2(this.m_oTransform);
|
|
|
|
|
if (!this.m_bIntegerGrid || !_check_transform) {
|
|
|
|
|
if (_check_transform) {
|
|
|
|
|
this.SetIntegerGrid(true);
|
|
|
|
|
this.drawHorLineExt(align, y, x, r, penW, leftMW, rightMW);
|
|
|
|
|
this.SetIntegerGrid(false);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
this.p_width(penW * 1000);
|
|
|
|
|
this._s();
|
|
|
|
|
this._m(x, y);
|
|
|
|
|
this._l(r, y);
|
|
|
|
|
this.ds();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
var pen_w = Math.max(((this.m_dDpiX * penW / g_dKoef_in_to_mm) + 0.5) >> 0, 1);
|
|
|
|
|
var _x = (this.m_oFullTransform.TransformPointX(x, y) >> 0) + 0.5;
|
|
|
|
|
var _r = (this.m_oFullTransform.TransformPointX(r, y) >> 0) + 0.5;
|
|
|
|
|
if (leftMW != 0) {
|
|
|
|
|
var _center = _x;
|
|
|
|
|
var pen_mw = Math.max(((this.m_dDpiX * Math.abs(leftMW) * 2 / g_dKoef_in_to_mm) + 0.5) >> 0, 1);
|
|
|
|
|
if (leftMW < 0) {
|
|
|
|
|
if ((pen_mw % 2) == 0) {
|
|
|
|
|
_x = _center - (pen_mw / 2);
|
|
|
|
|
} else {
|
|
|
|
|
_x = _center - ((pen_mw / 2) >> 0);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
if ((pen_mw % 2) == 0) {
|
|
|
|
|
_x = _center + ((pen_mw / 2) - 1);
|
|
|
|
|
} else {
|
|
|
|
|
_x = _center + ((pen_mw / 2) >> 0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (rightMW != 0) {
|
|
|
|
|
var _center = _r;
|
|
|
|
|
var pen_mw = Math.max(((this.m_dDpiX * Math.abs(rightMW) * 2 / g_dKoef_in_to_mm) + 0.5) >> 0, 1);
|
|
|
|
|
if (rightMW < 0) {
|
|
|
|
|
if ((pen_mw % 2) == 0) {
|
|
|
|
|
_r = _center - (pen_mw / 2);
|
|
|
|
|
} else {
|
|
|
|
|
_r = _center - ((pen_mw / 2) >> 0);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
if ((pen_mw % 2) == 0) {
|
|
|
|
|
_r = _center + (pen_mw / 2) - 1;
|
|
|
|
|
} else {
|
|
|
|
|
_r = _center + ((pen_mw / 2) >> 0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
var ctx = this.m_oContext;
|
|
|
|
|
ctx.lineWidth = pen_w;
|
|
|
|
|
_x -= 0.5;
|
|
|
|
|
_r += 0.5;
|
|
|
|
|
switch (align) {
|
|
|
|
|
case 0:
|
|
|
|
|
var _top = (this.m_oFullTransform.TransformPointY(x, y) >> 0) + 0.5;
|
|
|
|
|
ctx.beginPath();
|
|
|
|
|
ctx.moveTo(_x, _top + pen_w / 2 - 0.5);
|
|
|
|
|
ctx.lineTo(_r, _top + pen_w / 2 - 0.5);
|
|
|
|
|
ctx.stroke();
|
|
|
|
|
break;
|
|
|
|
|
case 1:
|
|
|
|
|
var _center = (this.m_oFullTransform.TransformPointY(x, y) >> 0) + 0.5;
|
|
|
|
|
ctx.beginPath();
|
|
|
|
|
if (0 == (pen_w % 2)) {
|
|
|
|
|
ctx.moveTo(_x, _center - 0.5);
|
|
|
|
|
ctx.lineTo(_r, _center - 0.5);
|
|
|
|
|
} else {
|
|
|
|
|
ctx.moveTo(_x, _center);
|
|
|
|
|
ctx.lineTo(_r, _center);
|
|
|
|
|
}
|
|
|
|
|
ctx.stroke();
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
var _bottom = (this.m_oFullTransform.TransformPointY(x, y) >> 0) + 0.5;
|
|
|
|
|
ctx.beginPath();
|
|
|
|
|
ctx.moveTo(_x, _bottom - pen_w / 2 + 0.5);
|
|
|
|
|
ctx.lineTo(_r, _bottom - pen_w / 2 + 0.5);
|
|
|
|
|
ctx.stroke();
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
rect: function (x, y, w, h) {
|
|
|
|
|
var ctx = this.m_oContext;
|
|
|
|
|
ctx.beginPath();
|
|
|
|
|
if (this.m_bIntegerGrid) {
|
|
|
|
|
var _x = (this.m_oFullTransform.TransformPointX(x, y) + 0.5) >> 0;
|
|
|
|
|
var _y = (this.m_oFullTransform.TransformPointY(x, y) + 0.5) >> 0;
|
|
|
|
|
var _r = (this.m_oFullTransform.TransformPointX(x + w, y) + 0.5) >> 0;
|
|
|
|
|
var _b = (this.m_oFullTransform.TransformPointY(x, y + h) + 0.5) >> 0;
|
|
|
|
|
ctx.rect(_x, _y, _r - _x, _b - _y);
|
|
|
|
|
} else {
|
|
|
|
|
ctx.rect(x, y, w, h);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
TableRect: function (x, y, w, h) {
|
|
|
|
|
var ctx = this.m_oContext;
|
|
|
|
|
if (this.m_bIntegerGrid) {
|
|
|
|
|
var _x = (this.m_oFullTransform.TransformPointX(x, y) >> 0) + 0.5;
|
|
|
|
|
var _y = (this.m_oFullTransform.TransformPointY(x, y) >> 0) + 0.5;
|
|
|
|
|
var _r = (this.m_oFullTransform.TransformPointX(x + w, y) >> 0) + 0.5;
|
|
|
|
|
var _b = (this.m_oFullTransform.TransformPointY(x, y + h) >> 0) + 0.5;
|
|
|
|
|
ctx.fillRect(_x - 0.5, _y - 0.5, _r - _x + 1, _b - _y + 1);
|
|
|
|
|
} else {
|
|
|
|
|
ctx.fillRect(x, y, w, h);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
AddClipRect: function (x, y, w, h) {
|
|
|
|
|
var __rect = new _rect();
|
|
|
|
|
__rect.x = x;
|
|
|
|
|
__rect.y = y;
|
|
|
|
|
__rect.w = w;
|
|
|
|
|
__rect.h = h;
|
|
|
|
|
this.GrState.AddClipRect(__rect);
|
|
|
|
|
},
|
|
|
|
|
RemoveClipRect: function () {},
|
|
|
|
|
SetClip: function (r) {
|
|
|
|
|
var ctx = this.m_oContext;
|
|
|
|
|
ctx.save();
|
|
|
|
|
ctx.beginPath();
|
|
|
|
|
if (!global_MatrixTransformer.IsIdentity(this.m_oTransform)) {
|
|
|
|
|
ctx.rect(r.x, r.y, r.w, r.h);
|
|
|
|
|
} else {
|
|
|
|
|
var _x = (this.m_oFullTransform.TransformPointX(r.x, r.y) + 1) >> 0;
|
|
|
|
|
var _y = (this.m_oFullTransform.TransformPointY(r.x, r.y) + 1) >> 0;
|
|
|
|
|
var _r = (this.m_oFullTransform.TransformPointX(r.x + r.w, r.y) - 1) >> 0;
|
|
|
|
|
var _b = (this.m_oFullTransform.TransformPointY(r.x, r.y + r.h) - 1) >> 0;
|
|
|
|
|
ctx.rect(_x, _y, _r - _x + 1, _b - _y + 1);
|
|
|
|
|
}
|
|
|
|
|
this.clip();
|
|
|
|
|
ctx.beginPath();
|
|
|
|
|
},
|
|
|
|
|
RemoveClip: function () {
|
|
|
|
|
this.m_oContext.restore();
|
|
|
|
|
this.m_oContext.save();
|
|
|
|
|
if (this.m_oContext.globalAlpha != this.globalAlpha) {
|
|
|
|
|
this.m_oContext.globalAlpha = this.globalAlpha;
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
drawCollaborativeChanges: function (x, y, w, h, Color) {
|
|
|
|
|
this.b_color1(Color.r, Color.g, Color.b, 255);
|
|
|
|
|
this.rect(x, y, w, h);
|
|
|
|
|
this.df();
|
|
|
|
|
},
|
|
|
|
|
drawSearchResult: function (x, y, w, h) {
|
|
|
|
|
this.b_color1(255, 220, 0, 200);
|
|
|
|
|
this.rect(x, y, w, h);
|
|
|
|
|
this.df();
|
|
|
|
|
},
|
|
|
|
|
drawFlowAnchor: function (x, y) {
|
|
|
|
|
if (!window.g_flow_anchor || !window.g_flow_anchor.asc_complete || (!editor || !editor.ShowParaMarks)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (false === this.m_bIntegerGrid) {
|
|
|
|
|
this.m_oContext.setTransform(1, 0, 0, 1, 0, 0);
|
|
|
|
|
}
|
|
|
|
|
var _x = this.m_oFullTransform.TransformPointX(x, y) >> 0;
|
|
|
|
|
var _y = this.m_oFullTransform.TransformPointY(x, y) >> 0;
|
|
|
|
|
this.m_oContext.drawImage(window.g_flow_anchor, _x, _y);
|
|
|
|
|
if (false === this.m_bIntegerGrid) {
|
|
|
|
|
this.m_oContext.setTransform(this.m_oFullTransform.sx, this.m_oFullTransform.shy, this.m_oFullTransform.shx, this.m_oFullTransform.sy, this.m_oFullTransform.tx, this.m_oFullTransform.ty);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
SavePen: function () {
|
|
|
|
|
this.GrState.SavePen();
|
|
|
|
|
},
|
|
|
|
|
RestorePen: function () {
|
|
|
|
|
this.GrState.RestorePen();
|
|
|
|
|
},
|
|
|
|
|
SaveBrush: function () {
|
|
|
|
|
this.GrState.SaveBrush();
|
|
|
|
|
},
|
|
|
|
|
RestoreBrush: function () {
|
|
|
|
|
this.GrState.RestoreBrush();
|
|
|
|
|
},
|
|
|
|
|
SavePenBrush: function () {
|
|
|
|
|
this.GrState.SavePenBrush();
|
|
|
|
|
},
|
|
|
|
|
RestorePenBrush: function () {
|
|
|
|
|
this.GrState.RestorePenBrush();
|
|
|
|
|
},
|
|
|
|
|
SaveGrState: function () {
|
|
|
|
|
this.GrState.SaveGrState();
|
|
|
|
|
},
|
|
|
|
|
RestoreGrState: function () {
|
|
|
|
|
this.GrState.RestoreGrState();
|
|
|
|
|
},
|
|
|
|
|
StartClipPath: function () {},
|
|
|
|
|
EndClipPath: function () {
|
|
|
|
|
this.m_oContext.clip();
|
|
|
|
|
},
|
|
|
|
|
StartCheckTableDraw: function () {
|
|
|
|
|
if (!this.m_bIntegerGrid && global_MatrixTransformer.IsIdentity2(this.m_oTransform)) {
|
|
|
|
|
this.SaveGrState();
|
|
|
|
|
this.SetIntegerGrid(true);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
},
|
|
|
|
|
EndCheckTableDraw: function (bIsRestore) {
|
|
|
|
|
if (bIsRestore) {
|
|
|
|
|
this.RestoreGrState();
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
SetTextClipRect: function (_l, _t, _r, _b) {
|
|
|
|
|
this.TextClipRect = {
|
|
|
|
|
l: (_l * this.m_oCoordTransform.sx) >> 0,
|
|
|
|
|
t: (_t * this.m_oCoordTransform.sy) >> 0,
|
|
|
|
|
r: (_r * this.m_oCoordTransform.sx) >> 0,
|
|
|
|
|
b: (_b * this.m_oCoordTransform.sy) >> 0
|
|
|
|
|
};
|
|
|
|
|
},
|
|
|
|
|
AddSmartRect: function (x, y, w, h, pen_w) {
|
|
|
|
|
if (!global_MatrixTransformer.IsIdentity2(this.m_oTransform)) {
|
|
|
|
|
var r = x + w;
|
|
|
|
|
var b = y + h;
|
|
|
|
|
var dx1 = this.m_oFullTransform.TransformPointX(x, y);
|
|
|
|
|
var dy1 = this.m_oFullTransform.TransformPointY(x, y);
|
|
|
|
|
var dx2 = this.m_oFullTransform.TransformPointX(r, y);
|
|
|
|
|
var dy2 = this.m_oFullTransform.TransformPointY(r, y);
|
|
|
|
|
var dx3 = this.m_oFullTransform.TransformPointX(x, b);
|
|
|
|
|
var dy3 = this.m_oFullTransform.TransformPointY(x, b);
|
|
|
|
|
var dx4 = this.m_oFullTransform.TransformPointX(r, b);
|
|
|
|
|
var dy4 = this.m_oFullTransform.TransformPointY(r, b);
|
|
|
|
|
var _eps = 0.001;
|
|
|
|
|
var bIsClever = false;
|
|
|
|
|
var _type = 1;
|
|
|
|
|
if (Math.abs(dx1 - dx3) < _eps && Math.abs(dx2 - dx4) < _eps && Math.abs(dy1 - dy2) < _eps && Math.abs(dy3 - dy4) < _eps) {
|
|
|
|
|
bIsClever = true;
|
|
|
|
|
_type = 1;
|
|
|
|
|
}
|
|
|
|
|
if (!bIsClever && Math.abs(dx1 - dx2) < _eps && Math.abs(dx3 - dx4) < _eps && Math.abs(dy1 - dy3) < _eps && Math.abs(dy2 - dy4) < _eps) {
|
|
|
|
|
_type = 2;
|
|
|
|
|
bIsClever = true;
|
|
|
|
|
}
|
|
|
|
|
if (!bIsClever) {
|
|
|
|
|
this.ds();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
var _xI = (_type == 1) ? Math.min(dx1, dx2) : Math.min(dx1, dx3);
|
|
|
|
|
var _rI = (_type == 1) ? Math.max(dx1, dx2) : Math.max(dx1, dx3);
|
|
|
|
|
var _yI = (_type == 1) ? Math.min(dy1, dy3) : Math.min(dy1, dy2);
|
|
|
|
|
var _bI = (_type == 1) ? Math.max(dy1, dy3) : Math.max(dy1, dy2);
|
|
|
|
|
var bIsSmartAttack = false;
|
|
|
|
|
if (!this.m_bIntegerGrid) {
|
|
|
|
|
this.SetIntegerGrid(true);
|
|
|
|
|
bIsSmartAttack = true;
|
|
|
|
|
}
|
|
|
|
|
var _pen_w = (pen_w * this.m_oCoordTransform.sx + 0.5) >> 0;
|
|
|
|
|
if (0 >= _pen_w) {
|
|
|
|
|
_pen_w = 1;
|
|
|
|
|
}
|
|
|
|
|
this._s();
|
|
|
|
|
if ((_pen_w & 1) == 1) {
|
|
|
|
|
var _x = (_xI >> 0) + 0.5;
|
|
|
|
|
var _y = (_yI >> 0) + 0.5;
|
|
|
|
|
var _r = (_rI >> 0) + 0.5;
|
|
|
|
|
var _b = (_bI >> 0) + 0.5;
|
|
|
|
|
this.m_oContext.rect(_x, _y, _r - _x, _b - _y);
|
|
|
|
|
} else {
|
|
|
|
|
var _x = (_xI + 0.5) >> 0;
|
|
|
|
|
var _y = (_yI + 0.5) >> 0;
|
|
|
|
|
var _r = (_rI + 0.5) >> 0;
|
|
|
|
|
var _b = (_bI + 0.5) >> 0;
|
|
|
|
|
this.m_oContext.rect(_x, _y, _r - _x, _b - _y);
|
|
|
|
|
}
|
|
|
|
|
this.m_oContext.lineWidth = _pen_w;
|
|
|
|
|
this.ds();
|
|
|
|
|
if (bIsSmartAttack) {
|
|
|
|
|
this.SetIntegerGrid(false);
|
|
|
|
|
}
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
var bIsSmartAttack = false;
|
|
|
|
|
if (!this.m_bIntegerGrid) {
|
|
|
|
|
this.SetIntegerGrid(true);
|
|
|
|
|
bIsSmartAttack = true;
|
|
|
|
|
}
|
|
|
|
|
var _pen_w = (pen_w * this.m_oCoordTransform.sx + 0.5) >> 0;
|
|
|
|
|
if (0 >= _pen_w) {
|
|
|
|
|
_pen_w = 1;
|
|
|
|
|
}
|
|
|
|
|
this._s();
|
|
|
|
|
if ((_pen_w & 1) == 1) {
|
|
|
|
|
var _x = (this.m_oFullTransform.TransformPointX(x, y) >> 0) + 0.5;
|
|
|
|
|
var _y = (this.m_oFullTransform.TransformPointY(x, y) >> 0) + 0.5;
|
|
|
|
|
var _r = (this.m_oFullTransform.TransformPointX(x + w, y + h) >> 0) + 0.5;
|
|
|
|
|
var _b = (this.m_oFullTransform.TransformPointY(x + w, y + h) >> 0) + 0.5;
|
|
|
|
|
this.m_oContext.rect(_x, _y, _r - _x, _b - _y);
|
|
|
|
|
} else {
|
|
|
|
|
var _x = (this.m_oFullTransform.TransformPointX(x, y) + 0.5) >> 0;
|
|
|
|
|
var _y = (this.m_oFullTransform.TransformPointY(x, y) + 0.5) >> 0;
|
|
|
|
|
var _r = (this.m_oFullTransform.TransformPointX(x + w, y + h) + 0.5) >> 0;
|
|
|
|
|
var _b = (this.m_oFullTransform.TransformPointY(x + w, y + h) + 0.5) >> 0;
|
|
|
|
|
this.m_oContext.rect(_x, _y, _r - _x, _b - _y);
|
|
|
|
|
}
|
|
|
|
|
this.m_oContext.lineWidth = _pen_w;
|
|
|
|
|
this.ds();
|
|
|
|
|
if (bIsSmartAttack) {
|
|
|
|
|
this.SetIntegerGrid(false);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
CheckUseFonts2: function (_transform) {
|
|
|
|
|
if (!global_MatrixTransformer.IsIdentity2(_transform)) {
|
|
|
|
|
if (window.g_fontManager2 == null) {
|
|
|
|
|
window.g_fontManager2 = new CFontManager();
|
|
|
|
|
window.g_fontManager2.Initialize(true);
|
|
|
|
|
}
|
|
|
|
|
this.m_oFontManager2 = window.g_fontManager2;
|
|
|
|
|
if (null == this.m_oLastFont2) {
|
|
|
|
|
this.m_oLastFont2 = new CFontSetup();
|
|
|
|
|
}
|
|
|
|
|
this.IsUseFonts2 = true;
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
UncheckUseFonts2: function () {
|
|
|
|
|
this.IsUseFonts2 = false;
|
|
|
|
|
},
|
|
|
|
|
Drawing_StartCheckBounds: function (x, y, w, h) {},
|
|
|
|
|
Drawing_EndCheckBounds: function () {},
|
|
|
|
|
DrawPresentationComment: function (type, x, y, w, h) {
|
|
|
|
|
if (this.IsThumbnail) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (this.m_bIntegerGrid) {
|
|
|
|
|
if (window.g_comment_image && window.g_comment_image.asc_complete === true) {
|
|
|
|
|
var _x = (this.m_oFullTransform.TransformPointX(x, y) >> 0);
|
|
|
|
|
var _y = (this.m_oFullTransform.TransformPointY(x, y) >> 0);
|
|
|
|
|
var _index = 0;
|
|
|
|
|
if ((type & 2) == 2) {
|
|
|
|
|
_index = 2;
|
|
|
|
|
}
|
|
|
|
|
if ((type & 1) == 1) {
|
|
|
|
|
_index += 1;
|
|
|
|
|
}
|
|
|
|
|
if (this.IsRetina) {
|
|
|
|
|
_index += 4;
|
|
|
|
|
}
|
|
|
|
|
var _offset = g_comment_image_offsets[_index];
|
|
|
|
|
this.m_oContext.drawImage(window.g_comment_image, _offset[0], _offset[1], _offset[2], _offset[3], _x, _y, _offset[2], _offset[3]);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
this.SetIntegerGrid(true);
|
|
|
|
|
this.DrawPresentationComment(type, x, y, w, h);
|
|
|
|
|
this.SetIntegerGrid(false);
|
|
|
|
|
}
|
|
|
|
|
}
|
2014-07-05 18:22:49 +00:00
|
|
|
|
};
|