init repo
This commit is contained in:
399
OfficeWeb/sdk/Excel/graphics/DrawingContextWord.js
Normal file
399
OfficeWeb/sdk/Excel/graphics/DrawingContextWord.js
Normal file
@@ -0,0 +1,399 @@
|
||||
/*
|
||||
* (c) Copyright Ascensio System SIA 2010-2014
|
||||
*
|
||||
* 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
|
||||
*
|
||||
*/
|
||||
var g_fontManagerExcel = new CFontManager();
|
||||
g_fontManagerExcel.Initialize(true);
|
||||
var oldPpi = undefined;
|
||||
var lastColor = undefined,
|
||||
lastResult = null,
|
||||
reColor = /^\s*(?:#?([0-9a-f]{6})|#?([0-9a-f]{3})|rgba?\s*\(\s*((?:\d*\.?\d+)(?:\s*,\s*(?:\d*\.?\d+)){2,3})\s*\))\s*$/i;
|
||||
var asc_round = function round(x) {
|
||||
var y = x + (x >= 0 ? 0.5 : -0.4);
|
||||
return y | y;
|
||||
};
|
||||
var asc_floor = function floor(x) {
|
||||
var y = x | x;
|
||||
y -= x < 0 && y > x ? 1 : 0;
|
||||
return y + (x - y > kLeftLim1 ? 1 : 0);
|
||||
};
|
||||
var asc_typeof = function typeOf(obj) {
|
||||
if (obj === undefined) {
|
||||
return kUndefinedL;
|
||||
}
|
||||
if (obj === null) {
|
||||
return kNullL;
|
||||
}
|
||||
return Object.prototype.toString.call(obj).slice(8, -1).toLowerCase();
|
||||
};
|
||||
function getCvtRatio(fromUnits, toUnits, ppi) {
|
||||
if (ppi !== oldPpi || oldPpi === undefined) {
|
||||
var _ppi = 1 / ppi,
|
||||
_72 = 1 / 72,
|
||||
_25_4 = 1 / 25.4;
|
||||
cvt = [[1, 72 * _ppi, _ppi, 25.4 * _ppi], [ppi * _72, 1, _72, 25.4 * _72], [ppi, 72, 1, 25.4], [ppi * _25_4, 72 * _25_4, _25_4, 1]];
|
||||
oldPpi = ppi;
|
||||
}
|
||||
return cvt[fromUnits][toUnits];
|
||||
}
|
||||
function parseColor(c) {
|
||||
if (lastColor === c) {
|
||||
return lastResult;
|
||||
}
|
||||
var bin, m, x, type, r, g, b, a, css, s, rgb, rgba;
|
||||
if (asc_typeof(c) === "number") {
|
||||
type = 4;
|
||||
r = (c >> 16) & 255;
|
||||
g = (c >> 8) & 255;
|
||||
b = c & 255;
|
||||
a = 1;
|
||||
bin = c;
|
||||
} else {
|
||||
m = reColor.exec(c);
|
||||
if (!m) {
|
||||
return null;
|
||||
}
|
||||
if (m[1]) {
|
||||
x = [m[1].slice(0, 2), m[1].slice(2, 4), m[1].slice(4)];
|
||||
type = 1;
|
||||
} else {
|
||||
if (m[2]) {
|
||||
x = [m[2].slice(0, 1), m[2].slice(1, 2), m[2].slice(2)];
|
||||
type = 0;
|
||||
} else {
|
||||
x = m[3].split(/\s*,\s*/i);
|
||||
type = x.length === 3 ? 2 : 3;
|
||||
}
|
||||
}
|
||||
r = parseInt(type !== 0 ? x[0] : x[0] + x[0], type < 2 ? 16 : 10);
|
||||
g = parseInt(type !== 0 ? x[1] : x[1] + x[1], type < 2 ? 16 : 10);
|
||||
b = parseInt(type !== 0 ? x[2] : x[2] + x[2], type < 2 ? 16 : 10);
|
||||
a = type === 3 ? (asc_round(parseFloat(x[3]) * 100) * 0.01) : 1;
|
||||
bin = (r << 16) | (g << 8) | b;
|
||||
}
|
||||
css = bin.toString(16);
|
||||
while (css.length < 6) {
|
||||
css = "0" + css;
|
||||
}
|
||||
css = "#" + css;
|
||||
s = r + ", " + g + ", " + b;
|
||||
rgb = "rgb(" + s + ")";
|
||||
rgba = "rgba(" + s + ", " + a + ")";
|
||||
lastColor = c;
|
||||
lastResult = {
|
||||
r: r,
|
||||
g: g,
|
||||
b: b,
|
||||
a: a,
|
||||
rgb: rgb,
|
||||
rgba: rgba,
|
||||
color: css,
|
||||
origColor: type < 2 ? css : (type === 2 ? rgb : (type === 3 ? rgba : bin)),
|
||||
origType: type,
|
||||
binary: bin
|
||||
};
|
||||
return lastResult;
|
||||
}
|
||||
function CDrawingContextWord() {
|
||||
this.Graphics = null;
|
||||
this.scaleFactor = 1;
|
||||
this.font = new FontProperties("Arial", 11);
|
||||
}
|
||||
function TextMetrics(width, height, lineHeight, baseline, descender, fontSize, centerline, widthBB) {
|
||||
if (! (this instanceof TextMetrics)) {
|
||||
return new TextMetrics(width, height, lineHeight, baseline, descender, fontSize, centerline, widthBB);
|
||||
}
|
||||
this.width = width !== undefined ? width : 0;
|
||||
this.height = height !== undefined ? height : 0;
|
||||
this.lineHeight = lineHeight !== undefined ? lineHeight : 0;
|
||||
this.baseline = baseline !== undefined ? baseline : 0;
|
||||
this.descender = descender !== undefined ? descender : 0;
|
||||
this.fontSize = fontSize !== undefined ? fontSize : 0;
|
||||
this.centerline = centerline !== undefined ? centerline : 0;
|
||||
this.widthBB = widthBB !== undefined ? widthBB : 0;
|
||||
return this;
|
||||
}
|
||||
CDrawingContextWord.prototype = {
|
||||
initFromGraphics: function (graphics) {
|
||||
this.Graphics = graphics;
|
||||
},
|
||||
initFromContext: function (ctx, width_px, height_px, width_mm, height_mm) {
|
||||
if (undefined === width_mm || undefined === height_mm) {
|
||||
width_mm = width_px * g_dKoef_pix_to_mm;
|
||||
height_mm = height_px * g_dKoef_pix_to_mm;
|
||||
}
|
||||
this.Graphics = new CGraphics();
|
||||
this.Graphics.init(ctx, width_px, height_px, width_mm, height_mm);
|
||||
this.Graphics.m_oFontManager = g_fontManagerExcel;
|
||||
this.Graphics.transform(1, 0, 0, 1, 0, 0);
|
||||
},
|
||||
setCanvas: function (canvas) {
|
||||
var c = canvas !== undefined ? canvas : null;
|
||||
if (c === null) {
|
||||
return;
|
||||
}
|
||||
var ctx = c.getContext("2d");
|
||||
this.initFromContext(ctx, c.width, c.height);
|
||||
},
|
||||
setFontManager: function (oManager) {
|
||||
this.Graphics.m_oFontManager = oManager;
|
||||
},
|
||||
setFont: function (font, angle) {
|
||||
var italic, bold, fontStyle, r;
|
||||
if (font.FontFamily.Index === undefined || font.FontFamily.Index === null || font.FontFamily.Index === -1) {
|
||||
font.FontFamily.Index = window.g_map_font_index[font.FontFamily.Name];
|
||||
}
|
||||
italic = true === font.Italic;
|
||||
bold = true === font.Bold;
|
||||
this.font.copyFrom(font);
|
||||
fontStyle = FontStyle.FontStyleRegular;
|
||||
if (!italic && bold) {
|
||||
fontStyle = FontStyle.FontStyleBold;
|
||||
} else {
|
||||
if (italic && !bold) {
|
||||
fontStyle = FontStyle.FontStyleItalic;
|
||||
} else {
|
||||
if (italic && bold) {
|
||||
fontStyle = FontStyle.FontStyleBoldItalic;
|
||||
}
|
||||
}
|
||||
}
|
||||
var fm = this.Graphics.m_oFontManager;
|
||||
if (angle && 0 != angle) {
|
||||
r = window.g_font_infos[font.FontFamily.Index].LoadFont(window.g_font_loader, fm, font.FontSize, fontStyle, this.Graphics.m_dDpiX, this.Graphics.m_dDpiY, this.Graphics.m_oTransform);
|
||||
} else {
|
||||
r = window.g_font_infos[font.FontFamily.Index].LoadFont(window.g_font_loader, fm, font.FontSize, fontStyle, this.Graphics.m_dDpiX, this.Graphics.m_dDpiY);
|
||||
}
|
||||
if (r === false) {
|
||||
throw "Can not use " + font.FontFamily.Name + " font. (Check whether font file is loaded)";
|
||||
}
|
||||
return this;
|
||||
},
|
||||
measureText: function (text, units) {
|
||||
var fm = this.Graphics.m_oFontManager;
|
||||
var r = getCvtRatio(0, units >= 0 && units <= 3 ? units : 1, this.Graphics.m_dDpiX);
|
||||
for (var tmp, w = 0, w2 = 0, i = 0; i < text.length; ++i) {
|
||||
tmp = fm.MeasureChar(text.charCodeAt(i));
|
||||
w += tmp.fAdvanceX;
|
||||
}
|
||||
w2 = w - tmp.fAdvanceX + tmp.oBBox.fMaxX - tmp.oBBox.fMinX + 1;
|
||||
return this._calcTextMetrics(w * r, w2 * r, fm, r);
|
||||
},
|
||||
fillText: function (text, x, y, maxWidth, charWidths, angle) {
|
||||
var kF = 0.3527;
|
||||
this.Graphics.t(text, x * kF, y * kF);
|
||||
},
|
||||
transform: function (sx, shy, shx, sy, tx, ty) {
|
||||
this.Graphics.transform(sx, shy, shx, sy, tx, ty);
|
||||
},
|
||||
getHeightText: function () {
|
||||
var fm = this.Graphics.m_oFontManager;
|
||||
var UnitsPerEm = fm.m_lUnits_Per_Em;
|
||||
var Height = fm.m_lLineHeight;
|
||||
var setUpSize = this.font.FontSize;
|
||||
return Height * setUpSize / UnitsPerEm;
|
||||
},
|
||||
_calcTextMetrics: function (w, wBB, fm, r) {
|
||||
var factor = this.font.FontSize * r / fm.m_lUnits_Per_Em,
|
||||
l = fm.m_lLineHeight * factor,
|
||||
b = fm.m_lAscender * factor,
|
||||
d = Math.abs(fm.m_lDescender * factor);
|
||||
return new TextMetrics(w, b + d, l, b, d, this.font.FontSize, 0, wBB);
|
||||
},
|
||||
setFillStyle: function (val) {
|
||||
var c = parseColor(val);
|
||||
this.Graphics.b_color1(c.r, c.g, c.b, (c.a * 255 + 0.5) >> 0);
|
||||
return this;
|
||||
}
|
||||
};
|
||||
function FontProperties(family, size, bold, italic, underline, strikeout) {
|
||||
if (! (this instanceof FontProperties)) {
|
||||
return new FontProperties(family, size, bold, italic, underline, strikeout);
|
||||
}
|
||||
this.FontFamily = {
|
||||
Name: family,
|
||||
Index: -1,
|
||||
Angle: 0
|
||||
};
|
||||
this.FontSize = size;
|
||||
this.Bold = !!bold;
|
||||
this.Italic = !!italic;
|
||||
this.Underline = underline;
|
||||
this.Strikeout = strikeout;
|
||||
return this;
|
||||
}
|
||||
FontProperties.prototype = {
|
||||
constructor: FontProperties,
|
||||
copyFrom: function (font) {
|
||||
this.FontFamily.Name = font.FontFamily.Name;
|
||||
this.FontFamily.Index = font.FontFamily.Index;
|
||||
this.FontSize = font.FontSize;
|
||||
this.Bold = font.Bold;
|
||||
this.Italic = font.Italic;
|
||||
this.Underline = font.Underline;
|
||||
this.Strikeout = font.Strikeout;
|
||||
},
|
||||
clone: function () {
|
||||
return new FontProperties(this.FontFamily.Name, this.FontSize, this.Bold, this.Italic, this.Underline, this.Strikeout);
|
||||
},
|
||||
isEqual: function (font) {
|
||||
return font !== undefined && this.FontFamily.Name.toLowerCase() === font.FontFamily.Name.toLowerCase() && this.FontSize === font.FontSize && this.Bold === font.Bold && this.Italic === font.Italic;
|
||||
}
|
||||
};
|
||||
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;
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user