Files
core/PdfReader/Src/Graphics.h
Ilya.Kirillov 65d72ae4ec Убраны лишние файлы. Все файлы сконвертированы в UTF8.
git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@62550 954022d7-b5bf-4e40-9824-e11837661b57
2016-05-21 00:02:55 +03:00

294 lines
12 KiB
C++

#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