mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-04-07 13:55:33 +08:00
293 lines
12 KiB
C++
293 lines
12 KiB
C++
#ifndef _GRAPHICS_H
|
|
#define _GRAPHICS_H
|
|
|
|
#include "GlobalParams.h"
|
|
|
|
class StringExt;
|
|
class XRef;
|
|
class Array;
|
|
class Stream;
|
|
class Parser;
|
|
class Dict;
|
|
class Function;
|
|
class OutputDev;
|
|
class GrFontDict;
|
|
class GrFont;
|
|
class GrPattern;
|
|
class GrTilingPattern;
|
|
class GrShadingPattern;
|
|
class GrShading;
|
|
class GrFunctionShading;
|
|
class GrAxialShading;
|
|
class GrRadialShading;
|
|
class GrGouraudTriangleShading;
|
|
class GrPatchMeshShading;
|
|
struct GrPatch;
|
|
class GrState;
|
|
struct GrColor;
|
|
class GrColorSpace;
|
|
class Graphics;
|
|
class PDFRectangle;
|
|
class AnnotBorderStyle;
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
enum GrClipType
|
|
{
|
|
clipNone,
|
|
clipNormal,
|
|
clipEO
|
|
};
|
|
|
|
enum ArgType
|
|
{
|
|
argBool, // Boolean
|
|
argInt, // Integer
|
|
argNum, // Number (integer or real)
|
|
argString, // String
|
|
argName, // Name
|
|
argArray, // Array
|
|
argProps, // Properties (Dictionary èëè Name)
|
|
argSCN, // scn/SCN
|
|
argNone // èñïîëüçóåòñÿ, ÷òîáû èçáåæàòü ïóñòûõ ïîëåé ïðè èíèöèàëèçàöèè
|
|
};
|
|
|
|
#define maxArgs 33
|
|
|
|
struct Operator
|
|
{
|
|
char sName[4];
|
|
int nArgumentsCount;
|
|
ArgType arrArguments[maxArgs];
|
|
void (Graphics::*pFunction)(Object pArgs[], int nArgsCount);
|
|
};
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------------------
|
|
// GrResources
|
|
//-------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
class GrResources
|
|
{
|
|
public:
|
|
|
|
GrResources(XRef *pXref, Dict *pResourcesDict, GrResources *pNext, GlobalParams *pGlobalParams);
|
|
~GrResources();
|
|
|
|
GrFont *LookupFont (char *sName);
|
|
BOOL LookupXObject (char *sName, Object *pObject);
|
|
BOOL LookupAndCopyXObject(char *sName, Object *pObject);
|
|
void LookupColorSpace (char *sName, Object *pObject);
|
|
GrPattern *LookupPattern (char *sName);
|
|
GrShading *LookupShading (char *sName);
|
|
BOOL LookupExtGState (char *sName, Object *pObject);
|
|
|
|
GrResources *GetNext()
|
|
{
|
|
return m_pNext;
|
|
}
|
|
|
|
private:
|
|
|
|
GrFontDict *m_pFonts;
|
|
Object m_oXObjectDict;
|
|
Object m_oColorSpaceDict;
|
|
Object m_oPatternDict;
|
|
Object m_oShadingDict;
|
|
Object m_oExtGStateDict;
|
|
GrResources *m_pNext;
|
|
|
|
GlobalParams *m_pGlobalParams;
|
|
};
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------------------
|
|
// Graphics
|
|
//-------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
class Graphics
|
|
{
|
|
public:
|
|
|
|
Graphics(GlobalParams *pGlobalParams, XRef *pXref, OutputDev *pOut, int nPageNumber, Dict *pResourcesDict, double dHorDPI, double dVerDPI, PDFRectangle *pBox, PDFRectangle *pCropBox, int nRotate, BOOL (*pAbortCheckCallBack)(void *pData) = NULL, void *pAbortCheckData = NULL);
|
|
|
|
Graphics(GlobalParams *pGlobalParams, XRef *pXref, OutputDev *pOut, Dict *pResourcesDict, PDFRectangle *pBox, PDFRectangle *pCropBox, BOOL (*pAbortCheckCallBack)(void *pData) = NULL, void *pAbortCheckData = NULL);
|
|
|
|
~Graphics();
|
|
|
|
// Èíèöèàëèçèðóåì Ïàðñåð ïî pObject, ïðåäâàðèòåëüíî ïðîâîäèì ïðîâåðêó: ßâëÿåòñÿ ëè pObject ïîòîêîì èëè ìàññèâîì ïîòîêîâ.
|
|
void Display(Object *pObject, BOOL bTopLevel = TRUE);
|
|
|
|
// Ðèñóåì annotation
|
|
void DrawAnnotation(Object *pStream, AnnotBorderStyle *pBorderStyle, double dMinX, double dMinY, double dMaxX, double dMaxY);
|
|
|
|
// Ñîõðàíÿåì GState.
|
|
void SaveGState();
|
|
|
|
// Âîññòàíàâëèâàåì ïðåäûäóùèé GState.
|
|
void RestoreGState();
|
|
|
|
// Ñ÷èòûâàåì òåêóùèé GState.
|
|
GrState *GetGState()
|
|
{
|
|
return m_pGState;
|
|
}
|
|
|
|
private:
|
|
|
|
void StartParse(BOOL bTopLevel);
|
|
void ExecuteOperator(Object *pCommand, Object arrArguments[], int nArgumentsCount);
|
|
Operator *FindOperator(char *sName);
|
|
BOOL CheckArgumentType(Object *pArgument, ArgType eType);
|
|
int GetPos();
|
|
|
|
// Graphics state
|
|
void OperatorSave (Object arrArguments[], int nArgumentsCount);
|
|
void OperatorRestore (Object arrArguments[], int nArgumentsCount);
|
|
void OperatorConcat (Object arrArguments[], int nArgumentsCount);
|
|
void OperatorSetDash (Object arrArguments[], int nArgumentsCount);
|
|
void OperatorSetFlat (Object arrArguments[], int nArgumentsCount);
|
|
void OperatorSetLineJoin (Object arrArguments[], int nArgumentsCount);
|
|
void OperatorSetLineCap (Object arrArguments[], int nArgumentsCount);
|
|
void OperatorSetMiterLimit (Object arrArguments[], int nArgumentsCount);
|
|
void OperatorSetLineWidth (Object arrArguments[], int nArgumentsCount);
|
|
void OperatorSetRenderingIntent(Object arrArguments[], int nArgumentsCount);
|
|
void OperatorSetExtGState (Object arrArguments[], int nArgumentsCount);
|
|
void MakeSoftMask(Object *pStream, BOOL bAlpha, GrColorSpace *pBlendingColorSpace, BOOL bIsolated, BOOL bKnockout, Function *pTransferFunc, GrColor *pBackdropColor);
|
|
|
|
// Colour spaces
|
|
void OperatorSetFillGray (Object arrArguments[], int nArgumentsCount);
|
|
void OperatorSetStrokeGray (Object arrArguments[], int nArgumentsCount);
|
|
void OperatorSetFillCMYKColor (Object arrArguments[], int nArgumentsCount);
|
|
void OperatorSetStrokeCMYKColor (Object arrArguments[], int nArgumentsCount);
|
|
void OperatorSetFillRGBColor (Object arrArguments[], int nArgumentsCount);
|
|
void OperatorSetStrokeRGBColor (Object arrArguments[], int nArgumentsCount);
|
|
void OperatorSetFillColorSpace (Object arrArguments[], int nArgumentsCount);
|
|
void OperatorSetStrokeColorSpace(Object arrArguments[], int nArgumentsCount);
|
|
void OperatorSetFillColor (Object arrArguments[], int nArgumentsCount);
|
|
void OperatorSetStrokeColor (Object arrArguments[], int nArgumentsCount);
|
|
void OperatorSetFillColorN (Object arrArguments[], int nArgumentsCount);
|
|
void OperatorSetStrokeColorN (Object arrArguments[], int nArgumentsCount);
|
|
|
|
// Path construction
|
|
void OperatorMoveTo (Object arrArguments[], int nArgumentsCount);
|
|
void OperatorLineTo (Object arrArguments[], int nArgumentsCount);
|
|
void OperatorCurveTo (Object arrArguments[], int nArgumentsCount);
|
|
void OperatorCurveTo1 (Object arrArguments[], int nArgumentsCount);
|
|
void OperatorCurveTo2 (Object arrArguments[], int nArgumentsCount);
|
|
void OperatorRectangle(Object arrArguments[], int nArgumentsCount);
|
|
void OperatorClosePath(Object arrArguments[], int nArgumentsCount);
|
|
|
|
// Path-painting
|
|
void OperatorEndPath (Object arrArguments[], int nArgumentsCount);
|
|
void OperatorStroke (Object arrArguments[], int nArgumentsCount);
|
|
void OperatorCloseStroke (Object arrArguments[], int nArgumentsCount);
|
|
void OperatorFill (Object arrArguments[], int nArgumentsCount);
|
|
void OperatorEOFill (Object arrArguments[], int nArgumentsCount);
|
|
void OperatorFillStroke (Object arrArguments[], int nArgumentsCount);
|
|
void OperatorCloseFillStroke (Object arrArguments[], int nArgumentsCount);
|
|
void OperatorEOFillStroke (Object arrArguments[], int nArgumentsCount);
|
|
void OperatorCloseEOFillStroke(Object arrArguments[], int nArgumentsCount);
|
|
void OperatorShadingFill (Object arrArguments[], int nArgumentsCount);
|
|
void DoPatternFill(BOOL bEOFill);
|
|
void DoPatternStroke();
|
|
void DoTilingPatternFill (GrTilingPattern *pPattern, BOOL bStroke, BOOL bEOFill);
|
|
void DoShadingPatternFill(GrShadingPattern *pPattern, BOOL bStroke, BOOL bEOFill);
|
|
void DoFunctionShadingFill(GrFunctionShading *pShading);
|
|
void DoFunctionShadingFill(GrFunctionShading *pShading, double dMinX, double dMinY, double dMaxX, double dMaxY, GrColor *pColors, int nDepth);
|
|
void DoAxialShadingFill (GrAxialShading *pShading);
|
|
void DoRadialShadingFill (GrRadialShading *pShading);
|
|
void DoGouraudTriangleShadingFill(GrGouraudTriangleShading *pShading);
|
|
void GouraudFillTriangle(double dAx, double dAy, GrColor *pColorA, double dBx, double dBy, GrColor *pColorB, double dCx, double dCy, GrColor *pColorC, int nComponentsCount, int nDepth);
|
|
void DoPatchMeshShadingFill(GrPatchMeshShading *pShading);
|
|
void MeshFillPatch(GrPatch *pPatch, int nComponentsCount, int nDepth);
|
|
void DoEndPath();
|
|
|
|
// Clipping paths
|
|
void OperatorClip (Object arrArguments[], int nArgumentsCount);
|
|
void OperatorEOClip(Object arrArguments[], int nArgumentsCount);
|
|
|
|
// Text objects
|
|
void OperatorBeginText(Object arrArguments[], int nArgumentsCount);
|
|
void OperatorEndText (Object arrArguments[], int nArgumentsCount);
|
|
|
|
// Text state
|
|
void OperatorSetCharSpacing (Object arrArguments[], int nArgumentsCount);
|
|
void OperatorSetFont (Object arrArguments[], int nArgumentsCount);
|
|
void OperatorSetTextLeading (Object arrArguments[], int nArgumentsCount);
|
|
void OperatorSetTextRender (Object arrArguments[], int nArgumentsCount);
|
|
void OperatorSetTextRise (Object arrArguments[], int nArgumentsCount);
|
|
void OperatorSetWordSpacing (Object arrArguments[], int nArgumentsCount);
|
|
void OperatorSetHorizScaling(Object arrArguments[], int nArgumentsCount);
|
|
|
|
// Text positioning
|
|
void OperatorTextMove (Object arrArguments[], int nArgumentsCount);
|
|
void OperatorTextMoveSet (Object arrArguments[], int nArgumentsCount);
|
|
void OperatorSetTextMatrix(Object arrArguments[], int nArgumentsCount);
|
|
void OperatorTextNextLine (Object arrArguments[], int nArgumentsCount);
|
|
|
|
// Text showing
|
|
void OperatorShowText (Object arrArguments[], int nArgumentsCount);
|
|
void OperatorMoveShowText (Object arrArguments[], int nArgumentsCount);
|
|
void OperatorMoveSetShowText(Object arrArguments[], int nArgumentsCount);
|
|
void OperatorShowSpaceText (Object arrArguments[], int nArgumentsCount);
|
|
void DoShowText(StringExt *seString);
|
|
|
|
// XObjects
|
|
void OperatorXObject(Object arrArguments[], int nArgumentsCount);
|
|
void DoImage(Object *pRef, Stream *pStream, BOOL bInlineImage);
|
|
void DoForm(Object *pStream);
|
|
void DoForm(Object *pStream, Dict *pResourcesDict, double *pMatrix, double *pBBox, BOOL bTranspGroup = FALSE, BOOL bSoftMask = FALSE, GrColorSpace *pBlendingColorSpace = NULL, BOOL bIsolated = FALSE, BOOL bKnockout = FALSE, BOOL bAlpha = FALSE, Function *pTransferFunctions = NULL, GrColor *pBackdropColor = NULL);
|
|
|
|
// Inline images
|
|
void OperatorBeginImage(Object arrArguments[], int nArgumentsCount);
|
|
void OperatorImageData (Object arrArguments[], int nArgumentsCount);
|
|
void OperatorEndImage (Object arrArguments[], int nArgumentsCount);
|
|
Stream *BuildImageStream();
|
|
|
|
// Type 3 fonts
|
|
void OperatorSetCharWidth (Object arrArguments[], int nArgumentsCount);
|
|
void OperatorSetCacheDevice(Object arrArguments[], int nArgumentsCount);
|
|
|
|
// Compatibility
|
|
void OperatorBeginIgnoreUndef(Object arrArguments[], int nArgumentsCount);
|
|
void OperatorEndIgnoreUndef (Object arrArguments[], int nArgumentsCount);
|
|
|
|
// Marked content
|
|
void OperatorBeginMarkedContent(Object arrArguments[], int nArgumentsCount);
|
|
void OperatorEndMarkedContent (Object arrArguments[], int nArgumentsCount);
|
|
void OperatorMarkPoint (Object arrArguments[], int nArgumentsCount);
|
|
|
|
void PushResources(Dict *pResourcesDict);
|
|
void PopResources();
|
|
|
|
private:
|
|
|
|
XRef *m_pXref; // Òàáëèöà Xref äëÿ äàííîãî PDF - äîêóìåíòà
|
|
OutputDev *m_pOut; // Output device
|
|
BOOL m_bSubPage; // Sub-page object?
|
|
BOOL m_bPrintCommands; // print the drawing commands (for debugging)
|
|
GrResources *m_pResources; // Resources
|
|
int m_nUpdateLevel;
|
|
|
|
GrState *m_pGState; // Òåêóùèé GState
|
|
BOOL m_bFontChanged; // True, åñëè øðèôò èëè òåêñòîâàÿ ìàòðèöà èçìåíèëèñü
|
|
GrClipType m_eClip; // Clip type
|
|
int m_nIgnoreUndef; // Òåêóùèé óðîâåíü âëîæåííîñòè äëÿ BX/EX
|
|
double m_arrBaseMatrix[6]; // Ñòàíäàðòíàÿ ìàòðèöà äëÿ ïîñëåäíèõ îáúåêòîâ Page/Form/Pattern
|
|
int m_nFormDepth;
|
|
|
|
Parser *m_pParser; // Ïàðñåð äëÿ ñîäåðæèìîãî ñòðàíèöû
|
|
|
|
BOOL (*m_pAbortCheckCallBack)(void *pData); // Ïðîâåðêà íà îòìåíó
|
|
void *m_pAbortCheckData;
|
|
|
|
static Operator OperatorsTable[]; // Òàáëèöà ãðàôè÷åñêèõ îïåðàòîðîâ
|
|
|
|
#ifdef _DEBUG
|
|
FILE *m_pDumpFile; // Ôàéë äëÿ ðàñïå÷àòêè êîìàíä, çàïèñàííûõ â PDF
|
|
#endif
|
|
|
|
GlobalParams *m_pGlobalParams;
|
|
};
|
|
|
|
#endif /* _GRAPHICS_H */
|