Files
DocumentServer-v-9.2.0/sdkjs/word/Drawing/Graphics.js
Yajbir Singh f1b860b25c
Some checks failed
check / markdownlint (push) Has been cancelled
check / spellchecker (push) Has been cancelled
updated
2025-12-11 19:03:17 +05:30

3022 lines
74 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* (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;
var locktype_None = AscCommon.c_oAscLockTypes.kLockTypeNone;
var locktype_Mine = AscCommon.c_oAscLockTypes.kLockTypeMine;
var locktype_Other = AscCommon.c_oAscLockTypes.kLockTypeOther;
var locktype_Other2 = AscCommon.c_oAscLockTypes.kLockTypeOther2;
var AscBrowser = AscCommon.AscBrowser;
var global_MatrixTransformer = AscCommon.global_MatrixTransformer;
/**
* Special class to handle single line text
* @param text
* @param fontName
* @param fontSize
* @constructor
*/
function TextLine(text, fontName, fontSize)
{
let dc = null;
AscCommon.ExecuteNoHistory(function()
{
dc = new AscWord.CDocumentContent();
dc.ClearContent(false);
let p = new AscWord.Paragraph();
let run = new AscWord.Run();
run.AddText(text);
p.AddToContentToEnd(run);
dc.PushToContent(p);
let textPr = new AscWord.CTextPr();
textPr.RFonts.SetAll(fontName);
textPr.FontSize = fontSize;
textPr.FontSizeCS = fontSize;
textPr.Color = new AscWord.CDocumentColor(68, 68, 68);
run.SetPr(textPr);
let paraPr = new AscWord.CParaPr();
paraPr.Spacing.After = 0;
paraPr.Spacing.Before = 0;
paraPr.Spacing.Line = 1;
paraPr.Spacing.Line = Asc.linerule_Auto;
p.SetPr(paraPr);
});
this.dc = dc;
this.fontSize = fontSize;
}
/**
* @returns {{w:number, h:number, ascent: number, descent: number}}
*/
TextLine.prototype.getSize = function()
{
this.dc.Reset(0, 0, AscWord.MAX_MM_VALUE, AscWord.MAX_MM_VALUE);
this.dc.Recalculate_Page(0, true, false);
let p = this.dc.GetElement(0);
let bounds = this.dc.GetContentBounds(0);
let lineMetrics = p.getLineMetrics(0);
return {
w : p.GetAutoWidthForDropCap(),
h : bounds.Bottom - bounds.Top,
ascent : lineMetrics.TextAscent2,
descent : lineMetrics.TextDescent,
};
};
TextLine.prototype.draw = function(graphics, x, y)
{
let showParaMarks = false;
if (Asc.editor && Asc.editor.ShowParaMarks)
{
Asc.editor.ShowParaMarks = false;
showParaMarks = true;
}
this.dc.Reset(x, y, AscWord.MAX_MM_VALUE, AscWord.MAX_MM_VALUE);
this.dc.Recalculate_Page(0, true, false);
this.dc.Draw(0, graphics);
if (showParaMarks)
Asc.editor.ShowParaMarks = true;
};
function CGraphics()
{
AscCommon.CGraphicsBase.call(this, AscCommon.RendererType.Drawer, true);
this.m_oContext = null;
this.m_dWidthMM = 0;
this.m_dHeightMM = 0;
this.m_lWidthPix = 0;
this.m_lHeightPix = 0;
this.m_dDpiX = 96.0;
this.m_dDpiY = 96.0;
this.m_bIsBreak = false;
this.m_oPen = new AscCommon.CPen();
this.m_bPenColorInit = false;
this.m_oBrush = new AscCommon.CBrush();
this.m_bBrushColorInit = false;
this.isDisableStrokeFillOptimization = false;
this.m_oFontManager = null;
this.m_oCoordTransform = new AscCommon.CMatrix();
this.m_oTransform = new AscCommon.CMatrix();
this.m_oFullTransform = new AscCommon.CMatrix();
this.m_oInvertFullTransform = new AscCommon.CMatrix();
this.m_oBaseTransform = null;
this.m_oCurFont =
{
Name : "",
FontSize : 10,
Bold : false,
Italic : false
};
// RFonts
this.m_oTextPr = null;
this.m_oGrFonts = new AscCommon.CGrRFonts();
this.m_oLastFont = new AscCommon.CFontSetup();
this.LastFontOriginInfo = { Name : "", Replace : null };
this.m_bIntegerGrid = true;
this.TextureFillTransformScaleX = 1;
this.TextureFillTransformScaleY = 1;
this.IsThumbnail = false;
this.TextClipRect = null;
this.IsClipContext = false;
this.IsUseFonts2 = false;
this.m_oFontManager2 = null;
this.m_oLastFont2 = null;
this.dash_no_smart = null;
}
CGraphics.prototype = Object.create(AscCommon.CGraphicsBase.prototype);
CGraphics.prototype.constructor = CGraphics;
CGraphics.prototype.init = function(context,width_px,height_px,width_mm,height_mm)
{
this.m_oContext = context;
this.m_lHeightPix = height_px >> 0;
this.m_lWidthPix = width_px >> 0;
this.m_dWidthMM = width_mm;
this.m_dHeightMM = height_mm;
this.m_dDpiX = 25.4 * this.m_lWidthPix / this.m_dWidthMM;
this.m_dDpiY = 25.4 * this.m_lHeightPix / this.m_dHeightMM;
this.m_oCoordTransform.sx = this.m_dDpiX / 25.4;
this.m_oCoordTransform.sy = this.m_dDpiY / 25.4;
this.TextureFillTransformScaleX = 1 / this.m_oCoordTransform.sx;
this.TextureFillTransformScaleY = 1 / this.m_oCoordTransform.sy;
/*
if (this.IsThumbnail)
{
this.TextureFillTransformScaleX *= (width_px / (width_mm * g_dKoef_mm_to_pix));
this.TextureFillTransformScaleY *= (height_px / (height_mm * g_dKoef_mm_to_pix))
}
*/
/*
if (true == this.m_oContext.mozImageSmoothingEnabled)
this.m_oContext.mozImageSmoothingEnabled = false;
*/
this.m_oLastFont.Clear();
this.m_oContext.save();
this.m_bPenColorInit = false;
this.m_bBrushColorInit = false;
};
CGraphics.prototype.isSupportEditFeatures = function()
{
return true;
};
CGraphics.prototype.put_GlobalAlpha = function(enable, alpha)
{
if (false === enable)
{
this.globalAlpha = 1;
this.m_oContext.globalAlpha = 1;
}
else
{
this.globalAlpha = alpha;
this.m_oContext.globalAlpha = alpha;
}
};
CGraphics.prototype.Start_GlobalAlpha = function()
{
};
CGraphics.prototype.End_GlobalAlpha = function()
{
if (false === this.m_bIntegerGrid)
{
this.m_oContext.setTransform(1,0,0,1,0,0);
}
var oldDarkMode = this.isDarkMode;
this.isDarkMode = false;
if (!this.endGlobalAlphaColor)
this.b_color1(255, 255, 255, 140);
else
this.b_color1(this.endGlobalAlphaColor.R, this.endGlobalAlphaColor.G, this.endGlobalAlphaColor.B, 140);
this.isDarkMode = oldDarkMode;
this.m_oContext.fillRect(0, 0, this.m_lWidthPix, this.m_lHeightPix);
this.m_oContext.beginPath();
if (false === this.m_bIntegerGrid)
{
this.m_oContext.setTransform(this.m_oFullTransform.sx,this.m_oFullTransform.shy,this.m_oFullTransform.shx,
this.m_oFullTransform.sy,this.m_oFullTransform.tx,this.m_oFullTransform.ty);
}
};
// pen methods
CGraphics.prototype.p_color = function(r,g,b,a)
{
var _c = this.m_oPen.Color;
if (this.m_bPenColorInit && _c.R === r && _c.G === g && _c.B === b && _c.A === a)
return;
if (!this.isDisableStrokeFillOptimization)
this.m_bPenColorInit = true;
_c.R = r;
_c.G = g;
_c.B = b;
_c.A = a;
this.m_oContext.strokeStyle = "rgba(" + _c.R + "," + _c.G + "," + _c.B + "," + (_c.A / 255) + ")";
};
CGraphics.prototype.p_width = function(w)
{
this.m_oPen.LineWidth = w / 1000;
if (!this.m_bIntegerGrid)
{
if (0 != this.m_oPen.LineWidth)
{
this.m_oContext.lineWidth = this.m_oPen.LineWidth;
}
else
{
var _x1 = this.m_oFullTransform.TransformPointX(0, 0);
var _y1 = this.m_oFullTransform.TransformPointY(0, 0);
var _x2 = this.m_oFullTransform.TransformPointX(1, 1);
var _y2 = this.m_oFullTransform.TransformPointY(1, 1);
var _koef = Math.sqrt(((_x2 - _x1)*(_x2 - _x1) + (_y2 - _y1)*(_y2 - _y1)) / 2);
this.m_oContext.lineWidth = 1 / _koef;
}
}
else
{
if (0 != this.m_oPen.LineWidth)
{
var _m = this.m_oFullTransform;
var x = _m.sx + _m.shx;
var y = _m.sy + _m.shy;
var koef = Math.sqrt((x * x + y * y) / 2);
this.m_oContext.lineWidth = this.m_oPen.LineWidth * koef;
}
else
{
this.m_oContext.lineWidth = 1;
}
}
};
CGraphics.prototype.p_dash = function(params)
{
if (!this.m_oContext.setLineDash)
return;
this.dash_no_smart = params ? params.slice() : null;
this.m_oContext.setLineDash(params ? params : []);
};
// brush methods
CGraphics.prototype.b_color1 = function(r,g,b,a)
{
var _c = this.m_oBrush.Color1;
if (this.m_bBrushColorInit && _c.R === r && _c.G === g && _c.B === b && _c.A === a)
return;
if (!this.isDisableStrokeFillOptimization)
this.m_bBrushColorInit = true;
_c.R = r;
_c.G = g;
_c.B = b;
_c.A = a;
this.m_oContext.fillStyle = "rgba(" + _c.R + "," + _c.G + "," + _c.B + "," + (_c.A / 255) + ")";
};
CGraphics.prototype.b_color2 = function(r,g,b,a)
{
var _c = this.m_oBrush.Color2;
_c.R = r;
_c.G = g;
_c.B = b;
_c.A = a;
};
// TRANSFORMS
CGraphics.prototype.SetBaseTransform = function(m)
{
this.ResetBaseTransform();
this.m_oBaseTransform = new AscCommon.CMatrix();
this.m_oBaseTransform.CopyFrom(m);
this.m_oTransform.Multiply(this.m_oBaseTransform, AscCommon.MATRIX_ORDER_APPEND);
};
CGraphics.prototype.ResetBaseTransform = function()
{
if (this.m_oBaseTransform)
{
let m = new AscCommon.CMatrix();
m.CopyFrom(this.m_oBaseTransform);
m.Invert();
this.m_oTransform.Multiply(m, AscCommon.MATRIX_ORDER_APPEND);
}
this.m_oBaseTransform = null;
};
CGraphics.prototype.reset = function()
{
this.m_oTransform.Reset();
if (this.m_oBaseTransform)
this.m_oTransform.Multiply(this.m_oBaseTransform, AscCommon.MATRIX_ORDER_APPEND);
this.CalculateFullTransform(false);
if (!this.m_bIntegerGrid)
this.m_oContext.setTransform(this.m_oCoordTransform.sx,0,0,this.m_oCoordTransform.sy,0, 0);
};
CGraphics.prototype.transform = function(sx,shy,shx,sy,tx,ty)
{
this.m_oTransform.SetValues(sx,shy,shx,sy,tx,ty);
if (this.m_oBaseTransform)
this.m_oTransform.Multiply(this.m_oBaseTransform, AscCommon.MATRIX_ORDER_APPEND);
this.CalculateFullTransform();
if (false === this.m_bIntegerGrid)
{
let m = this.m_oFullTransform;
this.m_oContext.setTransform(m.sx,m.shy,m.shx,m.sy,m.tx,m.ty);
}
// TODO: remove this code
if (null != this.m_oFontManager)
this.m_oFontManager.SetTextMatrix(sx,shy,shx,sy,tx,ty);
};
CGraphics.prototype.transform3 = function(m, isNeedInvert)
{
this.m_oTransform.CopyFrom(m);
if (this.m_oBaseTransform)
this.m_oTransform.Multiply(this.m_oBaseTransform, AscCommon.MATRIX_ORDER_APPEND);
this.CalculateFullTransform(isNeedInvert);
if (false === this.m_bIntegerGrid)
{
let m = this.m_oFullTransform;
this.m_oContext.setTransform(m.sx,m.shy,m.shx,m.sy,m.tx,m.ty);
}
else
{
this.SetIntegerGrid(false);
}
};
CGraphics.prototype.CalculateFullTransform = function(isInvertNeed)
{
this.m_oCoordTransform.CopyTo(this.m_oFullTransform);
this.m_oFullTransform.Multiply(this.m_oTransform, AscCommon.MATRIX_ORDER_PREPEND);
this.m_oFullTransform.CopyTo(this.m_oInvertFullTransform);
if (false !== isInvertNeed)
global_MatrixTransformer.MultiplyAppendInvert(this.m_oInvertFullTransform, this.m_oTransform);
};
// path commands
CGraphics.prototype._s = function()
{
this.m_oContext.beginPath();
};
CGraphics.prototype._e = function()
{
this.m_oContext.beginPath();
};
CGraphics.prototype._z = function()
{
this.m_oContext.closePath();
};
CGraphics.prototype._m = function(x,y)
{
if (false === this.m_bIntegerGrid)
{
this.m_oContext.moveTo(x,y);
}
else
{
var _x = (this.m_oFullTransform.TransformPointX(x,y)) >> 0;
var _y = (this.m_oFullTransform.TransformPointY(x,y)) >> 0;
this.m_oContext.moveTo(_x + 0.5,_y + 0.5);
}
};
CGraphics.prototype._l = function(x,y)
{
if (false === this.m_bIntegerGrid)
{
this.m_oContext.lineTo(x,y);
}
else
{
var _x = (this.m_oFullTransform.TransformPointX(x,y)) >> 0;
var _y = (this.m_oFullTransform.TransformPointY(x,y)) >> 0;
this.m_oContext.lineTo(_x + 0.5,_y + 0.5);
}
};
CGraphics.prototype._c = function(x1,y1,x2,y2,x3,y3)
{
if (false === this.m_bIntegerGrid)
{
this.m_oContext.bezierCurveTo(x1,y1,x2,y2,x3,y3);
}
else
{
var _x1 = (this.m_oFullTransform.TransformPointX(x1,y1)) >> 0;
var _y1 = (this.m_oFullTransform.TransformPointY(x1,y1)) >> 0;
var _x2 = (this.m_oFullTransform.TransformPointX(x2,y2)) >> 0;
var _y2 = (this.m_oFullTransform.TransformPointY(x2,y2)) >> 0;
var _x3 = (this.m_oFullTransform.TransformPointX(x3,y3)) >> 0;
var _y3 = (this.m_oFullTransform.TransformPointY(x3,y3)) >> 0;
this.m_oContext.bezierCurveTo(_x1 + 0.5,_y1 + 0.5,_x2 + 0.5,_y2 + 0.5,_x3 + 0.5,_y3 + 0.5);
}
};
CGraphics.prototype._c2 = function(x1,y1,x2,y2)
{
if (false === this.m_bIntegerGrid)
{
this.m_oContext.quadraticCurveTo(x1,y1,x2,y2);
}
else
{
var _x1 = (this.m_oFullTransform.TransformPointX(x1,y1)) >> 0;
var _y1 = (this.m_oFullTransform.TransformPointY(x1,y1)) >> 0;
var _x2 = (this.m_oFullTransform.TransformPointX(x2,y2)) >> 0;
var _y2 = (this.m_oFullTransform.TransformPointY(x2,y2)) >> 0;
this.m_oContext.quadraticCurveTo(_x1 + 0.5,_y1 + 0.5,_x2 + 0.5,_y2 + 0.5);
}
};
CGraphics.prototype.ds = function()
{
this.m_oContext.stroke();
};
CGraphics.prototype.df = function()
{
this.m_oContext.fill();
};
// canvas state
CGraphics.prototype.save = function()
{
this.m_oContext.save();
};
CGraphics.prototype.restore = function()
{
this.m_oContext.restore();
this.m_bPenColorInit = false;
this.m_bBrushColorInit = false;
};
CGraphics.prototype.clip = function()
{
this.m_oContext.clip();
};
CGraphics.prototype.FreeFont = function()
{
// это чтобы не сбросился кэш при отрисовке следующего шейпа
this.m_oFontManager.m_pFont = null;
};
CGraphics.prototype.ClearLastFont = function()
{
this.m_oLastFont = new AscCommon.CFontSetup();
this.m_oLastFont2 = null;
};
// images
CGraphics.prototype.checkLoadingImage = function(img)
{
return (img.Status === AscFonts.ImageLoadStatus.Loading);
};
CGraphics.prototype.drawImage2 = function(img,x,y,w,h,alpha,srcRect)
{
if (srcRect)
{
// test on need draw:
if (srcRect.l >= 100 || srcRect.t >= 100)
return;
if (srcRect.r <= 0 || srcRect.b <= 0)
return;
}
var isA = (undefined !== alpha && null != alpha && 255 != alpha);
var _oldGA = 0;
if (isA)
{
_oldGA = this.m_oContext.globalAlpha;
this.m_oContext.globalAlpha = alpha / 255;
}
if (false === this.m_bIntegerGrid)
{
if (!srcRect)
{
// тут нужно проверить, можно ли нарисовать точно. т.е. может картинка ровно такая, какая нужна.
if (!global_MatrixTransformer.IsIdentity2(this.m_oTransform) ||
this.isVectorImage(img))
{
this.m_oContext.drawImage(img,x,y,w,h);
}
else
{
var xx = this.m_oFullTransform.TransformPointX(x, y);
var yy = this.m_oFullTransform.TransformPointY(x, y);
var rr = this.m_oFullTransform.TransformPointX(x + w, y + h);
var bb = this.m_oFullTransform.TransformPointY(x + w, y + h);
var ww = rr - xx;
var hh = bb - yy;
if (Math.abs(img.width - ww) < 2 && Math.abs(img.height - hh) < 2)
{
// рисуем точно
this.m_oContext.setTransform(1, 0, 0, 1, 0, 0);
this.m_oContext.drawImage(img, xx >> 0, yy >> 0);
var _ft = this.m_oFullTransform;
this.m_oContext.setTransform(_ft.sx,_ft.shy,_ft.shx,_ft.sy,_ft.tx,_ft.ty);
}
else
{
this.m_oContext.drawImage(img,x,y,w,h);
}
}
}
else
{
var _w = img.width;
var _h = img.height;
if (_w > 0 && _h > 0)
{
var _sx = 0;
var _sy = 0;
var _sr = _w;
var _sb = _h;
var _l = srcRect.l;
var _t = srcRect.t;
var _r = 100 - srcRect.r;
var _b = 100 - srcRect.b;
_sx += _l * _w / 100;
_sr -= _r * _w / 100;
_sy += _t * _h / 100;
_sb -= _b * _h / 100;
var naturalW = _w;
naturalW -= _sx;
naturalW += (_sr - _w);
var naturalH = _h;
naturalH -= _sy;
naturalH += (_sb - _h);
var tmpW = w;
var tmpH = h;
if (_sx < 0)
{
x += (-_sx * tmpW / naturalW);
w -= (-_sx * tmpW / naturalW);
_sx = 0;
}
if (_sy < 0)
{
y += (-_sy * tmpH / naturalH);
h -= (-_sy * tmpH / naturalH);
_sy = 0;
}
if (_sr > _w)
{
w -= ((_sr - _w) * tmpW / naturalW);
_sr = _w;
}
if (_sb > _h)
{
h -= ((_sb - _h) * tmpH / naturalH);
_sb = _h;
}
if (_sx >= _sr || _sx >= _w || _sr <= 0 || w <= 0)
return;
if (_sy >= _sb || _sy >= _h || _sb <= 0 || h <= 0)
return;
this.m_oContext.drawImage(img, _sx, _sy, _sr - _sx, _sb - _sy, x, y, w, h);
}
else
{
this.m_oContext.drawImage(img,x,y,w,h);
}
}
}
else
{
var _x1 = (this.m_oFullTransform.TransformPointX(x,y)) >> 0;
var _y1 = (this.m_oFullTransform.TransformPointY(x,y)) >> 0;
var _x2 = (this.m_oFullTransform.TransformPointX(x+w,y+h)) >> 0;
var _y2 = (this.m_oFullTransform.TransformPointY(x+w,y+h)) >> 0;
x = _x1;
y = _y1;
w = _x2 - _x1;
h = _y2 - _y1;
if (!srcRect)
{
// тут нужно проверить, можно ли нарисовать точно. т.е. может картинка ровно такая, какая нужна.
if (!global_MatrixTransformer.IsIdentity2(this.m_oTransform) ||
this.isVectorImage(img))
{
this.m_oContext.drawImage(img,_x1,_y1,w,h);
}
else
{
if (Math.abs(img.width - w) < 2 && Math.abs(img.height - h) < 2)
{
// рисуем точно
this.m_oContext.drawImage(img, x, y);
}
else
{
this.m_oContext.drawImage(img,_x1,_y1,w,h);
}
}
}
else
{
var _w = img.width;
var _h = img.height;
if (_w > 0 && _h > 0)
{
var __w = w;
var __h = h;
var _delW = Math.max(0, -srcRect.l) + Math.max(0, srcRect.r - 100) + 100;
var _delH = Math.max(0, -srcRect.t) + Math.max(0, srcRect.b - 100) + 100;
var _sx = 0;
if (srcRect.l > 0 && srcRect.l < 100)
_sx = Math.min((_w * srcRect.l / 100) >> 0, _w - 1);
else if (srcRect.l < 0)
{
var _off = ((-srcRect.l / _delW) * __w);
x += _off;
w -= _off;
}
var _sy = 0;
if (srcRect.t > 0 && srcRect.t < 100)
_sy = Math.min((_h * srcRect.t / 100) >> 0, _h - 1);
else if (srcRect.t < 0)
{
var _off = ((-srcRect.t / _delH) * __h);
y += _off;
h -= _off;
}
var _sr = _w;
if (srcRect.r > 0 && srcRect.r < 100)
_sr = Math.max(Math.min((_w * srcRect.r / 100) >> 0, _w - 1), _sx);
else if (srcRect.r > 100)
{
var _off = ((srcRect.r - 100) / _delW) * __w;
w -= _off;
}
var _sb = _h;
if (srcRect.b > 0 && srcRect.b < 100)
_sb = Math.max(Math.min((_h * srcRect.b / 100) >> 0, _h - 1), _sy);
else if (srcRect.b > 100)
{
var _off = ((srcRect.b - 100) / _delH) * __h;
h -= _off;
}
if ((_sr-_sx) > 0 && (_sb-_sy) > 0 && w > 0 && h > 0)
this.m_oContext.drawImage(img,_sx,_sy,_sr-_sx,_sb-_sy,x,y,w,h);
}
else
{
this.m_oContext.drawImage(img,x,y,w,h);
}
}
}
if (isA)
{
this.m_oContext.globalAlpha = _oldGA;
}
};
CGraphics.prototype.drawImage = function(img,x,y,w,h,alpha,srcRect,nativeImage)
{
if (nativeImage)
{
this.drawImage2(nativeImage,x,y,w,h,alpha,srcRect);
return;
}
var _img = Asc.editor.ImageLoader.map_image_index[img];
if (_img && this.checkLoadingImage(_img))
{
// TODO: IMAGE_LOADING
}
else if (_img != undefined && _img.Image != null)
{
this.drawImage2(_img.Image,x,y,w,h,alpha,srcRect);
}
else
{
var _x = x;
var _y = y;
var _r = x+w;
var _b = y+h;
var ctx = this.m_oContext;
var old_p = ctx.lineWidth;
var bIsNoIntGrid = false;
if (this.m_bIntegerGrid)
{
_x = (this.m_oFullTransform.TransformPointX(x,y) >> 0) + 0.5;
_y = (this.m_oFullTransform.TransformPointY(x,y) >> 0) + 0.5;
_r = (this.m_oFullTransform.TransformPointX(x+w,y+h) >> 0) + 0.5;
_b = (this.m_oFullTransform.TransformPointY(x+w,y+h) >> 0) + 0.5;
ctx.lineWidth = 1;
}
else
{
if (global_MatrixTransformer.IsIdentity2(this.m_oTransform))
{
bIsNoIntGrid = true;
this.SetIntegerGrid(true);
_x = (this.m_oFullTransform.TransformPointX(x,y) >> 0) + 0.5;
_y = (this.m_oFullTransform.TransformPointY(x,y) >> 0) + 0.5;
_r = (this.m_oFullTransform.TransformPointX(x+w,y+h) >> 0) + 0.5;
_b = (this.m_oFullTransform.TransformPointY(x+w,y+h) >> 0) + 0.5;
ctx.lineWidth = 1;
}
else
{
ctx.lineWidth = 1 / this.m_oCoordTransform.sx;
}
}
//ctx.strokeStyle = "#FF0000";
ctx.strokeStyle = "#F98C76";
ctx.beginPath();
ctx.moveTo(_x,_y);
ctx.lineTo(_r,_b);
ctx.moveTo(_r,_y);
ctx.lineTo(_x,_b);
ctx.stroke();
ctx.beginPath();
ctx.moveTo(_x,_y);
ctx.lineTo(_r,_y);
ctx.lineTo(_r,_b);
ctx.lineTo(_x,_b);
ctx.closePath();
ctx.stroke();
ctx.beginPath();
if (bIsNoIntGrid)
this.SetIntegerGrid(false);
ctx.lineWidth = old_p;
ctx.strokeStyle = "rgba(" + this.m_oPen.Color.R + "," + this.m_oPen.Color.G + "," +
this.m_oPen.Color.B + "," + (this.m_oPen.Color.A / 255) + ")";
}
};
CGraphics.prototype.drawBlipFillTile = function (transform, imageUrl, alpha, scaleX, scaleY, offsetX, offsetY, flipH, flipV) {
const ctx = this.m_oContext;
if (!ctx) return;
ctx.save();
if (transform) {
ctx.transform(
transform.sx,
transform.shy,
transform.shx,
transform.sy,
transform.tx,
transform.ty
);
}
const imageData = Asc.editor.ImageLoader.map_image_index[imageUrl];
if (!imageData || this.checkLoadingImage(imageData)) return;
const image = imageData.Image;
if (!image) return;
// Translation (offsets)
ctx.translate(offsetX, offsetY);
// Scaling (local)
ctx.scale(scaleX, scaleY);
// Mirroring
function createVerticalFlipPattern(sourceCanvas, width, height) {
const newCanvas = document.createElement('canvas');
newCanvas.width = width;
newCanvas.height = height * 2;
const newCtx = newCanvas.getContext('2d');
newCtx.drawImage(sourceCanvas, 0, 0, width, height);
newCtx.scale(1, -1);
newCtx.drawImage(sourceCanvas, 0, -height * 2, width, height);
return newCanvas;
}
function createHorizontalFlipPattern(sourceCanvas, width, height) {
const newCanvas = document.createElement('canvas');
newCanvas.width = width * 2;
newCanvas.height = height;
const newCtx = newCanvas.getContext('2d');
newCtx.drawImage(sourceCanvas, 0, 0, width, height);
newCtx.scale(-1, 1);
newCtx.drawImage(sourceCanvas, -width * 2, 0, width, height);
return newCanvas;
}
let patternSource = image;
if (flipH || flipV) {
const tempCanvas = document.createElement('canvas');
tempCanvas.width = image.width;
tempCanvas.height = image.height;
const tempCtx = tempCanvas.getContext('2d');
tempCtx.drawImage(image, 0, 0);
patternSource = tempCanvas;
}
if (flipV) {
patternSource = createVerticalFlipPattern(patternSource, patternSource.width, patternSource.height);
}
if (flipH) {
patternSource = createHorizontalFlipPattern(patternSource, patternSource.width, patternSource.height);
}
// Transparency
if (AscFormat.isRealNumber(alpha) && alpha >= 0 && alpha <= 1) {
ctx.globalAlpha = alpha;
}
const pattern = ctx.createPattern(patternSource, 'repeat');
ctx.fillStyle = pattern;
ctx.fill();
ctx.restore();
};
CGraphics.prototype.drawBlipFillStretch = function (transform, imageUrl, alpha, x, y, w, h, srcRect, canvas) {
const ctx = this.m_oContext;
if (!ctx) return;
ctx.save();
if (transform) {
ctx.transform(
transform.sx,
transform.shy,
transform.shx,
transform.sy,
transform.tx,
transform.ty
);
}
this.drawImage(
imageUrl,
x, y, w, h,
alpha * 255,
srcRect,
canvas
);
ctx.restore();
}
// text
CGraphics.prototype.GetFont = function()
{
return this.m_oCurFont;
};
CGraphics.prototype.font = function(font_id,font_size)
{
AscFonts.g_font_infos[AscFonts.g_map_font_index[font_id]].LoadFont(Asc.editor.FontLoader, this.IsUseFonts2 ? this.m_oFontManager2 : this.m_oFontManager,
Math.max(font_size, 1), 0, this.m_dDpiX, this.m_dDpiY, this.m_oTransform);
};
CGraphics.prototype.SetFont = function(font)
{
if (null == font)
return;
this.m_oCurFont.Name = font.FontFamily.Name;
this.m_oCurFont.FontSize = font.FontSize;
this.m_oCurFont.Bold = font.Bold;
this.m_oCurFont.Italic = font.Italic;
var bItalic = true === font.Italic;
var bBold = true === font.Bold;
var oFontStyle = AscFonts.FontStyle.FontStyleRegular;
if ( !bItalic && bBold )
oFontStyle = AscFonts.FontStyle.FontStyleBold;
else if ( bItalic && !bBold )
oFontStyle = AscFonts.FontStyle.FontStyleItalic;
else if ( bItalic && bBold )
oFontStyle = AscFonts.FontStyle.FontStyleBoldItalic;
var _last_font = this.IsUseFonts2 ? this.m_oLastFont2 : this.m_oLastFont;
var _font_manager = this.IsUseFonts2 ? this.m_oFontManager2 : this.m_oFontManager;
_last_font.SetUpName = font.FontFamily.Name;
_last_font.SetUpSize = font.FontSize;
_last_font.SetUpStyle = oFontStyle;
g_fontApplication.LoadFont(_last_font.SetUpName, AscCommon.g_font_loader, _font_manager, font.FontSize, oFontStyle, this.m_dDpiX, this.m_dDpiY, this.m_oTransform, this.LastFontOriginInfo);
var _mD = _last_font.SetUpMatrix;
var _mS = this.m_oTransform;
_mD.sx = _mS.sx;
_mD.sy = _mS.sy;
_mD.shx = _mS.shx;
_mD.shy = _mS.shy;
_mD.tx = _mS.tx;
_mD.ty = _mS.ty;
//_font_manager.SetTextMatrix(this.m_oTransform.sx,this.m_oTransform.shy,this.m_oTransform.shx,
// this.m_oTransform.sy,this.m_oTransform.tx,this.m_oTransform.ty);
};
CGraphics.prototype.SetTextPr = function(textPr, theme)
{
if (theme && textPr && textPr.ReplaceThemeFonts)
textPr.ReplaceThemeFonts(theme.themeElements.fontScheme);
this.m_oTextPr = textPr;
if (theme)
this.m_oGrFonts.checkFromTheme(theme.themeElements.fontScheme, this.m_oTextPr.RFonts);
else
this.m_oGrFonts = this.m_oTextPr.RFonts;
};
CGraphics.prototype.GetRFonts = function()
{
return this.m_oGrFonts;
};
CGraphics.prototype.SetFontSlot = function(slot, fontSizeKoef)
{
var _rfonts = this.GetRFonts();
var _lastFont = this.IsUseFonts2 ? this.m_oLastFont2 : this.m_oLastFont;
switch (slot)
{
case fontslot_ASCII:
{
_lastFont.Name = _rfonts.Ascii.Name;
_lastFont.Size = this.m_oTextPr.FontSize;
_lastFont.Bold = this.m_oTextPr.Bold;
_lastFont.Italic = this.m_oTextPr.Italic;
break;
}
case fontslot_CS:
{
_lastFont.Name = _rfonts.CS.Name;
_lastFont.Size = this.m_oTextPr.FontSizeCS;
_lastFont.Bold = this.m_oTextPr.BoldCS;
_lastFont.Italic = this.m_oTextPr.ItalicCS;
break;
}
case fontslot_EastAsia:
{
_lastFont.Name = _rfonts.EastAsia.Name;
_lastFont.Size = this.m_oTextPr.FontSize;
_lastFont.Bold = this.m_oTextPr.Bold;
_lastFont.Italic = this.m_oTextPr.Italic;
break;
}
case fontslot_HAnsi:
default:
{
_lastFont.Name = _rfonts.HAnsi.Name;
_lastFont.Size = this.m_oTextPr.FontSize;
_lastFont.Bold = this.m_oTextPr.Bold;
_lastFont.Italic = this.m_oTextPr.Italic;
break;
}
}
if (undefined !== fontSizeKoef)
_lastFont.Size *= fontSizeKoef;
var _style = 0;
if (_lastFont.Italic)
_style += 2;
if (_lastFont.Bold)
_style += 1;
this.SetFontInternal(_lastFont.Name, _lastFont.Size, _style);
//_font_manager.SetTextMatrix(this.m_oTransform.sx,this.m_oTransform.shy,this.m_oTransform.shx,
// this.m_oTransform.sy,this.m_oTransform.tx,this.m_oTransform.ty);
};
CGraphics.prototype.SetFontInternal = function(name, size, style)
{
var _lastFont = this.IsUseFonts2 ? this.m_oLastFont2 : this.m_oLastFont;
var _font_manager = this.IsUseFonts2 ? this.m_oFontManager2 : this.m_oFontManager;
if (name != _lastFont.SetUpName || size != _lastFont.SetUpSize || style != _lastFont.SetUpStyle || !_font_manager.m_pFont)
{
_lastFont.SetUpName = name;
_lastFont.SetUpSize = size;
_lastFont.SetUpStyle = style;
g_fontApplication.LoadFont(_lastFont.SetUpName, AscCommon.g_font_loader, _font_manager, _lastFont.SetUpSize, _lastFont.SetUpStyle, this.m_dDpiX, this.m_dDpiY, this.m_oTransform, this.LastFontOriginInfo);
var _mD = _lastFont.SetUpMatrix;
var _mS = this.m_oTransform;
_mD.sx = _mS.sx;
_mD.sy = _mS.sy;
_mD.shx = _mS.shx;
_mD.shy = _mS.shy;
_mD.tx = _mS.tx;
_mD.ty = _mS.ty;
}
else
{
var _mD = _lastFont.SetUpMatrix;
var _mS = this.m_oTransform;
if (_mD.sx != _mS.sx || _mD.sy != _mS.sy || _mD.shx != _mS.shx || _mD.shy != _mS.shy || _mD.tx != _mS.tx || _mD.ty != _mS.ty)
{
_mD.sx = _mS.sx;
_mD.sy = _mS.sy;
_mD.shx = _mS.shx;
_mD.shy = _mS.shy;
_mD.tx = _mS.tx;
_mD.ty = _mS.ty;
_font_manager.SetTextMatrix(_mD.sx,_mD.shy,_mD.shx,_mD.sy,_mD.tx,_mD.ty);
}
}
};
CGraphics.prototype.GetTextPr = function()
{
return this.m_oTextPr;
};
CGraphics.prototype.FillText = function(x,y,text)
{
// убыстеренный вариант. здесь везде заточка на то, что приходит одна буква
if (this.m_bIsBreak)
return;
var _x = this.m_oInvertFullTransform.TransformPointX(x,y);
var _y = this.m_oInvertFullTransform.TransformPointY(x,y);
var _font_manager = this.IsUseFonts2 ? this.m_oFontManager2 : this.m_oFontManager;
try
{
var _code = text.charCodeAt(0);
if (null != this.LastFontOriginInfo.Replace)
_code = g_fontApplication.GetReplaceGlyph(_code, this.LastFontOriginInfo.Replace);
_font_manager.LoadString4C(_code,_x,_y);
}
catch(err)
{
}
if (false === this.m_bIntegerGrid)
{
this.m_oContext.setTransform(1,0,0,1,0,0);
}
var pGlyph = _font_manager.m_oGlyphString.m_pGlyphsBuffer[0];
if (null == pGlyph)
return;
if (null != pGlyph.oBitmap)
{
var oldAlpha = undefined;
if (this.textAlpha)
{
oldAlpha = this.m_oContext.globalAlpha;
this.m_oContext.globalAlpha = oldAlpha * this.textAlpha;
}
this.private_FillGlyph(pGlyph);
if (undefined !== oldAlpha)
this.m_oContext.globalAlpha = oldAlpha;
}
if (false === this.m_bIntegerGrid)
{
this.m_oContext.setTransform(this.m_oFullTransform.sx,this.m_oFullTransform.shy,this.m_oFullTransform.shx,
this.m_oFullTransform.sy,this.m_oFullTransform.tx,this.m_oFullTransform.ty);
}
};
CGraphics.prototype.t = function(text,x,y,isBounds)
{
if (this.m_bIsBreak)
return;
var _x = this.m_oInvertFullTransform.TransformPointX(x,y);
var _y = this.m_oInvertFullTransform.TransformPointY(x,y);
var _font_manager = this.IsUseFonts2 ? this.m_oFontManager2 : this.m_oFontManager;
try
{
_font_manager.LoadString2(text,_x,_y);
}
catch(err)
{
}
this.m_oContext.setTransform(1,0,0,1,0,0);
var _bounds = isBounds ? {x:100000, y:100000, r:-100000, b:-100000} : null;
while (true)
{
var pGlyph = _font_manager.GetNextChar2();
if (null == pGlyph)
break;
if (null != pGlyph.oBitmap)
{
this.private_FillGlyph(pGlyph, _bounds);
}
}
if (false === this.m_bIntegerGrid)
{
this.m_oContext.setTransform(this.m_oFullTransform.sx,this.m_oFullTransform.shy,this.m_oFullTransform.shx,
this.m_oFullTransform.sy,this.m_oFullTransform.tx,this.m_oFullTransform.ty);
}
return _bounds;
};
CGraphics.prototype.FillText2 = function(x,y,text,cropX,cropW)
{
// убыстеренный вариант. здесь везде заточка на то, что приходит одна буква
if (this.m_bIsBreak)
return;
var _x = this.m_oInvertFullTransform.TransformPointX(x,y);
var _y = this.m_oInvertFullTransform.TransformPointY(x,y);
var _font_manager = this.IsUseFonts2 ? this.m_oFontManager2 : this.m_oFontManager;
try
{
var _code = text.charCodeAt(0);
if (null != this.LastFontOriginInfo.Replace)
_code = g_fontApplication.GetReplaceGlyph(_code, this.LastFontOriginInfo.Replace);
_font_manager.LoadString4C(_code,_x,_y);
}
catch(err)
{
}
this.m_oContext.setTransform(1,0,0,1,0,0);
var pGlyph = _font_manager.m_oGlyphString.m_pGlyphsBuffer[0];
if (null == pGlyph)
return;
if (null != pGlyph.oBitmap)
{
this.private_FillGlyphC(pGlyph,cropX,cropW);
}
if (false === this.m_bIntegerGrid)
{
this.m_oContext.setTransform(this.m_oFullTransform.sx,this.m_oFullTransform.shy,this.m_oFullTransform.shx,
this.m_oFullTransform.sy,this.m_oFullTransform.tx,this.m_oFullTransform.ty);
}
};
CGraphics.prototype.t2 = function(text,x,y,cropX,cropW)
{
if (this.m_bIsBreak)
return;
var _x = this.m_oInvertFullTransform.TransformPointX(x,y);
var _y = this.m_oInvertFullTransform.TransformPointY(x,y);
var _font_manager = this.IsUseFonts2 ? this.m_oFontManager2 : this.m_oFontManager;
try
{
_font_manager.LoadString2(text,_x,_y);
}
catch(err)
{
}
this.m_oContext.setTransform(1,0,0,1,0,0);
while (true)
{
var pGlyph = _font_manager.GetNextChar2();
if (null == pGlyph)
break;
if (null != pGlyph.oBitmap)
{
this.private_FillGlyphC(pGlyph,cropX,cropW);
}
}
if (false === this.m_bIntegerGrid)
{
this.m_oContext.setTransform(this.m_oFullTransform.sx,this.m_oFullTransform.shy,this.m_oFullTransform.shx,
this.m_oFullTransform.sy,this.m_oFullTransform.tx,this.m_oFullTransform.ty);
}
};
CGraphics.prototype.FillTextCode = function(x,y,lUnicode)
{
// убыстеренный вариант. здесь везде заточка на то, что приходит одна буква
if (this.m_bIsBreak)
return;
var _x = this.m_oInvertFullTransform.TransformPointX(x,y);
var _y = this.m_oInvertFullTransform.TransformPointY(x,y);
var _font_manager = this.IsUseFonts2 ? this.m_oFontManager2 : this.m_oFontManager;
try
{
if (null != this.LastFontOriginInfo.Replace)
lUnicode = g_fontApplication.GetReplaceGlyph(lUnicode, this.LastFontOriginInfo.Replace);
_font_manager.LoadString4C(lUnicode,_x,_y);
}
catch(err)
{
}
if (false === this.m_bIntegerGrid)
{
this.m_oContext.setTransform(1,0,0,1,0,0);
}
var pGlyph = _font_manager.m_oGlyphString.m_pGlyphsBuffer[0];
if (null == pGlyph)
return;
if (null != pGlyph.oBitmap)
{
var oldAlpha = undefined;
if (this.textAlpha)
{
oldAlpha = this.m_oContext.globalAlpha;
this.m_oContext.globalAlpha = oldAlpha * this.textAlpha;
}
this.private_FillGlyph(pGlyph);
if (undefined !== oldAlpha)
this.m_oContext.globalAlpha = oldAlpha;
}
if (false === this.m_bIntegerGrid)
{
this.m_oContext.setTransform(this.m_oFullTransform.sx,this.m_oFullTransform.shy,this.m_oFullTransform.shx,
this.m_oFullTransform.sy,this.m_oFullTransform.tx,this.m_oFullTransform.ty);
}
};
CGraphics.prototype.tg = function(text,x,y,codepoints)
{
if (this.m_bIsBreak)
return;
var _x = this.m_oInvertFullTransform.TransformPointX(x,y);
var _y = this.m_oInvertFullTransform.TransformPointY(x,y);
var _font_manager = this.IsUseFonts2 ? this.m_oFontManager2 : this.m_oFontManager;
try
{
_font_manager.LoadString3C(text,_x,_y,codepoints);
}
catch(err)
{
}
if (false === this.m_bIntegerGrid)
{
this.m_oContext.setTransform(1,0,0,1,0,0);
}
var pGlyph = _font_manager.m_oGlyphString.m_pGlyphsBuffer[0];
if (null == pGlyph)
return;
if (null != pGlyph.oBitmap)
{
let oldAlpha = undefined;
let _a = this.m_oBrush.Color1.A;
if (this.textAlpha || 255 !== _a)
{
oldAlpha = this.m_oContext.globalAlpha;
this.m_oContext.globalAlpha = oldAlpha * this.textAlpha * (_a / 255);
}
this.private_FillGlyph(pGlyph);
if (oldAlpha)
this.m_oContext.globalAlpha = oldAlpha;
}
if (false === this.m_bIntegerGrid)
{
this.m_oContext.setTransform(this.m_oFullTransform.sx,this.m_oFullTransform.shy,this.m_oFullTransform.shx,
this.m_oFullTransform.sy,this.m_oFullTransform.tx,this.m_oFullTransform.ty);
}
};
// private methods
CGraphics.prototype.private_FillGlyph = function(pGlyph, _bounds)
{
// new scheme
var nW = pGlyph.oBitmap.nWidth;
var nH = pGlyph.oBitmap.nHeight;
if (0 == nW || 0 == nH)
return;
var _font_manager = this.IsUseFonts2 ? this.m_oFontManager2 : this.m_oFontManager;
var nX = (_font_manager.m_oGlyphString.m_fX >> 0) + (pGlyph.fX + pGlyph.oBitmap.nX) >> 0;
var nY = (_font_manager.m_oGlyphString.m_fY >> 0) + (pGlyph.fY - pGlyph.oBitmap.nY) >> 0;
pGlyph.oBitmap.oGlyphData.checkColor(this.m_oBrush.Color1.R,this.m_oBrush.Color1.G,this.m_oBrush.Color1.B,nW,nH);
if (null == this.TextClipRect)
pGlyph.oBitmap.draw(this.m_oContext, nX, nY, this.TextClipRect);
else
pGlyph.oBitmap.drawCropInRect(this.m_oContext, nX, nY, this.TextClipRect);
if (_bounds)
{
var _r = nX + pGlyph.oBitmap.nWidth;
var _b = nY + pGlyph.oBitmap.nHeight;
if (_bounds.x > nX)
_bounds.x = nX;
if (_bounds.y > nY)
_bounds.y = nY;
if (_bounds.r < _r)
_bounds.r = _r;
if (_bounds.b < _b)
_bounds.b = _b;
}
};
CGraphics.prototype.private_FillGlyphC = function(pGlyph,cropX,cropW)
{
// new scheme
var nW = pGlyph.oBitmap.nWidth;
var nH = pGlyph.oBitmap.nHeight;
if (0 == nW || 0 == nH)
return;
var _font_manager = this.IsUseFonts2 ? this.m_oFontManager2 : this.m_oFontManager;
var nX = (_font_manager.m_oGlyphString.m_fX + pGlyph.fX + pGlyph.oBitmap.nX) >> 0;
var nY = (_font_manager.m_oGlyphString.m_fY + pGlyph.fY - pGlyph.oBitmap.nY) >> 0;
var d_koef = this.m_dDpiX / 25.4;
var cX = Math.max((cropX * d_koef) >> 0, 0);
var cW = Math.min((cropW * d_koef) >> 0, nW);
if (cW <= 0)
cW = 1;
pGlyph.oBitmap.oGlyphData.checkColor(this.m_oBrush.Color1.R,this.m_oBrush.Color1.G,this.m_oBrush.Color1.B,nW,nH);
pGlyph.oBitmap.drawCrop(this.m_oContext, nX, nY, cW, nH, cX);
};
CGraphics.prototype.private_FillGlyph2 = function(pGlyph)
{
var i = 0;
var j = 0;
var nW = pGlyph.oBitmap.nWidth;
var nH = pGlyph.oBitmap.nHeight;
if (0 == nW || 0 == nH)
return;
var _font_manager = this.IsUseFonts2 ? this.m_oFontManager2 : this.m_oFontManager;
var nX = (_font_manager.m_oGlyphString.m_fX + pGlyph.fX + pGlyph.oBitmap.nX) >> 0;
var nY = (_font_manager.m_oGlyphString.m_fY + pGlyph.fY - pGlyph.oBitmap.nY) >> 0;
var imageData = this.m_oContext.getImageData(nX,nY,nW,nH);
var pPixels = imageData.data;
var _r = this.m_oBrush.Color1.R;
var _g = this.m_oBrush.Color1.G;
var _b = this.m_oBrush.Color1.B;
for (; j < nH; ++j)
{
var indx = 4 * j * nW;
for (i = 0; i < nW; ++i)
{
var weight = pGlyph.oBitmap.pData[j * pGlyph.oBitmap.nWidth + i];
if (255 == weight)
{
pPixels[indx] = _r;
pPixels[indx + 1] = _g;
pPixels[indx + 2] = _b;
pPixels[indx + 3] = 255;
}
else
{
var r = pPixels[indx];
var g = pPixels[indx + 1];
var b = pPixels[indx + 2];
var a = pPixels[indx + 3];
pPixels[indx] = ((_r - r) * weight + (r << 8)) >>> 8;
pPixels[indx + 1] = ((_g - g) * weight + (g << 8)) >>> 8;
pPixels[indx + 2] = ((_b - b) * weight + (b << 8)) >>> 8;
pPixels[indx + 3] = (weight + a) - ((weight * a + 256) >>> 8);
}
indx += 4;
}
}
this.m_oContext.putImageData(imageData,nX,nY);
};
CGraphics.prototype.SetIntegerGrid = function(param)
{
if (true == param)
{
this.m_bIntegerGrid = true;
this.m_oContext.setTransform(1,0,0,1,0,0);
}
else
{
this.m_bIntegerGrid = false;
this.m_oContext.setTransform(this.m_oFullTransform.sx,this.m_oFullTransform.shy,this.m_oFullTransform.shx,
this.m_oFullTransform.sy,this.m_oFullTransform.tx,this.m_oFullTransform.ty);
}
};
CGraphics.prototype.GetIntegerGrid = function()
{
return this.m_bIntegerGrid;
};
CGraphics.prototype.DrawStringASCII = function(name, size, bold, italic, text, x, y, bIsHeader)
{
this._DrawStringASCII(name, size, bold, italic, text, x, y, bIsHeader, false);
};
CGraphics.prototype.DrawStringASCII2 = function(name, size, bold, italic, text, x, y, bIsHeader)
{
this._DrawStringASCII(name, size, bold, italic, text, x, y, bIsHeader, true);
};
CGraphics.prototype._DrawStringASCII = function(name, size, bold, italic, text, x, y, isHeader, fromRight)
{
let fontSize = (((size * 2 * 96 / this.m_dDpiY) + 0.5) >> 0) / 2;
let textLine = new TextLine(text, name, fontSize);
let textSize = textLine.getSize();
let _koef_px_to_mm = 25.4 / this.m_dDpiY;
let textH = textSize.ascent / _koef_px_to_mm;
let textW = textSize.w / _koef_px_to_mm;
var _ctx = this.m_oContext;
_ctx.beginPath();
_ctx.fillStyle = "#E1E1E1";
_ctx.strokeStyle = this.isDarkMode ? "#E1E1E1" : GlobalSkin.RulerOutline;
this.m_bBrushColorInit = false;
this.m_bPenColorInit = false;
var _xPxOffset = 10;
var _yPxOffset = 5;
_xPxOffset = (_xPxOffset * AscCommon.AscBrowser.retinaPixelRatio) >> 0;
_yPxOffset = (_yPxOffset * AscCommon.AscBrowser.retinaPixelRatio) >> 0;
if (fromRight)
x = this.m_dWidthMM - x;
var __x = this.m_oFullTransform.TransformPointX(x, y) >> 0;
var __y = this.m_oFullTransform.TransformPointY(x, y) >> 0;
var __w = (textW >> 0) + 2 * _xPxOffset;
var __h = (textH >> 0) + 2 * _yPxOffset;
if (fromRight)
__x -= __w;
if (!isHeader)
__y -= __h;
if (!AscBrowser.isCustomScalingAbove2())
_ctx.rect(__x + 0.5, __y + 0.5, __w, __h);
else
_ctx.rect(__x, __y, __w, __h);
_ctx.fill();
_ctx.stroke();
_ctx.beginPath();
y += _yPxOffset * _koef_px_to_mm;
if (!isHeader)
y -= __h * _koef_px_to_mm ;
x += _xPxOffset * _koef_px_to_mm;
if (fromRight)
x -= __w * _koef_px_to_mm;
// Мы обрезаем высоту и ширину по пиксельной сетке, из-за этого текст кажется прижатым к низу
// Корректируем горизонтальную позицию, чтобы он был ближе к верху
y = ((y / _koef_px_to_mm) >> 0) * _koef_px_to_mm;
textLine.draw(this, x, y);
};
CGraphics.prototype.GetAutoShapesTrack = function()
{
return Asc.editor.WordControl.m_oDrawingDocument.AutoShapesTrack;
};
CGraphics.prototype.DrawHeaderEdit = function(yPos, lock_type, sectionNum, bIsRepeat, type)
{
this.StartDrawShape();
var _y = this.m_oFullTransform.TransformPointY(0,yPos);
_y = (_y >> 0) + 0.5;
var _x = 0;
var _wmax = this.m_lWidthPix;
var _w1 = 6;
var _w2 = 3;
var _lineWidth = 1;
if (AscBrowser.isCustomScalingAbove2())
{
_y >>= 0;
_lineWidth = 2;
}
var ctx = this.m_oContext;
switch (lock_type)
{
case locktype_None:
case locktype_Mine:
{
if (!this.isDarkMode)
{
var c = AscCommon.RgbaHexToRGBA(GlobalSkin.RulerOutline);
this.p_color(c.R, c.G, c.B, 255);
}
else
{
ctx.strokeStyle = "#E1E1E1";
}
ctx.lineWidth = _lineWidth;
break;
}
case locktype_Other:
case locktype_Other2:
{
this.p_color(238, 53, 37, 255);
ctx.lineWidth = _lineWidth;
_w1 = 2;
_w2 = 1;
break;
}
default:
{
this.p_color(155, 187, 277, 255);
ctx.lineWidth = _lineWidth;
_w1 = 2;
_w2 = 1;
}
}
_w1 = (_w1 * AscCommon.AscBrowser.retinaPixelRatio) >> 0;
_w2 = (_w2 * AscCommon.AscBrowser.retinaPixelRatio) >> 0;
var bIsNoIntGrid = this.m_bIntegerGrid;
if (false == bIsNoIntGrid)
this.SetIntegerGrid(true);
this._s();
while (true)
{
if (_x > _wmax)
break;
ctx.moveTo(_x,_y);
_x+=_w1;
ctx.lineTo(_x,_y);
_x+=_w2;
}
this.ds();
var _header_text = AscCommon.translateManager.getValue("Header");
if (-1 != sectionNum)
_header_text += (AscCommon.translateManager.getValue(" -Section ") + (sectionNum + 1) + "-");
if (type)
{
if (type.bFirst)
_header_text = AscCommon.translateManager.getValue("First Page ") + _header_text;
else if (EvenAndOddHeaders)
{
if (type.bEven)
_header_text = AscCommon.translateManager.getValue("Even Page ") + _header_text;
else
_header_text = AscCommon.translateManager.getValue("Odd Page ") + _header_text;
}
}
var _fontSize = ((9 * AscCommon.AscBrowser.retinaPixelRatio) >> 0);
this.DrawStringASCII("Courier New", _fontSize, false, false, _header_text, 2, yPos, true);
if (bIsRepeat)
this.DrawStringASCII2("Courier New", _fontSize, false, false, AscCommon.translateManager.getValue("Same as Previous"), 2, yPos, true);
if (false == bIsNoIntGrid)
this.SetIntegerGrid(false);
this.EndDrawShape();
};
CGraphics.prototype.DrawFooterEdit = function(yPos, lock_type, sectionNum, bIsRepeat, type)
{
this.StartDrawShape();
var _y = this.m_oFullTransform.TransformPointY(0,yPos);
_y = (_y >> 0) + 0.5;
var _x = 0;
var _w1 = 6;
var _w2 = 3;
var _lineWidth = 1;
if (AscBrowser.isCustomScalingAbove2())
{
_y >>= 0;
_lineWidth = 2;
}
var ctx = this.m_oContext;
switch (lock_type)
{
case locktype_None:
case locktype_Mine:
{
var c = AscCommon.RgbaHexToRGBA(GlobalSkin.RulerOutline);
this.p_color(c.R, c.G, c.B, 255);
ctx.lineWidth = _lineWidth;
break;
}
case locktype_Other:
case locktype_Other2:
{
this.p_color(238, 53, 37, 255);
ctx.lineWidth = _lineWidth;
_w1 = 2;
_w2 = 1;
break;
}
default:
{
this.p_color(155, 187, 277, 255);
ctx.lineWidth = _lineWidth;
_w1 = 2;
_w2 = 1;
}
}
_w1 = (_w1 * AscCommon.AscBrowser.retinaPixelRatio) >> 0;
_w2 = (_w2 * AscCommon.AscBrowser.retinaPixelRatio) >> 0;
var _wmax = this.m_lWidthPix;
var bIsNoIntGrid = this.m_bIntegerGrid;
if (false == bIsNoIntGrid)
this.SetIntegerGrid(true);
this._s();
while (true)
{
if (_x > _wmax)
break;
ctx.moveTo(_x,_y);
_x+=_w1;
ctx.lineTo(_x,_y);
_x+=_w2;
}
this.ds();
var _header_text = AscCommon.translateManager.getValue("Footer");
if (-1 != sectionNum)
_header_text += (AscCommon.translateManager.getValue(" -Section ") + (sectionNum + 1) + "-");
if (type)
{
if (type.bFirst)
_header_text = AscCommon.translateManager.getValue("First Page ") + _header_text;
else if (EvenAndOddHeaders)
{
if (type.bEven)
_header_text = AscCommon.translateManager.getValue("Even Page ") + _header_text;
else
_header_text = AscCommon.translateManager.getValue("Odd Page ") + _header_text;
}
}
var _fontSize = ((9 * AscCommon.AscBrowser.retinaPixelRatio) >> 0);
this.DrawStringASCII("Courier New", _fontSize, false, false, _header_text, 2, yPos, false);
if (bIsRepeat)
this.DrawStringASCII2("Courier New", _fontSize, false, false, AscCommon.translateManager.getValue("Same as Previous"), 2, yPos, false);
if (false == bIsNoIntGrid)
this.SetIntegerGrid(false);
this.EndDrawShape();
};
CGraphics.prototype.DrawLockParagraph = function(lock_type, x, y1, y2)
{
if (lock_type == locktype_None || editor.WordControl.m_oDrawingDocument.IsLockObjectsEnable === false || Asc.editor.isViewMode || (lock_type === locktype_Mine && true === AscCommon.CollaborativeEditing.Is_Fast()))
return;
if (lock_type == locktype_Mine)
{
this.p_color(22, 156, 0, 255);
//this.p_color(155, 187, 277, 255);
}
else
this.p_color(238, 53, 37, 255);
var _x = this.m_oFullTransform.TransformPointX(x, y1) >> 0;
var _xT = this.m_oFullTransform.TransformPointX(x, y2) >> 0;
var _y1 = (this.m_oFullTransform.TransformPointY(x, y1) >> 0) + 0.5;
var _y2 = (this.m_oFullTransform.TransformPointY(x, y2) >> 0) - 1.5;
var ctx = this.m_oContext;
if (_x != _xT)
{
// значит какой-то трансформ
var dKoefMMToPx = 1 / Math.max(this.m_oCoordTransform.sx, 0.001);
this.p_width(1000 * dKoefMMToPx);
var w_dot = 2 * dKoefMMToPx;
var w_dist = 1 * dKoefMMToPx;
var w_len_indent = 3;
var _interf = this.GetAutoShapesTrack();
this._s();
_interf.AddLineDash(ctx, x, y1, x, y2, w_dot, w_dist);
_interf.AddLineDash(ctx, x, y1, x + w_len_indent, y1, w_dot, w_dist);
_interf.AddLineDash(ctx, x, y2, x + w_len_indent, y2, w_dot, w_dist);
this.ds();
return;
}
var bIsInt = this.m_bIntegerGrid;
if (!bIsInt)
this.SetIntegerGrid(true);
ctx.lineWidth = 1;
var w_dot = 2;
var w_dist = 1;
var w_len_indent = (3 * this.m_oCoordTransform.sx) >> 0;
this._s();
var y_mem = _y1 - 0.5;
while (true)
{
if ((y_mem + w_dot) > _y2)
break;
ctx.moveTo(_x + 0.5,y_mem);
y_mem+=w_dot;
ctx.lineTo(_x + 0.5,y_mem);
y_mem+=w_dist;
}
var x_max = _x + w_len_indent;
var x_mem = _x;
while (true)
{
if (x_mem > x_max)
break;
ctx.moveTo(x_mem,_y1);
x_mem+=w_dot;
ctx.lineTo(x_mem,_y1);
x_mem+=w_dist;
}
x_mem = _x;
while (true)
{
if (x_mem > x_max)
break;
ctx.moveTo(x_mem,_y2);
x_mem+=w_dot;
ctx.lineTo(x_mem,_y2);
x_mem+=w_dist;
}
this.ds();
if (!bIsInt)
this.SetIntegerGrid(false);
};
CGraphics.prototype.DrawLockObjectRect = function(lock_type, x, y, w, h)
{
if (Asc.editor.isViewMode || this.IsThumbnail || this.IsDemonstrationMode || lock_type === locktype_None)
return;
// for word/slides
if (Asc.editor.WordControl)
{
if (lock_type === locktype_Mine && true === AscCommon.CollaborativeEditing.Is_Fast())
return;
if (Asc.editor.WordControl.m_oDrawingDocument && Asc.editor.WordControl.m_oDrawingDocument.IsLockObjectsEnable === false && lock_type === locktype_Mine)
return;
}
if (lock_type === locktype_Mine)
{
this.p_color(22, 156, 0, 255);
//this.p_color(155, 187, 277, 255);
}
else
this.p_color(238, 53, 37, 255);
var ctx = this.m_oContext;
var _m = this.m_oTransform;
if (_m.sx != 1.0 || _m.shx != 0.0 || _m.shy != 0.0 || _m.sy != 1.0)
{
// значит какой-то трансформ
var dKoefMMToPx = 1 / Math.max(this.m_oCoordTransform.sx, 0.001);
this.p_width(1000 * dKoefMMToPx);
var w_dot = 2 * dKoefMMToPx;
var w_dist = 1 * dKoefMMToPx;
var _interf = this.GetAutoShapesTrack();
var eps = 5 * dKoefMMToPx;
var _x = x - eps;
var _y = y - eps;
var _r = x + w + eps;
var _b = y + h + eps;
this._s();
_interf.AddRectDash(ctx, _x, _y, _r, _y, _x, _b, _r, _b, w_dot, w_dist, true);
this._s();
return;
}
var bIsInt = this.m_bIntegerGrid;
if (!bIsInt)
this.SetIntegerGrid(true);
ctx.lineWidth = 1;
var w_dot = 2;
var w_dist = 2;
var eps = 5;
var _x = (this.m_oFullTransform.TransformPointX(x, y) >> 0) - eps + 0.5;
var _y = (this.m_oFullTransform.TransformPointY(x, y) >> 0) - eps + 0.5;
var _r = (this.m_oFullTransform.TransformPointX(x+w, y+h) >> 0) + eps + 0.5;
var _b = (this.m_oFullTransform.TransformPointY(x+w, y+h) >> 0) + eps + 0.5;
this._s();
for (var i = _x; i < _r; i += w_dist)
{
ctx.moveTo(i, _y);
i += w_dot;
if (i > _r)
i = _r;
ctx.lineTo(i, _y);
}
for (var i = _y; i < _b; i += w_dist)
{
ctx.moveTo(_r, i);
i += w_dot;
if (i > _b)
i = _b;
ctx.lineTo(_r, i);
}
for (var i = _r; i > _x; i -= w_dist)
{
ctx.moveTo(i, _b);
i -= w_dot;
if (i < _x)
i = _x;
ctx.lineTo(i, _b);
}
for (var i = _b; i > _y; i -= w_dist)
{
ctx.moveTo(_x, i);
i -= w_dot;
if (i < _y)
i = _y;
ctx.lineTo(_x, i);
}
this.ds();
if (!bIsInt)
this.SetIntegerGrid(false);
};
CGraphics.prototype.DrawEmptyTableLine = function(x1,y1,x2,y2)
{
if ((!Asc.editor.isShowTableEmptyLine || Asc.editor.isViewMode) && (Asc.editor.isShowTableEmptyLineAttack === false))
return;
var _x1 = this.m_oFullTransform.TransformPointX(x1,y1);
var _y1 = this.m_oFullTransform.TransformPointY(x1,y1);
var _x2 = this.m_oFullTransform.TransformPointX(x2,y2);
var _y2 = this.m_oFullTransform.TransformPointY(x2,y2);
_x1 = (_x1 >> 0) + 0.5;
_y1 = (_y1 >> 0) + 0.5;
_x2 = (_x2 >> 0) + 0.5;
_y2 = (_y2 >> 0) + 0.5;
this.p_color(138, 162, 191, 255);
var ctx = this.m_oContext;
if (_x1 != _x2 && _y1 != _y2)
{
// значит какой-то трансформ
var dKoefMMToPx = 1 / Math.max(this.m_oCoordTransform.sx, 0.001);
this.p_width(1000 * dKoefMMToPx);
this._s();
this.GetAutoShapesTrack().AddLineDash(ctx, x1, y1, x2, y2, 2 * dKoefMMToPx, 2 * dKoefMMToPx);
this.ds();
return;
}
ctx.lineWidth = 1;
var bIsInt = this.m_bIntegerGrid;
if (!bIsInt)
this.SetIntegerGrid(true);
if (_x1 == _x2)
{
var _y = Math.min(_y1, _y2) + 0.5;
var _w1 = 2;
var _w2 = 2;
var _wmax = Math.max(_y1, _y2) - 0.5;
this._s();
while (true)
{
if (_y > _wmax)
break;
ctx.moveTo(_x1,_y);
_y+=_w1;
if (_y > _wmax)
{
ctx.lineTo(_x1,_y - _w1 + 1);
}
else
{
ctx.lineTo(_x1,_y);
}
_y+=_w2;
}
this.ds();
}
else if (_y1 == _y2)
{
var _x = Math.min(_x1, _x2) + 0.5;
var _w1 = 2;
var _w2 = 2;
var _wmax = Math.max(_x1, _x2) - 0.5;
this._s();
while (true)
{
if (_x > _wmax)
break;
ctx.moveTo(_x,_y1);
_x+=_w1;
if (_x > _wmax)
{
ctx.lineTo(_x - _w2 + 1,_y1);
}
else
{
ctx.lineTo(_x,_y1);
}
_x+=_w2;
}
this.ds();
}
else
{
// значит какой-то трансформ
this._s();
this.GetAutoShapesTrack().AddLineDash(ctx, _x1, _y1, _x2, _y2, 2, 2);
this.ds();
}
if (!bIsInt)
this.SetIntegerGrid(false);
};
CGraphics.prototype.DrawSpellingLine = function(y0, x0, x1, w)
{
if (!Asc.editor.isViewMode)
this.drawHorLine(0, y0, x0, x1, w );
};
CGraphics.prototype.drawCustomRange = function(handlerId, rangeId, x0, y0, w, h, baseLine)
{
if (Asc.editor.isViewMode)
return;
let color = AscCommon.getUserColorById(handlerId, null, false);
let underlineY = 0.1 * (baseLine - y0) + baseLine;
if (-1 !== handlerId.indexOf("spelling"))
{
color = new AscCommon.CColor(239, 68, 68, 255);
}
else if (-1 !== handlerId.indexOf("grammar"))
{
color = new AscCommon.CColor(59, 130, 246, 255);
underlineY = 0.2 * (baseLine - y0) + baseLine;
}
this.p_color(color.r, color.g, color.b, 255);
this.p_width(0.25 * 1000);
this.drawHorLine(0, underlineY, x0, x0 + w, 0.25 );
};
// smart methods for horizontal / vertical lines
CGraphics.prototype.drawHorLine = function(align, y, x, r, penW)
{
var _check_transform = global_MatrixTransformer.IsIdentity2(this.m_oTransform);
if (!this.m_bIntegerGrid || !_check_transform)
{
if (_check_transform)
{
this.SetIntegerGrid(true);
this.drawHorLine(align, y, x, r, penW);
this.SetIntegerGrid(false);
return;
}
this.p_width(penW * 1000);
this._s();
this._m(x, y);
this._l(r, y);
this.ds();
this._s();
return;
}
var pen_w = ((this.m_dDpiX * penW / g_dKoef_in_to_mm) + 0.5) >> 0;
if (0 == pen_w)
pen_w = 1;
var _x = (this.m_oFullTransform.TransformPointX(x,y) >> 0) + 0.5 - 0.5;
var _r = (this.m_oFullTransform.TransformPointX(r,y) >> 0) + 0.5 + 0.5;
var ctx = this.m_oContext;
ctx.setTransform(1,0,0,1,0,0);
ctx.lineWidth = pen_w;
switch (align)
{
case 0:
{
// top
var _top = (this.m_oFullTransform.TransformPointY(x,y) >> 0) + 0.5;
ctx.beginPath();
ctx.moveTo(_x, _top + pen_w / 2 - 0.5);
ctx.lineTo(_r, _top + pen_w / 2 - 0.5);
ctx.stroke();
break;
}
case 1:
{
// center
var _center = (this.m_oFullTransform.TransformPointY(x,y) >> 0) + 0.5;
ctx.beginPath();
if (0 == (pen_w % 2))
{
ctx.moveTo(_x, _center - 0.5);
ctx.lineTo(_r, _center - 0.5);
}
else
{
ctx.moveTo(_x, _center);
ctx.lineTo(_r, _center);
}
ctx.stroke();
break;
}
case 2:
{
// bottom
var _bottom = (this.m_oFullTransform.TransformPointY(x,y) >> 0) + 0.5;
ctx.beginPath();
ctx.moveTo(_x, _bottom - pen_w / 2 + 0.5);
ctx.lineTo(_r, _bottom - pen_w / 2 + 0.5);
ctx.stroke();
break;
}
}
ctx.beginPath();
};
CGraphics.prototype.drawHorLine2 = function(align, y, x, r, penW)
{
var _check_transform = global_MatrixTransformer.IsIdentity2(this.m_oTransform);
if (!this.m_bIntegerGrid || !_check_transform)
{
if (_check_transform)
{
this.SetIntegerGrid(true);
this.drawHorLine2(align, y, x, r, penW);
this.SetIntegerGrid(false);
return;
}
var _y1 = y - penW / 2;
var _y2 = _y1 + 2 * penW;
this.p_width(penW * 1000);
this._s();
this._m(x, _y1);
this._l(r, _y1);
this.ds();
this._s();
this._m(x, _y2);
this._l(r, _y2);
this.ds();
this._s();
return;
}
var pen_w = ((this.m_dDpiX * penW / g_dKoef_in_to_mm) + 0.5) >> 0;
if (0 == pen_w)
pen_w = 1;
var _x = (this.m_oFullTransform.TransformPointX(x,y) >> 0) + 0.5 - 0.5;
var _r = (this.m_oFullTransform.TransformPointX(r,y) >> 0) + 0.5 + 0.5;
var ctx = this.m_oContext;
ctx.lineWidth = pen_w;
switch (align)
{
case 0:
{
// top
var _top = (this.m_oFullTransform.TransformPointY(x,y) >> 0) + 0.5;
var _pos1 = _top + pen_w / 2 - 0.5 - pen_w;
var _pos2 = _pos1 + pen_w * 2;
ctx.beginPath();
ctx.moveTo(_x, _pos1);
ctx.lineTo(_r, _pos1);
ctx.stroke();
ctx.beginPath();
ctx.moveTo(_x, _pos2);
ctx.lineTo(_r, _pos2);
ctx.stroke();
break;
}
case 1:
{
// center
// TODO:
break;
}
case 2:
{
// bottom
// TODO:
break;
}
}
ctx.beginPath();
};
CGraphics.prototype.drawVerLine = function(align, x, y, b, penW)
{
var _check_transform = global_MatrixTransformer.IsIdentity2(this.m_oTransform);
if (!this.m_bIntegerGrid || !_check_transform)
{
if (_check_transform)
{
this.SetIntegerGrid(true);
this.drawVerLine(align, x, y, b, penW);
this.SetIntegerGrid(false);
return;
}
this.p_width(penW * 1000);
this._s();
this._m(x, y);
this._l(x, b);
this.ds();
this._s();
return;
}
var pen_w = ((this.m_dDpiX * penW / g_dKoef_in_to_mm) + 0.5) >> 0;
if (0 == pen_w)
pen_w = 1;
var _y = (this.m_oFullTransform.TransformPointY(x,y) >> 0) + 0.5 - 0.5;
var _b = (this.m_oFullTransform.TransformPointY(x,b) >> 0) + 0.5 + 0.5;
var ctx = this.m_oContext;
ctx.lineWidth = pen_w;
switch (align)
{
case 0:
{
// left
var _left = (this.m_oFullTransform.TransformPointX(x,y) >> 0) + 0.5;
ctx.beginPath();
ctx.moveTo(_left + pen_w / 2 - 0.5, _y);
ctx.lineTo(_left + pen_w / 2 - 0.5, _b);
ctx.stroke();
break;
}
case 1:
{
// center
var _center = (this.m_oFullTransform.TransformPointX(x,y) >> 0) + 0.5;
ctx.beginPath();
if (0 == (pen_w % 2))
{
ctx.moveTo(_center - 0.5, _y);
ctx.lineTo(_center - 0.5, _b);
}
else
{
ctx.moveTo(_center, _y);
ctx.lineTo(_center, _b);
}
ctx.stroke();
break;
}
case 2:
{
// right
var _right = (this.m_oFullTransform.TransformPointX(x,y) >> 0) + 0.5;
ctx.beginPath();
ctx.moveTo(_right - pen_w / 2 + 0.5, _y);
ctx.lineTo(_right - pen_w / 2 + 0.5, _b);
ctx.stroke();
break;
}
}
ctx.beginPath();
};
// мега крутые функции для таблиц
CGraphics.prototype.drawHorLineExt = function(align, y, x, r, penW, leftMW, rightMW)
{
var _check_transform = global_MatrixTransformer.IsIdentity2(this.m_oTransform);
if (!this.m_bIntegerGrid || !_check_transform)
{
if (_check_transform)
{
this.SetIntegerGrid(true);
this.drawHorLineExt(align, y, x, r, penW, leftMW, rightMW);
this.SetIntegerGrid(false);
return;
}
this.p_width(penW * 1000);
this._s();
this._m(x, y);
this._l(r, y);
this.ds();
this._s();
return;
}
var pen_w = Math.max(((this.m_dDpiX * penW / g_dKoef_in_to_mm) + 0.5) >> 0, 1);
var _x = (this.m_oFullTransform.TransformPointX(x,y) >> 0) + 0.5;
var _r = (this.m_oFullTransform.TransformPointX(r,y) >> 0) + 0.5;
if (leftMW != 0)
{
var _center = _x;
var pen_mw = Math.max(((this.m_dDpiX * Math.abs(leftMW) * 2 / g_dKoef_in_to_mm) + 0.5) >> 0, 1);
if (leftMW < 0)
{
if ((pen_mw % 2) == 0)
{
_x = _center - (pen_mw / 2);
}
else
{
_x = _center - ((pen_mw / 2) >> 0);
}
}
else
{
if ((pen_mw % 2) == 0)
{
_x = _center + ((pen_mw / 2) - 1.0);
}
else
{
_x = _center + ((pen_mw / 2) >> 0);
}
}
}
if (rightMW != 0)
{
var _center = _r;
var pen_mw = Math.max(((this.m_dDpiX * Math.abs(rightMW) * 2 / g_dKoef_in_to_mm) + 0.5) >> 0, 1);
if (rightMW < 0)
{
if ((pen_mw % 2) == 0)
{
_r = _center - (pen_mw / 2);
}
else
{
_r = _center - ((pen_mw / 2) >> 0);
}
}
else
{
if ((pen_mw % 2) == 0)
{
_r = _center + (pen_mw / 2) - 1.0;
}
else
{
_r = _center + ((pen_mw / 2) >> 0);
}
}
}
var ctx = this.m_oContext;
ctx.lineWidth = pen_w;
_x -= 0.5;
_r += 0.5;
switch (align)
{
case 0:
{
// top
var _top = (this.m_oFullTransform.TransformPointY(x,y) >> 0) + 0.5;
ctx.beginPath();
ctx.moveTo(_x, _top + pen_w / 2 - 0.5);
ctx.lineTo(_r, _top + pen_w / 2 - 0.5);
ctx.stroke();
break;
}
case 1:
{
// center
var _center = (this.m_oFullTransform.TransformPointY(x,y) >> 0) + 0.5;
ctx.beginPath();
if (0 == (pen_w % 2))
{
ctx.moveTo(_x, _center - 0.5);
ctx.lineTo(_r, _center - 0.5);
}
else
{
ctx.moveTo(_x, _center);
ctx.lineTo(_r, _center);
}
ctx.stroke();
break;
}
case 2:
{
// bottom
var _bottom = (this.m_oFullTransform.TransformPointY(x,y) >> 0) + 0.5;
ctx.beginPath();
ctx.moveTo(_x, _bottom - pen_w / 2 + 0.5);
ctx.lineTo(_r, _bottom - pen_w / 2 + 0.5);
ctx.stroke();
break;
}
}
ctx.beginPath();
};
CGraphics.prototype.rect = function(x,y,w,h)
{
var ctx = this.m_oContext;
ctx.beginPath();
if (this.m_bIntegerGrid)
{
var tr = this.m_oFullTransform;
if (0.0 === tr.shx && 0.0 === tr.shy)
{
var _x = (tr.TransformPointX(x, y) + 0.5) >> 0;
var _y = (tr.TransformPointY(x, y) + 0.5) >> 0;
var _r = (tr.TransformPointX(x + w, y) + 0.5) >> 0;
var _b = (tr.TransformPointY(x, y + h) + 0.5) >> 0;
ctx.rect(_x, _y, _r - _x, _b - _y);
}
else
{
var x1 = tr.TransformPointX(x, y);
var y1 = tr.TransformPointY(x, y);
var x2 = tr.TransformPointX(x + w, y);
var y2 = tr.TransformPointY(x + w, y);
var x3 = tr.TransformPointX(x + w, y + h);
var y3 = tr.TransformPointY(x + w, y + h);
var x4 = tr.TransformPointX(x, y + h);
var y4 = tr.TransformPointY(x, y + h);
ctx.moveTo(x1, y1);
ctx.lineTo(x2, y2);
ctx.lineTo(x3, y3);
ctx.lineTo(x4, y4);
ctx.closePath();
}
}
else
{
ctx.rect(x, y, w, h);
}
};
CGraphics.prototype.TableRect = function(x,y,w,h)
{
var ctx = this.m_oContext;
if (this.m_bIntegerGrid)
{
var _x = (this.m_oFullTransform.TransformPointX(x,y) >> 0) + 0.5;
var _y = (this.m_oFullTransform.TransformPointY(x,y) >> 0) + 0.5;
var _r = (this.m_oFullTransform.TransformPointX(x+w,y) >> 0) + 0.5;
var _b = (this.m_oFullTransform.TransformPointY(x,y+h) >> 0) + 0.5;
ctx.fillRect(_x - 0.5, _y - 0.5, _r - _x + 1, _b - _y + 1);
}
else
{
ctx.fillRect(x, y, w, h);
}
};
// функции клиппирования
CGraphics.prototype.SetClip = function(r)
{
var ctx = this.m_oContext;
ctx.save();
ctx.beginPath();
if (!global_MatrixTransformer.IsIdentity(this.m_oTransform))
{
ctx.rect(r.x, r.y, r.w, r.h);
}
else
{
var _x = (this.m_oFullTransform.TransformPointX(r.x,r.y) + 1) >> 0;
var _y = (this.m_oFullTransform.TransformPointY(r.x,r.y) + 1) >> 0;
var _r = (this.m_oFullTransform.TransformPointX(r.x+r.w,r.y) - 1) >> 0;
var _b = (this.m_oFullTransform.TransformPointY(r.x,r.y+r.h) - 1) >> 0;
ctx.rect(_x, _y, _r - _x + 1, _b - _y + 1);
}
this.clip();
ctx.beginPath();
};
CGraphics.prototype.RemoveClip = function()
{
this.m_oContext.restore();
this.m_oContext.save();
this.m_bPenColorInit = false;
this.m_bBrushColorInit = false;
if (this.m_oContext.globalAlpha != this.globalAlpha)
this.m_oContext.globalAlpha = this.globalAlpha;
};
CGraphics.prototype.drawCollaborativeChanges = function(x, y, w, h, Color)
{
this.b_color1( Color.r, Color.g, Color.b, 255 );
this.rect( x, y, w, h );
this.df();
};
CGraphics.prototype.drawMailMergeField = function(x, y, w, h)
{
this.b_color1(206, 212, 223, 204);
//this.b_color1(216, 221, 230, 255);
this.rect( x, y, w, h );
this.df();
};
CGraphics.prototype.drawSearchResult = function(x, y, w, h)
{
this.b_color1( 255, 238, 128, 255 );
this.rect( x, y, w, h );
this.df();
};
CGraphics.prototype.drawFlowAnchor = function(x, y)
{
var _flow_anchor = (AscCommon.OverlayRasterIcons && AscCommon.OverlayRasterIcons.Anchor) ? AscCommon.OverlayRasterIcons.Anchor.get() : undefined;
if (!_flow_anchor || (!Asc.editor || !Asc.editor.ShowParaMarks))
return;
if (false === this.m_bIntegerGrid)
{
this.m_oContext.setTransform(1,0,0,1,0,0);
}
var _x = this.m_oFullTransform.TransformPointX(x,y) >> 0;
var _y = this.m_oFullTransform.TransformPointY(x,y) >> 0;
this.m_oContext.drawImage(_flow_anchor, _x, _y);
if (false === this.m_bIntegerGrid)
{
this.m_oContext.setTransform(this.m_oFullTransform.sx,this.m_oFullTransform.shy,this.m_oFullTransform.shx,
this.m_oFullTransform.sy,this.m_oFullTransform.tx,this.m_oFullTransform.ty);
}
};
CGraphics.prototype.drawPermissionMark = function(x, y, h, isStart, isActive)
{
if (isActive)
this.p_color(164, 160, 0, 255);
else
this.p_color(127, 127, 127, 255);
if (!global_MatrixTransformer.IsIdentity2(this.m_oTransform))
{
let coeff = this.m_oCoordTransform.sx;
this.p_width(2 / coeff * 1000);
let shift = isStart ? 3 / coeff : -3 / coeff;
this._s();
this._m(x + shift, y);
this._l(x, y);
this._l(x, y + h);
this._l(x + shift, y + h);
this.ds();
this._s();
}
else
{
let pen_w = 2;
let ctx = this.m_oContext;
ctx.setTransform(1, 0, 0, 1, 0, 0);
ctx.lineWidth = 2;
let _y = (this.m_oFullTransform.TransformPointY(x, y) >> 0) + 0.5 - 0.5;
let _b = (this.m_oFullTransform.TransformPointY(x, y + h) >> 0) + 0.5 - 0.5;
let _x0 = (this.m_oFullTransform.TransformPointX(x, y) >> 0) + 0.5 - 0.5 - pen_w / 2;
let _x1 = _x0 + (isStart ? pen_w / 2 + 3 : -pen_w / 2 - 3);
ctx.beginPath();
ctx.moveTo(_x1, _y);
ctx.lineTo(_x0, _y);
ctx.lineTo(_x0, _b);
ctx.lineTo(_x1, _b);
ctx.stroke();
ctx.beginPath();
}
};
CGraphics.prototype.StartClipPath = function()
{
};
CGraphics.prototype.EndClipPath = function()
{
this.m_oContext.clip();
};
CGraphics.prototype.StartCheckTableDraw = function()
{
if (!this.m_bIntegerGrid && global_MatrixTransformer.IsIdentity2(this.m_oTransform))
{
this.SaveGrState();
this.SetIntegerGrid(true);
return true;
}
return false;
};
CGraphics.prototype.EndCheckTableDraw = function(bIsRestore)
{
if (bIsRestore)
this.RestoreGrState();
};
CGraphics.prototype.SetTextClipRect = function(_l, _t, _r, _b)
{
this.TextClipRect = {
l : (_l * this.m_oCoordTransform.sx) >> 0,
t : (_t * this.m_oCoordTransform.sy) >> 0,
r : (_r * this.m_oCoordTransform.sx) >> 0,
b : (_b * this.m_oCoordTransform.sy) >> 0
};
};
CGraphics.prototype.AddSmartRect = function(x, y, w, h, pen_w)
{
if (!global_MatrixTransformer.IsIdentity2(this.m_oTransform))
{
// проверим - может все-таки можно нарисовать как надо?
var r = x + w;
var b = y + h;
var dx1 = this.m_oFullTransform.TransformPointX(x, y);
var dy1 = this.m_oFullTransform.TransformPointY(x, y);
var dx2 = this.m_oFullTransform.TransformPointX(r, y);
var dy2 = this.m_oFullTransform.TransformPointY(r, y);
var dx3 = this.m_oFullTransform.TransformPointX(x, b);
var dy3 = this.m_oFullTransform.TransformPointY(x, b);
var dx4 = this.m_oFullTransform.TransformPointX(r, b);
var dy4 = this.m_oFullTransform.TransformPointY(r, b);
var _eps = 0.001;
var bIsClever = false;
var _type = 1;
if (Math.abs(dx1 - dx3) < _eps &&
Math.abs(dx2 - dx4) < _eps &&
Math.abs(dy1 - dy2) < _eps &&
Math.abs(dy3 - dy4) < _eps)
{
bIsClever = true;
_type = 1;
}
if (!bIsClever &&
Math.abs(dx1 - dx2) < _eps &&
Math.abs(dx3 - dx4) < _eps &&
Math.abs(dy1 - dy3) < _eps &&
Math.abs(dy2 - dy4) < _eps)
{
_type = 2;
bIsClever = true;
}
if (!bIsClever)
{
this.ds();
return;
}
var _xI = (_type == 1) ? Math.min(dx1, dx2) : Math.min(dx1, dx3);
var _rI = (_type == 1) ? Math.max(dx1, dx2) : Math.max(dx1, dx3);
var _yI = (_type == 1) ? Math.min(dy1, dy3) : Math.min(dy1, dy2);
var _bI = (_type == 1) ? Math.max(dy1, dy3) : Math.max(dy1, dy2);
var bIsSmartAttack = false;
if (!this.m_bIntegerGrid)
{
this.SetIntegerGrid(true);
bIsSmartAttack = true;
if (this.dash_no_smart)
{
for (var index = 0; index < this.dash_no_smart.length; index++)
this.dash_no_smart[index] = (this.m_oCoordTransform.sx * this.dash_no_smart[index] + 0.5) >> 0;
this.m_oContext.setLineDash(this.dash_no_smart);
this.dash_no_smart = null;
}
}
var _pen_w = (pen_w * this.m_oCoordTransform.sx + 0.5) >> 0;
if (0 >= _pen_w)
_pen_w = 1;
this._s();
if ((_pen_w & 0x01) == 0x01)
{
var _x = (_xI >> 0) + 0.5;
var _y = (_yI >> 0) + 0.5;
var _r = (_rI >> 0) + 0.5;
var _b = (_bI >> 0) + 0.5;
this.m_oContext.rect(_x, _y, _r - _x, _b - _y);
}
else
{
var _x = (_xI + 0.5) >> 0;
var _y = (_yI + 0.5) >> 0;
var _r = (_rI + 0.5) >> 0;
var _b = (_bI + 0.5) >> 0;
this.m_oContext.rect(_x, _y, _r - _x, _b - _y);
}
this.m_oContext.lineWidth = _pen_w;
this.ds();
if (bIsSmartAttack)
{
this.SetIntegerGrid(false);
}
return;
}
var bIsSmartAttack = false;
if (!this.m_bIntegerGrid)
{
this.SetIntegerGrid(true);
bIsSmartAttack = true;
if (this.dash_no_smart)
{
for (var index = 0; index < this.dash_no_smart.length; index++)
this.dash_no_smart[index] = (this.m_oCoordTransform.sx * this.dash_no_smart[index] + 0.5) >> 0;
this.m_oContext.setLineDash(this.dash_no_smart);
this.dash_no_smart = null;
}
}
var _pen_w = (pen_w * this.m_oCoordTransform.sx + 0.5) >> 0;
if (0 >= _pen_w)
_pen_w = 1;
this._s();
if ((_pen_w & 0x01) == 0x01)
{
var _x = (this.m_oFullTransform.TransformPointX(x, y) >> 0) + 0.5;
var _y = (this.m_oFullTransform.TransformPointY(x, y) >> 0) + 0.5;
var _r = (this.m_oFullTransform.TransformPointX(x+w, y+h) >> 0) + 0.5;
var _b = (this.m_oFullTransform.TransformPointY(x+w, y+h) >> 0) + 0.5;
this.m_oContext.rect(_x, _y, _r - _x, _b - _y);
}
else
{
var _x = (this.m_oFullTransform.TransformPointX(x, y) + 0.5) >> 0;
var _y = (this.m_oFullTransform.TransformPointY(x, y) + 0.5) >> 0;
var _r = (this.m_oFullTransform.TransformPointX(x+w, y+h) + 0.5) >> 0;
var _b = (this.m_oFullTransform.TransformPointY(x+w, y+h) + 0.5) >> 0;
this.m_oContext.rect(_x, _y, _r - _x, _b - _y);
}
this.m_oContext.lineWidth = _pen_w;
this.ds();
if (bIsSmartAttack)
{
this.SetIntegerGrid(false);
}
};
CGraphics.prototype.CheckUseFonts2 = function(_transform, isForm)
{
if (!global_MatrixTransformer.IsIdentity2(_transform))
{
if (!AscCommon.g_fontManager2)
{
AscCommon.g_fontManager2 = new AscFonts.CFontManager();
AscCommon.g_fontManager2.Initialize(true);
}
this.m_oFontManager2 = AscCommon.g_fontManager2;
if (null == this.m_oLastFont2)
this.m_oLastFont2 = new AscCommon.CFontSetup();
this.IsUseFonts2 = true;
}
};
CGraphics.prototype.UncheckUseFonts2 = function()
{
this.IsUseFonts2 = false;
};
CGraphics.prototype.DrawPresentationComment = function(type, x, y, w, h)
{
if (this.IsThumbnail || this.IsDemonstrationMode)
return;
if (this.m_bIntegerGrid)
{
if (AscCommon.g_comment_image && AscCommon.g_comment_image.asc_complete === true)
{
var _x = (this.m_oFullTransform.TransformPointX(x,y) >> 0);
var _y = (this.m_oFullTransform.TransformPointY(x,y) >> 0);
var _index = 0;
if ((type & 0x02) == 0x02)
_index = 2;
if ((type & 0x01) == 0x01)
_index += 1;
if (AscBrowser.isCustomScalingAbove2())
_index += 4;
var _offset = AscCommon.g_comment_image_offsets[_index];
this.m_oContext.drawImage(AscCommon.g_comment_image, _offset[0], _offset[1], _offset[2], _offset[3], _x, _y, _offset[2], _offset[3]);
}
}
else
{
this.SetIntegerGrid(true);
this.DrawPresentationComment(type, x, y, w, h);
this.SetIntegerGrid(false);
}
};
CGraphics.prototype.DrawFootnoteRect = function(x, y, w, h)
{
var _old = this.m_bIntegerGrid;
if (!_old)
this.SetIntegerGrid(true);
this.p_dash([1, 1]);
this._s();
var l = x;
var t = y;
var r = x + w;
var b = y + h;
this.drawHorLineExt(c_oAscLineDrawingRule.Top, t, l, r, 0, 0, 0);
this.drawVerLine(c_oAscLineDrawingRule.Right, l, t, b, 0);
this.drawVerLine(c_oAscLineDrawingRule.Left, r, t, b, 0);
this.drawHorLineExt(c_oAscLineDrawingRule.Top, b, l, r, 0, 0, 0);
this.ds();
this._s();
this.p_dash(null);
if (!_old)
this.SetIntegerGrid(false);
};
//------------------------------------------------------------export----------------------------------------------------
window['AscCommon'] = window['AscCommon'] || {};
window['AscCommon'].CGraphics = CGraphics;
// cells rewrite AscCommon.Graphics
window['AscCommonExcel'].CGraphics = CGraphics;
})(window);