/* * (c) Copyright Ascensio System SIA 2010-2024 * * 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 20A-6 Ernesta Birznieka-Upish * street, Riga, Latvia, EU, LV-1050. * * 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"; (function(window, undefined) { // Import var g_fontApplication = AscFonts.g_fontApplication; function CGrRFonts() { this.Ascii = {Name : "Empty", Index : -1}; this.EastAsia = {Name : "Empty", Index : -1}; this.HAnsi = {Name : "Empty", Index : -1}; this.CS = {Name : "Empty", Index : -1}; } CGrRFonts.prototype = { checkFromTheme : function(fontScheme, rFonts) { this.Ascii.Name = fontScheme.checkFont(rFonts.Ascii.Name); this.EastAsia.Name = fontScheme.checkFont(rFonts.EastAsia.Name); this.HAnsi.Name = fontScheme.checkFont(rFonts.HAnsi.Name); this.CS.Name = fontScheme.checkFont(rFonts.CS.Name); this.Ascii.Index = -1; this.EastAsia.Index = -1; this.HAnsi.Index = -1; this.CS.Index = -1; }, fromRFonts : function(rFonts) { if (rFonts.Ascii) { this.Ascii.Name = rFonts.Ascii.Name; } else { this.Ascii.Name = "Empty"; } if (rFonts.EastAsia) { this.EastAsia.Name = rFonts.EastAsia.Name; } else { this.EastAsia.Name = "Empty"; } if (rFonts.HAnsi) { this.HAnsi.Name = rFonts.HAnsi.Name; } else { this.HAnsi.Name = "Empty" } if (rFonts.CS) { this.CS.Name = rFonts.CS.Name; } else { this.CS.Name = "Empty"; } this.Ascii.Index = -1; this.EastAsia.Index = -1; this.HAnsi.Index = -1; this.CS.Index = -1; } }; var gr_state_pen = 0; var gr_state_brush = 1; var gr_state_pen_brush = 2; var gr_state_state = 3; var gr_state_all = 4; function CFontSetup() { this.Name = ""; this.Index = -1; this.Size = 12; this.Bold = false; this.Italic = false; this.Dpi = 72; this.SetUpName = ""; this.SetUpIndex = -1; this.SetUpSize = 12; this.SetUpStyle = -1; this.SetUpDpi = 72; this.SetUpMatrix = new CMatrix(); } CFontSetup.prototype = { Clear : function() { this.Name = ""; this.Index = -1; this.Size = 12; this.Bold = false; this.Italic = false; this.SetUpName = ""; this.SetUpIndex = -1; this.SetUpSize = 12; this.SetUpStyle = -1; this.SetUpMatrix = new CMatrix(); } }; function CGrState_Pen() { this.Type = gr_state_pen; this.Pen = null; } CGrState_Pen.prototype = { Init : function(_pen) { if (_pen !== undefined) this.Pen = _pen.CreateDublicate(); } }; function CGrState_Brush() { this.Type = gr_state_brush; this.Brush = null; } CGrState_Brush.prototype = { Init : function(_brush) { if (undefined !== _brush) this.Brush = _brush.CreateDublicate(); } }; function CGrState_PenBrush() { this.Type = gr_state_pen_brush; this.Pen = null; this.Brush = null; } CGrState_PenBrush.prototype = { Init : function(_pen, _brush) { if (undefined !== _pen && undefined !== _brush) { this.Pen = _pen.CreateDublicate(); this.Brush = _brush.CreateDublicate(); } } }; function CHist_Clip() { this.Path = null; // clipPath this.Rect = null; // clipRect. clipRect - is a simple clipPath. this.IsIntegerGrid = false; this.Transform = new CMatrix(); } CHist_Clip.prototype = { Init : function(path, rect, isIntegerGrid, transform) { this.Path = path; if (rect !== undefined) { this.Rect = new _rect(); this.Rect.x = rect.x; this.Rect.y = rect.y; this.Rect.w = rect.w; this.Rect.h = rect.h; } if (undefined !== isIntegerGrid) this.IsIntegerGrid = isIntegerGrid; if (undefined !== transform) this.Transform = transform.CreateDublicate(); }, ToRenderer : function(renderer) { if (this.Rect != null) { var r = this.Rect; renderer.StartClipPath(); renderer.rect(r.x, r.y, r.w, r.h); renderer.EndClipPath(); } else { // TODO: пока не используется } } }; function CGrState_State() { this.Type = gr_state_state; this.Transform = null; this.IsIntegerGrid = false; this.Clips = null; } CGrState_State.prototype = { Init : function(_transform, _isIntegerGrid, _clips) { if (undefined !== _transform) this.Transform = _transform.CreateDublicate(); if (undefined !== _isIntegerGrid) this.IsIntegerGrid = _isIntegerGrid; if (undefined !== _clips) this.Clips = _clips; }, ApplyClips : function(renderer) { var _len = this.Clips.length; for (var i = 0; i < _len; i++) { this.Clips[i].ToRenderer(renderer); } }, Apply : function(parent) { for (var i = 0, len = this.Clips.length; i < len; i++) { parent.transform3(this.Clips[i].Transform); parent.SetIntegerGrid(this.Clips[i].IsIntegerGrid); var _r = this.Clips[i].Rect; parent.StartClipPath(); parent._s(); parent._m(_r.x, _r.y); parent._l(_r.x + _r.w, _r.y); parent._l(_r.x + _r.w, _r.y + _r.h); parent._l(_r.x, _r.y + _r.h); parent._l(_r.x, _r.y); parent.EndClipPath(); } } }; function CGrState() { this.Parent = null; this.States = []; this.Clips = []; } CGrState.prototype = { SavePen : function() { if (null == this.Parent) return; var _state = new CGrState_Pen(); _state.Init(this.Parent.m_oPen); this.States.push(_state); }, SaveBrush : function() { if (null == this.Parent) return; var _state = new CGrState_Brush(); _state.Init(this.Parent.m_oBrush); this.States.push(_state); }, SavePenBrush : function() { if (null == this.Parent) return; var _state = new CGrState_PenBrush(); _state.Init(this.Parent.m_oPen, this.Parent.m_oBrush); this.States.push(_state); }, RestorePen : function() { var _ind = this.States.length - 1; if (null == this.Parent || -1 == _ind) return; var _state = this.States[_ind]; if (_state.Type == gr_state_pen) { this.States.splice(_ind, 1); var _c = _state.Pen.Color; this.Parent.p_color(_c.R, _c.G, _c.B, _c.A); } }, RestoreBrush : function() { var _ind = this.States.length - 1; if (null == this.Parent || -1 == _ind) return; var _state = this.States[_ind]; if (_state.Type == gr_state_brush) { this.States.splice(_ind, 1); var _c = _state.Brush.Color1; this.Parent.b_color1(_c.R, _c.G, _c.B, _c.A); } }, RestorePenBrush : function() { var _ind = this.States.length - 1; if (null == this.Parent || -1 == _ind) return; var _state = this.States[_ind]; if (_state.Type == gr_state_pen_brush) { this.States.splice(_ind, 1); var _cb = _state.Brush.Color1; var _cp = _state.Pen.Color; this.Parent.b_color1(_cb.R, _cb.G, _cb.B, _cb.A); this.Parent.p_color(_cp.R, _cp.G, _cp.B, _cp.A); } }, SaveGrState : function() { if (null == this.Parent) return; var _state = new CGrState_State(); _state.Init(this.Parent.m_oTransform, !!this.Parent.m_bIntegerGrid, this.Clips); this.States.push(_state); this.Clips = []; }, RestoreGrState : function() { var _ind = this.States.length - 1; if (null == this.Parent || -1 == _ind) return; if (this.Parent.grStateIsUseBaseTransform()) this.Parent.grStateSaveBaseTransform(); var _state = this.States[_ind]; if (_state.Type === gr_state_state) { if (this.Clips.length > 0) { // значит клипы были, и их нужно обновить this.Parent.RemoveClip(); for (var i = 0; i <= _ind; i++) { if (this.States[i].Type === gr_state_state) this.States[i].Apply(this.Parent); } } this.Clips = _state.Clips; this.States.splice(_ind, 1); this.Parent.transform3(_state.Transform); this.Parent.SetIntegerGrid(_state.IsIntegerGrid); } if (this.Parent.grStateIsUseBaseTransform()) this.Parent.grStateRestoreBaseTransform(); }, RemoveLastClip : function() { // цель - убрать примененные this.Clips if (this.Clips.length === 0) return; if (this.Parent.grStateIsUseBaseTransform()) this.Parent.grStateSaveBaseTransform(); this.lastState = new CGrState_State(); this.lastState.Init(this.Parent.m_oTransform, !!this.Parent.m_bIntegerGrid, this.Clips); this.Parent.RemoveClip(); for (var i = 0, len = this.States.length; i < len; i++) { if (this.States[i].Type === gr_state_state) this.States[i].Apply(this.Parent); } this.Clips = []; this.Parent.transform3(this.lastState.Transform); this.Parent.SetIntegerGrid(this.lastState.IsIntegerGrid); if (this.Parent.grStateIsUseBaseTransform()) this.Parent.grStateRestoreBaseTransform(); }, RestoreLastClip : function() { // цель - вернуть примененные this.lastState.Clips if (!this.lastState) return; if (this.Parent.grStateIsUseBaseTransform()) this.Parent.grStateSaveBaseTransform(); this.lastState.Apply(this.Parent); this.Clips = this.lastState.Clips; this.Parent.transform3(this.lastState.Transform); this.Parent.SetIntegerGrid(this.lastState.IsIntegerGrid); this.lastState = null; if (this.Parent.grStateIsUseBaseTransform()) this.Parent.grStateRestoreBaseTransform(); }, Save : function() { this.SavePen(); this.SaveBrush(); this.SaveGrState(); }, Restore : function() { this.RestoreGrState(); this.RestoreBrush(); this.RestorePen(); }, StartClipPath : function() { // реализовать, как понадобится }, EndClipPath : function() { // реализовать, как понадобится }, AddClipRect : function(_r) { var _histClip = new CHist_Clip(); _histClip.Transform = this.Parent.m_oTransform.CreateDublicate(); _histClip.IsIntegerGrid = !!this.Parent.m_bIntegerGrid; _histClip.Rect = new _rect(); _histClip.Rect.x = _r.x; _histClip.Rect.y = _r.y; _histClip.Rect.w = _r.w; _histClip.Rect.h = _r.h; this.Clips.push(_histClip); this.Parent.StartClipPath(); this.Parent._s(); this.Parent._m(_r.x, _r.y); this.Parent._l(_r.x + _r.w, _r.y); this.Parent._l(_r.x + _r.w, _r.y + _r.h); this.Parent._l(_r.x, _r.y + _r.h); this.Parent._l(_r.x, _r.y); this.Parent.EndClipPath(); //this.Parent._e(); } }; function CMemory(bIsNoInit) { this.Init = function(len) { this.len = (len === undefined) ? 1024 * 1024 * 5 : len; this.data = new Uint8Array(this.len); this.pos = 0; } this.data = null; this.len = 0; this.pos = 0; this.posAttrEnd = 0; this.attrQuote = 0x22;//" if (true !== bIsNoInit) this.Init(); this.Copy = function(oMemory, nPos, nLen) { for (var Index = 0; Index < nLen; Index++) { this.CheckSize(1); this.data[this.pos++] = oMemory.data[Index + nPos]; } }; this.CheckSize = function(count) { if (this.pos + count >= this.len) { var oldData = this.data; this.len = Math.max(this.len * 2, this.pos + ((3 * count / 2) >> 0)); this.data = new Uint8Array(this.len); for (var i = 0; i < this.pos; i++) this.data[i] = oldData[i]; } } this.GetBase64Memory = function() { return AscCommon.Base64.encode(this.data, 0, this.pos); } this.GetBase64Memory2 = function(nPos, nLen) { return AscCommon.Base64.encode(this.data, nPos, nLen); } this.sha256 = function() { let sha256 = AscCommon.Digest.sha256(this.data, 0, this.pos); return AscCommon.Hex.encode(sha256); }; this.GetData = function(nPos, nLen) { var len = this.GetCurPosition(); var res = new Uint8Array(len); for (var i = 0; i < len; i++) res[i] = this.data[i]; return res; } this.GetDataUint8 = function(pos, len) { if (undefined === pos) { pos = 0; } if (undefined === len) { len = this.GetCurPosition() - pos; } return this.data.slice(pos, pos + len); } this.GetCurPosition = function() { return this.pos; } this.Seek = function(nPos) { this.pos = nPos; } this.Skip = function(nDif) { this.pos += nDif; } this.WriteWithLen = function(_this, callback) { let oldPos = this.GetCurPosition(); this.WriteULong(0); callback.call(_this, this); let curPos = this.GetCurPosition(); let len = curPos - oldPos; this.Seek(oldPos); this.WriteULong(len - 4); this.Seek(curPos); return len; }; this.WriteBool = function(val) { this.CheckSize(1); if (false == val) this.data[this.pos++] = 0; else this.data[this.pos++] = 1; } this.WriteByte = function(val) { this.CheckSize(1); this.data[this.pos++] = val; } this.WriteSByte = function(val) { this.CheckSize(1); if (val < 0) val += 256; this.data[this.pos++] = val; } this.WriteShort = function(val) { this.CheckSize(2); this.data[this.pos++] = (val) & 0xFF; this.data[this.pos++] = (val >>> 8) & 0xFF; } this.WriteUShort = function(val) { this.WriteShort(AscFonts.FT_Common.UShort_To_Short(val)); } this.WriteLong = function(val) { this.CheckSize(4); this.data[this.pos++] = (val) & 0xFF; this.data[this.pos++] = (val >>> 8) & 0xFF; this.data[this.pos++] = (val >>> 16) & 0xFF; this.data[this.pos++] = (val >>> 24) & 0xFF; } this.WriteULong = function(val) { this.WriteLong(AscFonts.FT_Common.UintToInt(val)); } this.WriteDouble = function(val) { this.CheckSize(4); var lval = ((val * 100000) >> 0) & 0xFFFFFFFF; // спасаем пять знаков после запятой. this.data[this.pos++] = (lval) & 0xFF; this.data[this.pos++] = (lval >>> 8) & 0xFF; this.data[this.pos++] = (lval >>> 16) & 0xFF; this.data[this.pos++] = (lval >>> 24) & 0xFF; } var tempHelp = new ArrayBuffer(8); var tempHelpUnit = new Uint8Array(tempHelp); var tempHelpFloat = new Float64Array(tempHelp); this.WriteDouble2 = function(val) { this.CheckSize(8); tempHelpFloat[0] = val; this.data[this.pos++] = tempHelpUnit[0]; this.data[this.pos++] = tempHelpUnit[1]; this.data[this.pos++] = tempHelpUnit[2]; this.data[this.pos++] = tempHelpUnit[3]; this.data[this.pos++] = tempHelpUnit[4]; this.data[this.pos++] = tempHelpUnit[5]; this.data[this.pos++] = tempHelpUnit[6]; this.data[this.pos++] = tempHelpUnit[7]; } this._doubleEncodeLE754 = function(v) { //код взят из jspack.js на основе стандарта Little-endian N-bit IEEE 754 floating point var s, e, m, i, d, c, mLen, eLen, eBias, eMax; var el = {len : 8, mLen : 52, rt : 0}; mLen = el.mLen, eLen = el.len * 8 - el.mLen - 1, eMax = (1 << eLen) - 1, eBias = eMax >> 1; s = v < 0 ? 1 : 0; v = Math.abs(v); if (isNaN(v) || (v == Infinity)) { m = isNaN(v) ? 1 : 0; e = eMax; } else { e = Math.floor(Math.log(v) / Math.LN2); // Calculate log2 of the value if (v * (c = Math.pow(2, -e)) < 1) { e--; c *= 2; } // Math.log() isn't 100% reliable // Round by adding 1/2 the significand's LSD if (e + eBias >= 1) { v += el.rt / c; } // Normalized: mLen significand digits else { v += el.rt * Math.pow(2, 1 - eBias); } // Denormalized: <= mLen significand digits if (v * c >= 2) { e++; c /= 2; } // Rounding can increment the exponent if (e + eBias >= eMax) { // Overflow m = 0; e = eMax; } else if (e + eBias >= 1) { // Normalized - term order matters, as Math.pow(2, 52-e) and v*Math.pow(2, 52) can overflow m = (v * c - 1) * Math.pow(2, mLen); e = e + eBias; } else { // Denormalized - also catches the '0' case, somewhat by chance m = v * Math.pow(2, eBias - 1) * Math.pow(2, mLen); e = 0; } } var a = new Array(8); for (i = 0, d = 1; mLen >= 8; a[i] = m & 0xff, i += d, m /= 256, mLen -= 8); for (e = (e << mLen) | m, eLen += mLen; eLen > 0; a[i] = e & 0xff, i += d, e /= 256, eLen -= 8); a[i - d] |= s * 128; return a; } this.WriteStringBySymbol = function(code) { if (code < 0xFFFF) { this.CheckSize(4); this.data[this.pos++] = 1; this.data[this.pos++] = 0; this.data[this.pos++] = code & 0xFF; this.data[this.pos++] = (code >>> 8) & 0xFF; } else { this.CheckSize(6); this.data[this.pos++] = 2; this.data[this.pos++] = 0; var codePt = code - 0x10000; var c1 = 0xD800 | (codePt >> 10); var c2 = 0xDC00 | (codePt & 0x3FF); this.data[this.pos++] = c1 & 0xFF; this.data[this.pos++] = (c1 >>> 8) & 0xFF; this.data[this.pos++] = c2 & 0xFF; this.data[this.pos++] = (c2 >>> 8) & 0xFF; } } this.WriteString = function(text) { if ("string" != typeof text) text = text + ""; var count = text.length & 0xFFFF; this.CheckSize(2 * count + 2); this.data[this.pos++] = count & 0xFF; this.data[this.pos++] = (count >>> 8) & 0xFF; for (var i = 0; i < count; i++) { var c = text.charCodeAt(i) & 0xFFFF; this.data[this.pos++] = c & 0xFF; this.data[this.pos++] = (c >>> 8) & 0xFF; } } this.WriteString2 = function(text) { if ("string" != typeof text) text = text + ""; var count = text.length & 0x7FFFFFFF; var countWrite = 2 * count; this.WriteLong(countWrite); this.CheckSize(countWrite); for (var i = 0; i < count; i++) { var c = text.charCodeAt(i) & 0xFFFF; this.data[this.pos++] = c & 0xFF; this.data[this.pos++] = (c >>> 8) & 0xFF; } } this.WriteString3 = function(text) { if ("string" != typeof text) text = text + ""; var count = text.length & 0x7FFFFFFF; var countWrite = 2 * count; this.CheckSize(countWrite); for (var i = 0; i < count; i++) { var c = text.charCodeAt(i) & 0xFFFF; this.data[this.pos++] = c & 0xFF; this.data[this.pos++] = (c >>> 8) & 0xFF; } } this.WriteString4 = function(text) { if ("string" != typeof text) text = text + ""; var count = text.length & 0x7FFFFFFF; this.WriteLong(count); this.CheckSize(2 * count); for (var i = 0; i < count; i++) { var c = text.charCodeAt(i) & 0xFFFF; this.data[this.pos++] = c & 0xFF; this.data[this.pos++] = (c >>> 8) & 0xFF; } } this.WriteStringA = function(text) { var count = text.length; this.WriteULong(count); this.CheckSize(count); for (var i=0;i>> 8) & 0xFF; this.data[_pos++] = (val >>> 16) & 0xFF; this.data[_pos++] = (val >>> 24) & 0xFF; } this.WriteBuffer = function(data, _pos, count) { this.CheckSize(count); for (var i = 0; i < count; i++) { this.data[this.pos++] = data[_pos + i]; } } this.WriteUtf8Char = function(code) { this.CheckSize(6); if (code < 0x80) { this.data[this.pos++] = code; } else if (code < 0x0800) { this.data[this.pos++] = (0xC0 | (code >> 6)); this.data[this.pos++] = (0x80 | (code & 0x3F)); } else if (code < 0x10000) { this.data[this.pos++] = (0xE0 | (code >> 12)); this.data[this.pos++] = (0x80 | ((code >> 6) & 0x3F)); this.data[this.pos++] = (0x80 | (code & 0x3F)); } else if (code < 0x1FFFFF) { this.data[this.pos++] = (0xF0 | (code >> 18)); this.data[this.pos++] = (0x80 | ((code >> 12) & 0x3F)); this.data[this.pos++] = (0x80 | ((code >> 6) & 0x3F)); this.data[this.pos++] = (0x80 | (code & 0x3F)); } else if (code < 0x3FFFFFF) { this.data[this.pos++] = (0xF8 | (code >> 24)); this.data[this.pos++] = (0x80 | ((code >> 18) & 0x3F)); this.data[this.pos++] = (0x80 | ((code >> 12) & 0x3F)); this.data[this.pos++] = (0x80 | ((code >> 6) & 0x3F)); this.data[this.pos++] = (0x80 | (code & 0x3F)); } else if (code < 0x7FFFFFFF) { this.data[this.pos++] = (0xFC | (code >> 30)); this.data[this.pos++] = (0x80 | ((code >> 24) & 0x3F)); this.data[this.pos++] = (0x80 | ((code >> 18) & 0x3F)); this.data[this.pos++] = (0x80 | ((code >> 12) & 0x3F)); this.data[this.pos++] = (0x80 | ((code >> 6) & 0x3F)); this.data[this.pos++] = (0x80 | (code & 0x3F)); } }; this.SetXmlAttributeQuote = function(val) { this.attrQuote = val; } this.WriteXmlString = function(val) { var pCur = 0; var pEnd = val.length; while (pCur < pEnd) { var code = val.charCodeAt(pCur++); if (code >= 0xD800 && code <= 0xDFFF && pCur < pEnd) { code = 0x10000 + (((code & 0x3FF) << 10) | (0x03FF & val.charCodeAt(pCur++))); } this.WriteUtf8Char(code); } }; this.WriteXmlStringEncode = function(val) { var pCur = 0; var pEnd = val.length; while (pCur < pEnd) { var code = val.charCodeAt(pCur++); if (code >= 0xD800 && code <= 0xDFFF && pCur < pEnd) { code = 0x10000 + (((code & 0x3FF) << 10) | (0x03FF & val.charCodeAt(pCur++))); } this.WriteXmlCharCode(code); } }; this.WriteXmlCharCode = function(code) { switch (code) { case 0x26: //& this.WriteUtf8Char(0x26); this.WriteUtf8Char(0x61); this.WriteUtf8Char(0x6d); this.WriteUtf8Char(0x70); this.WriteUtf8Char(0x3b); break; case 0x27: //' this.WriteUtf8Char(0x26); this.WriteUtf8Char(0x61); this.WriteUtf8Char(0x70); this.WriteUtf8Char(0x6f); this.WriteUtf8Char(0x73); this.WriteUtf8Char(0x3b); break; case 0x3c: //< this.WriteUtf8Char(0x26); this.WriteUtf8Char(0x6c); this.WriteUtf8Char(0x74); this.WriteUtf8Char(0x3b); break; case 0x3e: //> this.WriteUtf8Char(0x26); this.WriteUtf8Char(0x67); this.WriteUtf8Char(0x74); this.WriteUtf8Char(0x3b); break; case 0x22: //" this.WriteUtf8Char(0x26); this.WriteUtf8Char(0x71); this.WriteUtf8Char(0x75); this.WriteUtf8Char(0x6f); this.WriteUtf8Char(0x74); this.WriteUtf8Char(0x3b); break; default: this.WriteUtf8Char(code); break; } }; this.WriteXmlStringEncodeInSingleQuote = function(val) { var pCur = 0; var pEnd = val.length; while (pCur < pEnd) { var code = val.charCodeAt(pCur++); if (code >= 0xD800 && code <= 0xDFFF && pCur < pEnd) { code = 0x10000 + (((code & 0x3FF) << 10) | (0x03FF & val.charCodeAt(pCur++))); } this.WriteXmlCharCodeInSingleQuote(code); } }; this.WriteXmlCharCodeInSingleQuote = function(code) { switch (code) { case 0x26: //& this.WriteUtf8Char(0x26); this.WriteUtf8Char(0x61); this.WriteUtf8Char(0x6d); this.WriteUtf8Char(0x70); this.WriteUtf8Char(0x3b); break; case 0x27: //' this.WriteUtf8Char(0x26); this.WriteUtf8Char(0x61); this.WriteUtf8Char(0x70); this.WriteUtf8Char(0x6f); this.WriteUtf8Char(0x73); this.WriteUtf8Char(0x3b); break; case 0x3c: //< this.WriteUtf8Char(0x26); this.WriteUtf8Char(0x6c); this.WriteUtf8Char(0x74); this.WriteUtf8Char(0x3b); break; case 0x3e: //> this.WriteUtf8Char(0x26); this.WriteUtf8Char(0x67); this.WriteUtf8Char(0x74); this.WriteUtf8Char(0x3b); break; default: this.WriteUtf8Char(code); break; } }; this.WriteXmlStringEncodeInDoubleQuote = function(val) { var pCur = 0; var pEnd = val.length; while (pCur < pEnd) { var code = val.charCodeAt(pCur++); if (code >= 0xD800 && code <= 0xDFFF && pCur < pEnd) { code = 0x10000 + (((code & 0x3FF) << 10) | (0x03FF & val.charCodeAt(pCur++))); } this.WriteXmlCharCodeInDoubleQuote(code); } }; this.WriteXmlCharCodeInDoubleQuote = function(code) { switch (code) { case 0x26: //& this.WriteUtf8Char(0x26); this.WriteUtf8Char(0x61); this.WriteUtf8Char(0x6d); this.WriteUtf8Char(0x70); this.WriteUtf8Char(0x3b); break; case 0x3c: //< this.WriteUtf8Char(0x26); this.WriteUtf8Char(0x6c); this.WriteUtf8Char(0x74); this.WriteUtf8Char(0x3b); break; case 0x3e: //> this.WriteUtf8Char(0x26); this.WriteUtf8Char(0x67); this.WriteUtf8Char(0x74); this.WriteUtf8Char(0x3b); break; case 0x22: //" this.WriteUtf8Char(0x26); this.WriteUtf8Char(0x71); this.WriteUtf8Char(0x75); this.WriteUtf8Char(0x6f); this.WriteUtf8Char(0x74); this.WriteUtf8Char(0x3b); break; default: this.WriteUtf8Char(code); break; } }; this.WriteXmlBool = function(val) { this.WriteXmlString(val ? '1' : '0'); }; this.WriteXmlByte = function(val) { this.WriteXmlInt(val); }; this.WriteXmlSByte = function(val) { this.WriteXmlInt(val); }; this.WriteXmlInt = function(val) { this.WriteXmlString(val.toFixed(0)); }; this.WriteXmlUInt = function(val) { this.WriteXmlInt(val); }; this.WriteXmlInt64 = function(val) { this.WriteXmlInt(val); }; this.WriteXmlUInt64 = function(val) { this.WriteXmlInt(val); }; this.WriteXmlDouble = function(val) { this.WriteXmlNumber(val); }; this.WriteXmlNumber = function(val) { this.WriteXmlString(val.toString()); }; this.WriteXmlNodeStart = function(name) { this.WriteUtf8Char(0x3c); this.WriteXmlString(name); }; this.WriteXmlNodeEnd = function(name) { this.WriteUtf8Char(0x3c); this.WriteUtf8Char(0x2f); this.WriteXmlString(name); this.WriteUtf8Char(0x3e); }; this.WriteXmlNodeEndCheckEmpty = function(name) { if (this.posAttrEnd === this.GetCurPosition()) { this.Seek(this.posAttrEnd - 1); this.WriteUtf8Char(0x2f); this.WriteUtf8Char(0x3e); } else { this.WriteUtf8Char(0x3c); this.WriteUtf8Char(0x2f); this.WriteXmlString(name); this.WriteUtf8Char(0x3e); } }; this.WriteXmlNodeWithText = function(name, text) { this.WriteXmlNodeStart(name); this.WriteXmlAttributesEnd(false); if (text) this.WriteXmlStringEncode(text.toString()); this.WriteXmlNodeEnd(name); }; this.WriteXmlAttributesEnd = function(isEnd) { if (isEnd) this.WriteUtf8Char(0x2f); this.WriteUtf8Char(0x3e); }; this.WriteXmlAttributesEndSavePos = function() { this.WriteUtf8Char(0x3e); this.posAttrEnd = this.GetCurPosition(); }; this.WriteXmlAttributeString = function(name, val) { this.WriteUtf8Char(0x20); this.WriteXmlString(name); this.WriteUtf8Char(0x3d); this.WriteUtf8Char(this.attrQuote); this.WriteXmlString(val.toString()); this.WriteUtf8Char(this.attrQuote); }; this.WriteXmlAttributeStringEncode = function(name, val) { this.WriteUtf8Char(0x20); this.WriteXmlString(name); this.WriteUtf8Char(0x3d); this.WriteUtf8Char(this.attrQuote); //todo remove if. save method to proerty like attrQuote if (this.attrQuote === 0x22) { this.WriteXmlStringEncodeInDoubleQuote(val.toString()); } else { this.WriteXmlStringEncodeInSingleQuote(val.toString()); } this.WriteUtf8Char(this.attrQuote); }; this.WriteXmlAttributeBool = function(name, val) { this.WriteXmlAttributeString(name, val ? '1' : '0'); }; this.WriteXmlAttributeByte = function(name, val) { this.WriteXmlAttributeInt(name, val); }; this.WriteXmlAttributeSByte = function(name, val) { this.WriteXmlAttributeInt(name, val); }; this.WriteXmlAttributeInt = function(name, val) { this.WriteXmlAttributeString(name, val.toFixed(0)); }; this.WriteXmlAttributeUInt = function(name, val) { this.WriteXmlAttributeInt(name, val); }; this.WriteXmlAttributeInt64 = function(name, val) { this.WriteXmlAttributeInt(name, val); }; this.WriteXmlAttributeUInt64 = function(name, val) { this.WriteXmlAttributeInt(name, val); }; this.WriteXmlAttributeDouble = function(name, val) { this.WriteXmlAttributeNumber(name, val); }; this.WriteXmlAttributeNumber = function(name, val) { this.WriteXmlAttributeString(name, val.toString()); }; this.WriteXmlNullable = function(val, name) { if (val) { val.toXml(this, name); } }; //пересмотреть, куча аргументов this.WriteXmlArray = function(val, name, opt_parentName, needWriteCount, ns, childns) { if (!ns) { ns = ""; } if (!childns) { childns = ""; } if(val && val.length > 0) { if(opt_parentName) { this.WriteXmlNodeStart(ns + opt_parentName); if (needWriteCount) { this.WriteXmlNullableAttributeNumber("count", val.length); } this.WriteXmlAttributesEnd(); } val.forEach(function(elem, index){ elem.toXml(this, name, childns, childns, index); }, this); if(opt_parentName) { this.WriteXmlNodeEnd(ns + opt_parentName); } } }; this.WriteXmlNullableAttributeString = function(name, val) { if (null !== val && undefined !== val) { this.WriteXmlAttributeString(name, val) } }; this.WriteXmlNullableAttributeStringEncode = function(name, val) { if (null !== val && undefined !== val) { this.WriteXmlAttributeStringEncode(name, val) } }; this.WriteXmlNonEmptyAttributeStringEncode = function(name, val) { if (val) { this.WriteXmlAttributeStringEncode(name, val) } }; this.WriteXmlNullableAttributeBool = function(name, val) { if (null !== val && undefined !== val) { this.WriteXmlAttributeBool(name, val) } }; this.WriteXmlNullableAttributeBool2 = function(name, val) { //добавлюя по аналогии с x2t if (null !== val && undefined !== val) { this.WriteXmlNullableAttributeString(name, val ? "1": "0") } }; this.WriteXmlNullableAttributeByte = function(name, val) { if (null !== val && undefined !== val) { this.WriteXmlAttributeByte(name, val) } }; this.WriteXmlNullableAttributeSByte = function(name, val) { if (null !== val && undefined !== val) { this.WriteXmlAttributeSByte(name, val) } }; this.WriteXmlNullableAttributeInt = function(name, val) { if (null !== val && undefined !== val) { this.WriteXmlAttributeInt(name, val) } }; this.WriteXmlNullableAttributeUInt = function(name, val) { if (null !== val && undefined !== val) { this.WriteXmlAttributeUInt(name, val) } }; this.WriteXmlNullableAttributeInt64 = function(name, val) { if (null !== val && undefined !== val) { this.WriteXmlAttributeInt64(name, val) } }; this.WriteXmlNullableAttributeUInt64 = function(name, val) { if (null !== val && undefined !== val) { this.WriteXmlAttributeUInt64(name, val) } }; this.WriteXmlNullableAttributeDouble = function(name, val) { if (null !== val && undefined !== val) { this.WriteXmlAttributeDouble(name, val) } }; this.WriteXmlNullableAttributeAnyNumber = function(name, val) { if (null !== val && undefined !== val) { if (val === Infinity) { this.WriteXmlAttributeString(name, "INF"); } else { this.WriteXmlAttributeDouble(name, val); } } }; this.WriteXmlNullableAttributeNumber = function(name, val) { if (null !== val && undefined !== val) { this.WriteXmlAttributeNumber(name, val) } }; this.WriteXmlNullableAttributeIntWithKoef = function(name, val, koef) { if (null !== val && undefined !== val) { this.WriteXmlAttributeInt(name, val * koef) } }; this.WriteXmlNullableAttributeUIntWithKoef = function(name, val, koef) { if (null !== val && undefined !== val) { this.WriteXmlAttributeUInt(name, val * koef) } }; this.WriteXmlAttributeBoolIfTrue = function(name, val) { if (val) { this.WriteXmlAttributeBool(name, val) } }; this.WriteXmlValueString = function(name, val) { this.WriteXmlNodeStart(name); this.WriteXmlAttributesEnd(); this.WriteXmlString(val.toString()); this.WriteXmlNodeEnd(name); }; this.WriteXmlValueStringEncode = function(name, val) { this.WriteXmlNodeStart(name); this.WriteXmlAttributeString("xml:space", "preserve"); this.WriteXmlAttributesEnd(); this.WriteXmlStringEncode(val.toString()); this.WriteXmlNodeEnd(name); }; this.WriteXmlValueStringEncode2 = function(name, val) { this.WriteXmlNodeStart(name); this.WriteXmlAttributesEnd(); this.WriteXmlStringEncode(val.toString()); this.WriteXmlNodeEnd(name); }; this.WriteXmlValueBool = function(name, val) { this.WriteXmlNodeStart(name); this.WriteXmlAttributesEnd(); this.WriteXmlBool(val); this.WriteXmlNodeEnd(name); }; this.WriteXmlValueByte = function(name, val) { this.WriteXmlNodeStart(name); this.WriteXmlAttributesEnd(); this.WriteXmlByte(val); this.WriteXmlNodeEnd(name); }; this.WriteXmlValueSByte = function(name, val) { this.WriteXmlNodeStart(name); this.WriteXmlAttributesEnd(); this.WriteXmlSByte(val); this.WriteXmlNodeEnd(name); }; this.WriteXmlValueInt = function(name, val) { this.WriteXmlNodeStart(name); this.WriteXmlAttributesEnd(); this.WriteXmlInt(val); this.WriteXmlNodeEnd(name); }; this.WriteXmlValueUInt = function(name, val) { this.WriteXmlNodeStart(name); this.WriteXmlAttributesEnd(); this.WriteXmlUInt(val); this.WriteXmlNodeEnd(name); }; this.WriteXmlValueInt64 = function(name, val) { this.WriteXmlNodeStart(name); this.WriteXmlAttributesEnd(); this.WriteXmlInt64(val); this.WriteXmlNodeEnd(name); }; this.WriteXmlValueUInt64 = function(name, val) { this.WriteXmlNodeStart(name); this.WriteXmlAttributesEnd(); this.WriteXmlUInt64(val); this.WriteXmlNodeEnd(name); }; this.WriteXmlValueDouble = function(name, val) { this.WriteXmlNodeStart(name); this.WriteXmlAttributesEnd(); this.WriteXmlDouble(val); this.WriteXmlNodeEnd(name); }; this.WriteXmlValueNumber = function(name, val) { this.WriteXmlNodeStart(name); this.WriteXmlAttributesEnd(); this.WriteXmlNumber(val); this.WriteXmlNodeEnd(name); }; this.WriteXmlNullableValueString = function(name, val) { if (null !== val && undefined !== val) { this.WriteXmlValueString(name, val) } }; this.WriteXmlNullableValueStringEncode = function(name, val) { if (null !== val && undefined !== val) { this.WriteXmlValueStringEncode(name, val) } }; this.WriteXmlNullableValueStringEncode2 = function(name, val) { if (null !== val && undefined !== val) { this.WriteXmlValueStringEncode2(name, val) } }; this.WriteXmlNullableValueBool = function(name, val) { if (null !== val && undefined !== val) { this.WriteXmlValueBool(name, val) } }; this.WriteXmlNullableValueByte = function(name, val) { if (null !== val && undefined !== val) { this.WriteXmlValueByte(name, val) } }; this.WriteXmlNullableValueSByte = function(name, val) { if (null !== val && undefined !== val) { this.WriteXmlValueSByte(name, val) } }; this.WriteXmlNullableValueInt = function(name, val) { if (null !== val && undefined !== val) { this.WriteXmlValueInt(name, val) } }; this.WriteXmlNullableValueUInt = function(name, val) { if (null !== val && undefined !== val) { this.WriteXmlValueUInt(name, val) } }; this.WriteXmlNullableValueInt64 = function(name, val) { if (null !== val && undefined !== val) { this.WriteXmlValueInt64(name, val) } }; this.WriteXmlNullableValueUInt64 = function(name, val) { if (null !== val && undefined !== val) { this.WriteXmlValueUInt64(name, val) } }; this.WriteXmlNullableValueDouble = function(name, val) { if (null !== val && undefined !== val) { this.WriteXmlValueDouble(name, val) } }; this.WriteXmlNullableValueNumber = function(name, val) { if (null !== val && undefined !== val) { this.WriteXmlValueNumber(name, val) } }; this.XlsbStartRecord = function(type, len) { //Type if (type < 0x80) { this.WriteByte(type); } else { this.WriteByte((type & 0x7F) | 0x80); this.WriteByte(type >> 7); } //Len for (var i = 0; i < 4; ++i) { var part = len & 0x7F; len = len >> 7; if (len === 0) { this.WriteByte(part); break; } else { this.WriteByte(part | 0x80); } } }; this.XlsbEndRecord = function() { }; //все аргументы сохраняю как в x2t, ns - префикс пока не использую this.WritingValNode = function(ns, name, val) { this.WriteXmlNodeStart(name); this.WriteXmlAttributeString("val", val); this.WriteXmlAttributesEnd(true); }; this.WritingValNodeEncodeXml = function(ns, name, val) { this.WriteXmlNodeStart(name); this.WriteXmlNullableAttributeStringEncode("val", val); this.WriteXmlAttributesEnd(true); }; this.WritingValNodeIf = function(ns, name, cond, val) { this.WriteXmlNodeStart(name); if (cond) { this.WriteXmlAttributeString("val", val); } this.WriteXmlAttributesEnd(true); }; this.WriteXmlHeader = function() { this.WriteXmlString("\n"); }; this.WriteXmlRelationshipsNS = function() { this.WriteXmlAttributeString("xmlns:r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships"); }; } function CCommandsType() { this.ctPenXML = 0; this.ctPenColor = 1; this.ctPenAlpha = 2; this.ctPenSize = 3; this.ctPenDashStyle = 4; this.ctPenLineStartCap = 5; this.ctPenLineEndCap = 6; this.ctPenLineJoin = 7; this.ctPenDashPatern = 8; this.ctPenDashPatternCount = 9; this.ctPenDashOffset = 10; this.ctPenAlign = 11; this.ctPenMiterLimit = 12; // brush this.ctBrushXML = 20; this.ctBrushType = 21; this.ctBrushColor1 = 22; this.ctBrushColor2 = 23; this.ctBrushAlpha1 = 24; this.ctBrushAlpha2 = 25; this.ctBrushTexturePathOld = 26; this.ctBrushTextureAlpha = 27; this.ctBrushTextureMode = 28; this.ctBrushRectable = 29; this.ctBrushRectableEnabled = 30; this.ctBrushGradient = 31; this.ctBrushTexturePath = 32; // font this.ctFontXML = 40; this.ctFontName = 41; this.ctFontSize = 42; this.ctFontStyle = 43; this.ctFontPath = 44; this.ctFontGID = 45; this.ctFontCharSpace = 46; // shadow this.ctShadowXML = 50; this.ctShadowVisible = 51; this.ctShadowDistanceX = 52; this.ctShadowDistanceY = 53; this.ctShadowBlurSize = 54; this.ctShadowColor = 55; this.ctShadowAlpha = 56; // edge this.ctEdgeXML = 70; this.ctEdgeVisible = 71; this.ctEdgeDistance = 72; this.ctEdgeColor = 73; this.ctEdgeAlpha = 74; // text this.ctDrawText = 80; this.ctDrawTextEx = 81; this.ctDrawTextCode = 82; this.ctDrawTextCodeGid = 83; // pathcommands this.ctPathCommandMoveTo = 91; this.ctPathCommandLineTo = 92; this.ctPathCommandLinesTo = 93; this.ctPathCommandCurveTo = 94; this.ctPathCommandCurvesTo = 95; this.ctPathCommandArcTo = 96; this.ctPathCommandClose = 97; this.ctPathCommandEnd = 98; this.ctDrawPath = 99; this.ctPathCommandStart = 100; this.ctPathCommandGetCurrentPoint = 101; this.ctPathCommandText = 102; this.ctPathCommandTextEx = 103; // image this.ctDrawImage = 110; this.ctDrawImageFromFile = 111; this.ctSetParams = 120; this.ctBeginCommand = 121; this.ctEndCommand = 122; this.ctSetTransform = 130; this.ctResetTransform = 131; this.ctClipMode = 140; this.ctCommandLong1 = 150; this.ctCommandDouble1 = 151; this.ctCommandString1 = 152; this.ctCommandLong2 = 153; this.ctCommandDouble2 = 154; this.ctCommandString2 = 155; this.ctHyperlink = 160; this.ctLink = 161; this.ctFormField = 162; this.ctDocInfo = 163; this.ctAnnotField = 164; this.ctAnnotFieldDelete = 165; this.ctWidgetsInfo = 166; this.ctHeadings = 169; this.ctRedact = 170; this.ctPageWidth = 200; this.ctPageHeight = 201; this.ctPageStart = 202; this.ctPageEnd = 203; this.ctDocumentEdit = 204; this.ctDocumentClose = 205; this.ctPageEdit = 206; this.ctPageClear = 207; this.ctPageRotate = 208; this.ctError = 255; } var CommandType = new CCommandsType(); var MetaBrushType = { Solid : 0, Gradient : 1, Texture : 2 }; // 0 - dash // 1 - dashDot // 2 - dot // 3 - lgDash // 4 - lgDashDot // 5 - lgDashDotDot // 6 - solid // 7 - sysDash // 8 - sysDashDot // 9 - sysDashDotDot // 10- sysDot // visio types // vsdxTransparent : 11, // vsdxSolid : 12, // vsdxDash : 13, // vsdxDot : 14, // vsdxDashDot : 15, // vsdxDashDotDot : 16, // vsdxDashDashDot : 17, // vsdxLongDashShortDash : 18, // vsdxLongDashShortDashShortDash : 19, // vsdxHalfDash : 20, // vsdxHalfDot : 21, // vsdxHalfDashDot : 22, // vsdxHalfDashDotDot : 23, // vsdxHalfDashDashDot : 24, // vsdxHalfLongDashShortDash : 25, // vsdxHalfLongDashShortDashShortDash : 26, // vsdxDoubleDash: : 27 // vsdxDoubleDot : 28, // vsdxDoubleDashDot : 29, // vsdxDoubleDashDotDot : 30, // vsdxDoubleDashDashDot : 31, // vsdxDoubleLongDashShortDash : 32, // vsdxDoubleLongDashShortDashShortDash : 33, // vsdxHalfHalfDash : 34, var DashPatternPresets = [ [4, 3], [4, 3, 1, 3], [1, 3], [8, 3], [8, 3, 1, 3], [8, 3, 1, 3, 1, 3], undefined, [3, 1], [3, 1, 1, 1], [3, 1, 1, 1, 1, 1], [1, 1], // visio types // !!! line patterns were made to look correct for visio line cap type square. // But now only flat cap type is supported in sdkjs. [0, 1], // vsdxTransparent [1, 0], // vsdxSolid [9, 3], // vsdxDash [2, 3], // vsdxDot [9, 3, 2, 3], // vsdxDashDot [9, 3, 2, 3, 2, 3], // vsdxDashDotDot [9, 3, 9, 3, 2, 3], // vsdxDashDashDot [21, 3, 9, 3], // vsdxLongDashShortDash [21, 3, 9, 3, 9, 3], // vsdxLongDashShortDashShortDash [5, 1], // vsdxHalfDash [2, 1], // vsdxHalfDot [5, 1, 2, 1],// vsdxHalfDashDot [5, 1, 2, 1, 2, 1],// vsdxHalfDashDotDot [5, 1, 5, 1, 2, 1], // vsdxHalfDashDashDot [11, 1, 5, 1], // vsdxHalfLongDashShortDash [11, 1, 5, 1, 5, 1], // vsdxHalfLongDashShortDashShortDash [16, 8], // vsdxDoubleDash [2, 7], // vsdxDoubleDot [16, 8, 2, 8],// vsdxDoubleDashDot [17, 7, 2, 7, 2, 7], // vsdxDoubleDashDotDot [16, 7, 16, 7, 2, 7], // vsdxDoubleDashDashDot [41, 7, 17, 7], // vsdxDoubleLongDashShortDash [41, 7, 17, 7, 17, 7], // vsdxDoubleLongDashShortDashShortDash [1, 0], // vsdxHalfHalfDash (in visio is solid for cap type square) ]; function CMetafileFontPicker(manager) { this.Manager = manager; // в идеале - кэш измерятеля. тогда ни один шрифт не будет загружен заново if (!this.Manager) { this.Manager = new AscFonts.CFontManager(); this.Manager.Initialize(false) } this.FontsInCache = {}; this.LastPickFont = null; this.LastPickFontNameOrigin = ""; this.LastPickFontName = ""; this.Metafile = null; // класс, которому будет подменяться шрифт this.SetFont = function(setFont) { var name = setFont.FontFamily.Name; var size = setFont.FontSize; var style = 0; if (setFont.Italic == true) style += 2; if (setFont.Bold == true) style += 1; var name_check = name + "_" + style; if (this.FontsInCache[name_check]) { this.LastPickFont = this.FontsInCache[name_check]; } else { var font = g_fontApplication.GetFontFileWeb(name, style); var font_name_index = AscFonts.g_map_font_index[font.m_wsFontName]; var fontId = AscFonts.g_font_infos[font_name_index].GetFontID(AscCommon.g_font_loader, style); var test_id = fontId.id + fontId.faceIndex + size; var cache = this.Manager.m_oFontsCache; this.LastPickFont = cache.Fonts[test_id]; if (!this.LastPickFont) this.LastPickFont = cache.Fonts[test_id + "nbold"]; if (!this.LastPickFont) this.LastPickFont = cache.Fonts[test_id + "nitalic"]; if (!this.LastPickFont) this.LastPickFont = cache.Fonts[test_id + "nboldnitalic"]; if (!this.LastPickFont) { // такого при правильном кэше быть не должно if (window["NATIVE_EDITOR_ENJINE"] && fontId.file.Status != 0) { fontId.file.LoadFontNative(); } this.LastPickFont = cache.LockFont(fontId.file.stream_index, fontId.id, fontId.faceIndex, size, "", this.Manager); } this.FontsInCache[name_check] = this.LastPickFont; } this.LastPickFontNameOrigin = name; this.LastPickFontName = name; this.Metafile.SetFont(setFont, true); }; this.FillTextCode = function(glyph) { if (this.LastPickFont && this.LastPickFont.GetGIDByUnicode(glyph)) { if (this.LastPickFontName != this.LastPickFontNameOrigin) { this.LastPickFontName = this.LastPickFontNameOrigin; this.Metafile.SetFontName(this.LastPickFontName); } } else { var name = AscFonts.FontPickerByCharacter.getFontBySymbol(glyph); if (name != this.LastPickFontName) { this.LastPickFontName = name; this.Metafile.SetFontName(this.LastPickFontName); } } }; } function isCloudPrintingUrl() { if (window["AscDesktopEditor"]) { if ((undefined !== window["AscDesktopEditor"]["CryptoMode"]) && (0 < window["AscDesktopEditor"]["CryptoMode"])) return false; if (window["AscDesktopEditor"]["IsLocalFile"] && window["AscDesktopEditor"]["IsFilePrinting"]) { if (!window["AscDesktopEditor"]["IsLocalFile"]() && window["AscDesktopEditor"]["IsFilePrinting"]()) return true; } } return false; } function getCloudPrintingUrl(url) { var urlLocal = AscCommon.g_oDocumentUrls.getImageLocal(url); if (urlLocal && urlLocal.endsWith(".svg")) { let localWithoutExt = urlLocal.slice(0, urlLocal.length - 3); let urlRes = AscCommon.g_oDocumentUrls.getImageUrl(localWithoutExt + "wmf"); if (urlRes) return urlRes; urlRes = AscCommon.g_oDocumentUrls.getImageUrl(localWithoutExt + "emf"); if (urlRes) return urlRes; } return url; } function CMetafile(width, height) { this.Width = width; this.Height = height; this.m_oPen = new CPen(); this.m_oBrush = new CBrush(); this.m_oFont = { Name : "", FontSize : -1, Style : -1 }; // чтобы выставилось в первый раз this.m_oPen.Color.R = -1; this.m_oBrush.Color1.R = -1; this.m_oBrush.Color2.R = -1; this.m_oTransform = new CMatrix(); this.m_arrayCommands = []; this.Memory = null; this.VectorMemoryForPrint = null; this.BrushType = MetaBrushType.Solid; // RFonts this.m_oTextPr = null; this.m_oGrFonts = new CGrRFonts(); // просто чтобы не создавать каждый раз this.m_oFontSlotFont = new CFontSetup(); this.LastFontOriginInfo = {Name : "", Replace : null}; this.m_oFontTmp = { FontFamily : { Name : "arial" }, Bold : false, Italic : false }; this.StartOffset = 0; this.m_bIsPenDash = false; this.FontPicker = null; this.lastPoint = null; } CMetafile.prototype = { // pen methods p_color : function(r, g, b, a) { if (this.m_oPen.Color.R != r || this.m_oPen.Color.G != g || this.m_oPen.Color.B != b) { this.m_oPen.Color.R = r; this.m_oPen.Color.G = g; this.m_oPen.Color.B = b; var value = b << 16 | g << 8 | r; this.Memory.WriteByte(CommandType.ctPenColor); this.Memory.WriteLong(value); } if (this.m_oPen.Color.A != a) { this.m_oPen.Color.A = a; this.Memory.WriteByte(CommandType.ctPenAlpha); this.Memory.WriteByte(a); } }, p_width : function(w) { var val = w / 1000; if (this.m_oPen.Size != val) { this.m_oPen.Size = val; this.Memory.WriteByte(CommandType.ctPenSize); this.Memory.WriteDouble(val); } }, p_dash : function(params) { var bIsDash = (params && (params.length > 0)) ? true : false; if (false == this.m_bIsPenDash && bIsDash == this.m_bIsPenDash) return; this.m_bIsPenDash = bIsDash; if (!this.m_bIsPenDash) { this.Memory.WriteByte(CommandType.ctPenDashStyle); this.Memory.WriteByte(0); } else { this.Memory.WriteByte(CommandType.ctPenDashStyle); this.Memory.WriteByte(5); this.Memory.WriteLong(params.length); for (var i = 0; i < params.length; i++) { this.Memory.WriteDouble(params[i]); } } }, // brush methods b_color1 : function(r, g, b, a) { if (this.BrushType != MetaBrushType.Solid) { this.Memory.WriteByte(CommandType.ctBrushType); this.Memory.WriteLong(1000); this.BrushType = MetaBrushType.Solid; } if (this.m_oBrush.Color1.R != r || this.m_oBrush.Color1.G != g || this.m_oBrush.Color1.B != b) { this.m_oBrush.Color1.R = r; this.m_oBrush.Color1.G = g; this.m_oBrush.Color1.B = b; var value = b << 16 | g << 8 | r; this.Memory.WriteByte(CommandType.ctBrushColor1); this.Memory.WriteLong(value); } if (this.m_oBrush.Color1.A != a) { this.m_oBrush.Color1.A = a; this.Memory.WriteByte(CommandType.ctBrushAlpha1); this.Memory.WriteByte(a); } }, b_color2 : function(r, g, b, a) { if (this.m_oBrush.Color2.R != r || this.m_oBrush.Color2.G != g || this.m_oBrush.Color2.B != b) { this.m_oBrush.Color2.R = r; this.m_oBrush.Color2.G = g; this.m_oBrush.Color2.B = b; var value = b << 16 | g << 8 | r; this.Memory.WriteByte(CommandType.ctBrushColor2); this.Memory.WriteLong(value); } if (this.m_oBrush.Color2.A != a) { this.m_oBrush.Color2.A = a; this.Memory.WriteByte(CommandType.ctBrushAlpha2); this.Memory.WriteByte(a); } }, put_brushTexture : function(src, mode) { var isCloudPrinting = isCloudPrintingUrl(); if (this.BrushType !== MetaBrushType.Texture) { this.Memory.WriteByte(CommandType.ctBrushType); this.Memory.WriteLong(3008); this.BrushType = MetaBrushType.Texture; } this.m_oBrush.Color1.R = -1; this.m_oBrush.Color1.G = -1; this.m_oBrush.Color1.B = -1; this.m_oBrush.Color1.A = -1; this.Memory.WriteByte(CommandType.ctBrushTexturePath); var _src = src; if (src.startsWith("blob:")) { _src = AscCommon.g_oDocumentBlobUrls.getImageBase64(src); } else if (isCloudPrinting) { _src = getCloudPrintingUrl(src) } else { var srcLocal = AscCommon.g_oDocumentUrls.getLocal(_src); if (srcLocal) _src = srcLocal; } this.Memory.WriteString2(_src); this.Memory.WriteByte(CommandType.ctBrushTextureMode); this.Memory.WriteByte(mode); }, put_BrushTextureAlpha : function(alpha) { var write = alpha; if (null == alpha || undefined == alpha) write = 255; this.Memory.WriteByte(CommandType.ctBrushTextureAlpha); this.Memory.WriteByte(write); }, put_BrushGradient : function(gradFill, points, transparent) { this.BrushType = MetaBrushType.Gradient; this.Memory.WriteByte(CommandType.ctBrushGradient); this.Memory.WriteByte(AscCommon.g_nodeAttributeStart); if (gradFill.path != null && (gradFill.lin == null || gradFill.lin == undefined)) { this.Memory.WriteByte(1); this.Memory.WriteByte(gradFill.path); this.Memory.WriteDouble(points.x0); this.Memory.WriteDouble(points.y0); this.Memory.WriteDouble(points.x1); this.Memory.WriteDouble(points.y1); this.Memory.WriteDouble(points.r0); this.Memory.WriteDouble(points.r1); } else { this.Memory.WriteByte(0); if (null == gradFill.lin) { this.Memory.WriteLong(90 * 60000); this.Memory.WriteBool(false); } else { this.Memory.WriteLong(gradFill.lin.angle); this.Memory.WriteBool(gradFill.lin.scale); } this.Memory.WriteDouble(points.x0); this.Memory.WriteDouble(points.y0); this.Memory.WriteDouble(points.x1); this.Memory.WriteDouble(points.y1); } var _colors = gradFill.colors; var firstColor = null; var lastColor = null; if (_colors.length > 0) { if (_colors[0].pos > 0) { firstColor = { color : { RGBA : { R : _colors[0].color.RGBA.R, G : _colors[0].color.RGBA.G, B : _colors[0].color.RGBA.B, A : _colors[0].color.RGBA.A } }, pos : 0 }; _colors.unshift(firstColor); } var posLast = _colors.length - 1; if (_colors[posLast].pos < 100000) { lastColor = { color : { RGBA : { R : _colors[posLast].color.RGBA.R, G : _colors[posLast].color.RGBA.G, B : _colors[posLast].color.RGBA.B, A : _colors[posLast].color.RGBA.A } }, pos : 100000 }; _colors.push(lastColor); } } this.Memory.WriteByte(2); this.Memory.WriteLong(_colors.length); for (var i = 0; i < _colors.length; i++) { this.Memory.WriteLong(_colors[i].pos); this.Memory.WriteByte(_colors[i].color.RGBA.R); this.Memory.WriteByte(_colors[i].color.RGBA.G); this.Memory.WriteByte(_colors[i].color.RGBA.B); if (null == transparent) this.Memory.WriteByte(_colors[i].color.RGBA.A); else this.Memory.WriteByte(transparent); } if (firstColor) _colors.shift(); if (lastColor) _colors.pop(); this.Memory.WriteByte(AscCommon.g_nodeAttributeEnd); }, transform : function(sx, shy, shx, sy, tx, ty) { if (this.m_oTransform.sx != sx || this.m_oTransform.shx != shx || this.m_oTransform.shy != shy || this.m_oTransform.sy != sy || this.m_oTransform.tx != tx || this.m_oTransform.ty != ty) { this.m_oTransform.sx = sx; this.m_oTransform.shx = shx; this.m_oTransform.shy = shy; this.m_oTransform.sy = sy; this.m_oTransform.tx = tx; this.m_oTransform.ty = ty; this.Memory.WriteByte(CommandType.ctSetTransform); this.Memory.WriteDouble(sx); this.Memory.WriteDouble(shy); this.Memory.WriteDouble(shx); this.Memory.WriteDouble(sy); this.Memory.WriteDouble(tx); this.Memory.WriteDouble(ty); } }, // path commands _s : function() { if (this.VectorMemoryForPrint != null) this.VectorMemoryForPrint.ClearNoAttack(); var _memory = (null == this.VectorMemoryForPrint) ? this.Memory : this.VectorMemoryForPrint; _memory.WriteByte(CommandType.ctPathCommandStart); this.lastPoint = null; }, _e : function() { // тут всегда напрямую в Memory this.Memory.WriteByte(CommandType.ctPathCommandEnd); this.lastPoint = null; }, _z : function() { var _memory = (null == this.VectorMemoryForPrint) ? this.Memory : this.VectorMemoryForPrint; _memory.WriteByte(CommandType.ctPathCommandClose); this.lastPoint = null; }, _m : function(x, y) { var _memory = (null == this.VectorMemoryForPrint) ? this.Memory : this.VectorMemoryForPrint; _memory.WriteByte(CommandType.ctPathCommandMoveTo); _memory.WriteDouble(x); _memory.WriteDouble(y); this.lastPoint = {x: x, y: y}; }, _l : function(x, y) { var _memory = (null == this.VectorMemoryForPrint) ? this.Memory : this.VectorMemoryForPrint; _memory.WriteByte(CommandType.ctPathCommandLineTo); _memory.WriteDouble(x); _memory.WriteDouble(y); this.lastPoint = {x: x, y: y}; }, _c : function(x1, y1, x2, y2, x3, y3) { var _memory = (null == this.VectorMemoryForPrint) ? this.Memory : this.VectorMemoryForPrint; _memory.WriteByte(CommandType.ctPathCommandCurveTo); _memory.WriteDouble(x1); _memory.WriteDouble(y1); _memory.WriteDouble(x2); _memory.WriteDouble(y2); _memory.WriteDouble(x3); _memory.WriteDouble(y3); this.lastPoint = {x: x3, y: y3}; }, _c2 : function(x1, y1, x2, y2) { var _memory = (null == this.VectorMemoryForPrint) ? this.Memory : this.VectorMemoryForPrint; _memory.WriteByte(CommandType.ctPathCommandCurveTo); if (null == this.lastPoint) { _memory.WriteDouble(x1); _memory.WriteDouble(y1); _memory.WriteDouble(x1); _memory.WriteDouble(y1); _memory.WriteDouble(x2); _memory.WriteDouble(y2); } else { _memory.WriteDouble(this.lastPoint.x + 2 * (x1 - this.lastPoint.x) / 3); _memory.WriteDouble(this.lastPoint.y + 2 * (y1 - this.lastPoint.y) / 3); _memory.WriteDouble(x2 + 2 * (x1 - x2) / 3); _memory.WriteDouble(y2 + 2 * (y1 - y2) / 3); _memory.WriteDouble(x2); _memory.WriteDouble(y2); } this.lastPoint = {x: x2, y: y2}; }, ds : function() { if (null == this.VectorMemoryForPrint) { this.Memory.WriteByte(CommandType.ctDrawPath); this.Memory.WriteLong(1); } else { this.Memory.Copy(this.VectorMemoryForPrint, 0, this.VectorMemoryForPrint.pos); this.Memory.WriteByte(CommandType.ctDrawPath); this.Memory.WriteLong(1); } }, df : function() { if (null == this.VectorMemoryForPrint) { this.Memory.WriteByte(CommandType.ctDrawPath); this.Memory.WriteLong(256); } else { this.Memory.Copy(this.VectorMemoryForPrint, 0, this.VectorMemoryForPrint.pos); this.Memory.WriteByte(CommandType.ctDrawPath); this.Memory.WriteLong(256); } }, WriteVectorMemoryForPrint : function() { if (null != this.VectorMemoryForPrint) { this.Memory.Copy(this.VectorMemoryForPrint, 0, this.VectorMemoryForPrint.pos); } }, drawpath : function(type) { if (null == this.VectorMemoryForPrint) { this.Memory.WriteByte(CommandType.ctDrawPath); this.Memory.WriteLong(type); } else { this.Memory.Copy(this.VectorMemoryForPrint, 0, this.VectorMemoryForPrint.pos); this.Memory.WriteByte(CommandType.ctDrawPath); this.Memory.WriteLong(type); } }, // canvas state save : function() { }, restore : function() { }, clip : function() { }, // images drawImage : function(img, x, y, w, h, isUseOriginUrl) { if (img.startsWith("blob:")) { this.Memory.WriteString2(AscCommon.g_oDocumentBlobUrls.getImageBase64(img)); this.Memory.WriteDouble(x); this.Memory.WriteDouble(y); this.Memory.WriteDouble(w); this.Memory.WriteDouble(h); return; } var isCloudPrinting = isCloudPrintingUrl(); if (!window.editor) { // excel this.Memory.WriteByte(CommandType.ctDrawImageFromFile); let _img = img; if (isCloudPrinting) { _img = getCloudPrintingUrl(_img); } else { var imgLocal = AscCommon.g_oDocumentUrls.getLocal(img); if (imgLocal && (true !== isUseOriginUrl)) { _img = imgLocal; } } this.Memory.WriteString2(_img); this.Memory.WriteDouble(x); this.Memory.WriteDouble(y); this.Memory.WriteDouble(w); this.Memory.WriteDouble(h); return; } var _src = ""; if (!window["NATIVE_EDITOR_ENJINE"] && (true !== isUseOriginUrl)) { var _img = window.editor.ImageLoader.map_image_index[img]; if (_img == undefined || _img.Image == null) return; _src = _img.src; } else { _src = img; } if (isCloudPrinting) { _src = getCloudPrintingUrl(_src) } else { var srcLocal = AscCommon.g_oDocumentUrls.getLocal(_src); if (srcLocal) _src = srcLocal; } this.Memory.WriteByte(CommandType.ctDrawImageFromFile); this.Memory.WriteString2(_src); this.Memory.WriteDouble(x); this.Memory.WriteDouble(y); this.Memory.WriteDouble(w); this.Memory.WriteDouble(h); }, SetFontName : function(name) { var fontinfo = g_fontApplication.GetFontInfo(name, 0, this.LastFontOriginInfo); if (this.m_oFont.Name != fontinfo.Name) { this.m_oFont.Name = fontinfo.Name; this.Memory.WriteByte(CommandType.ctFontName); this.Memory.WriteString(this.m_oFont.Name); } }, SetFont : function(font, isFromPicker) { if (this.FontPicker && !isFromPicker) return this.FontPicker.SetFont(font); if (null == font) return; var style = 0; if (font.Italic == true) style += 2; if (font.Bold == true) style += 1; var fontinfo = g_fontApplication.GetFontInfo(font.FontFamily.Name, style, this.LastFontOriginInfo); //style = fontinfo.GetBaseStyle(style); if (this.m_oFont.Name != fontinfo.Name) { this.m_oFont.Name = fontinfo.Name; this.Memory.WriteByte(CommandType.ctFontName); this.Memory.WriteString(this.m_oFont.Name); } if (this.m_oFont.FontSize != font.FontSize) { this.m_oFont.FontSize = font.FontSize; this.Memory.WriteByte(CommandType.ctFontSize); this.Memory.WriteDouble(this.m_oFont.FontSize); } if (this.m_oFont.Style != style) { this.m_oFont.Style = style; this.Memory.WriteByte(CommandType.ctFontStyle); this.Memory.WriteLong(style); } }, FillText : function(x, y, text) { if (1 == text.length) return this.FillTextCode(x, y, text.charCodeAt(0)); this.Memory.WriteByte(CommandType.ctDrawText); this.Memory.WriteString(text); this.Memory.WriteDouble(x); this.Memory.WriteDouble(y); }, FillTextCode : function(x, y, code) { var _code = code; if (null != this.LastFontOriginInfo.Replace) _code = g_fontApplication.GetReplaceGlyph(_code, this.LastFontOriginInfo.Replace); if (this.FontPicker) this.FontPicker.FillTextCode(_code); this.Memory.WriteByte(CommandType.ctDrawText); this.Memory.WriteStringBySymbol(_code); this.Memory.WriteDouble(x); this.Memory.WriteDouble(y); }, tg : function(gid, x, y, codepoints) { /* var _old_pos = this.Memory.pos; g_fontApplication.LoadFont(this.m_oFont.Name, AscCommon.g_font_loader, AscCommon.g_oTextMeasurer.m_oManager, this.m_oFont.FontSize, Math.max(this.m_oFont.Style, 0), 72, 72); AscCommon.g_oTextMeasurer.m_oManager.LoadStringPathCode(gid, true, x, y, this); // start (1) + draw(1) + typedraw(4) + end(1) = 7! if ((this.Memory.pos - _old_pos) < 8) this.Memory.pos = _old_pos; */ this.Memory.WriteByte(CommandType.ctDrawTextCodeGid); this.Memory.WriteLong(gid); this.Memory.WriteDouble(x); this.Memory.WriteDouble(y); var count = codepoints ? codepoints.length : 0; this.Memory.WriteLong(count); for (var i = 0; i < count; i++) this.Memory.WriteLong(codepoints[i]); }, charspace : function(space) { }, beginCommand : function(command) { this.Memory.WriteByte(CommandType.ctBeginCommand); this.Memory.WriteLong(command); }, endCommand : function(command) { if (32 == command) { if (null == this.VectorMemoryForPrint) { this.Memory.WriteByte(CommandType.ctEndCommand); this.Memory.WriteLong(command); } else { this.Memory.Copy(this.VectorMemoryForPrint, 0, this.VectorMemoryForPrint.pos); this.Memory.WriteByte(CommandType.ctEndCommand); this.Memory.WriteLong(command); } return; } this.Memory.WriteByte(CommandType.ctEndCommand); this.Memory.WriteLong(command); }, put_PenLineJoin : function(_join) { this.Memory.WriteByte(CommandType.ctPenLineJoin); this.Memory.WriteByte(_join & 0xFF); }, put_TextureBounds : function(x, y, w, h) { this.Memory.WriteByte(CommandType.ctBrushRectable); this.Memory.WriteDouble(x); this.Memory.WriteDouble(y); this.Memory.WriteDouble(w); this.Memory.WriteDouble(h); }, put_TextureBoundsEnabled : function(bIsEnabled) { this.Memory.WriteByte(CommandType.ctBrushRectableEnabled); this.Memory.WriteBool(bIsEnabled); }, SetFontInternal : function(name, size, style) { // TODO: remove m_oFontSlotFont var _lastFont = this.m_oFontSlotFont; _lastFont.Name = name; _lastFont.Size = size; _lastFont.Bold = (style & AscFonts.FontStyle.FontStyleBold) ? true : false; _lastFont.Italic = (style & AscFonts.FontStyle.FontStyleItalic) ? true : false; this.m_oFontTmp.FontFamily.Name = _lastFont.Name; this.m_oFontTmp.Bold = _lastFont.Bold; this.m_oFontTmp.Italic = _lastFont.Italic; this.m_oFontTmp.FontSize = _lastFont.Size; this.SetFont(this.m_oFontTmp); }, SetFontSlot : function(slot, fontSizeKoef) { var _rfonts = this.m_oGrFonts; var _lastFont = this.m_oFontSlotFont; 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; this.m_oFontTmp.FontFamily.Name = _lastFont.Name; this.m_oFontTmp.Bold = _lastFont.Bold; this.m_oFontTmp.Italic = _lastFont.Italic; this.m_oFontTmp.FontSize = _lastFont.Size; this.SetFont(this.m_oFontTmp); }, AddHyperlink : function(x, y, w, h, url, tooltip) { this.Memory.WriteByte(CommandType.ctHyperlink); this.Memory.WriteDouble(x); this.Memory.WriteDouble(y); this.Memory.WriteDouble(w); this.Memory.WriteDouble(h); this.Memory.WriteString(url); this.Memory.WriteString(tooltip); }, AddLink : function(x, y, w, h, dx, dy, dPage) { this.Memory.WriteByte(CommandType.ctLink); this.Memory.WriteDouble(x); this.Memory.WriteDouble(y); this.Memory.WriteDouble(w); this.Memory.WriteDouble(h); this.Memory.WriteDouble(dx); this.Memory.WriteDouble(dy); this.Memory.WriteLong(dPage); }, AddFormField : function(nX, nY, nW, nH, nBaseLineOffset, oForm) { if (!oForm) return; this.Memory.WriteByte(CommandType.ctFormField); var nStartPos = this.Memory.GetCurPosition(); this.Memory.Skip(4); this.Memory.WriteDouble(nX); this.Memory.WriteDouble(nY); this.Memory.WriteDouble(nW); this.Memory.WriteDouble(nH); this.Memory.WriteDouble(nBaseLineOffset); var nFlagPos = this.Memory.GetCurPosition(); this.Memory.Skip(4); var nFlag = 0; var oFormPr = oForm.GetFormPr(); let formKey = null; if (!oForm.IsMainForm()) { let mainForm = oForm.GetMainForm(); let subIndex = oForm.GetSubFormIndex(); formKey = mainForm.GetFormKey() + "_" + subIndex; } else { formKey = oFormPr.GetKey(); } if (formKey) { nFlag |= 1; this.Memory.WriteString(formKey); } var sHelpText = oFormPr.GetHelpText(); if (sHelpText) { nFlag |= (1 << 1); this.Memory.WriteString(sHelpText); } if (oFormPr.GetRequired()) nFlag |= (1 << 2); if (oForm.IsPlaceHolder()) nFlag |= (1 << 3); // 7-ой и 8-ой биты зарезервированы для бордера var oBorder = oFormPr.GetBorder(); if (oBorder && !oBorder.IsNone()) { nFlag |= (1 << 6); var oColor = oBorder.GetColor(); this.Memory.WriteLong(1); this.Memory.WriteDouble(oBorder.GetWidth()); this.Memory.WriteByte(oColor.r); this.Memory.WriteByte(oColor.g); this.Memory.WriteByte(oColor.b); this.Memory.WriteByte(0x255); } var oParagraph = oForm.GetParagraph(); var oShd = oFormPr.GetShd(); if (oParagraph && oShd && !oShd.IsNil()) { nFlag |= (1 << 9); var oColor = oShd.GetSimpleColor(oParagraph.GetTheme(), oParagraph.GetColorMap()); this.Memory.WriteByte(oColor.r); this.Memory.WriteByte(oColor.g); this.Memory.WriteByte(oColor.b); this.Memory.WriteByte(0x255); } if (oParagraph && AscCommon.align_Left !== oParagraph.GetParagraphAlign()) { nFlag |= (1 << 10); this.Memory.WriteByte(oParagraph.GetParagraphAlign()); } // 0 - Unknown // 1 - Text // 2 - ComboBox/DropDownList // 3 - CheckBox/RadioButton // 4 - Picture // 5 - Signature // 6 - DateTime if (oForm.IsTextForm()) { this.Memory.WriteLong(1); var oTextFormPr = oForm.GetTextFormPr(); if (oTextFormPr.Comb) nFlag |= (1 << 20); if (oTextFormPr.MaxCharacters > 0) { nFlag |= (1 << 21); this.Memory.WriteLong(oTextFormPr.MaxCharacters); } let sValue = oForm.GetSelectedText(true, false, {}); if (sValue) { nFlag |= (1 << 22); this.Memory.WriteString(sValue); } if (oTextFormPr.MultiLine && oForm.IsFixedForm()) nFlag |= (1 << 23); if (oTextFormPr.AutoFit) nFlag |= (1 << 24); let sPlaceHolderText = oForm.GetPlaceholderText(); if (sPlaceHolderText) { nFlag |= (1 << 25); this.Memory.WriteString(sPlaceHolderText); } let format = oTextFormPr.GetFormat(); if (!format.IsEmpty()) { nFlag |= (1 << 26); this.Memory.WriteByte(format.GetType()); let formatSymbols = format.GetSymbols(false); this.Memory.WriteLong(formatSymbols.length); for (let index = 0, count = formatSymbols.length; index < count; ++index) { this.Memory.WriteLong(formatSymbols[index]); } let mask = ""; if (format.IsMask()) mask = format.GetMask(); else if (format.IsRegExp()) mask = format.GetRegExp(); this.Memory.WriteString(mask); } } else if (oForm.IsComboBox() || oForm.IsDropDownList()) { this.Memory.WriteLong(2); var isComboBox = oForm.IsComboBox(); var oFormPr = isComboBox ? oForm.GetComboBoxPr() : oForm.GetDropDownListPr(); if (isComboBox) nFlag |= (1 << 20); var sValue = oForm.GetSelectedText(true); var nSelectedIndex = -1; // Обработка "Choose an item" var nItemsCount = oFormPr.GetItemsCount(); if (nItemsCount > 0 && AscCommon.translateManager.getValue("Choose an item") === oFormPr.GetItemDisplayText(0)) { this.Memory.WriteLong(nItemsCount - 1); for (var nIndex = 1; nIndex < nItemsCount; ++nIndex) { var sItemValue = oFormPr.GetItemDisplayText(nIndex); if (sItemValue === sValue) nSelectedIndex = nIndex; this.Memory.WriteString(sItemValue); } } else { this.Memory.WriteLong(nItemsCount); for (var nIndex = 0; nIndex < nItemsCount; ++nIndex) { var sItemValue = oFormPr.GetItemDisplayText(nIndex); if (sItemValue === sValue) nSelectedIndex = nIndex; this.Memory.WriteString(sItemValue); } } this.Memory.WriteLong(nSelectedIndex); if (sValue) { nFlag |= (1 << 22); this.Memory.WriteString(sValue); } var sPlaceHolderText = oForm.GetPlaceholderText(); if (sPlaceHolderText) { nFlag |= (1 << 23); this.Memory.WriteString(sPlaceHolderText); } } else if (oForm.IsCheckBox()) { this.Memory.WriteLong(3); var oCheckBoxPr = oForm.GetCheckBoxPr(); if (oCheckBoxPr.GetChecked()) nFlag |= (1 << 20); var nCheckedSymbol = oCheckBoxPr.GetCheckedSymbol(); var nUncheckedSymbol = oCheckBoxPr.GetUncheckedSymbol(); var nType = 0x0000; if (0x2611 === nCheckedSymbol && 0x2610 === nUncheckedSymbol) nType = 0x0001; else if (0x25C9 === nCheckedSymbol && 0x25CB === nUncheckedSymbol) nType = 0x0002; var sCheckedFont = oCheckBoxPr.GetCheckedFont(); if (AscCommon.IsAscFontSupport(sCheckedFont, nCheckedSymbol)) sCheckedFont = "ASCW3"; var sUncheckedFont = oCheckBoxPr.GetUncheckedFont(); if (AscCommon.IsAscFontSupport(sUncheckedFont, nUncheckedSymbol)) sUncheckedFont = "ASCW3"; this.Memory.WriteLong(nType); this.Memory.WriteLong(nCheckedSymbol); this.Memory.WriteString(sCheckedFont); this.Memory.WriteLong(nUncheckedSymbol); this.Memory.WriteString(sUncheckedFont); var sGroupName = oCheckBoxPr.GetGroupKey(); if (sGroupName) { nFlag |= (1 << 21); this.Memory.WriteString(sGroupName); } } else if (oForm.IsPicture()) { this.Memory.WriteLong(4); var oPicturePr = oForm.GetPictureFormPr(); if (oPicturePr.IsConstantProportions()) nFlag |= (1 << 20); if (oPicturePr.IsRespectBorders()) nFlag |= (1 << 21); nFlag |= ((oPicturePr.GetScaleFlag() & 0xF) << 24); this.Memory.WriteLong(oPicturePr.GetShiftX() * 1000); this.Memory.WriteLong(oPicturePr.GetShiftY() * 1000); if (!oForm.IsPlaceHolder()) { var arrDrawings = oForm.GetAllDrawingObjects(); if (arrDrawings.length > 0 && arrDrawings[0].IsPicture() && arrDrawings[0].GraphicObj.blipFill) { var _src = AscCommon.getFullImageSrc2(arrDrawings[0].GraphicObj.blipFill.RasterImageId); var isCloudPrinting = isCloudPrintingUrl(); if (isCloudPrinting) { _src = getCloudPrintingUrl(_src) } else { var srcLocal = AscCommon.g_oDocumentUrls.getLocal(_src); if (srcLocal) _src = srcLocal; } nFlag |= (1 << 22); this.Memory.WriteString(_src); } } } else if (oForm.IsDatePicker()) { this.Memory.WriteLong(6); let dateTimePr = oForm.GetDatePickerPr(); let value = oForm.GetSelectedText(true, false, {}); if (value) { nFlag |= (1 << 22); this.Memory.WriteString(value); } let placeholderText = oForm.GetPlaceholderText(); if (placeholderText) { nFlag |= (1 << 25); this.Memory.WriteString(placeholderText); } let dateFormat = dateTimePr.GetDateFormat(); if (dateFormat) { nFlag |= (1 << 26); this.Memory.WriteString(dateFormat); } } else { this.Memory.WriteLong(0); } var nEndPos = this.Memory.GetCurPosition(); this.Memory.Seek(nFlagPos); this.Memory.WriteLong(nFlag); this.Memory.Seek(nStartPos); this.Memory.WriteLong(nEndPos - nStartPos); this.Memory.Seek(nEndPos); }, ClearLastFont : function() { this.m_oFont = { Name : "", FontSize : -1, Style : -1 }; this.m_oTextPr = null; this.m_oGrFonts = new CGrRFonts(); this.m_oFontSlotFont = new CFontSetup(); this.LastFontOriginInfo = {Name : "", Replace : null}; } }; function CDocumentRenderer() { AscCommon.CGraphicsBase.call(this, AscCommon.RendererType.PDF, true); this.m_arrayPages = []; this.m_lPagesCount = 0; //this.DocumentInfo = ""; this.Memory = new CMemory(); this.VectorMemoryForPrint = null; this.m_oPen = null; this.m_oBrush = null; this.m_oTransform = null; this._restoreDumpedVectors = null; this.m_oBaseTransform = null; this.UseOriginImageUrl = false; this.FontPicker = null; this.isPrintMode = false; } CDocumentRenderer.prototype = Object.create(AscCommon.CGraphicsBase.prototype); CDocumentRenderer.prototype.constructor = CDocumentRenderer; CDocumentRenderer.prototype.InitPicker = function(_manager) { this.FontPicker = new CMetafileFontPicker(_manager); }; CDocumentRenderer.prototype.SetBaseTransform = function(_matrix) { this.m_oBaseTransform = _matrix; }; CDocumentRenderer.prototype.BeginPage = function(width, height) { this.m_arrayPages[this.m_arrayPages.length] = new CMetafile(width, height); this.m_lPagesCount = this.m_arrayPages.length; this.m_arrayPages[this.m_lPagesCount - 1].Memory = this.Memory; this.m_arrayPages[this.m_lPagesCount - 1].StartOffset = this.Memory.pos; this.m_arrayPages[this.m_lPagesCount - 1].VectorMemoryForPrint = this.VectorMemoryForPrint; this.m_arrayPages[this.m_lPagesCount - 1].FontPicker = this.FontPicker; if (this.FontPicker) this.m_arrayPages[this.m_lPagesCount - 1].FontPicker.Metafile = this.m_arrayPages[this.m_lPagesCount - 1]; this.Memory.WriteByte(CommandType.ctPageStart); this.Memory.WriteByte(CommandType.ctPageWidth); this.Memory.WriteDouble(width); this.Memory.WriteByte(CommandType.ctPageHeight); this.Memory.WriteDouble(height); var _page = this.m_arrayPages[this.m_lPagesCount - 1]; this.m_oPen = _page.m_oPen; this.m_oBrush = _page.m_oBrush; this.m_oTransform = _page.m_oTransform; }; CDocumentRenderer.prototype.EndPage = function() { this.Memory.WriteByte(CommandType.ctPageEnd); }; CDocumentRenderer.prototype.p_color = function(r, g, b, a) { if (0 != this.m_lPagesCount) this.m_arrayPages[this.m_lPagesCount - 1].p_color(r, g, b, a); }; CDocumentRenderer.prototype.p_width = function(w) { if (0 != this.m_lPagesCount) this.m_arrayPages[this.m_lPagesCount - 1].p_width(w); }; CDocumentRenderer.prototype.p_dash = function(params) { if (0 != this.m_lPagesCount) this.m_arrayPages[this.m_lPagesCount - 1].p_dash(params); }; // brush methods CDocumentRenderer.prototype.b_color1 = function(r, g, b, a) { if (0 != this.m_lPagesCount) this.m_arrayPages[this.m_lPagesCount - 1].b_color1(r, g, b, a); }; CDocumentRenderer.prototype.b_color2 = function(r, g, b, a) { if (0 != this.m_lPagesCount) this.m_arrayPages[this.m_lPagesCount - 1].b_color2(r, g, b, a); }; CDocumentRenderer.prototype.transform = function(sx, shy, shx, sy, tx, ty) { if (0 != this.m_lPagesCount) { if (null == this.m_oBaseTransform) this.m_arrayPages[this.m_lPagesCount - 1].transform(sx, shy, shx, sy, tx, ty); else { var _transform = new CMatrix(); _transform.sx = sx; _transform.shy = shy; _transform.shx = shx; _transform.sy = sy; _transform.tx = tx; _transform.ty = ty; AscCommon.global_MatrixTransformer.MultiplyAppend(_transform, this.m_oBaseTransform); this.m_arrayPages[this.m_lPagesCount - 1].transform(_transform.sx, _transform.shy, _transform.shx, _transform.sy, _transform.tx, _transform.ty); } } }; CDocumentRenderer.prototype.transform3 = function(m) { this.transform(m.sx, m.shy, m.shx, m.sy, m.tx, m.ty); }; CDocumentRenderer.prototype.reset = function() { this.transform(1, 0, 0, 1, 0, 0); }; // path commands CDocumentRenderer.prototype._s = function() { if (0 != this.m_lPagesCount) this.m_arrayPages[this.m_lPagesCount - 1]._s(); }; CDocumentRenderer.prototype._e = function() { if (0 != this.m_lPagesCount) this.m_arrayPages[this.m_lPagesCount - 1]._e(); }; CDocumentRenderer.prototype._z = function() { if (0 != this.m_lPagesCount) this.m_arrayPages[this.m_lPagesCount - 1]._z(); }; CDocumentRenderer.prototype._m = function(x, y) { if (0 != this.m_lPagesCount) this.m_arrayPages[this.m_lPagesCount - 1]._m(x, y); }; CDocumentRenderer.prototype._l = function(x, y) { if (0 != this.m_lPagesCount) this.m_arrayPages[this.m_lPagesCount - 1]._l(x, y); }; CDocumentRenderer.prototype._c = function(x1, y1, x2, y2, x3, y3) { if (0 != this.m_lPagesCount) this.m_arrayPages[this.m_lPagesCount - 1]._c(x1, y1, x2, y2, x3, y3); }; CDocumentRenderer.prototype._c2 = function(x1, y1, x2, y2) { if (0 != this.m_lPagesCount) this.m_arrayPages[this.m_lPagesCount - 1]._c2(x1, y1, x2, y2); }; CDocumentRenderer.prototype.ds= function() { if (0 != this.m_lPagesCount) this.m_arrayPages[this.m_lPagesCount - 1].ds(); }; CDocumentRenderer.prototype.df = function() { if (0 != this.m_lPagesCount) this.m_arrayPages[this.m_lPagesCount - 1].df(); }; CDocumentRenderer.prototype.drawpath = function(type) { if (0 != this.m_lPagesCount) this.m_arrayPages[this.m_lPagesCount - 1].drawpath(type); }; // images CDocumentRenderer.prototype.drawImage = function(img, x, y, w, h, alpha, srcRect) { if (img == null || img == undefined || img == "") return; if (0 != this.m_lPagesCount) { if (!srcRect) this.m_arrayPages[this.m_lPagesCount - 1].drawImage(img, x, y, w, h, this.UseOriginImageUrl); else { /* if (!window.editor) { this.m_arrayPages[this.m_lPagesCount - 1].drawImage(img,x,y,w,h); return; } */ /* var _img = undefined; if (window.editor) _img = window.editor.ImageLoader.map_image_index[img]; else if (window["Asc"]["editor"]) _img = window["Asc"]["editor"].ImageLoader.map_image_index[img]; var w0 = 0; var h0 = 0; if (_img != undefined && _img.Image != null) { w0 = _img.Image.width; h0 = _img.Image.height; } if (w0 == 0 || h0 == 0) { this.m_arrayPages[this.m_lPagesCount - 1].drawImage(img, x, y, w, h); return; } */ var bIsClip = false; if (srcRect.l > 0 || srcRect.t > 0 || srcRect.r < 100 || srcRect.b < 100) bIsClip = true; if (bIsClip) { this.SaveGrState(); this.AddClipRect(x, y, w, h); } 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; if (srcRect.l < 0) { var _off = ((-srcRect.l / _delW) * __w); x += _off; w -= _off; } if (srcRect.t < 0) { var _off = ((-srcRect.t / _delH) * __h); y += _off; h -= _off; } if (srcRect.r > 100) { var _off = ((srcRect.r - 100) / _delW) * __w; w -= _off; } if (srcRect.b > 100) { var _off = ((srcRect.b - 100) / _delH) * __h; h -= _off; } var _wk = 100; if (srcRect.l > 0) _wk -= srcRect.l; if (srcRect.r < 100) _wk -= (100 - srcRect.r); _wk = 100 / _wk; var _hk = 100; if (srcRect.t > 0) _hk -= srcRect.t; if (srcRect.b < 100) _hk -= (100 - srcRect.b); _hk = 100 / _hk; var _r = x + w; var _b = y + h; if (srcRect.l > 0) { x -= ((srcRect.l * _wk * w) / 100); } if (srcRect.t > 0) { y -= ((srcRect.t * _hk * h) / 100); } if (srcRect.r < 100) { _r += (((100 - srcRect.r) * _wk * w) / 100); } if (srcRect.b < 100) { _b += (((100 - srcRect.b) * _hk * h) / 100); } this.m_arrayPages[this.m_lPagesCount - 1].drawImage(img, x, y, _r - x, _b - y); if (bIsClip) { this.RestoreGrState(); } } } }; CDocumentRenderer.prototype.SetFont = function(font) { if (0 != this.m_lPagesCount) this.m_arrayPages[this.m_lPagesCount - 1].SetFont(font); }; CDocumentRenderer.prototype.FillText = function(x, y, text, cropX, cropW) { if (0 != this.m_lPagesCount) this.m_arrayPages[this.m_lPagesCount - 1].FillText(x, y, text); }; CDocumentRenderer.prototype.FillTextCode = function(x, y, text, cropX, cropW) { if (0 != this.m_lPagesCount) this.m_arrayPages[this.m_lPagesCount - 1].FillTextCode(x, y, text); }; CDocumentRenderer.prototype.tg = function(gid, x, y, codePoints) { if (0 != this.m_lPagesCount) this.m_arrayPages[this.m_lPagesCount - 1].tg(gid, x, y, codePoints); }; CDocumentRenderer.prototype.FillText2 = function(x, y, text) { if (0 != this.m_lPagesCount) this.m_arrayPages[this.m_lPagesCount - 1].FillText(x, y, text); }; CDocumentRenderer.prototype.GetFont = function() { if (0 != this.m_lPagesCount) return this.m_arrayPages[this.m_lPagesCount - 1].m_oFont; return null; }; CDocumentRenderer.prototype.put_PenLineJoin = function(_join) { if (0 != this.m_lPagesCount) this.m_arrayPages[this.m_lPagesCount - 1].put_PenLineJoin(_join); }; CDocumentRenderer.prototype.put_TextureBounds = function(x, y, w, h) { if (0 != this.m_lPagesCount) this.m_arrayPages[this.m_lPagesCount - 1].put_TextureBounds(x, y, w, h); }; CDocumentRenderer.prototype.put_TextureBoundsEnabled = function(val) { if (0 != this.m_lPagesCount) this.m_arrayPages[this.m_lPagesCount - 1].put_TextureBoundsEnabled(val); }; CDocumentRenderer.prototype.put_brushTexture = function(src, mode) { if (src == null || src == undefined) src = ""; if (0 != this.m_lPagesCount) this.m_arrayPages[this.m_lPagesCount - 1].put_brushTexture(src, mode); }; CDocumentRenderer.prototype.put_BrushTextureAlpha = function(alpha) { if (0 != this.m_lPagesCount) this.m_arrayPages[this.m_lPagesCount - 1].put_BrushTextureAlpha(alpha); }; CDocumentRenderer.prototype.put_BrushGradient = function(gradFill, points, transparent) { if (0 != this.m_lPagesCount) this.m_arrayPages[this.m_lPagesCount - 1].put_BrushGradient(gradFill, points, transparent); }; // функции клиппирования CDocumentRenderer.prototype.SetClip = function(r) { if (0 != this.m_lPagesCount) this.m_arrayPages[this.m_lPagesCount - 1].beginCommand(32); this.rect(r.x, r.y, r.w, r.h); if (0 != this.m_lPagesCount) this.m_arrayPages[this.m_lPagesCount - 1].endCommand(32); //this._s(); }; CDocumentRenderer.prototype.RemoveClip = function() { if (0 != this.m_lPagesCount) { this.m_arrayPages[this.m_lPagesCount - 1].beginCommand(64); this.m_arrayPages[this.m_lPagesCount - 1].endCommand(64); } }; CDocumentRenderer.prototype.GetTransform = function() { if (0 != this.m_lPagesCount) { return this.m_arrayPages[this.m_lPagesCount - 1].m_oTransform; } return null; }; CDocumentRenderer.prototype.GetLineWidth = function() { if (0 != this.m_lPagesCount) { return this.m_arrayPages[this.m_lPagesCount - 1].m_oPen.Size; } return 0; }; CDocumentRenderer.prototype.GetPen = function() { if (0 != this.m_lPagesCount) { return this.m_arrayPages[this.m_lPagesCount - 1].m_oPen; } return 0; }; CDocumentRenderer.prototype.GetBrush = function() { if (0 != this.m_lPagesCount) { return this.m_arrayPages[this.m_lPagesCount - 1].m_oBrush; } return 0; }; CDocumentRenderer.prototype.StartClipPath = function() { this.private_removeVectors(); if (0 != this.m_lPagesCount) this.m_arrayPages[this.m_lPagesCount - 1].beginCommand(32); }; CDocumentRenderer.prototype.EndClipPath = function() { if (0 != this.m_lPagesCount) this.m_arrayPages[this.m_lPagesCount - 1].endCommand(32); this.private_restoreVectors(); }; CDocumentRenderer.prototype.SetTextPr = function(textPr, theme) { if (0 != this.m_lPagesCount) { var _page = this.m_arrayPages[this.m_lPagesCount - 1]; if (theme && textPr && textPr.ReplaceThemeFonts) textPr.ReplaceThemeFonts(theme.themeElements.fontScheme); _page.m_oTextPr = textPr; if (theme) _page.m_oGrFonts.checkFromTheme(theme.themeElements.fontScheme, _page.m_oTextPr.RFonts); else _page.m_oGrFonts = _page.m_oTextPr.RFonts; } }; CDocumentRenderer.prototype.SetFontInternal = function(name, size, style) { if (0 != this.m_lPagesCount) this.m_arrayPages[this.m_lPagesCount - 1].SetFontInternal(name, size, style); }; CDocumentRenderer.prototype.SetFontSlot = function(slot, fontSizeKoef) { if (0 != this.m_lPagesCount) this.m_arrayPages[this.m_lPagesCount - 1].SetFontSlot(slot, fontSizeKoef); }; CDocumentRenderer.prototype.GetTextPr = function() { if (0 != this.m_lPagesCount) return this.m_arrayPages[this.m_lPagesCount - 1].m_oTextPr; return null; }; CDocumentRenderer.prototype.private_removeVectors = function() { this._restoreDumpedVectors = this.VectorMemoryForPrint; if (this._restoreDumpedVectors != null) { this.VectorMemoryForPrint = null; if (0 != this.m_lPagesCount) this.m_arrayPages[this.m_lPagesCount - 1].VectorMemoryForPrint = null; } }; CDocumentRenderer.prototype.private_restoreVectors = function() { if (null != this._restoreDumpedVectors) { this.VectorMemoryForPrint = this._restoreDumpedVectors; if (0 != this.m_lPagesCount) this.m_arrayPages[this.m_lPagesCount - 1].VectorMemoryForPrint = this._restoreDumpedVectors; } this._restoreDumpedVectors = null; }; CDocumentRenderer.prototype.AddHyperlink = function(x, y, w, h, url, tooltip) { if (0 !== this.m_lPagesCount) this.m_arrayPages[this.m_lPagesCount - 1].AddHyperlink(x, y, w, h, url, tooltip); }; CDocumentRenderer.prototype.AddLink = function(x, y, w, h, dx, dy, dPage) { if (0 !== this.m_lPagesCount) this.m_arrayPages[this.m_lPagesCount - 1].AddLink(x, y, w, h, dx, dy, dPage); }; CDocumentRenderer.prototype.AddFormField = function(nX, nY, nW, nH, nBaseLineOffset, oForm) { if (0 !== this.m_lPagesCount) this.m_arrayPages[this.m_lPagesCount - 1].AddFormField(nX, nY, nW, nH, nBaseLineOffset, oForm); }; CDocumentRenderer.prototype.DocInfo = function(props) { if (props) { this.Memory.WriteByte(CommandType.ctDocInfo); var nFlagPos = this.Memory.GetCurPosition(); this.Memory.Skip(4); var nFlag = 0; if (props.asc_getTitle()) { nFlag |= 1; this.Memory.WriteString(props.asc_getTitle()); } if (props.asc_getCreator()) { nFlag |= (1 << 1); this.Memory.WriteString(props.asc_getCreator()); } if (props.asc_getSubject()) { nFlag |= (1 << 2); this.Memory.WriteString(props.asc_getSubject()); } if (props.asc_getKeywords()) { nFlag |= (1 << 3); this.Memory.WriteString(props.asc_getKeywords()); } var nEndPos = this.Memory.GetCurPosition(); this.Memory.Seek(nFlagPos); this.Memory.WriteLong(nFlag); this.Memory.Seek(nEndPos); } }; CDocumentRenderer.prototype.ClearLastFont = function() { if (0 !== this.m_lPagesCount) this.m_arrayPages[this.m_lPagesCount - 1].ClearLastFont(); }; function WriteHeadings(memory, headings) { if (!headings.length) return; memory.WriteByte(CommandType.ctHeadings); let nStartPos = memory.GetCurPosition(); memory.Skip(4); memory.WriteLong(headings.length); for (let i = 0; i < headings.length; ++i) { memory.WriteLong(headings[i].lvl); memory.WriteLong(headings[i].page); memory.WriteDouble(headings[i].x); memory.WriteDouble(headings[i].y); memory.WriteString(headings[i].desc); } let nEndPos = memory.GetCurPosition(); memory.Seek(nStartPos); memory.WriteLong(nEndPos - nStartPos); memory.Seek(nEndPos); } function AddHeading(headings, posXY, lvl, text) { if (!posXY) return; let x = posXY.X; let y = posXY.Y; if (posXY.Transform) { x = posXY.Transform.TransformPointX(posXY.X, posXY.Y); y = posXY.Transform.TransformPointY(posXY.X, posXY.Y); } headings.push({ lvl : lvl, page : posXY.PageNum, x : x, y : y, desc : text }); } function GetHeadingsByHeadings(logicDocument) { let docOutline = logicDocument.GetDocumentOutline(); let isUse = docOutline.IsUse(); if (!isUse) docOutline.SetUse(true); let count = docOutline.GetElementsCount(); let headings = []; for (let i = 0; i < count; ++i) { let posXY = docOutline.GetDestinationXY(i); AddHeading(headings, posXY, docOutline.GetLevel(i), docOutline.GetText(i)); } if (!isUse) docOutline.SetUse(false); return headings; } function GetHeadingsByBookmarks(logicDocument) { let bookmarkManager = logicDocument.GetBookmarksManager(); let count = bookmarkManager.GetCount(); let headings = []; for (let i = 0; i < count; ++i) { let name = bookmarkManager.GetName(i); if (bookmarkManager.IsHiddenBookmark(name)) continue; let bookmarkStart = bookmarkManager.GetBookmarkStart(i); if (!bookmarkStart) continue; let posXY = bookmarkStart.GetDestinationXY(); AddHeading(headings, posXY, 0, name); } return headings; } CDocumentRenderer.prototype.AddHeadings = function(logicDocument, byHeadings) { if (!logicDocument) return; let headings; if (byHeadings) headings = GetHeadingsByHeadings(logicDocument); else headings = GetHeadingsByBookmarks(logicDocument); WriteHeadings(this.Memory, headings); }; var MATRIX_ORDER_PREPEND = 0; var MATRIX_ORDER_APPEND = 1; function CMatrix() { this.sx = 1.0; this.shx = 0.0; this.shy = 0.0; this.sy = 1.0; this.tx = 0.0; this.ty = 0.0; } CMatrix.prototype = { Reset : function() { this.sx = 1.0; this.shx = 0.0; this.shy = 0.0; this.sy = 1.0; this.tx = 0.0; this.ty = 0.0; }, CopyTo : function(m) { m.sx = this.sx; m.shx = this.shx; m.shy = this.shy; m.sy = this.sy; m.tx = this.tx; m.ty = this.ty; }, CopyFrom : function(m) { this.sx = m.sx; this.shx = m.shx; this.shy = m.shy; this.sy = m.sy; this.tx = m.tx; this.ty = m.ty; }, SetValues : function(sx,shy,shx,sy,tx,ty) { this.sx = sx; this.shx = shx; this.shy = shy; this.sy = sy; this.tx = tx; this.ty = ty; }, // трансформ 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 = AscCommon.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 Determinant : function() { return this.sx * this.sy - this.shy * this.shx; }, // invert 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; }, // transform point 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; }, TransformPoint : function(x, y) { const transformedX = x * this.sx + y * this.shx + this.tx; const transformedY = x * this.shy + y * this.sy + this.ty; return { x: transformedX, y: transformedY }; }, // calculate rotate angle GetRotation : function() { var x1 = 0.0; var y1 = 0.0; var x2 = 1.0; var y2 = 0.0; var _x1 = this.TransformPointX(x1, y1); var _y1 = this.TransformPointY(x1, y1); var _x2 = this.TransformPointX(x2, y2); var _y2 = this.TransformPointY(x2, y2); var _y = _y2 - _y1; var _x = _x2 - _x1; if (Math.abs(_y) < 0.001) { if (_x > 0) return 0; else return 180; } if (Math.abs(_x) < 0.001) { if (_y > 0) return 90; else return 270; } var a = Math.atan2(_y, _x); a = AscCommon.rad2deg(a); if (a < 0) a += 360; return 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.0 && this.shx == 0.0 && this.shy == 0.0 && this.sy == 1.0 && this.tx == 0.0 && this.ty == 0.0) { return true; } return false; }, IsIdentity2 : function() { if (this.sx == 1.0 && this.shx == 0.0 && this.shy == 0.0 && this.sy == 1.0) { return true; } return false; }, GetScaleValue : function() { var x1 = this.TransformPointX(0, 0); var y1 = this.TransformPointY(0, 0); var x2 = this.TransformPointX(1, 1); var y2 = this.TransformPointY(1, 1); return Math.sqrt(((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1))/2); }, exportToObject : function() { return { "SX": this.sx, "SHX": this.shx, "SHY": this.shy, "SY": this.sy, "TX": this.tx, "TY": this.ty }; } }; function GradientGetAngleNoRotate(_angle, _transform) { var x1 = 0.0; var y1 = 0.0; var x2 = 1.0; var y2 = 0.0; var _matrixRotate = new CMatrix(); _matrixRotate.Rotate(-_angle / 60000); var _x11 = _matrixRotate.TransformPointX(x1, y1); var _y11 = _matrixRotate.TransformPointY(x1, y1); var _x22 = _matrixRotate.TransformPointX(x2, y2); var _y22 = _matrixRotate.TransformPointY(x2, y2); _matrixRotate = global_MatrixTransformer.Invert(_transform); var _x1 = _matrixRotate.TransformPointX(_x11, _y11); var _y1 = _matrixRotate.TransformPointY(_x11, _y11); var _x2 = _matrixRotate.TransformPointX(_x22, _y22); var _y2 = _matrixRotate.TransformPointY(_x22, _y22); var _y = _y2 - _y1; var _x = _x2 - _x1; var a = 0; if (Math.abs(_y) < 0.001) { if (_x > 0) a = 0; else a = 180; } else if (Math.abs(_x) < 0.001) { if (_y > 0) a = 90; else a = 270; } else { a = Math.atan2(_y, _x); a = AscCommon.rad2deg(a); } if (a < 0) a += 360; //console.log(a); return a * 60000; }; 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 CMatrix(); 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.Reflect = function (matrix, isHorizontal, isVertical) { var m = new CMatrix(); m.shx = 0; m.sy = 1; m.tx = 0; m.ty = 0; m.sx = 1; m.shy = 0; if (isHorizontal && isVertical) { m.sx = -1; m.sy = -1; } else if (isHorizontal) { m.sx = -1; } else if (isVertical) { m.sy = -1; } else { return; } this.MultiplyAppend(matrix, m); } this.CreateDublicateM = function(matrix) { let m = new CMatrix(); m.CopyFrom(matrix); return m; } this.IsIdentity = function(m) { if (m.sx == 1.0 && m.shx == 0.0 && m.shy == 0.0 && m.sy == 1.0 && m.tx == 0.0 && m.ty == 0.0) { return true; } return false; } this.IsIdentity2 = function(m) { var eps = 0.00001; if (Math.abs(m.sx - 1.0) < eps && Math.abs(m.shx) < eps && Math.abs(m.shy) < eps && Math.abs(m.sy - 1.0) < eps) { return true; } return false; } } 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; } function CTableMarkup(Table) { this.Internal = { RowIndex : 0, CellIndex : 0, PageNum : 0 }; this.Table = Table; this.X = 0; // Смещение таблицы от начала страницы до первой колонки this.Cols = []; // массив ширин колонок this.Margins = []; // массив левых и правых маргинов this.Rows = []; // массив позиций, высот строк(для данной страницы) // Rows = [ { Y : , H : }, ... ] this.CurCol = 0; // текущая колонка this.CurRow = 0; // текущая строка this.TransformX = 0; this.TransformY = 0; } CTableMarkup.prototype = { CreateDublicate : function() { var obj = new CTableMarkup(this.Table); obj.Internal = {RowIndex : this.Internal.RowIndex, CellIndex : this.Internal.CellIndex, PageNum : this.Internal.PageNum}; obj.X = this.X; var len = this.Cols.length; for (var i = 0; i < len; i++) obj.Cols[i] = this.Cols[i]; len = this.Margins.length; for (var i = 0; i < len; i++) obj.Margins[i] = {Left : this.Margins[i].Left, Right : this.Margins[i].Right}; len = this.Rows.length; for (var i = 0; i < len; i++) obj.Rows[i] = {Y : this.Rows[i].Y, H : this.Rows[i].H}; obj.CurRow = this.CurRow; obj.CurCol = this.CurCol; return obj; }, CorrectFrom : function() { this.X += this.TransformX; var _len = this.Rows.length; for (var i = 0; i < _len; i++) { this.Rows[i].Y += this.TransformY; } }, CorrectTo : function() { this.X -= this.TransformX; var _len = this.Rows.length; for (var i = 0; i < _len; i++) { this.Rows[i].Y -= this.TransformY; } }, Get_X : function() { return this.X; }, Get_Y : function() { var _Y = 0; if (this.Rows.length > 0) { _Y = this.Rows[0].Y; } return _Y; } }; function CTableOutline(Table, PageNum, X, Y, W, H) { this.Table = Table; this.PageNum = PageNum; this.X = X; this.Y = Y; this.W = W; this.H = H; } var g_fontManager = new AscFonts.CFontManager(); g_fontManager.Initialize(true); g_fontManager.SetHintsProps(true, true); var g_dDpiX = 96.0; var g_dDpiY = 96.0; var g_dKoef_mm_to_pix = g_dDpiX / 25.4; var g_dKoef_pix_to_mm = 25.4 / g_dDpiX; function _rect() { this.x = 0; this.y = 0; this.w = 0; this.h = 0; } //--------------------------------------------------------export---------------------------------------------------- window['AscCommon'] = window['AscCommon'] || {}; window['AscCommon'].CGrRFonts = CGrRFonts; window['AscCommon'].CFontSetup = CFontSetup; window['AscCommon'].CGrState = CGrState; window['AscCommon'].CMemory = CMemory; window['AscCommon'].CMetafile = CMetafile; window['AscCommon'].CDocumentRenderer = CDocumentRenderer; window['AscCommon'].MATRIX_ORDER_PREPEND = MATRIX_ORDER_PREPEND; window['AscCommon'].MATRIX_ORDER_APPEND = MATRIX_ORDER_APPEND; window['AscCommon'].CMatrix = CMatrix; window['AscCommon'].CGlobalMatrixTransformer = CGlobalMatrixTransformer; window['AscCommon'].CClipManager = CClipManager; window['AscCommon'].CPen = CPen; window['AscCommon'].CBrush = CBrush; window['AscCommon'].CTableMarkup = CTableMarkup; window['AscCommon'].CTableOutline = CTableOutline; window['AscCommon']._rect = _rect; window['AscCommon'].global_MatrixTransformer = new CGlobalMatrixTransformer(); window['AscCommon'].g_fontManager = g_fontManager; window['AscCommon'].g_dDpiX = g_dDpiX; window['AscCommon'].g_dKoef_mm_to_pix = g_dKoef_mm_to_pix; window['AscCommon'].g_dKoef_pix_to_mm = g_dKoef_pix_to_mm; window['AscCommon'].GradientGetAngleNoRotate = GradientGetAngleNoRotate; window['AscCommon'].DashPatternPresets = DashPatternPresets; window['AscCommon'].CommandType = CommandType; })(window);