#ifndef _PDF_READER_GRAPHICS_H #define _PDF_READER_GRAPHICS_H #include "GlobalParams.h" namespace PdfReader { 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? 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 // _PDF_READER_GRAPHICS_H