Files
DocumentServer-v-9.2.0/sdkjs/word/Drawing/Graphics.js
T
Yajbir Singh f1b860b25c
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

/*
* (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);