Files
core/ASCOfficePDFReader/SImage.h

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 */