⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wmbase.cpp

📁 WDK 下的XPSDrv 中filter 例子之 watermark
💻 CPP
字号:
/*++

Copyright (c) 2005 Microsoft Corporation

All rights reserved.

THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.

File Name:

   wmbase.cpp

Abstract:

   Base watermark class implementation. The base watermark class provides
   common functionality required between different watermarks (Text, RasterGraphic
   and VectorGraphic. This includes methods for converting a GDI matrix object
   into the appropriate XPS matrix mark-up and intialising the matrix according to
   the watermark options.

--*/

#include "precomp.h"
#include "debug.h"
#include "globals.h"
#include "xdstring.h"
#include "wmbase.h"

using XDPrintSchema::PageWatermark::Layering::ELayeringOption;
using XDPrintSchema::PageWatermark::Layering::Overlay;
using XDPrintSchema::PageWatermark::Layering::Underlay;

/*++

Routine Name:

    CWatermark::CWatermark

Routine Description:

    Constructor for the base watermark class

Arguments:

    wmProps - Watermark PrintTicket properties class

Return Value:

    None
    Throws CXDException(HRESULT) on an error

--*/
CWatermark::CWatermark(
    __in CONST CWMPTProperties& wmProps
    ) :
    m_pDOMDoc(NULL),
    m_WMProps(wmProps)
{
    //
    // Create the DOM document so that sub-classes have access ASAP
    //
    HRESULT hr = m_pDOMDoc.CoCreateInstance(CLSID_DOMDocument60);

    if (FAILED(hr))
    {
        ERR("Failed to create watermark DOM document.\n");
        throw CXDException(hr);
    }
}

/*++

Routine Name:

    CWatermark::~CWatermark

Routine Description:

    Default destructor for the watermarks base class

Arguments:

    None

Return Value:

    None

--*/
CWatermark::~CWatermark()
{
}

/*++

Routine Name:

    CWatermark::MatrixToXML

Routine Description:

    Method to create XML markup representing the
    supplied transformation matrix

Arguments:

    pMatrix          - Pointer to the transformation matrix to convert to XML
    pbstrMatrixXForm - Pointer to the string which will containg the matrix markup

Return Value:

    HRESULT
    S_OK - On success
    E_*  - On error

--*/
HRESULT
CWatermark::MatrixToXML(
    __in        CONST Matrix* pMatrix,
    __deref_out BSTR*         pbstrMatrixXForm
    )
{
    //
    // Construct the matric mark-up from a GDI+ matrix
    //
    HRESULT hr = S_OK;

    if (SUCCEEDED(hr = CHECK_POINTER(pbstrMatrixXForm, E_POINTER)) &&
        SUCCEEDED(hr = CHECK_POINTER(pMatrix, E_POINTER)))
    {
        REAL matElems[6];
        if (Ok == pMatrix->GetElements(matElems))
        {
            try
            {
                CStringXDW cstrMatrix;
                cstrMatrix.Format(L"%.2f,%.2f,%.2f,%.2f,%.2f,%.2f",
                                  matElems[0],
                                  matElems[1],
                                  matElems[2],
                                  matElems[3],
                                  matElems[4],
                                  matElems[5]);

                *pbstrMatrixXForm = cstrMatrix.AllocSysString();
            }
            catch (CXDException& e)
            {
                hr = e;
            }
        }
        else
        {
            *pbstrMatrixXForm = NULL;
            hr = E_FAIL;
        }
    }

    ERR_ON_HR(hr);
    return hr;
}

/*++

Routine Name:

    CWatermark::GetXML

Routine Description:

    Method to get the XML containing the watermark text

Arguments:

    pbstrXML - Pointer to the string to hold the watermark XML text

Return Value:

    HRESULT
    S_OK - On success
    E_*  - On error

--*/
HRESULT
CWatermark::GetXML(
    __deref_out BSTR* pbstrXML
    )
{
    HRESULT hr = S_OK;

    if (SUCCEEDED(hr = CHECK_POINTER(pbstrXML, E_POINTER)) &&
        SUCCEEDED(hr = CHECK_POINTER(m_pWMElem, E_PENDING)))
    {
        hr = m_pWMElem->get_xml(pbstrXML);
    }

    ERR_ON_HR(hr);
    return hr;
}

/*++

Routine Name:

    CWatermark::CreateWMTransform

Routine Description:

    Method to create a transformation matrix which will scale, translate and rotate
    the watermark to correctly fit onto the page. This overload perform scaling to fit
    the watermark content to the requested bounds and is used when creating the bitmap
    or vector watermark.

Arguments:

    wmBounds         - Rectangular area to contain the watermark
    pbstrMatrixXForm - Pointer to the string to contain the watermark transformation matrix

Return Value:

    HRESULT
    S_OK - On success
    E_*  - On error

--*/
HRESULT
CWatermark::CreateWMTransform(
    __in        RectF wmBounds,
    __deref_out BSTR* pbstrMatrixXForm
    )
{
    ASSERTMSG(wmBounds.Width > 0, "Zero width watermark found whilst creating transform\n");
    ASSERTMSG(wmBounds.Height > 0, "Zero height watermark found whilst creating transform\n");

    HRESULT hr = S_OK;

    if (SUCCEEDED(hr = CHECK_POINTER(pbstrMatrixXForm, E_POINTER)))
    {
        *pbstrMatrixXForm = NULL;

        RectF targetBounds;
        REAL  angle = 0;

        if (SUCCEEDED(hr = m_WMProps.GetBounds(&targetBounds)) &&
            SUCCEEDED(hr = m_WMProps.GetAngle(&angle)) &&
            wmBounds.Width > 0 &&
            wmBounds.Height > 0)
        {
            ASSERTMSG(targetBounds.Width > 0, "Zero width target found whilst creating transform\n");
            ASSERTMSG(targetBounds.Height > 0, "Zero height target found whilst creating transform\n");

            //
            // Start with the identity matrix
            //
            Matrix xForm;

            //
            // Offset to the target bounds
            //
            PointF offset(targetBounds.X - wmBounds.X, targetBounds.Y - wmBounds.Y);

            //
            // Apply the transforms to the matrix
            //
            xForm.Scale(targetBounds.Width/wmBounds.Width, targetBounds.Height/wmBounds.Height, MatrixOrderAppend);
            xForm.Rotate(angle, MatrixOrderAppend);
            xForm.Translate(offset.X, offset.Y, MatrixOrderAppend);

            //
            // Retrieve the matrix string
            //
            hr = MatrixToXML(&xForm, pbstrMatrixXForm);
        }
    }

    ERR_ON_HR(hr);
    return hr;
}

/*++

Routine Name:

    CWatermark::CreateWMTransform

Routine Description:

    Method to create a transformation matrix which will translate and rotate. This overload
    does not perform any scaling to fit the watermark content and is used when creating the
    text watermark.

Arguments:

    wmOrigin         - Point defining the watermark origin
    pbstrMatrixXForm - Pointer to the string to contain the watermark transformation matrix

Return Value:

    HRESULT
    S_OK - On success
    E_*  - On error

--*/
HRESULT
CWatermark::CreateWMTransform(
    __in        PointF wmOrigin,
    __deref_out BSTR*  pbstrMatrixXForm
    )
{
    HRESULT hr = S_OK;

    if (SUCCEEDED(hr = CHECK_POINTER(pbstrMatrixXForm, E_POINTER)))
    {
        *pbstrMatrixXForm = NULL;
        REAL  angle = 0;

        if (SUCCEEDED(hr = m_WMProps.GetAngle(&angle)))
        {
            //
            // Start with the identity matrix
            //
            Matrix xForm;

            //
            // Apply the transforms to the matrix
            //
            xForm.Rotate(angle, MatrixOrderAppend);
            xForm.Translate(wmOrigin.X, wmOrigin.Y, MatrixOrderAppend);

            //
            // Retrieve the matrix string
            //
            hr = MatrixToXML(&xForm, pbstrMatrixXForm);
        }
    }

    ERR_ON_HR(hr);
    return hr;
}

/*++

Routine Name:

    CWatermark::InsertStart

Routine Description:

    Method to check whether the watermark should be inserted at the start of the
    page to create an underlay effect

Arguments:

    None

Return Value:

    BOOL
    TRUE  - The watermark mark-up needs to be inserted at the start of the fixed page
    FALSE - The watermark mark-up needs to be inserted at the end of the fixed page

--*/
BOOL
CWatermark::InsertStart(
    VOID
    )
{
    ELayeringOption wmLayering = Overlay;

    m_WMProps.GetLayering(&wmLayering);

    return wmLayering == Underlay;
}

/*++

Routine Name:

    CWatermark::InsertEnd

Routine Description:

    Method to check whether the watermark should be inserted at the
    end of the page to create an overlay effect

Arguments:

    None

Return Value:

    BOOL
    TRUE  - The watermark mark-up needs to be inserted at the end of the fixed page
    FALSE - The watermark mark-up needs to be inserted at the start of the fixed page

--*/
BOOL
CWatermark::InsertEnd(
    VOID
    )
{
    return !InsertStart();
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -