mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-07-13 16:24:45 +08:00
488 lines
12 KiB
C++
488 lines
12 KiB
C++
#pragma once
|
|
#include "ASCRenderer.h"
|
|
#include "Metafile.h"
|
|
#include "..\..\..\Common\OfficeFileTemplate.h"
|
|
|
|
|
|
#define PROPERTY_META(NameBase, Name, Type) \
|
|
STDMETHOD(get_##NameBase##Name)(Type* pVal) \
|
|
{ \
|
|
if (NULL == pVal) \
|
|
return S_FALSE; \
|
|
*pVal = m_oPage.m_o##NameBase.##Name; \
|
|
return S_OK; \
|
|
} \
|
|
STDMETHOD(put_##NameBase##Name)(Type Val) \
|
|
{ \
|
|
m_oPage.##NameBase##Name(Val); \
|
|
return S_OK; \
|
|
}
|
|
|
|
[coclass, uuid("40D33F34-B681-46be-8649-FFBE7146569D"), threading(apartment), vi_progid("AVSMetafile"), progid("AVSMetafile.1"), version(1.0)]
|
|
class ATL_NO_VTABLE CASCMetafile : public IASCMetafile, public IASCRenderer2
|
|
{
|
|
protected:
|
|
|
|
CMetafile m_oPage;
|
|
|
|
// ÷ňîáű đčńîâŕňü ďđ˙ěî čç ôŕéëŕ (ďîęŕ djvu)
|
|
IAVSOfficePages* m_pDocInstance;
|
|
LONG m_lPageIndex;
|
|
|
|
DWORD m_lCommandType;
|
|
CString m_strHyperLinks;
|
|
|
|
public:
|
|
|
|
CASCMetafile() : m_oPage()
|
|
{
|
|
m_pDocInstance = NULL;
|
|
m_lPageIndex = NULL;
|
|
|
|
m_lCommandType = c_nNone;
|
|
}
|
|
|
|
~CASCMetafile()
|
|
{
|
|
RELEASEINTERFACE(m_pDocInstance);
|
|
}
|
|
|
|
public:
|
|
STDMETHOD(get_Type)(LONG* lType)
|
|
{
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(NewPage)()
|
|
{
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHOD(get_Height)(double* fHeight)
|
|
{
|
|
if (NULL != fHeight)
|
|
*fHeight = m_oPage.m_fHeight;
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(get_Width)(double* fWidth)
|
|
{
|
|
if (NULL != fWidth)
|
|
*fWidth = m_oPage.m_fWidth;
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(put_Height)(double fHeight)
|
|
{
|
|
m_oPage.m_fHeight = fHeight;
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(put_Width)(double fWidth)
|
|
{
|
|
m_oPage.m_fWidth = fWidth;
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(get_DpiX)(double* dDpiX)
|
|
{
|
|
return S_FALSE;
|
|
}
|
|
STDMETHOD(get_DpiY)(double* dDpiY)
|
|
{
|
|
return S_FALSE;
|
|
}
|
|
// ---------------------------------------------
|
|
// ôóíęöčč ńîńňî˙íč˙ îňęčńîâůčęŕ ---------------
|
|
STDMETHOD(SetPen)(BSTR bsXML)
|
|
{
|
|
m_oPage.PenXML(bsXML);
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(SetBrush)(BSTR bsXML)
|
|
{
|
|
m_oPage.BrushXML(bsXML);
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(SetFont)(BSTR bsXML)
|
|
{
|
|
m_oPage.FontXML(bsXML);
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(SetShadow)(BSTR bsXML)
|
|
{
|
|
m_oPage.ShadowXML(bsXML);
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(SetEdgeText)(BSTR bsXML)
|
|
{
|
|
m_oPage.EdgeXML(bsXML);
|
|
return S_OK;
|
|
}
|
|
// ---------------------------------------------
|
|
PROPERTY_META(Pen, Color, LONG)
|
|
PROPERTY_META(Pen, Alpha, LONG)
|
|
PROPERTY_META(Pen, Size, double)
|
|
PROPERTY_META(Pen, DashStyle, BYTE)
|
|
PROPERTY_META(Pen, LineStartCap, BYTE)
|
|
PROPERTY_META(Pen, LineEndCap, BYTE)
|
|
PROPERTY_META(Pen, LineJoin, BYTE)
|
|
PROPERTY_META(Pen, DashOffset, double)
|
|
PROPERTY_META(Pen, Align, LONG)
|
|
PROPERTY_META(Pen, MiterLimit, double)
|
|
|
|
STDMETHOD(PenDashPattern)(SAFEARRAY* pPattern)
|
|
{
|
|
if (NULL == pPattern)
|
|
return S_FALSE;
|
|
|
|
m_oPage.PenDashPatern((double*)pPattern->pvData, pPattern->rgsabound[0].cElements);
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(BrushRect)(BOOL b, double x, double y, double width, double height)
|
|
{
|
|
Gdiplus::RectF oRect((float)x, (float)y, (float)width, (float)height);
|
|
m_oPage.BrushRect(b, oRect);
|
|
return S_OK;
|
|
}
|
|
|
|
PROPERTY_META(Brush, Color1, LONG)
|
|
PROPERTY_META(Brush, Color2, LONG)
|
|
PROPERTY_META(Brush, Alpha1, LONG)
|
|
PROPERTY_META(Brush, Alpha2, LONG)
|
|
PROPERTY_META(Brush, TextureAlpha, LONG)
|
|
|
|
STDMETHOD(get_BrushTexturePath)(BSTR* bsPath)
|
|
{
|
|
*bsPath = m_oPage.m_oBrush.TexturePath.AllocSysString();
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(put_BrushTexturePath)(BSTR bsPath)
|
|
{
|
|
m_oPage.m_oBrush.TexturePath = (CString)bsPath;
|
|
return S_OK;
|
|
}
|
|
|
|
PROPERTY_META(Brush, TextureMode, LONG)
|
|
PROPERTY_META(Brush, Type, LONG)
|
|
PROPERTY_META(Brush, LinearAngle, double)
|
|
|
|
STDMETHOD(get_FontName)(BSTR* bsPath)
|
|
{
|
|
*bsPath = m_oPage.m_oFont.Name.AllocSysString();
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(put_FontName)(BSTR bsPath)
|
|
{
|
|
m_oPage.FontName((CString)bsPath);
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(get_FontPath)(BSTR* bsPath)
|
|
{
|
|
*bsPath = m_oPage.m_oFont.Path.AllocSysString();
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(put_FontPath)(BSTR bsPath)
|
|
{
|
|
m_oPage.FontPath((CString)bsPath);
|
|
return S_OK;
|
|
}
|
|
PROPERTY_META(Font, Size, double)
|
|
|
|
STDMETHOD(get_FontStyle)(LONG* val)
|
|
{
|
|
*val = m_oPage.m_oFont.GetStyle();
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(put_FontStyle)(LONG val)
|
|
{
|
|
m_oPage.FontStyle(val);
|
|
return S_OK;
|
|
}
|
|
|
|
PROPERTY_META(Font, StringGID, BOOL)
|
|
PROPERTY_META(Font, CharSpace, double);
|
|
|
|
PROPERTY_META(Shadow, Visible, BOOL)
|
|
PROPERTY_META(Shadow, DistanceX, double)
|
|
PROPERTY_META(Shadow, DistanceY, double)
|
|
PROPERTY_META(Shadow, BlurSize, double)
|
|
PROPERTY_META(Shadow, Color, LONG)
|
|
PROPERTY_META(Shadow, Alpha, LONG)
|
|
|
|
PROPERTY_META(Edge, Visible, LONG)
|
|
PROPERTY_META(Edge, Dist, double)
|
|
PROPERTY_META(Edge, Color, LONG)
|
|
PROPERTY_META(Edge, Alpha, LONG)
|
|
|
|
// ---------------------------------------------
|
|
// îňđčńîâęŕ ňĺęńňŕ
|
|
STDMETHOD(CommandDrawText)(BSTR bsText, double fX, double fY, double fWidth, double fHeight, double fBaseLineOffset)
|
|
{
|
|
if (c_nHyperlinkType == m_lCommandType)
|
|
m_strHyperLinks = (CString)bsText;
|
|
|
|
m_oPage.DrawText(bsText, fX, fY, fWidth, fHeight, fBaseLineOffset);
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(CommandDrawTextEx)(BSTR bsText, BSTR bsGidText, BSTR bsSourceCodeText, double fX, double fY, double fWidth, double fHeight, double fBaseLineOffset, DWORD lFlags)
|
|
{
|
|
if (c_nHyperlinkType == m_lCommandType)
|
|
m_strHyperLinks = (CString)bsText;
|
|
|
|
m_oPage.DrawTextEx(bsText, bsGidText, bsSourceCodeText, fX, fY, fWidth, fHeight, fBaseLineOffset, lFlags, FALSE);
|
|
return S_OK;
|
|
}
|
|
// ---------------------------------------------
|
|
// GraphicPath Methods
|
|
STDMETHOD(PathCommandMoveTo)(double fX, double fY)
|
|
{
|
|
m_oPage.PathCommandMoveTo(fX, fY);
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(PathCommandLineTo)(double fX, double fY)
|
|
{
|
|
m_oPage.PathCommandLineTo(fX, fY);
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(PathCommandLinesTo)(SAFEARRAY* pPoints)
|
|
{
|
|
m_oPage.PathCommandLinesTo(pPoints);
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHOD(PathCommandCurveTo)(double fX1, double fY1, double fX2, double fY2, double fX3, double fY3)
|
|
{
|
|
m_oPage.PathCommandCurveTo(fX1, fY1, fX2, fY2, fX3, fY3);
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(PathCommandCurvesTo)(SAFEARRAY* pPoints)
|
|
{
|
|
m_oPage.PathCommandCurvesTo(pPoints);
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(PathCommandArcTo)(double fX, double fY, double fWidth, double fHeight, double fStartAngle, double fSweepAngle)
|
|
{
|
|
m_oPage.PathCommandArcTo(fX, fY, fWidth, fHeight, fStartAngle, fSweepAngle);
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(PathCommandClose)()
|
|
{
|
|
m_oPage.PathCommandClose();
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(PathCommandEnd)()
|
|
{
|
|
m_oPage.PathCommandEnd();
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHOD(PathCommandStart)()
|
|
{
|
|
m_oPage.PathCommandStart();
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(PathCommandGetCurrentPoint)(double* fX, double* fY)
|
|
{
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHOD(DrawPath)(long nType)
|
|
{
|
|
m_oPage.DrawPath(nType);
|
|
return S_OK;
|
|
}
|
|
// ---------------------------------------------
|
|
STDMETHOD(DrawImage)(IUnknown* pInterface, double fX, double fY, double fWidth, double fHeight)
|
|
{
|
|
m_oPage.DrawImage(pInterface, fX, fY, fWidth, fHeight);
|
|
return S_OK;
|
|
}
|
|
// ---------------------------------------------
|
|
STDMETHOD(DrawImageFromFile)(BSTR bstrPath, double fX, double fY, double fWidth, double fHeight)
|
|
{
|
|
m_oPage.DrawImageFromFile(bstrPath, fX, fY, fWidth, fHeight);
|
|
return S_OK;
|
|
}
|
|
//----------------------------------------------
|
|
STDMETHOD(SetAdditionalParam)(BSTR ParamName, VARIANT ParamValue)
|
|
{
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(GetAdditionalParam)(BSTR ParamName, VARIANT* ParamValue)
|
|
{
|
|
return S_OK;
|
|
}
|
|
|
|
// îňđčńîâęŕ ńňđŕíčöű
|
|
STDMETHOD(Draw)(IUnknown* punkRenderer, BOOL* pBreak)
|
|
{
|
|
IASCRenderer* pRenderer = NULL;
|
|
punkRenderer->QueryInterface(__uuidof(IASCRenderer), (void**)&pRenderer);
|
|
|
|
if (NULL == pRenderer)
|
|
return S_FALSE;
|
|
|
|
if (NULL == m_pDocInstance)
|
|
{
|
|
m_oPage.Draw2(pRenderer, pBreak);
|
|
}
|
|
else
|
|
{
|
|
pRenderer->put_Width(m_oPage.m_fWidth);
|
|
pRenderer->put_Height(m_oPage.m_fHeight);
|
|
m_pDocInstance->DrawPage(m_lPageIndex, punkRenderer, pBreak);
|
|
}
|
|
|
|
RELEASEINTERFACE(pRenderer);
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(Draw2)(IUnknown* pRenderer, double dDPIX, double dDPIY, BOOL* pBreak)
|
|
{
|
|
if (NULL == pRenderer)
|
|
return S_FALSE;
|
|
|
|
//C2DRenderer* p2D = dynamic_cast<C2DRenderer*>(pRenderer);
|
|
IASCRenderer* pRen = NULL;
|
|
pRenderer->QueryInterface(__uuidof(IASCRenderer), (void**)&pRen);
|
|
|
|
if (NULL == m_pDocInstance)
|
|
{
|
|
m_oPage.Draw2(pRen, pBreak);
|
|
}
|
|
else
|
|
{
|
|
pRen->put_Width(m_oPage.m_fWidth);
|
|
pRen->put_Height(m_oPage.m_fHeight);
|
|
m_pDocInstance->DrawPage(m_lPageIndex, pRenderer, pBreak);
|
|
}
|
|
RELEASEINTERFACE(pRen);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHOD(BeginCommand)(DWORD lType)
|
|
{
|
|
m_lCommandType = lType;
|
|
m_oPage.BeginCommand(lType);
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(EndCommand)(DWORD lType)
|
|
{
|
|
m_oPage.EndCommand(lType);
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(GetCommandParams)(double* dAngle, double* dLeft, double* dTop, double* dWidth, double* dHeight, DWORD* lFlags)
|
|
{
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(SetCommandParams)(double dAngle, double dLeft, double dTop, double dWidth, double dHeight, DWORD lFlags)
|
|
{
|
|
m_oPage.SetCommandParams(dAngle, dLeft, dTop, dWidth, dHeight, lFlags);
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHOD(SetTransform)(double dA, double dB, double dC, double dD, double dE, double dF)
|
|
{
|
|
m_oPage.SetTransform(dA, dB, dC, dD, dE, dF);
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(GetTransform)(double *pdA, double *pdB, double *pdC, double *pdD, double *pdE, double *pdF)
|
|
{
|
|
return S_FALSE;
|
|
}
|
|
STDMETHOD(ResetTransform)(void)
|
|
{
|
|
m_oPage.ResetTransform();
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHOD(get_ClipMode)(LONG* plMode)
|
|
{
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(put_ClipMode)(LONG lMode)
|
|
{
|
|
m_oPage.WriteClipMode(lMode);
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHOD(PathCommandText)(BSTR bsText, double fX, double fY, double fWidth, double fHeight, double fBaseLineOffset)
|
|
{
|
|
m_oPage.PathCommandText(bsText, fX, fY, fWidth, fHeight, fBaseLineOffset);
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(PathCommandTextEx)(BSTR bsText, BSTR bsGidText, BSTR bsSourceCodeText, double fX, double fY, double fWidth, double fHeight, double fBaseLineOffset, DWORD lFlags)
|
|
{
|
|
m_oPage.DrawTextEx(bsText, bsGidText, bsSourceCodeText, fX, fY, fWidth, fHeight, fBaseLineOffset, lFlags, TRUE);
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHOD(Save)(BSTR bsFile, DWORD dwType, BSTR bsParams)
|
|
{
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHOD(SetPageInstance)(IUnknown* punkInstance, LONG lPage)
|
|
{
|
|
RELEASEINTERFACE(m_pDocInstance);
|
|
m_lPageIndex = -1;
|
|
|
|
if (NULL != punkInstance)
|
|
{
|
|
punkInstance->QueryInterface(__uuidof(IAVSOfficePages), (void**)&m_pDocInstance);
|
|
m_lPageIndex = lPage;
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(get_Hypelinks)(BSTR* bsLinks)
|
|
{
|
|
if ((NULL == bsLinks) || (_T("") != m_strHyperLinks))
|
|
return S_FALSE;
|
|
|
|
*bsLinks = m_strHyperLinks.AllocSysString();
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(SetAdditionalCommands)(BSTR bsXML)
|
|
{
|
|
return S_OK;
|
|
}
|
|
|
|
// -------------------------------------
|
|
STDMETHOD(CommandLong)(LONG lCommand)
|
|
{
|
|
m_oPage.CommandLong(lCommand);
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(CommandDouble)(double dCommand)
|
|
{
|
|
m_oPage.CommandDouble(dCommand);
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(CommandString)(BSTR bsCommand)
|
|
{
|
|
m_oPage.CommandString(bsCommand);
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(CommandVariant)(VARIANT vCommand)
|
|
{
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHOD(CommandLong2)(LONG lType, LONG lCommand)
|
|
{
|
|
m_oPage.CommandLong2(lType, lCommand);
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(CommandDouble2)(LONG lType, double dCommand)
|
|
{
|
|
m_oPage.CommandDouble2(lType, dCommand);
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(CommandString2)(LONG lType, BSTR bsCommand)
|
|
{
|
|
m_oPage.CommandString2(lType, bsCommand);
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(CommandVariant2)(LONG lType, VARIANT vCommand)
|
|
{
|
|
return S_OK;
|
|
}
|
|
}; |