mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-07-11 14:00:32 +08:00
234 lines
8.6 KiB
C++
234 lines
8.6 KiB
C++
#ifndef _SIMAGE_H
|
|
#define _SIMAGE_H
|
|
|
|
#include "STypes.h"
|
|
#include "SClip.h"
|
|
|
|
class SImage;
|
|
class SBitmap;
|
|
struct SGlyphBitmap;
|
|
class SState;
|
|
class SPattern;
|
|
class SScreen;
|
|
class SPath;
|
|
class SXPath;
|
|
class SFont;
|
|
struct SPipe;
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
// Ñ÷èòûâàåì ñëåäóþùóþ ñòðîêó èç pPixels â Image mask.
|
|
typedef BOOL (*SImageMaskSource)(void *pData, SColorPointer pPixels);
|
|
|
|
// Ñ÷èòûâàåì ñëåäóþùóþ ñòðîêó èç pPixels â Image.
|
|
typedef BOOL (*SImageSource)(void *pData, SColorPointer pColorLine, unsigned char *pAlphaLine);
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
enum SPipeResultColorCtrl
|
|
{
|
|
PipeResultColorNoAlphaBlendRGB,
|
|
PipeResultColorNoAlphaBlendMono,
|
|
PipeResultColorAlphaNoBlendMono,
|
|
PipeResultColorAlphaNoBlendRGB,
|
|
PipeResultColorAlphaBlendMono,
|
|
PipeResultColorAlphaBlendRGB
|
|
};
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------------------
|
|
// SImage
|
|
//-------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
class SImage
|
|
{
|
|
public:
|
|
|
|
SImage(SBitmap *pBitmap, BOOL bVectorAA, SScreenParams *pScreenParams = NULL);
|
|
SImage(SBitmap *pBitmap, BOOL bVectorAA, SScreen *pScreen);
|
|
|
|
~SImage();
|
|
|
|
//-- Ñ÷èòûâàåì äàííûå èç òåêóùåãî SState ------------------------------------------------------------------------------------
|
|
|
|
double *GetMatrix();
|
|
SPattern *GetStrokePattern();
|
|
SPattern *GetFillPattern();
|
|
SScreen *GetScreen();
|
|
SBlendFunc GetBlendFunc();
|
|
double GetStrokeAlpha();
|
|
double GetFillAlpha();
|
|
double GetLineWidth();
|
|
int GetLineCap();
|
|
int GetLineJoin();
|
|
double GetMiterLimit();
|
|
double GetFlatness();
|
|
double *GetLineDash();
|
|
int GetLineDashLength();
|
|
double GetLineDashPhase();
|
|
SClip *GetClip();
|
|
SBitmap *GetSoftMask();
|
|
BOOL GetInNonIsolatedGroup();
|
|
|
|
//-- Èçìåíÿåì ïàðàìåòðû òåêóùåãî SState -------------------------------------------------------------------------------------
|
|
|
|
void SetMatrix(double *pMatrix);
|
|
void SetStrokePattern(SPattern *pPattern);
|
|
void SetFillPattern(SPattern *pPattern);
|
|
void SetScreen(SScreen *pScreen);
|
|
void SetBlendFunc(SBlendFunc pFunction);
|
|
void SetStrokeAlpha(double dAlpha);
|
|
void SetFillAlpha(double dAlpha);
|
|
void SetLineWidth(double dLineWidth);
|
|
void SetLineCap(int nLineCap);
|
|
void SetLineJoin(int nLineJoin);
|
|
void SetMiterLimit(double dMiterLimit);
|
|
void SetFlatness(double dFlatness);
|
|
void SetLineDash(double *pLineDash, int nLineDashLength, double dLineDashPhase); // Ìàññèâ <pLineDash> êîïèðóåòñÿ
|
|
void SetStrokeAdjust(BOOL bStrokeAdjust);
|
|
void ClipResetToRect(double dX0, double dY0, double dX1, double dY1);
|
|
int ClipToRect(double dX0, double dY0, double dX1, double dY1);
|
|
int ClipToPath(SPath *pPath, BOOL bEO);
|
|
void SetSoftMask(SBitmap *pSMask);
|
|
void SetInNonIsolatedGroup(SBitmap *pAlpha0Bitmap, int nAlpha0X, int nAlpha0Y);
|
|
|
|
//-- Ñîõðàíÿåì/âîññòàíàâëèâàåì SState (èìååòñÿ ââèäó ñòåê îáúåêòîâ SState) --------------------------------------------------
|
|
|
|
void SaveState();
|
|
int RestoreState();
|
|
|
|
//-- Ôóíêöèè ðèñîâàíèÿ ------------------------------------------------------------------------------------------------------
|
|
|
|
// Çàïîëíÿåì áèòìàï îäíèì öâåòîì.
|
|
void Clear(SColorPointer pColor, unsigned char unAlpha = 0x00);
|
|
|
|
// Îáâîäèì Path, èñïîëüçóÿ òåêóùèé StrokePattern.
|
|
int Stroke(SPath *pPath);
|
|
|
|
// Çàëèâàåì Path, èñïîëüçóÿ òåêóùèé FillPattern.
|
|
int Fill(SPath *pPath, BOOL bEO);
|
|
|
|
// Çàëèâàåì Path, ïðîèçâîäÿ îïåðàöèþ XOR.
|
|
int XorFill(SPath *pPath, BOOL bEO);
|
|
|
|
// Ðèñóåì ñèìâîë, èñïîëüçóÿ FillPattern.
|
|
int FillChar(double dX, double dY, int nChar, SFont *pFont);
|
|
|
|
// Ðèñóåì ñèìâîë, èñïîëüçóÿ FillPattern. Ýòà ôóíêöèÿ íå îñâîáîæäàåò ïàìÿòü, ò.å. èãíîðèðóåò pGlyph->bFreeData.
|
|
int FillGlyph(double dX, double dY, SGlyphBitmap *pGlyph);
|
|
|
|
// Ðèñóåì ìàñêó, èñïîëüçóÿ òåêóùèé FillColor. ×èòàåì nHeight ëèíèé ïî nWidth ïèêñåëåé èç pSrc. Åñëè çíà÷åíèå "1", òîãäà ïèêñåëü ðèñóåòñÿ
|
|
// ñ òåêóùèì öâåòîì, à åñëè "0" - ïèêñåëü ïðîçðà÷åí. Ìàòðèöà pMatrix çàäàåò ïðåîáðàçîâàíèå åäèíè÷íîãî êâàäðàòà â îáëàñòü (ïðÿìîóãîëüíèê)
|
|
// íóæíîãî ðàçìåðà äëÿ äàííîé êàðòèíêè.
|
|
int FillImageMask(SImageMaskSource pSrc, void *pSrcData, int nWidth, int nHeight, double *pMatrix, BOOL bGlyphMode);
|
|
|
|
// Ðèñóåì èçîáðàæåíèå. ×èòàåì nHeight ëèíèé ïî nWidth ïèêñåëåé èç pSrc. Ïðåäïîëàãàåòñÿ, ÷òî ïèêñåëå ñîîòâåòñâóþò eColorMode. Åñëè bAlpha = True,
|
|
// òîãäà èñïîëüçóåì çíà÷åíèå àëüôû, âîçâðàùàåìîå ôóíêöèå pSrc; â ïðîòèâíîì ñëó÷àå, èãíîðèóðåì àëüôà-êàíàë.
|
|
int DrawImage(SImageSource pSrc, void *pSrcData, SColorMode eColorMode, BOOL bAlpha, int nWidth, int nHeight, double *pMatrix);
|
|
|
|
// Ñîâìåùàåì ïðÿìîóãîëüíóþ îáëàñòü èç pSrc ñ äàííûì SImage.
|
|
int Composite(SBitmap *pSrc, int nSrcX, int nSrcY, int nDestX, int nDestY, int nWidth, int nHeight, BOOL bNoClip, BOOL bNonIsolated);
|
|
|
|
// Ñîâìåùàåì äàííûé SImage ñ ôîíîâûì öâåòîì. Àëüôà äëÿ ôîíîâîãî öâåòà ïðåäïîëàãàåòñÿ ðàâíîé 1.
|
|
void CompositeBackground(SColorPointer pColor);
|
|
|
|
// Êîïèðóåì ïðÿìîóãîëüíóþ îáëàñòü èç pSrc íà áèòìàï äàííîãî SImage. Çíà÷åíèÿ àëüôà êàíàëà âñå óñòàíàâëèâàåì ðàâíûìè 0.
|
|
int BlitTransparent(SBitmap *pSrc, int nSrcX, int nSrcY, int nDestX, int nDestY, int nWidth, int nHeight);
|
|
|
|
//-- Äîïîëíèòåëüíûå ôóíêöèè -------------------------------------------------------------------------------------------------
|
|
|
|
// Ñòðîèì Path äëÿ îáâîäêè, ïî äàííîìó Path êîòîðûé íóæíî îáâåñòè, èñïîëüçóÿ ïàðàìåòðû ëèíèè. Åñëè bFlatten = True, òîãäà ñíà÷àëà
|
|
// ñãëàäèì Path(ïî äàííîìó m_dFlatten) è îáðàáîòàåì ïóíêòèðíîñòü ëèíèè.
|
|
SPath *MakeStrokePath(SPath *pPath, BOOL bFlatten = TRUE);
|
|
|
|
// Âîçâðàùàåì áèòìàï äàííîãî SImage.
|
|
SBitmap *GetBitmap()
|
|
{
|
|
return m_pBitmap;
|
|
}
|
|
|
|
// Ôóíêöèÿ âîçâðàùàåò ãðàíèöû ðåãèîíà, â êîòîðîì ïðîèçâîäèëèñü ïîñëåäíèå èçìåíåíèÿ.
|
|
void GetModRegion(int *pnMinX, int *pnMinY, int *pnMaxX, int *pnMaxY)
|
|
{
|
|
*pnMinX = m_nModRegMinX;
|
|
*pnMinY = m_nModRegMinY;
|
|
*pnMaxX = m_nModRegMaxX;
|
|
*pnMaxY = m_nModRegMaxY;
|
|
}
|
|
|
|
// Óñòàíàâëèâàåì ãðàíèöû ðåãèîíà ñ ïîñëåäíèìè èçìåíåíèÿìè ïî ãðàíèöàì áèòìàïà.
|
|
void ClearModRegion();
|
|
|
|
// SClipResult ïîñëåäíåé îïåðàöèè ðèñîâàíèÿ.
|
|
SClipResult GetClipResult()
|
|
{
|
|
return m_pOpClipRes;
|
|
}
|
|
|
|
|
|
BOOL GetVectorAA()
|
|
{
|
|
return m_bVectorAA;
|
|
}
|
|
void SetVectorAA(BOOL bVectorAA)
|
|
{
|
|
m_bVectorAA = bVectorAA;
|
|
}
|
|
|
|
private:
|
|
|
|
void PipeInit(SPipe *pPipe, int nX, int nY, SPattern *pPattern, SColorPointer pColorSrc, double dAlphaInput, BOOL bUsesShape, BOOL bNonIsolatedGroup);
|
|
void PipeRun(SPipe *pPipe);
|
|
void PipeSetXY(SPipe *pPipe, int nX, int nY);
|
|
void PipeIncreaseX(SPipe *pPipe);
|
|
void DrawPixel(SPipe *pPipe, int nX, int nY, BOOL bNoClip);
|
|
void DrawAAPixelInit();
|
|
void DrawAAPixel(SPipe *pPipe, int nX, int nY);
|
|
void DrawSpan(SPipe *pPipe, int nX0, int nX1, int nY, BOOL bNoClip);
|
|
void DrawAALine(SPipe *pPipe, int nX0, int nX1, int nY);
|
|
|
|
void Transform(double *pMatrix, double dUserX, double dUserY, double *pdDeviceX, double *pdDeviceY);
|
|
void UpdateModX(int x);
|
|
void UpdateModY(int y);
|
|
|
|
|
|
void StrokeNarrow(SPath *pPath);
|
|
void StrokeWide(SPath *pPath);
|
|
SPath *FlattenPath(SPath *pPath, double *pMatrix, double dFlatness);
|
|
void FlattenCurve(double dX0, double dY0, double dX1, double dY1, double dX2, double dY2, double dX3, double dY3, double *pMatrix, double dFlatness_2, SPath *pFlatPath);
|
|
SPath *MakeDashedPath(SPath *pPath);
|
|
int FillWithPattern(SPath *pPath, BOOL bEO, SPattern *pPattern, double dAlpha);
|
|
int FillGlyph2(int nX, int nY, SGlyphBitmap *pGlyph);
|
|
|
|
private:
|
|
|
|
static SPipeResultColorCtrl m_arrePipeResultColorNoAlphaBlend[];
|
|
static SPipeResultColorCtrl m_arrePipeResultColorAlphaNoBlend[];
|
|
static SPipeResultColorCtrl m_arrePipeResultColorAlphaBlend[];
|
|
static int m_arrnPipeNonIsoGroupCorrection[];
|
|
|
|
private:
|
|
|
|
SBitmap *m_pBitmap;
|
|
SState *m_pState;
|
|
SBitmap *m_pAABuffer;
|
|
int m_nAABufferY;
|
|
|
|
SBitmap *m_pAlpha0Bitmap; // Äëÿ Non-isolated ãðóïï, áèòìàï õðàíÿùèé çíà÷åíèÿ àëüôà-êàíàëà
|
|
int m_nAlpha0X; //
|
|
int m_nAlpha0Y; // Ñäâèã â m_pAlpha0Bitmap
|
|
|
|
double m_arrdAAGamma[AntiAliasingSize * AntiAliasingSize + 1];
|
|
|
|
int m_nModRegMinX; //
|
|
int m_nModRegMinY; // Ãðàíèöû ðåãèîíà, â êîòîðîì ïðîèçâîäèëèñü ïîñëåäíèå èçìåíåíèÿ
|
|
int m_nModRegMaxX; // (ò.å. èçìåíåíèÿ ïîñëå âûçîâà ôóíêöèè GetModificationRegion())
|
|
int m_nModRegMaxY; //
|
|
|
|
SClipResult m_pOpClipRes; // Ðåçóëüòàò ïîñëåäíåé îïåðàöèè ðèñîâàíèÿ ïî îòíîøåíèþ ê Clipping
|
|
|
|
BOOL m_bVectorAA;
|
|
|
|
};
|
|
|
|
#endif /* _SIMAGE_H */
|