mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-04-07 13:55:33 +08:00
git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@52670 954022d7-b5bf-4e40-9824-e11837661b57
318 lines
11 KiB
C++
318 lines
11 KiB
C++
#ifndef _RENDERER_OUTPUTDEV_H
|
|
#define _RENDERER_OUTPUTDEV_H
|
|
|
|
#include "../ASCImageStudio3/ASCGraphics/Interfaces/ASCRenderer.h"
|
|
#include "../ASCImageStudio3/ASCGraphics/Objects/Structures.h"
|
|
|
|
#define _ONLY_PDF_WRITER_INTERFACE
|
|
#include "../ASCOfficePdfWriter/PDFWriter.h"
|
|
|
|
#include "OutputDevice.h"
|
|
#include "../Common/TemporaryCS.h"
|
|
|
|
class Gr8BitFont;
|
|
class OutputDev;
|
|
class GrPath;
|
|
class GrTextClip;
|
|
class GrState;
|
|
class GrClip;
|
|
struct Ref;
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------------------
|
|
struct TFontEntry
|
|
{
|
|
Ref oRef; // Ññûëêà íà îáúåêò-øðèôò
|
|
CStringW wsFilePath; // Ïóòü ê øðèôòó íà äèñêå
|
|
CStringW wsFontName; // Èìÿ øðèôòà, êîòîðîå çàïèñàíî â PDF(âåòêà äëÿ ñëó÷àåâ, êîãäà èìÿ øðèôòà â ñàìîì øðèôòå íå óêàçàíî)
|
|
unsigned short *pCodeToGID; // Òàáëèöà êîä - íîìåð ãëèôà â øðèôòå
|
|
unsigned short *pCodeToUnicode; // Òàáëèöà êîä - þíèêîäíîå çíà÷åíèå
|
|
unsigned int unLenGID; // Êîëè÷åñòâî ýëåìåíòîâ â òàáëèöàõ
|
|
unsigned int unLenUnicode; //
|
|
BOOL bAvailable; // Äîñòóïåí ëè øðèôò. Ñäåëàíî äëÿ ìíîãîïîòîêîâîñòè
|
|
};
|
|
|
|
class CFontList
|
|
{
|
|
public:
|
|
|
|
CFontList();
|
|
~CFontList();
|
|
void LoadFromFile(CStringW wsDirPath);
|
|
void SaveToFile(CStringW wsDirPath);
|
|
BOOL Find(Ref oRef, TFontEntry *pEntry);
|
|
BOOL Find2(Ref oRef, TFontEntry **ppEntry);
|
|
TFontEntry *Add(Ref oRef, CStringW wsFileName, unsigned short *pCodeToGID, unsigned short *pCodeToUnicode, unsigned int nLenGID, unsigned int nLenUnicode);
|
|
void Clear();
|
|
BOOL GetFont(Ref *pRef, TFontEntry *pEntry);
|
|
private:
|
|
|
|
CSimpleMap<Ref, TFontEntry*> m_oFontMap;
|
|
CRITICAL_SECTION m_oCS; // Êðèòè÷åñêàÿ ñåêöèÿ
|
|
};
|
|
//-------------------------------------------------------------------------------------------------------------------------------
|
|
template <typename T>
|
|
inline static double PDFCoordsToMM(T tX)
|
|
{
|
|
return ( (double)tX / 72.0 ) * 25.4;
|
|
}
|
|
|
|
//-------------------------------------------------------------------------------------------------------------------------------
|
|
static void FileWrite(void *pStream, char *sData, int nLen)
|
|
{
|
|
::fwrite( sData, 1, nLen, (FILE *)pStream );
|
|
}
|
|
//-------------------------------------------------------------------------------------------------------------------------------
|
|
// RendererOutputDev
|
|
//-------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
class RendererOutputDev: public OutputDev
|
|
{
|
|
public:
|
|
|
|
RendererOutputDev(GlobalParams *pGlobalParams, IASCRenderer *pRenderer, CFontList *pFontList = NULL);
|
|
virtual ~RendererOutputDev();
|
|
virtual BOOL UpSideDown()
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
virtual BOOL UseDrawChar()
|
|
{
|
|
//return FALSE;
|
|
return TRUE;
|
|
}
|
|
|
|
virtual BOOL UseTilingPatternFill()
|
|
{
|
|
return FALSE;
|
|
}
|
|
virtual BOOL UseFunctionalShadedFills()
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
virtual BOOL UseAxialShadedFills()
|
|
{
|
|
return m_bUseAxialShaded;
|
|
}
|
|
|
|
virtual BOOL UseRadialShadedFills()
|
|
{
|
|
return m_bUseRadialShaded;
|
|
}
|
|
virtual BOOL UseClipTo()
|
|
{
|
|
return FALSE;//TRUE;
|
|
}
|
|
|
|
virtual BOOL InterpretType3Chars()
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
virtual BOOL UseFillAndStroke()
|
|
{
|
|
return TRUE;
|
|
}
|
|
virtual BOOL UseSimpleTransparentGroup()
|
|
{
|
|
return TRUE;
|
|
}
|
|
virtual BOOL IsStopped()
|
|
{
|
|
if ( NULL != m_pbBreak )
|
|
return *m_pbBreak;
|
|
else
|
|
return FALSE;
|
|
}
|
|
//---------------------------------------------------------------------------------------------------------------------------
|
|
virtual void StartPage(int nPageIndex, GrState *pGState);
|
|
virtual void EndPage();
|
|
//----- Save/Restore GState
|
|
virtual void SaveGState(GrState *pGState);
|
|
virtual void RestoreGState(GrState *pGState);
|
|
//----- Èçìåíåíèå ïàðàìåòðîâ â GState
|
|
virtual void UpdateCTM(GrState *pGState, double dMatrix11, double dMatrix12, double dMatrix21, double dMatrix22, double dMatrix31, double dMatrix32);
|
|
virtual void UpdateLineDash(GrState *pGState);
|
|
virtual void UpdateFlatness(GrState *pGState);
|
|
virtual void UpdateLineJoin(GrState *pGState);
|
|
virtual void UpdateLineCap(GrState *pGState);
|
|
virtual void UpdateMiterLimit(GrState *pGState);
|
|
virtual void UpdateLineWidth(GrState *pGState);
|
|
virtual void UpdateStrokeAdjust(GrState *pGState);
|
|
virtual void UpdateFillColor(GrState *pGState);
|
|
virtual void UpdateStrokeColor(GrState *pGState);
|
|
virtual void UpdateBlendMode(GrState *pGState);
|
|
virtual void UpdateFillOpacity(GrState *pGState);
|
|
virtual void UpdateStrokeOpacity(GrState *pGState);
|
|
virtual void UpdateAll(GrState *pGState);
|
|
virtual void UpdateRender(GrState *pGState);
|
|
//----- Èçìåíåíèå òåêñòîâûõ ïàðàìåòðîâ
|
|
virtual void UpdateFont(GrState *pGState);
|
|
//----- Ðèñîâàíèå Path
|
|
virtual void Stroke(GrState *pGState);
|
|
virtual void Fill(GrState *pGState);
|
|
virtual void EoFill(GrState *pGState);
|
|
virtual void FillStroke(GrState *pGState);
|
|
virtual void EoFillStroke(GrState *pGState);
|
|
virtual void TilingPatternFill(GrState *pGState, Object *pStream, int nPaintType, Dict *pResourcesDict, double *pMatrix, double *pBBox, int nX0, int nY0, int nX1, int nY1, double dXStep, double dYStep);
|
|
virtual void StartTilingFill (GrState *pGState);
|
|
virtual void EndTilingFill ();
|
|
virtual BOOL FunctionShadedFill(GrState *pGState, GrFunctionShading *pShading);
|
|
virtual BOOL AxialShadedFill (GrState *pGState, GrAxialShading *pShading);
|
|
virtual BOOL RadialShadedFill (GrState *pGState, GrRadialShading *pShading);
|
|
virtual void StartShadedFill (GrState *pGState);
|
|
virtual void EndShadedFill ();
|
|
//----- Path clipping
|
|
virtual void Clip(GrState *pGState);
|
|
virtual void ClipAttack(GrState *pGState)
|
|
{
|
|
UpdateClipAttack(pGState);
|
|
}
|
|
virtual void EoClip(GrState *pGState);
|
|
virtual void ClipToStrokePath(GrState *pGState);
|
|
virtual void ClipToPath(GrState *pGState, GrPath *pPath, double *pMatrix, BOOL bEO);
|
|
//----- Âûâîä òåêñòà
|
|
virtual void BeginStringOperator(GrState *pGState);
|
|
virtual void EndStringOperator(GrState *pGState);
|
|
virtual void DrawString(GrState *pGState, StringExt *seString);
|
|
virtual void DrawChar(GrState *pGState, double dX, double dY, double dDx, double dDy, double dOriginX, double dOriginY, CharCode nCode, int nBytesCount, Unicode *pUnicode, int nUnicodeLen);
|
|
BOOL BeginType3Char(GrState *pGState, double dX, double dY, double dDx, double dDy, CharCode nCode, Unicode *pUnicode, int nUnicodeLen);
|
|
void EndType3Char(GrState *pGState);
|
|
void Type3D0(GrState *pGState, double dWx, double dWy);
|
|
void Type3D1(GrState *pGState, double dWx, double dWy, double dBLx, double dBLy, double dTRx, double dTRy);
|
|
// begin/end commands
|
|
virtual void BeginCommand(const ULONG& lCommand)
|
|
{
|
|
if (NULL != m_pRenderer)
|
|
m_pRenderer->BeginCommand(lCommand);
|
|
}
|
|
virtual void EndCommand(const ULONG& lCommand)
|
|
{
|
|
if (NULL != m_pRenderer)
|
|
m_pRenderer->EndCommand(lCommand);
|
|
}
|
|
// detect support futures
|
|
virtual bool IsSupportFuture(const CString& sName)
|
|
{
|
|
if (NULL == m_pRenderer)
|
|
return false;
|
|
|
|
VARIANT var;
|
|
var.vt = VT_BOOL;
|
|
var.boolVal = VARIANT_FALSE;
|
|
|
|
BSTR bsVal = sName.AllocSysString();
|
|
m_pRenderer->GetAdditionalParam(bsVal, &var);
|
|
SysFreeString(bsVal);
|
|
|
|
if (VARIANT_TRUE == var.boolVal)
|
|
return true;
|
|
return false;
|
|
}
|
|
virtual void SetAdditionalParam(const CString& sName, VARIANT& var)
|
|
{
|
|
if (NULL == m_pRenderer)
|
|
return;
|
|
|
|
BSTR bsVal = sName.AllocSysString();
|
|
m_pRenderer->SetAdditionalParam(bsVal, var);
|
|
SysFreeString(bsVal);
|
|
}
|
|
|
|
virtual void nativeSetTilingFill(BOOL bVal)
|
|
{
|
|
m_bTiling = bVal;
|
|
}
|
|
|
|
//----- Âûâîä êàðòèíîê
|
|
virtual void DrawImageMask(GrState *pGState, Object *pRef, Stream *pStream, int nWidth, int nHeight, BOOL bInvert, BOOL bInlineImage);
|
|
virtual void DrawImage(GrState *pGState, Object *pRef, Stream *pStream, int nWidth, int nHeight, GrImageColorMap *pColorMap, int *pMaskColors, BOOL bInlineImg);
|
|
virtual void DrawMaskedImage(GrState *pGState, Object *pRef, Stream *pStream, int nWidth, int nHeight, GrImageColorMap *pColorMap, Stream *pMaskStream, int nMaskWidth, int nMaskHeight, BOOL bMaskInvert);
|
|
virtual void DrawSoftMaskedImage(GrState *pGState, Object *pRef, Stream *pStream, int nWidth, int nHeight, GrImageColorMap *pColorMap, Stream *pMaskStream, int nMaskWidth, int nMaskHeight, GrImageColorMap *pMaskColorMap);
|
|
//----- Transparency groups è SMasks
|
|
virtual void BeginTransparencyGroup(GrState *pGState, double *pBBox, GrColorSpace *pBlendingColorSpace, BOOL bIsolated, BOOL bKnockout, BOOL bForSoftMask);
|
|
virtual void EndTransparencyGroup(GrState *pGState);
|
|
virtual void PaintTransparencyGroup(GrState *pGState, double *pBBox);
|
|
virtual void SetSoftMask(GrState *pGState, double *pBBox, BOOL bAlpha, Function *pTransferFunc, GrColor *pBackdropColor);
|
|
virtual void ClearSoftMask(GrState *pGState);
|
|
//----- Äîïîëíèòåëüíûå ôóíêöèè äëÿ äàííîãî óñòðîéñòâà
|
|
void NewPDF(XRef *pXref);
|
|
void SetAVSRenderer(IASCRenderer *pRenderer)
|
|
{
|
|
m_bUseAxialShaded = FALSE;
|
|
m_bUseRadialShaded = FALSE;
|
|
|
|
m_pRenderer = pRenderer;
|
|
|
|
if ( NULL != m_pRenderer )
|
|
{
|
|
m_pRenderer->put_PenColor( 0 );
|
|
m_pRenderer->put_PenAlpha( 255 );
|
|
m_pRenderer->put_PenSize( 1 );
|
|
|
|
m_pRenderer->put_ShadowVisible( 0 );
|
|
m_pRenderer->put_ShadowColor( 0 );
|
|
|
|
m_pRenderer->put_FontName( _T("Arial") );
|
|
m_pRenderer->put_FontStyle( 0 );
|
|
m_pRenderer->put_FontSize( 10.0 );
|
|
|
|
IPDFWriter *pInterface = NULL;
|
|
|
|
m_pRenderer->QueryInterface( __uuidof( IPDFWriter ), (void**)&pInterface );
|
|
if ( NULL != pInterface )
|
|
m_nRendererType = 1;
|
|
RELEASEINTERFACE( pInterface );
|
|
|
|
LONG lType = c_nUnknownRenderer;
|
|
m_pRenderer->get_Type( &lType );
|
|
if ( c_nSWFRenderer == lType )
|
|
{
|
|
m_bUseAxialShaded = TRUE;
|
|
m_bUseRadialShaded = TRUE;
|
|
}
|
|
}
|
|
}
|
|
void SetBreak(BOOL *pbBreak)
|
|
{
|
|
m_pbBreak = pbBreak;
|
|
}
|
|
private:
|
|
|
|
void Transform(double *pMatrix, double dUserX, double dUserY, double *pdDeviceX, double *pdDeviceY);
|
|
void DoPath(GrState *pGState, GrPath *pPath, double dPageHeight, double *pCTM);
|
|
void ClipToText(BSTR bsFontName, BSTR bsFontPath, double dFontSize, LONG lFontStyle, double *pMatrix, CString sText, double dX, double dY, double dWidth = 0, double dHeight = 0, double dBaseLineOffset = 0);
|
|
void UpdateClip(GrState *pGState);
|
|
void UpdateClipAttack(GrState *pGState);
|
|
void DoTransform(double *pMatrix, double *pdShiftX, double *pdShiftY, BOOL bText = FALSE);
|
|
private:
|
|
|
|
IASCRenderer *m_pRenderer;
|
|
int m_nRendererType;
|
|
|
|
double m_arrMatrix[6];
|
|
|
|
NSStructures::CFont m_oFont;
|
|
|
|
GrTextClip *m_pBufferTextClip;
|
|
|
|
XRef *m_pXref; // Òàáëèöà Xref äëÿ äàííîãî PDF-äîêóìåíòà
|
|
CFontList *m_pFontList;
|
|
AVSGraphics::IASCFontManager *m_pFontManager;
|
|
|
|
BOOL *m_pbBreak; // Âíåøíÿÿ îñòàíîâêà ðåíäåðåðà
|
|
|
|
BOOL m_bUseAxialShaded;
|
|
BOOL m_bUseRadialShaded;
|
|
|
|
GrClip *m_pClip;
|
|
BOOL m_bTiling;
|
|
BOOL m_bTransparentGroup;
|
|
|
|
BOOL m_bTransparentGroupSoftMask;
|
|
BYTE* m_pTransparentGroupSoftMask;
|
|
};
|
|
|
|
#endif /* _RENDERER_OUTPUTDEV_H */
|