Files
core/ASCOfficePDFReader/GState.h

2408 lines
60 KiB
C++

#ifndef _GSTATE_H
#define _GSTATE_H
#include "Object.h"
#include "Function.h"
#include <math.h>
class Array;
class GrFont;
class PDFRectangle;
class GrShading;
//-------------------------------------------------------------------------------------------------------------------------------
// GraphicsBlendMode
//-------------------------------------------------------------------------------------------------------------------------------
enum GraphicsBlendMode
{
grBlendNormal,
grBlendMultiply,
grBlendScreen,
grBlendOverlay,
grBlendDarken,
grBlendLighten,
grBlendColorDodge,
grBlendColorBurn,
grBlendHardLight,
grBlendSoftLight,
grBlendDifference,
grBlendExclusion,
grBlendHue,
grBlendSaturation,
grBlendColor,
grBlendLuminosity
};
//-------------------------------------------------------------------------------------------------------------------------------
// GrColorComp
//-------------------------------------------------------------------------------------------------------------------------------
// 16.16
typedef int GrColorComp;
#define GrColorComp1 0x10000
static inline GrColorComp DoubleToColor(double dValue)
{
return (GrColorComp)(dValue * GrColorComp1);
}
static inline double ColorToDouble(GrColorComp nColor)
{
return (double)nColor / (double)GrColorComp1;
}
static inline GrColorComp ByteToColor(unsigned char nByte)
{
// (nByte / 255) << 16 = (0.0000000100000001... * nByte) << 16
// = ((nByte << 8) + (nByte) + (nByte >> 8) + ...) << 16
// = (nByte << 8) + (nByte) + (nByte >> 7)
// [äëÿ îêðóãëåíèÿ]
return (GrColorComp)( ( nByte << 8 ) + nByte + ( nByte >> 7 ) );
}
static inline unsigned char ColorToByte(GrColorComp nColor)
{
// 255 * nColor + 0.5 = 256 * nColor - nColor + 0x8000
return (unsigned char)( ( ( nColor << 8) - nColor + 0x8000 ) >> 16 );
}
//-------------------------------------------------------------------------------------------------------------------------------
// GrColor
//-------------------------------------------------------------------------------------------------------------------------------
#define GrColorMaxComps funcMaxOutputs
struct GrColor
{
GrColorComp arrComp[GrColorMaxComps];
};
//-------------------------------------------------------------------------------------------------------------------------------
// GrGray
//-------------------------------------------------------------------------------------------------------------------------------
typedef GrColorComp GrGray;
//-------------------------------------------------------------------------------------------------------------------------------
// GrRGB
//-------------------------------------------------------------------------------------------------------------------------------
struct GrRGB
{
GrColorComp r, g, b;
};
//------------------------------------------------------------------------
// GrCMYK
//------------------------------------------------------------------------
struct GrCMYK
{
GrColorComp c, m, y, k;
};
//-------------------------------------------------------------------------------------------------------------------------------
// GrColorSpace
//-------------------------------------------------------------------------------------------------------------------------------
// Êîíñòàíòû GrColorSpaceModes è ìàññèâ GrColorSpaceModeNames, îïðåäåëåííûé
// â GState.cpp äîëæíû ñîâïàäàòü.
enum GrColorSpaceMode
{
csDeviceGray,
csCalGray,
csDeviceRGB,
csCalRGB,
csDeviceCMYK,
csLab,
csICCBased,
csIndexed,
csSeparation,
csDeviceN,
csPattern
};
class GrColorSpace
{
public:
GrColorSpace();
virtual ~GrColorSpace();
virtual GrColorSpace *Copy() = 0;
virtual GrColorSpaceMode GetMode() = 0;
static GrColorSpace *Parse(Object *pColorSpaceObject);
// Êîíâåðòèðóåì â -> Gray, RGB, èëè CMYK.
virtual void GetGray(GrColor *pColor, GrGray *pGray) = 0;
virtual void GetRGB (GrColor *pColor, GrRGB *pRGB) = 0;
virtual void GetCMYK(GrColor *pColor, GrCMYK *pCMYK) = 0;
// Êîëè÷åñòâî êîìïîíåíò.
virtual int GetComponentsCount() = 0;
// Ïîëó÷àåì ñòàíäàðòíîå çíà÷åíèå öâåòà â äàííîì öâåòîâîì ïðîñòðàíñòâå.
virtual void GetDefaultColor(GrColor *pColor) = 0;
// Ñòàíäàðòíûå ãðàíèö÷íûå çíà÷åíèÿ äëÿ êàæäîé êîìïîíåíòû ïèêñåëÿ, ãäå nMaxImagePixelValue - ìàêñèìàëüíîå çíà÷åíèå ïèêñåëÿ.
virtual void GetDefaultRanges(double *pDecodeLow, double *pDecodeRange, int nMaxImagePixelValue);
// True, åñëè â äàííîì öâåòîâîì ïðîñòðàíñòâå íà ñòðàíèöå íè÷åãî íå íàðèñîâàíî.
virtual BOOL IsNonMarking()
{
return FALSE;
}
// ×èñëî ðàçëè÷íûõ öâåòîâûõ ïðîñòðàíñòâ.
static int GetColorSpaceModesCount();
// Èìÿ ñîîòâåòñòâóþùåãî öâåòîâîãî ïðîñòðàíñòâà.
static char *GetColorSpaceModeName(int nIndex);
DWORD GetDwordColor(GrColor *pColor)
{
GrRGB oRGB;
GetRGB( pColor, &oRGB );
BYTE nR = ColorToByte(oRGB.r);
BYTE nG = ColorToByte(oRGB.g);
BYTE nB = ColorToByte(oRGB.b);
return ( (nB << 16) | (nG << 8) | nR );
}
private:
};
//-------------------------------------------------------------------------------------------------------------------------------
// GrDeviceGrayColorSpace
//-------------------------------------------------------------------------------------------------------------------------------
class GrDeviceGrayColorSpace: public GrColorSpace
{
public:
GrDeviceGrayColorSpace();
virtual ~GrDeviceGrayColorSpace();
virtual GrColorSpace *Copy();
virtual GrColorSpaceMode GetMode()
{
return csDeviceGray;
}
virtual void GetGray(GrColor *pColor, GrGray *pGray);
virtual void GetRGB (GrColor *pColor, GrRGB *pRGB);
virtual void GetCMYK(GrColor *pColor, GrCMYK *pCMYK);
virtual int GetComponentsCount()
{
return 1;
}
virtual void GetDefaultColor(GrColor *pColor);
private:
};
//-------------------------------------------------------------------------------------------------------------------------------
// GrCalGrayColorSpace
//-------------------------------------------------------------------------------------------------------------------------------
class GrCalGrayColorSpace: public GrColorSpace
{
public:
GrCalGrayColorSpace();
virtual ~GrCalGrayColorSpace();
virtual GrColorSpace *Copy();
virtual GrColorSpaceMode GetMode()
{
return csCalGray;
}
static GrColorSpace *Parse(Array *pArray);
virtual void GetGray(GrColor *pColor, GrGray *pGray);
virtual void GetRGB (GrColor *pColor, GrRGB *pRGB);
virtual void GetCMYK(GrColor *pColor, GrCMYK *pCMYK);
virtual int GetComponentsCount()
{
return 1;
}
virtual void GetDefaultColor(GrColor *pColor);
// Âîçâðàùàåì çíà÷åíèÿ, ñïåöèôè÷íûå ïðîñòðàíñòâó CalGray.
double GetWhiteX()
{
return m_dWhiteX;
}
double GetWhiteY()
{
return m_dWhiteY;
}
double GetWhiteZ()
{
return m_dWhiteZ;
}
double GetBlackX()
{
return m_dBlackX;
}
double GetBlackY()
{
return m_dBlackY;
}
double GetBlackZ()
{
return m_dBlackZ;
}
double GetGamma()
{
return m_dGamma;
}
private:
double m_dWhiteX; //
double m_dWhiteY; // White point
double m_dWhiteZ; //
double m_dBlackX; //
double m_dBlackY; // Black point
double m_dBlackZ; //
double m_dGamma; // Gamma
};
//-------------------------------------------------------------------------------------------------------------------------------
// GrDeviceRGBColorSpace
//-------------------------------------------------------------------------------------------------------------------------------
class GrDeviceRGBColorSpace: public GrColorSpace
{
public:
GrDeviceRGBColorSpace();
virtual ~GrDeviceRGBColorSpace();
virtual GrColorSpace *Copy();
virtual GrColorSpaceMode GetMode()
{
return csDeviceRGB;
}
virtual void GetGray(GrColor *pColor, GrGray *pGray);
virtual void GetRGB (GrColor *pColor, GrRGB *pRGB);
virtual void GetCMYK(GrColor *pColor, GrCMYK *pCMYK);
virtual int GetComponentsCount()
{
return 3;
}
virtual void GetDefaultColor(GrColor *pColor);
private:
};
//-------------------------------------------------------------------------------------------------------------------------------
// GrCalRGBColorSpace
//-------------------------------------------------------------------------------------------------------------------------------
class GrCalRGBColorSpace: public GrColorSpace
{
public:
GrCalRGBColorSpace();
virtual ~GrCalRGBColorSpace();
virtual GrColorSpace *Copy();
virtual GrColorSpaceMode GetMode()
{
return csCalRGB;
}
static GrColorSpace *Parse(Array *pArray);
virtual void GetGray(GrColor *pColor, GrGray *pGray);
virtual void GetRGB (GrColor *pColor, GrRGB *pRGB);
virtual void GetCMYK(GrColor *pColor, GrCMYK *pCMYK);
virtual int GetComponentsCount()
{
return 3;
}
virtual void GetDefaultColor(GrColor *pColor);
// Âîçâðàùàåì çíà÷åíèÿ, ñïåöèôè÷íûå ïðîñòðàíñòâó CalRBG.
double GetWhiteX()
{
return m_dWhiteX;
}
double GetWhiteY()
{
return m_dWhiteY;
}
double GetWhiteZ()
{
return m_dWhiteZ;
}
double GetBlackX()
{
return m_dBlackX;
}
double GetBlackY()
{
return m_dBlackY;
}
double GetBlackZ()
{
return m_dBlackZ;
}
double GetGammaR()
{
return m_dGammaR;
}
double GetGammaG()
{
return m_dGammaG;
}
double GetGammaB()
{
return m_dGammaB;
}
double *GetMatrix()
{
return m_arrdMatrix;
}
private:
double m_dWhiteX; //
double m_dWhiteY; // White point
double m_dWhiteZ; //
double m_dBlackX; //
double m_dBlackY; // Black point
double m_dBlackZ; //
double m_dGammaR; //
double m_dGammaG; // Gamma
double m_dGammaB; //
double m_arrdMatrix[9]; // Ìàòðèöà ïðåîáðàçîâàíèÿ: ABC -> XYZ
};
//-------------------------------------------------------------------------------------------------------------------------------
// GrDeviceCMYKColorSpace
//-------------------------------------------------------------------------------------------------------------------------------
class GrDeviceCMYKColorSpace: public GrColorSpace
{
public:
GrDeviceCMYKColorSpace();
virtual ~GrDeviceCMYKColorSpace();
virtual GrColorSpace *Copy();
virtual GrColorSpaceMode GetMode()
{
return csDeviceCMYK;
}
virtual void GetGray(GrColor *pColor, GrGray *pGray);
virtual void GetRGB (GrColor *pColor, GrRGB *pRGB);
virtual void GetCMYK(GrColor *pColor, GrCMYK *pCMYK);
virtual int GetComponentsCount()
{
return 4;
}
virtual void GetDefaultColor(GrColor *pColor);
private:
};
//-------------------------------------------------------------------------------------------------------------------------------
// GrLabColorSpace
//-------------------------------------------------------------------------------------------------------------------------------
class GrLabColorSpace: public GrColorSpace
{
public:
GrLabColorSpace();
virtual ~GrLabColorSpace();
virtual GrColorSpace *Copy();
virtual GrColorSpaceMode GetMode()
{
return csLab;
}
static GrColorSpace *Parse(Array *pArray);
virtual void GetGray(GrColor *pColor, GrGray *pGray);
virtual void GetRGB (GrColor *pColor, GrRGB *pRGB);
virtual void GetCMYK(GrColor *pColor, GrCMYK *pCMYK);
virtual int GetComponentsCount()
{
return 3;
}
virtual void GetDefaultColor(GrColor *pColor);
virtual void GetDefaultRanges(double *pDecodeLow, double *pDecodeRange, int nMaxImagePixelValue);
// Âîçâðàùàåì çíà÷åíèÿ, ñïåöèôè÷íûå ïðîñòðàíñòâó Lab.
double GetWhiteX()
{
return m_dWhiteX;
}
double GetWhiteY()
{
return m_dWhiteY;
}
double GetWhiteZ()
{
return m_dWhiteZ;
}
double GetBlackX()
{
return m_dBlackX;
}
double GetBlackY()
{
return m_dBlackY;
}
double GetBlackZ()
{
return m_dBlackZ;
}
double GetMinA()
{
return m_dMinA;
}
double GetMaxA()
{
return m_dMaxA;
}
double GetMinB()
{
return m_dMinB;
}
double GetMaxB()
{
return m_dMaxB;
}
private:
double m_dWhiteX; //
double m_dWhiteY; // White point
double m_dWhiteZ; //
double m_dBlackX; //
double m_dBlackY; // Black point
double m_dBlackZ; //
double m_dMinA; //
double m_dMaxA; // Ãðàíèöû äëÿ êîìïîíåíò À è Â
double m_dMinB; //
double m_dMaxB; //
double m_dMultR; //
double m_dMultG; // Äîïîëíèòåëüíûå ñîìíîæèòåëè
double m_dMultB; //
};
//-------------------------------------------------------------------------------------------------------------------------------
// GrICCBasedColorSpace
//-------------------------------------------------------------------------------------------------------------------------------
class GrICCBasedColorSpace: public GrColorSpace
{
public:
GrICCBasedColorSpace(int nCompontnsCount, GrColorSpace *pAlternate, Ref *pICCProfileStream);
virtual ~GrICCBasedColorSpace();
virtual GrColorSpace *Copy();
virtual GrColorSpaceMode GetMode()
{
return csICCBased;
}
static GrColorSpace *Parse(Array *pArray);
virtual void GetGray(GrColor *pColor, GrGray *pGray);
virtual void GetRGB (GrColor *pColor, GrRGB *pRGB);
virtual void GetCMYK(GrColor *pColor, GrCMYK *pCMYK);
virtual int GetComponentsCount()
{
return m_nComponentsCount;
}
virtual void GetDefaultColor(GrColor *pColor);
virtual void GetDefaultRanges(double *pDecodeLow, double *pDecodeRange, int nMaxImagePixelValue);
// Âîçâðàùàåì çíà÷åíèÿ, ñïåöèôè÷íûå ïðîñòðàíñòâó Lab.
GrColorSpace *GetAlternate()
{
return m_pAlternate;
}
private:
int m_nComponentsCount; // ×èñëî êîìïîíåíò öâåòà (1, 3, or 4)
GrColorSpace *m_pAlternate; // Àëüòåðíàòèâíîå öâåòîâîå ïðîñòðàíñòâî
double m_arrdRangeMin[4]; // Ìèíèìàëüíûå çíà÷åíèÿ äëÿ êàæäîé êîìïîíåíòû
double m_arrdRangeMax[4]; // Ìàêñèìàëüíûå çíà÷åíèÿ äëÿ êàæäîé êîìïîíåíòû
Ref m_oICCProfileStream; // ICC
};
//-------------------------------------------------------------------------------------------------------------------------------
// GrIndexedColorSpace
//-------------------------------------------------------------------------------------------------------------------------------
class GrIndexedColorSpace: public GrColorSpace
{
public:
GrIndexedColorSpace(GrColorSpace *pBase, int nHival);
virtual ~GrIndexedColorSpace();
virtual GrColorSpace *Copy();
virtual GrColorSpaceMode GetMode()
{
return csIndexed;
}
static GrColorSpace *Parse(Array *pArray);
virtual void GetGray(GrColor *pColor, GrGray *pGray);
virtual void GetRGB (GrColor *pColor, GrRGB *pRGB);
virtual void GetCMYK(GrColor *pColor, GrCMYK *pCMYK);
virtual int GetComponentsCount()
{
return 1;
}
virtual void GetDefaultColor(GrColor *pColor);
virtual void GetDefaultRanges(double *pDecodeLow, double *pDecodeRange, int nMaxImagePixelValue);
// Âîçâðàùàåì çíà÷åíèÿ, ñïåöèôè÷íûå ïðîñòðàíñòâó Indexed.
GrColorSpace *GetBase()
{
return m_pBase;
}
int GetHival()
{
return m_nHival;
}
unsigned char *GetLookup()
{
return m_pLookup;
}
private:
GrColor *MapColorToBase(GrColor *pColor, GrColor *pBaseColor);
private:
GrColorSpace *m_pBase; // Áàçîâîå öâåòîâîå ïðîñòðàíñòâî
int m_nHival; // Hival = max valid index value
unsigned char *m_pLookup; // Òàáëèöà öâåòîâ
};
//-------------------------------------------------------------------------------------------------------------------------------
// GrSeparationColorSpace
//-------------------------------------------------------------------------------------------------------------------------------
class GrSeparationColorSpace: public GrColorSpace
{
public:
GrSeparationColorSpace(StringExt *seName, GrColorSpace *pAlternate, Function *pFunction);
virtual ~GrSeparationColorSpace();
virtual GrColorSpace *Copy();
virtual GrColorSpaceMode GetMode()
{
return csSeparation;
}
static GrColorSpace *Parse(Array *pArray);
virtual void GetGray(GrColor *pColor, GrGray *pGray);
virtual void GetRGB (GrColor *pColor, GrRGB *pRGB);
virtual void GetCMYK(GrColor *pColor, GrCMYK *pCMYK);
virtual int GetComponentsCount()
{
return 1;
}
virtual void GetDefaultColor(GrColor *pColor);
virtual BOOL IsNonMarking()
{
return m_bNonMarking;
}
// Âîçâðàùàåì çíà÷åíèÿ, ñïåöèôè÷íûå ïðîñòðàíñòâó Separation.
StringExt *GetName()
{
return m_seName;
}
GrColorSpace *GetAlternateSpace()
{
return m_pAlternateSpace;
}
Function *GetTransformFunction()
{
return m_pFunction;
}
private:
StringExt *m_seName; // Color space family name
GrColorSpace *m_pAlternateSpace; // Àëüòåðíàòèâíîå öâåòîâîå ïðîñòðàíñòâî
Function *m_pFunction; // tintTransform ( ôóíêöèÿ ïðåîáðàçîâàíèÿ â àëüòåðíàòèâíîå ïðîñòðàíñòâî)
BOOL m_bNonMarking; // Áóäåò ëè âèäèìîé ãðàôèêà, èñïîëüçóþùàÿ äàííîå öâåòîâîå ïðîñòðàíñòâî
};
//-------------------------------------------------------------------------------------------------------------------------------
// GrDeviceNColorSpace
//-------------------------------------------------------------------------------------------------------------------------------
class GrDeviceNColorSpace: public GrColorSpace
{
public:
GrDeviceNColorSpace(int nComponentsCount, GrColorSpace *pAlternate, Function *pFunction);
virtual ~GrDeviceNColorSpace();
virtual GrColorSpace *Copy();
virtual GrColorSpaceMode GetMode()
{
return csDeviceN;
}
static GrColorSpace *Parse(Array *pArray);
virtual void GetGray(GrColor *pColor, GrGray *pGray);
virtual void GetRGB (GrColor *pColor, GrRGB *pRGB);
virtual void GetCMYK(GrColor *pColor, GrCMYK *pCMYK);
virtual int GetComponentsCount()
{
return m_nComponentsCount;
}
virtual void GetDefaultColor(GrColor *pColor);
virtual BOOL IsNonMarking()
{
return m_bNonMarking;
}
// Âîçâðàùàåì çíà÷åíèÿ, ñïåöèôè÷íûå ïðîñòðàíñòâó DeviceN.
StringExt *GetColorantName(int nIndex)
{
return m_arrseNames[nIndex];
}
GrColorSpace *GetAlternateColor()
{
return m_pAlternateSpace;
}
Function *GetTransformFunction()
{
return m_pFunction;
}
private:
int m_nComponentsCount; // ×èñëî êîìïîíåíò
StringExt *m_arrseNames[GrColorMaxComps]; // Îáúåêòû òèïà "Name" îïðåäåëÿþùèå êàæäóþ öâåòîâóþ êîìïîíåíòó
GrColorSpace *m_pAlternateSpace; // Àëüòåðíàòèâíîå öâåòîâîå ïðîñòðàíñòâî
Function *m_pFunction; // tintTransform ( ôóíêöèÿ ïðåîáðàçîâàíèÿ â àëüòåðíàòèâíîå ïðîñòðàíñòâî)
BOOL m_bNonMarking; // Áóäåò ëè âèäèìîé ãðàôèêà, èñïîëüçóþùàÿ äàííîå öâåòîâîå ïðîñòðàíñòâî
};
//-------------------------------------------------------------------------------------------------------------------------------
// GrPatternColorSpace
//-------------------------------------------------------------------------------------------------------------------------------
class GrPatternColorSpace: public GrColorSpace
{
public:
GrPatternColorSpace(GrColorSpace *pUnder);
virtual ~GrPatternColorSpace();
virtual GrColorSpace *Copy();
virtual GrColorSpaceMode GetMode()
{
return csPattern;
}
static GrColorSpace *Parse(Array *pArray);
virtual void GetGray(GrColor *pColor, GrGray *pGray);
virtual void GetRGB (GrColor *pColor, GrRGB *pRGB);
virtual void GetCMYK(GrColor *pColor, GrCMYK *pCMYK);
virtual int GetComponentsCount()
{
return 0;
}
virtual void GetDefaultColor(GrColor *pColor);
// Âîçâðàùàåì çíà÷åíèÿ, ñïåöèôè÷íûå ïðîñòðàíñòâó Pattern.
GrColorSpace *GetUnder()
{
return m_pUnder;
}
private:
GrColorSpace *m_pUnder; // Öâåòîâîå ïðîñòðàíñòâî ïîäêëàäêè (äëÿ íå öâåòîâûõ Patterns)
};
//-------------------------------------------------------------------------------------------------------------------------------
// GrPattern
//-------------------------------------------------------------------------------------------------------------------------------
class GrPattern
{
public:
GrPattern(int nType);
virtual ~GrPattern();
static GrPattern *Parse(Object *pObject);
virtual GrPattern *Copy() = 0;
int GetType()
{
return m_nType;
}
private:
int m_nType;
};
//-------------------------------------------------------------------------------------------------------------------------------
// GrTilingPattern
//-------------------------------------------------------------------------------------------------------------------------------
class GrTilingPattern: public GrPattern
{
public:
static GrTilingPattern *Parse(Object *pPatternObject);
virtual ~GrTilingPattern();
virtual GrPattern *Copy();
int GetPaintType()
{
return m_nPaintType;
}
int GetTilingType()
{
return m_nTilingType;
}
double *GetBBox()
{
return m_arrBBox;
}
double GetXStep()
{
return m_dXStep;
}
double GetYStep()
{
return m_dYStep;
}
Dict *GetResourcesDict()
{
return m_oResources.IsDict() ? m_oResources.GetDict() : (Dict *)NULL;
}
double *GetMatrix()
{
return m_arrMatrix;
}
Object *GetContentStream()
{
return &m_oContentStream;
}
private:
GrTilingPattern(int nPaintType, int nTilingType, double *pBBox, double dXStep, double dYStep, Object *pResources, double *pMatrix, Object *pContentStream);
private:
int m_nPaintType;
int m_nTilingType;
double m_arrBBox[4];
double m_dXStep;
double m_dYStep;
Object m_oResources;
double m_arrMatrix[6];
Object m_oContentStream;
};
//-------------------------------------------------------------------------------------------------------------------------------
// GrShadingPattern
//-------------------------------------------------------------------------------------------------------------------------------
class GrShadingPattern: public GrPattern
{
public:
static GrShadingPattern *Parse(Object *pPatternObject);
virtual ~GrShadingPattern();
virtual GrPattern *Copy();
GrShading *GetShading()
{
return m_pShading;
}
double *GetMatrix()
{
return m_arrMatrix;
}
private:
GrShadingPattern(GrShading *pShading, double *pMatrix);
private:
GrShading *m_pShading; // Ñàì îáúåêò Shading
double m_arrMatrix[6]; // Pattern matrix
};
//-------------------------------------------------------------------------------------------------------------------------------
// GrShading
//-------------------------------------------------------------------------------------------------------------------------------
class GrShading
{
public:
GrShading(int nType);
GrShading(GrShading *pShading);
virtual ~GrShading();
static GrShading *Parse(Object *pObject);
virtual GrShading *Copy() = 0;
int GetType()
{
return m_nType;
}
GrColorSpace *GetColorSpace()
{
return m_pColorSpace;
}
GrColor *GetBackground()
{
return &m_oBackground;
}
BOOL GetHasBackground()
{
return m_bHasBackground;
}
void GetBBox(double *pdXMin, double *pdYMin, double *pdXMax, double *pdYMax)
{
*pdXMin = m_dXMin;
*pdYMin = m_dYMin;
*pdXMax = m_dXMax;
*pdYMax = m_dYMax;
}
BOOL GetHasBBox()
{
return m_bHasBBox;
}
protected:
BOOL Initialize(Dict *pDict);
protected:
int m_nType; // Òèï
GrColorSpace *m_pColorSpace; // Öâåòîâîå ïðîñòðàíñòâî, â êîòîðîì ðèñóåì
GrColor m_oBackground; // Öâåò ïîäêëàäêè, åñëè îíà åñòü
BOOL m_bHasBackground; // Åñòü ëè ïîäêëàäêà?
double m_dXMin; //
double m_dYMin; // BBox
double m_dXMax; //
double m_dYMax; //
BOOL m_bHasBBox; // Çàäàí ëè BBox?
};
//-------------------------------------------------------------------------------------------------------------------------------
// GrFunctionShading
//-------------------------------------------------------------------------------------------------------------------------------
class GrFunctionShading: public GrShading
{
public:
GrFunctionShading(double dMinX, double dMinY, double dMaxX, double dMaxY, double *pMatrix, Function **ppFunctions, int nFuncsCount);
GrFunctionShading(GrFunctionShading *pShading);
virtual ~GrFunctionShading();
static GrFunctionShading *Parse(Dict *pDict);
virtual GrShading *Copy();
void GetDomain(double *pdMinX, double *pdMinY, double *pdMaxX, double *pdMaxY)
{
*pdMinX = m_dDomainMinX;
*pdMinY = m_dDomainMinY;
*pdMaxX = m_dDomainMaxX;
*pdMaxY = m_dDomainMaxY;
}
double *GetMatrix()
{
return m_arrMatrix;
}
int GetFunctionsCount()
{
return m_nFunctionsCount;
}
Function *GetFunction(int nIndex)
{
return m_arrFunctions[nIndex];
}
void GetColor(double dX, double dY, GrColor *pColor);
private:
double m_dDomainMinX; //
double m_dDomainMinY; // Domain
double m_dDomainMaxX; //
double m_dDomainMaxY; //
double m_arrMatrix[6]; // Ìàòðèöà ïðåîáðàçîâàíèÿ è ïðîñòðàíñòâà, îïðåäåëåííîãî Domain, â òåêóùåå ïðîñòðàíñòâî Shading
Function *m_arrFunctions[GrColorMaxComps];
int m_nFunctionsCount;
};
//-------------------------------------------------------------------------------------------------------------------------------
// GrAxialShading
//-------------------------------------------------------------------------------------------------------------------------------
class GrAxialShading: public GrShading
{
public:
GrAxialShading(double dX0, double dY0, double dX1, double dY1, double dT0, double dT1, Function **ppFunctions, int nFuncsCount, BOOL bExtendStart, BOOL bExtendEnd);
GrAxialShading(GrAxialShading *pShading);
virtual ~GrAxialShading();
static GrAxialShading *Parse(Dict *pDict);
virtual GrShading *Copy();
void GetCoords(double *pdX0, double *pdY0, double *pdX1, double *pdY1)
{
*pdX0 = m_dAxisX0;
*pdY0 = m_dAxisY0;
*pdX1 = m_dAxisX1;
*pdY1 = m_dAxisY1;
}
double GetDomain0()
{
return m_dT0;
}
double GetDomain1()
{
return m_dT1;
}
BOOL GetExtendStart()
{
return m_bExtendStart;
}
BOOL GetExtendEnd()
{
return m_bExtendEnd;
}
int GetFunctionsCount()
{
return m_nFunctionsCount;
}
Function *GetFunctions(int nIndex)
{
return m_arrFunctions[nIndex];
}
void GetColor(double dT, GrColor *pColor);
private:
double m_dAxisX0; // Íà÷àëüíàÿ òî÷êà âåêòîðà
double m_dAxisY0; //
double m_dAxisX1; // Êîíå÷íàÿ òî÷êà âåêòîðà
double m_dAxisY1; //
double m_dT0; // Ïðåäåëû ïàðàìåòðà t(ïàðàìåòðèçàöèÿ îñè)
double m_dT1;
Function *m_arrFunctions[GrColorMaxComps];
int m_nFunctionsCount;
BOOL m_bExtendStart; // Ïðîäîëæàòü ëè çà íà÷àëüíóþ òî÷êó îñè
BOOL m_bExtendEnd; // Ïðîäîëæàòü ëè çà êîíå÷íóþ òî÷êó îñè
};
//-------------------------------------------------------------------------------------------------------------------------------
// GrRadialShading
//-------------------------------------------------------------------------------------------------------------------------------
class GrRadialShading: public GrShading
{
public:
GrRadialShading(double dFirstX, double dFirstY, double dFirstRad, double dSecondX, double dSecondY, double dSecondRad, double dT0, double dT1, Function **ppFunctions, int nFuncsCount, BOOL bExtendFirst, BOOL bExtendSecond);
GrRadialShading(GrRadialShading *pShading);
virtual ~GrRadialShading();
static GrRadialShading *Parse(Dict *pDict);
virtual GrShading *Copy();
void GetCoords(double *pdFirstX, double *pdFirstY, double *pdFirstRad, double *pdSecondX, double *pdSecondY, double *pdSecondRad)
{
*pdFirstX = m_dFirstX;
*pdFirstY = m_dFirstY;
*pdFirstRad = m_dFirstRad;
*pdSecondX = m_dSecondX;
*pdSecondY = m_dSecondY;
*pdSecondRad = m_dSecondRad;
}
double GetDomain0()
{
return m_dT0;
}
double GetDomain1()
{
return m_dT1;
}
BOOL GetExtendFirst()
{
return m_bExtendFirst;
}
BOOL GetExtendSecond()
{
return m_bExtendSecond;
}
int GetFunctionsCount()
{
return m_nFunctionsCount;
}
Function *GetFunctions(int nIndex)
{
return m_arrFunctions[nIndex];
}
void GetColor(double dT, GrColor *pColor);
private:
double m_dFirstX; // Êîîðäèíàòû öåíòðà ïåðâîé îêðóæíîñòè
double m_dFirstY; //
double m_dFirstRad; // Ðàäèóñ ïåðâîé îêðóæíîñòè
double m_dSecondX; // Êîîðäèíàòû öåíòðà âòîðîé îêðóæíîñòè
double m_dSecondY; //
double m_dSecondRad; // Ðàäèóñ âòîðîé îêðóæíîñòè
double m_dT0; // Ãðàíèöû ïàðàìåòðà t
double m_dT1; //
Function *m_arrFunctions[GrColorMaxComps];
int m_nFunctionsCount;
BOOL m_bExtendFirst; // Ïðîäîëæàòü ëè ðèñîâàòü çà ïåðâûé êðóã
BOOL m_bExtendSecond; // Ïðîäîëæàòü ëè ðèñîâàòü çà âòîðîé êðóã
};
//-------------------------------------------------------------------------------------------------------------------------------
// GrGouraudTriangleShading
//-------------------------------------------------------------------------------------------------------------------------------
struct GrGouraudVertex
{
double dX; // Êîîðäèíàòû âåðøèíû
double dY; //
GrColor oColor; // Öâåò
};
class GrGouraudTriangleShading: public GrShading
{
public:
GrGouraudTriangleShading(int nType, GrGouraudVertex *pVertexes, int nVertexsCount, int (*pTriangles)[3], int nTrianglesCount, Function **ppFunctions, int nFunctionsCount);
GrGouraudTriangleShading(GrGouraudTriangleShading *pShading);
virtual ~GrGouraudTriangleShading();
static GrGouraudTriangleShading *Parse(int nType, Dict *pDict, Stream *pStream);
virtual GrShading *Copy();
int GetTrianglesCount()
{
return m_nTrianglesCount;
}
void GetTriangle(int nIndex, double *pdX0, double *pdY0, GrColor *pColor0, double *pdX1, double *pdY1, GrColor *pColor1, double *pdX2, double *pdY2, GrColor *pColor2);
private:
GrGouraudVertex *m_arrVertexs; // Ìàññèâ âñåõ âåðøèí
int m_nVertexsCount; // Êîëè÷åñòâî âåðøèí
int (*m_arrTriangles)[3]; // Ìàññèâ òðåóãîëüíèêîâ(òðåóãîëüíèê îïðåäåëÿåòñÿ ïî íîìåðàì âåðøèí)
int m_nTrianglesCount; // Êîëè÷åñòâî òðåóãîëüíèêîâ
Function *m_ppFunctions[GrColorMaxComps]; // Ôóíêöèè
int m_nFunctionsCount; // Êîëè÷åñòâî ôóíêöèé
};
//-------------------------------------------------------------------------------------------------------------------------------
// GrPatchMeshShading
//-------------------------------------------------------------------------------------------------------------------------------
struct GrPatch
{
double arrX[4][4];
double arrY[4][4];
GrColor arrColor[2][2];
};
class GrPatchMeshShading: public GrShading
{
public:
GrPatchMeshShading(int nType, GrPatch *pPatches, int nPatchesCount, Function **ppFuntions, int nFunctionsCount);
GrPatchMeshShading(GrPatchMeshShading *pShading);
virtual ~GrPatchMeshShading();
static GrPatchMeshShading *Parse(int nType, Dict *pDict, Stream *pStream);
virtual GrShading *Copy();
int GetPatchesCount()
{
return m_nPatchesCount;
}
GrPatch *GetPatch(int nIndex)
{
return &m_pPatches[nIndex];
}
private:
GrPatch *m_pPatches; // Ìàññèâ ÷àñòåé
int m_nPatchesCount; // Êîëè÷åñòâî ÷àñòåé
Function *m_ppFunctions[GrColorMaxComps]; // Ìàññèâ ôóíêöèé
int m_nFunctionsCount; // Êîëè÷åñòâî ôóíêöèé
};
//-------------------------------------------------------------------------------------------------------------------------------
// GrImageColorMap
//-------------------------------------------------------------------------------------------------------------------------------
class GrImageColorMap
{
public:
GrImageColorMap(int nBitsPerComponent, Object *pDecode, GrColorSpace *pColorSpace);
~GrImageColorMap();
GrImageColorMap *Copy()
{
return new GrImageColorMap(this);
}
BOOL IsValid()
{
return m_bSuccess;
}
GrColorSpace *GetColorSpace()
{
return m_pColorSpace;
}
int GetComponentsCount()
{
return m_nComponentsCount;
}
int GetBitsPerComponent()
{
return m_nBitsPerComponent;
}
double GetDecodeLow(int nIndex)
{
return m_arrDecodeLow[nIndex];
}
double GetDecodeHigh(int nIndex)
{
return m_arrDecodeLow[nIndex] + m_arrDecodeRange[nIndex];
}
void GetGray (unsigned char *pColorValue, GrGray *pGray);
void GetRGB (unsigned char *pColorValue, GrRGB *pRGB);
void GetCMYK (unsigned char *pColorValue, GrCMYK *pCMYK);
void GetColor(unsigned char *pColorValue, GrColor *pColor);
private:
GrImageColorMap(GrImageColorMap *pColorMap);
private:
GrColorSpace *m_pColorSpace; // Öâåòîâîå ïðîñòðàíñòâî èçîáðàæåíèÿ
int m_nBitsPerComponent; // bits per component
int m_nComponentsCount; // ×èñëî öâåòîâûõ êîìïîíåíò â ïèêñåëå
GrColorSpace *m_pColorSpace2; // Âòîðîå öâåòîâîå ïðîñòðàíñòâî
int m_nComponentsCount2; // ×èñëî öâåòîâûõ êîìïîíåíò â ïèêñåëå(âî âòîðîì ïðîñòðàíñòâå)
GrColorComp *m_ppLookup[GrColorMaxComps]; // lookup table
double m_arrDecodeLow[GrColorMaxComps]; // Ìèíèìàëüíûå çíà÷åíèÿ äëÿ êàæäîé êîìïîíåíòû
double m_arrDecodeRange[GrColorMaxComps]; // Çíà÷åíèÿ (Max - min) äëÿ êàæäîé êîìïîíåíòû
BOOL m_bSuccess;
};
//-------------------------------------------------------------------------------------------------------------------------------
// GrSubpath and GrPath
//-------------------------------------------------------------------------------------------------------------------------------
class GrSubpath
{
public:
GrSubpath(double dX, double dY);
~GrSubpath();
GrSubpath *Copy()
{
return new GrSubpath(this);
}
int GetPointsCount()
{
return m_nPointsCount;
}
double GetX(int nIndex)
{
return m_pX[nIndex];
}
double GetY(int nIndex)
{
return m_pY[nIndex];
}
BOOL GetCurve(int nIndex)
{
return m_pbCurve[nIndex];
}
double GetLastX()
{
return m_pX[m_nPointsCount - 1];
}
double GetLastY()
{
return m_pY[m_nPointsCount - 1];
}
void LineTo(double dX, double dY);
void CurveTo(double dX1, double dY1, double dX2, double dY2, double dX3, double dY3);
void Close();
BOOL IsClosed()
{
return m_bClosed;
}
// Äîáàâëÿåì ñäâèã (<dDx>, <dDy>) ê êàæäîé òî÷êå subpath.
void Offset(double dDx, double dDy);
void Transform(double *pMatrix);
bool IsEqual(GrSubpath *pSubPath)
{
if ( m_nPointsCount != pSubPath->m_nPointsCount || m_bClosed != pSubPath->m_bClosed )
return false;
for ( int nIndex = 0; nIndex < m_nPointsCount; nIndex++ )
{
if ( fabs( m_pX[nIndex] - pSubPath->m_pX[nIndex] ) > 0.001 || fabs( m_pY[nIndex] - pSubPath->m_pY[nIndex] ) > 0.001 || m_pbCurve[nIndex] != pSubPath->m_pbCurve[nIndex] )
return false;
}
return true;
}
private:
GrSubpath(GrSubpath *pSubpath);
private:
double *m_pX; // Êîîðäèíàòû òî÷åê â supath
double *m_pY; //
BOOL *m_pbCurve; // Åñëè m_bCurve[i] = true => òî÷êà i - êîíòðîëüíàÿ òî÷êà äëÿ êðèâîé Áåçüå
int m_nPointsCount; // Êîëè÷åñòâî òî÷åê
int m_nSize; // Ðàçìåð ìàññèâîâ m_pX/m_pY
BOOL m_bClosed; // Çàêðûò ëè path?
};
class GrPath
{
public:
GrPath();
~GrPath();
GrPath *Copy()
{
return new GrPath( m_bJustStarted, m_dFirstX, m_dFirstY, m_ppSubpaths, m_nSubpathsCount, m_nSize);
}
// Åñòü ëè òåêóùàÿ òî÷êà?
BOOL IsCurPoint()
{
return m_nSubpathsCount > 0 || m_bJustStarted;
}
// Ïóñòîé ëè path, ò.å. åñòü ëè â íåì õîòÿ áû îäèí subpath?
BOOL IsPathNonEmpty()
{
return m_nSubpathsCount > 0;
}
int GetSubpathsCount()
{
return m_nSubpathsCount;
}
GrSubpath *GetSubpath(int nIndex)
{
return m_ppSubpaths[nIndex];
}
double GetLastX()
{
return m_ppSubpaths[m_nSubpathsCount - 1]->GetLastX();
}
double GetLastY()
{
return m_ppSubpaths[m_nSubpathsCount - 1]->GetLastY();
}
void MoveTo (double dX, double dY);
void LineTo (double dX, double dY);
void CurveTo(double dX1, double dY1, double dX2, double dY2, double dX3, double dY3);
void Close();
void Append(GrPath *pPath);
// Äîáàâëÿåì ñäâèã (<dDx>, <dDy>) ê êàæäîé òî÷êå path.
void Offset(double dDx, double dDy);
bool IsEqual(GrPath *pPath)
{
if ( m_nSubpathsCount != pPath->m_nSubpathsCount )
return false;
for ( int nIndex = 0; nIndex < m_nSubpathsCount; nIndex++ )
{
if ( !m_ppSubpaths[nIndex]->IsEqual( pPath->m_ppSubpaths[nIndex] ) )
return false;
}
return true;
}
private:
GrPath(BOOL bJustStarted, double dFirstX, double dFirstY, GrSubpath **ppSubpaths, int nSubpathsCount, int nSize);
private:
BOOL m_bJustStarted; // True, åñëè íîâûé subpath áûë òîëüêî ÷òî íà÷àò
double m_dFirstX; // Êîîðäèíàòû ïåðâîé òî÷êè íîâîãî subpath
double m_dFirstY; //
GrSubpath **m_ppSubpaths; // Ñïèñîê subpaths
int m_nSubpathsCount; // Êîëè÷åòñâî subpaths
int m_nSize; // Ðàçìåð ìàññèâà m_ppSubpaths
};
//-------------------------------------------------------------------------------------------------------------------------------
// GrTextClip
//-------------------------------------------------------------------------------------------------------------------------------
class GrTextClip
{
public:
GrTextClip()
{
m_nTextsCount = m_nSize = 0;
m_pTexts = NULL;
m_pMatrix = NULL;
}
GrTextClip *Copy()
{
return new GrTextClip(this);
}
~GrTextClip()
{
for ( int nIndex = 0; nIndex < m_nTextsCount; ++nIndex )
{
if ( m_pTexts->bsText )
{
::SysFreeString( m_pTexts->bsText );
}
if ( m_pTexts->bsFontName )
{
::SysFreeString( m_pTexts->bsFontName );
}
if ( m_pTexts->bsFontPath )
{
::SysFreeString( m_pTexts->bsFontPath );
}
}
MemUtilsFree( m_pTexts );
MemUtilsFree( m_pMatrix );
}
void Reset()
{
for ( int nIndex = 0; nIndex < m_nTextsCount; ++nIndex )
{
if ( m_pTexts->bsText )
{
::SysFreeString( m_pTexts->bsText );
}
}
MemUtilsFree( m_pTexts );
MemUtilsFree( m_pMatrix );
m_nTextsCount = m_nSize = 0;
m_pTexts = NULL;
m_pMatrix = NULL;
}
void ClipToText(CString sFontName, CString sFontPath, double dFontSize, LONG lFontStyle, double *pMatrix, CString sText, double dX, double dY, double dWidth = 0, double dHeight = 0, double dBaseLineOffset = 0)
{
Resize(1);
m_pTexts[m_nTextsCount].bsFontName = sFontName.AllocSysString();
m_pTexts[m_nTextsCount].bsFontPath = sFontPath.AllocSysString();
m_pTexts[m_nTextsCount].dFontSize = dFontSize;
m_pTexts[m_nTextsCount].lFontStyle = lFontStyle;
m_pTexts[m_nTextsCount].bsText = sText.AllocSysString();
m_pTexts[m_nTextsCount].dX = dX;
m_pTexts[m_nTextsCount].dY = dY;
m_pTexts[m_nTextsCount].dWidth = dWidth;
m_pTexts[m_nTextsCount].dHeight = dHeight;
m_pTexts[m_nTextsCount].dBaseLineOffset = dBaseLineOffset;
m_pMatrix[m_nTextsCount].FromDoublePointer( pMatrix );
++m_nTextsCount;
return;
}
int GetTextsCount()
{
return m_nTextsCount;
}
BSTR GetText(int nTextIndex, double *pdX, double *pdY, double *pdWidth, double *pdHeight, double *pdBaseLineOffset, BSTR *pbsFontName, BSTR *pbsFontPath, double *pdFontSize, LONG *plFontStyle)
{
if ( nTextIndex < 0 || nTextIndex >= m_nTextsCount )
return NULL;
*pdX = m_pTexts[nTextIndex].dX;
*pdY = m_pTexts[nTextIndex].dY;
*pdWidth = m_pTexts[nTextIndex].dWidth;
*pdHeight = m_pTexts[nTextIndex].dHeight;
*pdBaseLineOffset = m_pTexts[nTextIndex].dBaseLineOffset;
*pbsFontName = m_pTexts[nTextIndex].bsFontName;
*pbsFontPath = m_pTexts[nTextIndex].bsFontPath;
*pdFontSize = m_pTexts[nTextIndex].dFontSize;
*plFontStyle = m_pTexts[nTextIndex].lFontStyle;
return m_pTexts[nTextIndex].bsText;
}
double *GetMatrix(int nTextIndex)
{
if ( nTextIndex < 0 || nTextIndex >= m_nTextsCount )
return NULL;
return m_pMatrix[nTextIndex].ToDoublePointer();
}
bool IsEqual(GrTextClip *pClip)
{
if ( pClip->m_nTextsCount != m_nTextsCount )
return false;
for ( int nIndex = 0; nIndex < m_nTextsCount; nIndex++ )
{
if ( !m_pTexts[nIndex].IsEqual( pClip->m_pTexts[nIndex] ) || !m_pMatrix[nIndex].IsEqual( pClip->m_pMatrix[nIndex] ) )
return false;
}
return true;
}
private:
GrTextClip(GrTextClip *pTextClip)
{
m_nTextsCount = pTextClip->m_nTextsCount;
m_nSize = pTextClip->m_nSize;
m_pTexts = (Text *)MemUtilsMallocArray( m_nSize, sizeof(Text));
m_pMatrix = (Matrix *)MemUtilsMallocArray( m_nSize, sizeof(Matrix));
for ( int nIndex = 0; nIndex < m_nTextsCount; ++nIndex )
{
m_pTexts[nIndex].bsText = CString(pTextClip->m_pTexts[nIndex].bsText).AllocSysString();
m_pTexts[nIndex].dX = pTextClip->m_pTexts[nIndex].dX;
m_pTexts[nIndex].dY = pTextClip->m_pTexts[nIndex].dY;
m_pTexts[nIndex].dWidth = pTextClip->m_pTexts[nIndex].dWidth;
m_pTexts[nIndex].dHeight = pTextClip->m_pTexts[nIndex].dHeight;
m_pTexts[nIndex].dBaseLineOffset = pTextClip->m_pTexts[nIndex].dBaseLineOffset;
m_pTexts[nIndex].bsFontName = CString(pTextClip->m_pTexts[nIndex].bsFontName).AllocSysString();
m_pTexts[nIndex].bsFontPath = CString(pTextClip->m_pTexts[nIndex].bsFontPath).AllocSysString();
m_pTexts[nIndex].dFontSize = pTextClip->m_pTexts[nIndex].dFontSize;
m_pTexts[nIndex].lFontStyle = pTextClip->m_pTexts[nIndex].lFontStyle;
m_pMatrix[nIndex] = pTextClip->m_pMatrix[nIndex];
}
}
void Resize(int nTextsCount)
{
if ( m_nTextsCount + nTextsCount > m_nSize )
{
if ( m_nSize == 0 )
{
m_nSize = 32;
}
while ( m_nSize < m_nTextsCount + nTextsCount )
{
m_nSize *= 2;
}
m_pTexts = (Text *)MemUtilsReallocArray( m_pTexts, m_nSize, sizeof(Text));
m_pMatrix = (Matrix *)MemUtilsReallocArray( m_pMatrix, m_nSize, sizeof(Matrix));
}
}
void Transform(double *pMatrix, double dX, double dY, double *pdX, double *pdY)
{
*pdX = dX * pMatrix[0] + dY * pMatrix[2] + pMatrix[4];
*pdY = dX * pMatrix[1] + dY * pMatrix[3] + pMatrix[5];
}
private:
#pragma pack(push, 1)
struct Matrix
{
double dA;
double dB;
double dC;
double dD;
double dE;
double dF;
double *ToDoublePointer()
{
return &dA;
}
void FromDoublePointer(double *pMatrix)
{
dA = pMatrix[0];
dB = pMatrix[1];
dC = pMatrix[2];
dD = pMatrix[3];
dE = pMatrix[4];
dF = pMatrix[5];
}
bool IsEqual(Matrix &oMatrix)
{
if ( fabs( dA - oMatrix.dA ) < 0.001 && fabs( dB - oMatrix.dB ) < 0.001 && fabs( dC - oMatrix.dC ) < 0.001 && fabs( dD - oMatrix.dD ) < 0.001 && fabs( dE - oMatrix.dE ) < 0.001 && fabs( dF - oMatrix.dF ) < 0.001 )
return true;
return false;
}
};
struct Text
{
BSTR bsFontName;
BSTR bsFontPath;
double dFontSize;
LONG lFontStyle;
BSTR bsText;
double dX;
double dY;
double dWidth;
double dHeight;
double dBaseLineOffset;
bool IsEqual(Text &oText)
{
if ( fabs( dX - oText.dX ) < 0.001 && fabs( dY - oText.dY ) < 0.001 && fabs( dWidth - oText.dWidth ) < 0.001 && fabs( dHeight - oText.dHeight ) < 0.001 && fabs( dBaseLineOffset - oText.dBaseLineOffset ) < 0.001 && CString( bsText ) == CString( oText.bsText ) )
return true;
return false;
}
};
#pragma pack(pop)
private:
Text *m_pTexts;
Matrix *m_pMatrix;
int m_nTextsCount;
int m_nSize;
};
//-------------------------------------------------------------------------------------------------------------------------------
// GrClip
//-------------------------------------------------------------------------------------------------------------------------------
#define GrClipEOFlag 0x01 // Èñïîëüçóåì ïðàâèëî Even-odd
class GrClip
{
public:
GrClip(double dMinX, double dMinY, double dMaxX, double dMaxY);
GrClip *Copy()
{
return new GrClip(this);
}
~GrClip();
void ResetToRect(double dX0, double dY0, double dX1, double dY1);
// Ïåðåñåêàåì Clip ñ çàäàííûì ïðÿìîóãîëüíèêîì.
void ClipToRect(double dX0, double dY0, double dX1, double dY1);
// Ïåðåñåêàåì Clip ñ <pPath>.
void ClipToPath(GrPath *pPath, double *pMatrix, BOOL bEO);
// Ïåðåñåêàåì ñ òåêñòîì
void ClipToText(CString sFontName, CString sFontPath, double dFontSize, LONG lFontStyle, double *pMatrix, CString sText, double dX, double dY, double dWidth, double dHeight, double dBaseLineOffset)
{
if ( !m_pTextClip )
m_pTextClip = new GrTextClip();
m_pTextClip->ClipToText( sFontName, sFontPath, dFontSize, lFontStyle, pMatrix, sText, dX, dY, dWidth, dHeight, dBaseLineOffset );
}
//
void AppendTextClip(GrTextClip *pTextClip)
{
for ( int nIndex = 0; nIndex < pTextClip->GetTextsCount(); nIndex++ )
{
BSTR bsFontName, bsFontPath;
LONG lFontStyle;
double dFontSize = 10, dX = 0, dY = 0, dWidth = 0, dHeight = 0, dBaseLineOffset = 0;
BSTR bsText = pTextClip->GetText( nIndex, &dX, &dY, &dWidth, &dHeight, &dBaseLineOffset, &bsFontName, &bsFontPath, &dFontSize, &lFontStyle );
double *pMatrix = pTextClip->GetMatrix( nIndex );
ClipToText( (CString)bsFontName, (CString)bsFontPath, dFontSize, lFontStyle, pMatrix, CString( bsText ), dX, dY, dWidth, dHeight, dBaseLineOffset );
}
}
int GetMinX()
{
return m_nMinX;
}
int GetMaxX()
{
return m_nMaxX;
}
int GetMinY()
{
return m_nMinY;
}
int GetMaxY()
{
return m_nMaxY;
}
int GetPathsCount()
{
return m_nPathsCount;
}
GrPath *GetPath(int nPathIndex)
{
if ( nPathIndex < 0 || nPathIndex >= m_nPathsCount )
return NULL;
return m_ppPaths[nPathIndex];
}
double *GetMatrix(int nPathIndex)
{
if ( nPathIndex < 0 || nPathIndex >= m_nPathsCount )
return NULL;
return m_pMatrix[nPathIndex].ToDoublePointer();
}
int GetFlag(int nPathIndex)
{
if ( nPathIndex < 0 || nPathIndex >= m_nPathsCount )
return NULL;
return m_pFlags[nPathIndex];
}
BSTR GetText(int nTextIndex, double *pdX, double *pdY, double *pdWidth, double *pdHeight, double *pdBaseLineOffset, BSTR *pbsFontName, BSTR *pbsFontPath, double *pdFontSize, LONG *plFontStyle)
{
if ( m_pTextClip )
{
return m_pTextClip->GetText( nTextIndex, pdX, pdY, pdWidth, pdHeight, pdBaseLineOffset, pbsFontName, pbsFontPath, pdFontSize, plFontStyle);
}
return NULL;
}
int GetTextsCount()
{
if ( m_pTextClip )
{
return m_pTextClip->GetTextsCount();
}
return -1;
}
double *GetTextMatrix(int nTextIndex)
{
if ( m_pTextClip )
return m_pTextClip->GetMatrix( nTextIndex );
return NULL;
}
bool IsEqual(GrClip *pClip, int &nPathIndex)
{
bool bResult = true;
nPathIndex = -1;
if ( !m_pTextClip->IsEqual( pClip->m_pTextClip ) )
return false;
if ( m_nPathsCount < pClip->m_nPathsCount )
bResult = false;
else if ( m_nPathsCount > pClip->m_nPathsCount )
return false;
for ( int nIndex = 0; nIndex < m_nPathsCount; nIndex++ )
{
if ( !m_pMatrix[nIndex].IsEqual( pClip->m_pMatrix[nIndex] ) || m_pFlags[nIndex] != pClip->m_pFlags[nIndex] || !m_ppPaths[nIndex]->IsEqual( pClip->m_ppPaths[nIndex] ) )
return false;
}
nPathIndex = m_nPathsCount;
return bResult;
}
private:
GrClip(GrClip *pClip);
void Resize(int nPathsCount);
GrPath *PathRect(double dX0, double dY0, double dX1, double dY1);
void Transform(double *pMatrix, double dX, double dY, double *pdX, double *pdY)
{
*pdX = dX * pMatrix[0] + dY * pMatrix[2] + pMatrix[4];
*pdY = dX * pMatrix[1] + dY * pMatrix[3] + pMatrix[5];
}
private:
#pragma pack(push, 1)
struct Matrix
{
double dA;
double dB;
double dC;
double dD;
double dE;
double dF;
double *ToDoublePointer()
{
return &dA;
}
void FromDoublePointer(double *pMatrix)
{
dA = pMatrix[0];
dB = pMatrix[1];
dC = pMatrix[2];
dD = pMatrix[3];
dE = pMatrix[4];
dF = pMatrix[5];
}
bool IsEqual(Matrix &oMatrix)
{
if ( fabs( dA - oMatrix.dA ) < 0.001 && fabs( dB - oMatrix.dB ) < 0.001 && fabs( dC - oMatrix.dC ) < 0.001 && fabs( dD - oMatrix.dD ) < 0.001 && fabs( dE - oMatrix.dE ) < 0.001 && fabs( dF - oMatrix.dF ) < 0.001 )
return true;
return false;
}
};
#pragma pack(pop)
private:
double m_dMinX;
double m_dMinY;
double m_dMaxX;
double m_dMaxY;
int m_nMinX;
int m_nMinY;
int m_nMaxX;
int m_nMaxY;
GrPath **m_ppPaths;
Matrix *m_pMatrix;
unsigned char *m_pFlags;
int m_nPathsCount;
int m_nSize;
GrTextClip *m_pTextClip;
};
//-------------------------------------------------------------------------------------------------------------------------------
// GrState
//-------------------------------------------------------------------------------------------------------------------------------
class GrState
{
public:
GrState(double dHorizDPI, double dVertDPI, PDFRectangle *pPageBox, int nRotate, BOOL bUpsideDown);
~GrState();
GrState *Copy()
{
return new GrState(this);
}
double GetHorDPI()
{
return m_dHorDPI;
}
double GetVerDPI()
{
return m_dVerDPI;
}
double *GetCTM()
{
return m_arrCTM;
}
double GetPageLeft()
{
return m_dPageLeft;
}
double GetPageBottom()
{
return m_dPageBottom;
}
double GetPageRight()
{
return m_dPageRight;
}
double GetPageTop()
{
return m_dPageTop;
}
double GetPageWidth()
{
return m_dPageWidth;
}
double GetPageHeight()
{
return m_dPageHeight;
}
int GetRotate()
{
return m_nRotate;
}
GrColor *GetFillColor()
{
return &m_oFillColor;
}
GrColor *GetStrokeColor()
{
return &m_oStrokeColor;
}
void GetFillGray(GrGray *pGray)
{
m_pFillColorSpace->GetGray( &m_oFillColor, pGray);
}
void GetStrokeGray(GrGray *pGray)
{
m_pStrokeColorSpace->GetGray( &m_oStrokeColor, pGray);
}
void GetFillRGB(GrRGB *pRGB)
{
m_pFillColorSpace->GetRGB( &m_oFillColor, pRGB);
}
void GetStrokeRGB(GrRGB *pRGB)
{
m_pStrokeColorSpace->GetRGB( &m_oStrokeColor, pRGB);
}
void GetFillCMYK(GrCMYK *pCMYK)
{
m_pFillColorSpace->GetCMYK( &m_oFillColor, pCMYK);
}
void GetStrokeCMYK(GrCMYK *pCMYK)
{
m_pStrokeColorSpace->GetCMYK( &m_oStrokeColor, pCMYK);
}
GrColorSpace *GetFillColorSpace()
{
return m_pFillColorSpace;
}
GrColorSpace *GetStrokeColorSpace()
{
return m_pStrokeColorSpace;
}
GrPattern *GetFillPattern()
{
return m_pFillPattern;
}
GrPattern *GetStrokePattern()
{
return m_pStrokePattern;
}
GraphicsBlendMode GetBlendMode()
{
return m_eBlendMode;
}
double GetFillOpacity()
{
return m_dFillOpacity;
}
double GetStrokeOpacity()
{
return m_dStrokeOpacity;
}
BOOL GetFillOverprint()
{
return m_bFillOverprint;
}
BOOL GetStrokeOverprint()
{
return m_bStrokeOverprint;
}
Function **GetTransfer()
{
return m_ppTransfer;
}
double GetLineWidth()
{
return m_dLineWidth;
}
void GetLineDash(double **ppDash, int *pSize, double *pStart)
{
*ppDash = m_pLineDash;
*pSize = m_nLineDashSize;
*pStart = m_dLineDashStart;
}
int GetFlatness()
{
return m_nFlatness;
}
int GetLineJoin()
{
return m_nLineJoin;
}
int GetLineCap()
{
return m_nLineCap;
}
double GetMiterLimit()
{
return m_dMiterLimit;
}
BOOL GetStrokeAdjust()
{
return m_bStrokeAdjust;
}
GrFont *GetFont()
{
return m_pFont;
}
double GetFontSize()
{
return m_dFontSize;
}
double *GetTextMatrix()
{
return m_arrTextMatrix;
}
double GetCharSpace()
{
return m_dCharSpace;
}
double GetWordSpace()
{
return m_dWordSpace;
}
double GetHorizScaling()
{
return m_dHorizScaling;
}
double GetLeading()
{
return m_dLeading;
}
double GetRise()
{
return m_nRise;
}
int GetRenderMode()
{
return m_nRenderMode;
}
GrPath *GetPath()
{
return m_pPath;
}
double GetCurX()
{
return m_dCurX;
}
double GetCurY()
{
return m_dCurY;
}
void GetClipBBox(double *pXMin, double *pYMin, double *pXMax, double *pYMax)
{
*pXMin = m_dClipXMin;
*pYMin = m_dClipYMin;
*pXMax = m_dClipXMax;
*pYMax = m_dClipYMax;
}
void GetUserClipBBox(double *pXMin, double *pYMin, double *pXMax, double *pYMax);
double GetTextLineX()
{
return m_dTextLineX;
}
double GetTextLineY()
{
return m_dTextLineY;
}
GrClip *GetClip()
{
return m_pClip;
}
// Åñòü ëè òåêóùàÿ òî÷êà?
BOOL IsCurPoint()
{
return m_pPath->IsCurPoint();
}
// Åñòü ëè íåïóñòîé path?
BOOL IsPathNonEmpty()
{
return m_pPath->IsPathNonEmpty();
}
// Ðàçëè÷íûå ïðåîáðàçîâàíèÿ êîîðäèíàò.
void Transform(double dSrcX, double dSrcY, double *pdResX, double *pdResY)
{
*pdResX = m_arrCTM[0] * dSrcX + m_arrCTM[2] * dSrcY + m_arrCTM[4];
*pdResY = m_arrCTM[1] * dSrcX + m_arrCTM[3] * dSrcY + m_arrCTM[5];
}
void TransformDelta(double dSrcX, double dSrcY, double *pdResX, double *pdResY)
{
*pdResX = m_arrCTM[0] * dSrcX + m_arrCTM[2] * dSrcY;
*pdResY = m_arrCTM[1] * dSrcX + m_arrCTM[3] * dSrcY;
}
void TextTransform(double dSrcX, double dSrcY, double *pdResX, double *pdResY)
{
*pdResX = m_arrTextMatrix[0] * dSrcX + m_arrTextMatrix[2] * dSrcY + m_arrTextMatrix[4];
*pdResY = m_arrTextMatrix[1] * dSrcX + m_arrTextMatrix[3] * dSrcY + m_arrTextMatrix[5];
}
void TextTransformDelta(double dSrcX, double dSrcY, double *pdResX, double *pdResY)
{
*pdResX = m_arrTextMatrix[0] * dSrcX + m_arrTextMatrix[2] * dSrcY;
*pdResY = m_arrTextMatrix[1] * dSrcX + m_arrTextMatrix[3] * dSrcY;
}
double TransformWidth(double dWidth);
double GetTransformedLineWidth()
{
return TransformWidth(m_dLineWidth);
}
double GetTransformedFontSize();
void GetFontTransformMatrix(double *pdM11, double *pdM12, double *pdM21, double *pdM22);
void SetCTM(double dA, double dB, double dC, double dD, double dE, double dF);
void ConcatCTM(double dA, double dB, double dC, double dD, double dE, double dF);
void ShiftCTM(double dShiftX, double dShiftY);
void SetFillColorSpace(GrColorSpace *pColorSpace);
void SetStrokeColorSpace(GrColorSpace *pColorSpace);
void SetFillColor(GrColor *pColor)
{
m_oFillColor = *pColor;
}
void SetStrokeColor(GrColor *pColor)
{
m_oStrokeColor = *pColor;
}
void SetFillPattern(GrPattern *pPattern);
void SetStrokePattern(GrPattern *pPattern);
void SetBlendMode(GraphicsBlendMode eMode)
{
m_eBlendMode = eMode;
}
void SetFillOpacity(double dOpacity)
{
m_dFillOpacity = dOpacity;
}
void SetStrokeOpacity(double dOpacity)
{
m_dStrokeOpacity = dOpacity;
}
void SetFillOverprint(BOOL bOverprint)
{
m_bFillOverprint = bOverprint;
}
void SetStrokeOverprint(BOOL bOverprint)
{
m_bStrokeOverprint = bOverprint;
}
void SetTransfer(Function **ppFunctions);
void SetLineWidth(double dWidth)
{
m_dLineWidth = dWidth;
}
void SetLineDash(double *pDash, int nLength, double dStart);
void SetFlatness(int nFlatness)
{
m_nFlatness = nFlatness;
}
void SetLineJoin(int nLineJoin)
{
m_nLineJoin = nLineJoin;
}
void SetLineCap(int nLineCap)
{
m_nLineCap = nLineCap;
}
void SetMiterLimit(double dMiterLimit)
{
m_dMiterLimit = dMiterLimit;
}
void SetStrokeAdjust(BOOL bStrokeAdjust)
{
m_bStrokeAdjust = bStrokeAdjust;
}
void SetFont(GrFont *pFont, double dFontSize)
{
m_pFont = pFont;
m_dFontSize = dFontSize;
}
void SetTextMatrix(double dA, double dB, double dC, double dD, double dE, double dF)
{
m_arrTextMatrix[0] = dA;
m_arrTextMatrix[1] = dB;
m_arrTextMatrix[2] = dC;
m_arrTextMatrix[3] = dD;
m_arrTextMatrix[4] = dE;
m_arrTextMatrix[5] = dF;
}
void SetCharSpace(double dCharSpace)
{
m_dCharSpace = dCharSpace;
}
void SetWordSpace(double dWordSpace)
{
m_dWordSpace = dWordSpace;
}
void SetHorizScaling(double dScale)
{
m_dHorizScaling = 0.01 * dScale;
}
void SetLeading(double dLeading)
{
m_dLeading = dLeading;
}
void SetRise(double dRise)
{
m_nRise = dRise;
}
void SetRenderMode(int nRenderMode)
{
m_nRenderMode = nRenderMode;
}
void SetPath(GrPath *pPath);
void MoveTo(double dX, double dY)
{
m_pPath->MoveTo( m_dCurX = dX, m_dCurY = dY);
}
void LineTo(double dX, double dY)
{
m_pPath->LineTo( m_dCurX = dX, m_dCurY = dY);
}
void CurveTo(double dX1, double dY1, double dX2, double dY2, double dX3, double dY3)
{
m_pPath->CurveTo( dX1, dY1, dX2, dY2, m_dCurX = dX3, m_dCurY = dY3);
}
void ClosePath()
{
m_pPath->Close();
m_dCurX = m_pPath->GetLastX();
m_dCurY = m_pPath->GetLastY();
}
void ClearPath();
void Clip();
void ClipToStrokePath();
// Òåêñò.
void TextSetPos(double dX, double dY)
{
m_dTextLineX = dX;
m_dTextLineY = dY;
}
void TextMoveTo(double dX, double dY)
{
m_dTextLineX = dX;
m_dTextLineY = dY;
TextTransform( dX, dY, &m_dCurX, &m_dCurY);
}
void TextShift(double dShiftX, double dShiftY);
void Shift(double dShidtX, double dShiftY);
// Ðàáîòà ñî ñòåêîì.
GrState *Save();
GrState *Restore();
BOOL HasSaves()
{
return m_pNext != NULL;
}
//
BOOL ParseBlendMode(Object *pObject, GraphicsBlendMode *peMode);
private:
GrState(GrState *pState);
private:
double m_dHorDPI; // Ðàçðåøåíèå ïî ãîðèçîíòàëè
double m_dVerDPI; // Ðàçðåøåíèå ïî âåðòèêàëè
double m_arrCTM[6]; // Ìàòðèöà ïðåîáðàçîâàíèÿ êîîðäèíàò
double m_dPageLeft; // Êîîðäèíàòû ëåâîãî íèæíåãî óãëà è
double m_dPageBottom; // ïðàâîãî âåðõíåãî â ïîëüçîâàòåëüñòêèõ êîîðäèíàòàõ
double m_dPageRight; //
double m_dPageTop; //
double m_dPageWidth; // Øèðèíà ñòðàíèöû â ïèêñåëÿõ(ò.å. ñ ó÷åòîì ðàçðåøåíèÿ m_dHorDPI)
double m_dPageHeight; // Âûñîòà ñòðàíèöû â ïèêñåëÿõ(ò.å. ñ ó÷åòîì ðàçðåøåíèÿ m_dVerDPI)
int m_nRotate; // Óãîë ïîâîðîòà ñòðàíèöû
GrColorSpace *m_pFillColorSpace; // Öâåòîâîå ïðîñòðàíñòâî äëÿ çàëèâêè
GrColorSpace *m_pStrokeColorSpace;// Öâåòîâîå ïðîñòðàíñòâî äëÿ îáâîäêè
GrColor m_oFillColor; // Öâåò äëÿ çàëèâêè
GrColor m_oStrokeColor; // Öâåò äëÿ îáâîäêè
GrPattern *m_pFillPattern; // Óêàçàòåëü íà îáúåêò, îïðåäåëÿþùèé çàëèâêó
GrPattern *m_pStrokePattern; // Óêàçàòåëü íà îáúåêò, îïðåäåëÿþùèé îáâîäêó
GraphicsBlendMode m_eBlendMode; // Blend mode (äëÿ ïðîçðà÷íîñòè)
double m_dFillOpacity; // Ïðîçðà÷íîñòü çàëèâêè
double m_dStrokeOpacity; // Ïðîçðà÷íîñòü îáâîäêè
BOOL m_bFillOverprint; // Çàëèâàåì ïîâåðõ âñåãî?
BOOL m_bStrokeOverprint; // Îáâîäèì ïîâåðõ âñåãî?
Function *m_ppTransfer[4]; // Ôóíêöèÿ ïåðåíîñà. Âàðèàíòû âõîäíûõ ïàðàìåòðîâ:
// âñå NULL = òîæäåñòâííàÿ ôóíêöèÿ;
// ïîñëåäíèå òðè NULL = îäíîìåðíàÿ ôóíêöèÿ;
// âñå 4 íå NULL = R,G,B,gray -ôóíêöèÿ
double m_dLineWidth; // Òîëùèíà ëèíèè
double *m_pLineDash; // Ïàðàìåòðû, åñëè ëèíèÿ ïóíêòèðíàÿ
int m_nLineDashSize; // Ðàçìåð ìàññèâà m_pLineDash
double m_dLineDashStart;//
int m_nFlatness; // Flatness Tolerance
int m_nLineJoin; // Òèï ñîåäèíåíèÿ ëèíèé
int m_nLineCap; // Òèï îêîíà÷íèÿ ëèíèé
double m_dMiterLimit; // Miter limit
BOOL m_bStrokeAdjust; // True, àâòîìàòè÷åñêè îáâîäèòü
GrFont *m_pFont; // Øðèôò
double m_dFontSize; // Ðàçìåð øðèôòà
double m_arrTextMatrix[6]; // Ìàòðèöà êîîðäèíàòíûõ ïðåîáðàçîâàíèé òåêñòà
double m_dCharSpace; // Ðàññòîÿíèå ìåæäó ñèìâîëàìè
double m_dWordSpace; // Ðàññòîÿíèå ìåæäó ñëîâàìè
double m_dHorizScaling; // Ãîðèçîíòàëüíîå ðàñòÿæåíèå òåêñòà
double m_dLeading; // Ðàññòîÿíèå ìåæäó ñòðîêàìè
double m_nRise; // Ïîäíÿòèå/îïóñêàíèå òåêñòà îòíîñèòåëüíî baseline
int m_nRenderMode; // Ñïîñîá ðèñîâàíèÿ áóêâ
GrPath *m_pPath; // Ìàññèâ ãðàôè÷åñêèõ Path
double m_dCurX; // Êîîðäèíàòû òåêóùåé òî÷êè
double m_dCurY; // (â ïîëüçîâàòåëüñêèõ êîîðäèíàòàõ)
double m_dTextLineX; // Êîîðäèíàòû íà÷àëüíîé òî÷êè, íà÷èíàÿ ñ êîòîðîé ïèøåòñÿ òåêñò
double m_dTextLineY; // (â òåêñòîâûõ êîîðäèíàòàõ)
GrClip *m_pClip;
double m_dClipXMin; //
double m_dClipYMin; // Ãðàíèöû äëÿ clip region
double m_dClipXMax; //
double m_dClipYMax; //
GrState *m_pNext; // Ñëåäóþùèé GrState â ñòýêå
};
#endif /* _GSTATE_H */