亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? bkflt.cpp

?? wdk自帶xpsdrv filter 之 booklet
?? 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:

   bkflt.cpp

Abstract:

   Booklet filter implementation. This class derives from the Xps filter
   class and implements the necessary part handlers to support booklet
   printing. The booklet filter is responsible for re-ordering pages and re-uses
   the NUp filter to provide 2-up and offset support.

--*/

#include "precomp.h"
#include "debug.h"
#include "globals.h"
#include "xdstring.h"
#include "xdexcept.h"
#include "pthndlr.h"
#include "bkflt.h"
#include "bksax.h"
#include "bkpthndlr.h"

using XDPrintSchema::Binding::BindingData;

//
// {7DFC96C6-CEA2-46d8-B354-887C47B7986D}
//
CLSID CBookletFilter::CLSID_BookletFilter = {0x7dfc96c6, 0xcea2, 0x46d8, {0xb3, 0x54, 0x88, 0x7c, 0x47, 0xb7, 0x98, 0x6d}};

/*++

Routine Name:

    CBookletFilter::CBookletFilter

Routine Description:

    Default constructor for the booklet filter which initialises the
    filter to sensible default values

Arguments:

    None

Return Value:

    None

--*/
CBookletFilter::CBookletFilter() :
    m_bSendAllDocs(TRUE),
    m_bookScope(CBkPTProperties::None)
{
}

/*++

Routine Name:

    CBookletFilter::~CBookletFilter

Routine Description:

    Default destructor for the booklet filter

Arguments:

    None

Return Value:

    None

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

/*++

Routine Name:

    CBookletFilter::GetCLSID

Routine Description:

    Method to obtain the class ID for the booklet filter

Arguments:

    None

Return Value:

    Reference to the class ID for the booklet filter

--*/
CONST CLSID&
CBookletFilter::GetCLSID(
    VOID
    )
{
    return CLSID_BookletFilter;
}

/*++

Routine Name:

    CNUpFilter::ProcessPart

Routine Description:

    Method for processing each fixed document sequence part in a container

Arguments:

    pFDS - Pointer to the fixed document sequence to process

Return Value:

    HRESULT
    S_OK - On success
    E_*  - On error

--*/
HRESULT
CBookletFilter::ProcessPart(
    __inout IFixedDocumentSequence* pFDS
    )
{
    VERBOSE("Processing Fixed Document Sequence part with booklet filter handler\n");

    HRESULT hr = S_OK;

    if (SUCCEEDED(hr = CHECK_POINTER(pFDS, E_POINTER)))
    {
        //
        // Get the PT manager to return the FixedDocumentSequence ticket.
        //
        IXMLDOMDocument2* pPT = NULL;
        if (SUCCEEDED(hr = m_ptManager.SetTicket(pFDS)) &&
            SUCCEEDED(hr = m_ptManager.GetTicket(kPTJobScope, &pPT)))
        {
            //
            // Set the binding scope from the PrintTicket
            //
            hr = SetBindingScope(pPT);
        }
    }

    if (SUCCEEDED(hr))
    {
        hr = m_pXDWriter->SendFixedDocumentSequence(pFDS);
    }

    ERR_ON_HR(hr);
    return hr;
}

/*++

Routine Name:

    CBookletFilter::ProcessPart

Routine Description:

    Method for processing each fixed document part in a container

Arguments:

    pFD - Pointer to the fixed document to process

Return Value:

    HRESULT
    S_OK    - On success
    S_FALSE - When not enabled in the PT
    E_*     - On error

--*/
HRESULT
CBookletFilter::ProcessPart(
    __inout IFixedDocument* pFD
    )
{
    VERBOSE("Processing Fixed Document part with booklet filter handler\n");

    HRESULT hr = S_OK;

    if (SUCCEEDED(hr = CHECK_POINTER(pFD, E_POINTER)) &&
        SUCCEEDED(hr = m_ptManager.SetTicket(pFD)))
    {
        //
        // If we are in a JobBook session we want to maintain the current
        // JobBook settings
        //
        if (m_bookScope != CBkPTProperties::Job)
        {
            //
            // Flush any outstanding pages in case we have just completed a
            // DocNUp sequence
            //
            hr = FlushCache();

            //
            // Get the PT manager to return the FixedDocument ticket.
            //
            IXMLDOMDocument2* pPT = NULL;
            if (SUCCEEDED(hr) &&
                SUCCEEDED(hr = m_ptManager.GetTicket(kPTDocumentScope, &pPT)))
            {
                //
                // Set the binding scope from the PrintTicket
                //
                hr = SetBindingScope(pPT);
            }
        }
    }

    if (SUCCEEDED(hr) &&
        m_bSendAllDocs)
    {
        hr = m_pXDWriter->SendFixedDocument(pFD);

        //
        // If we are JobBindAllDocuments we only ever send one doc - now we have
        // sent the first document we can test to see if we need to send all of them
        //
        if (m_bookScope == CBkPTProperties::Job)
        {
            m_bSendAllDocs = FALSE;
        }
    }

    ERR_ON_HR(hr);
    return hr;
}

/*++

Routine Name:

    CBookletFilter::ProcessPart

Routine Description:

    Method for processing each fixed page part in a container

Arguments:

    pFP - Pointer to the fixed page to process

Return Value:

    HRESULT
    S_OK - On success
    E_*  - On error

--*/
HRESULT
CBookletFilter::ProcessPart(
    __inout IFixedPage* pFP
    )
{
    ASSERTMSG(m_pXDWriter != NULL, "XD writer is not initialised.\n");

    VERBOSE("Processing Fixed Page with booklet filter handler\n");

    HRESULT hr = S_OK;

    if (SUCCEEDED(hr = CHECK_POINTER(pFP, E_POINTER)) &&
        SUCCEEDED(hr = CHECK_POINTER(m_pXDWriter, E_PENDING)))
    {
        //
        // Check if we are processing a booklet job
        //
        if (m_bookScope != CBkPTProperties::None)
        {
            //
            // Cache pages for reordering
            //
            try
            {
                m_cacheFP.push_back(pFP);
            }
            catch (exception& DBG_ONLY(e))
            {
                ERR(e.what());
                hr = E_FAIL;
            }
        }
        else
        {
            hr = m_pXDWriter->SendFixedPage(pFP);
        }
    }

    ERR_ON_HR(hr);
    return hr;
}

/*++

Routine Name:

    CBookletFilter::Finalize

Routine Description:

    Method to flush the cache of pages as the last action of the filter

Arguments:

    None

Return Value:

    HRESULT
    S_OK - On success
    E_*  - On error

--*/
HRESULT
CBookletFilter::Finalize(
    VOID
    )
{
    //
    // Just flush the cache of pages
    //
    return FlushCache();
}

/*++

Routine Name:

    CBookletFilter::FlushCache

Routine Description:

    Method to send the cached collection of pages in the correct order back

Arguments:

    None

Return Value:

    HRESULT
    S_OK - On success
    E_*  - On error

--*/
HRESULT
CBookletFilter::FlushCache(
    VOID
    )
{
    HRESULT hr = S_OK;

    if (m_pXDWriter == NULL)
    {
        hr = E_PENDING;
    }

    size_t cPages = 0;

    try
    {
        cPages = m_cacheFP.size();
    }
    catch (exception& DBG_ONLY(e))
    {
        ERR(e.what());
        hr = E_FAIL;
    }

    if (SUCCEEDED(hr) &&
        cPages > 0 &&
        m_bookScope != CBkPTProperties::None)
    {
        //
        // We may need to add a pad page if the page count is odd
        //
        CComPtr<IFixedPage> pNewFP(NULL);
        if (cPages%2 == 1 &&
            SUCCEEDED(hr = CreatePadPage(&pNewFP)))
        {
            //
            // We successfully created our pad page; add it to the cache
            //
            try
            {
                m_cacheFP.push_back(pNewFP);
            }
            catch (exception& DBG_ONLY(e))
            {
                ERR(e.what());
                hr = E_FAIL;
            }

            cPages++;
        }

        if (SUCCEEDED(hr))
        {
            try
            {
                //
                // Re-order pages in the cache
                //
                map<size_t, IFixedPage*>  reorderedPages;
                size_t newIndex = 0;
                size_t pageIndex = 0;
                for (pageIndex = 0; pageIndex < cPages/2; pageIndex++)
                {
                    reorderedPages[newIndex] = m_cacheFP[pageIndex];
                    newIndex += 2;
                }

                newIndex = cPages - 1;
                for (pageIndex = cPages/2; pageIndex < cPages; pageIndex++)
                {
                    reorderedPages[newIndex] = m_cacheFP[pageIndex];
                    newIndex -= 2;
                }

                //
                // Write out reordered pages
                //
                for (pageIndex = 0; pageIndex < cPages && SUCCEEDED(hr); pageIndex++)
                {
                    hr = m_pXDWriter->SendFixedPage(reorderedPages[pageIndex]);
                }

                //
                // Clean out the cache
                //
                m_cacheFP.clear();
            }
            catch (exception& DBG_ONLY(e))
            {
                ERR(e.what());
                hr = E_FAIL;
            }
        }
    }

    ERR_ON_HR(hr);
    return hr;
}

/*++

Routine Name:

    CBookletFilter::CreatePadPage

Routine Description:

    Method to create a pad page which is required for odd page counts to
    ensure pages are correctly ordered for presentation as a booklet

Arguments:

    ppNewPage - Pointer to a pointer to the newly created fixed page

Return Value:

    HRESULT
    S_OK - On success
    E_*  - On error

--*/
HRESULT
CBookletFilter::CreatePadPage(
    __deref_out IFixedPage** ppNewPage
    )
{
    HRESULT hr = S_OK;

    //
    // Validate parameters and members before proceeding
    //
    if (SUCCEEDED(hr = CHECK_POINTER(ppNewPage, E_POINTER)) &&
        SUCCEEDED(hr = CHECK_POINTER(m_pXDWriter, E_PENDING)))
    {
        *ppNewPage = NULL;
        PCWSTR pszPageName = NULL;

        try
        {
            //
            // Create a unique name for the pad page for this print session using GetTickCount()
            //
            CStringXDW szNewPageName;
            szNewPageName.Format(L"/Pad_page_%u.xaml", GetTickCount());
            pszPageName = szNewPageName.GetBuffer();

            //
            // Create a new empty page and retrieve a writer. Also get a
            // reader from the first page so we can copy the FixedPage root
            // element. This ensures the page sizes match.
            //
            CComPtr<IPrintWriteStream>  pWriter(NULL);
            CComPtr<ISAXXMLReader>      pSaxRdr(NULL);

            if (SUCCEEDED(hr) &&
                SUCCEEDED(hr = m_pXDWriter->GetNewEmptyPart(pszPageName,
                                                            IID_IFixedPage,
                                                            reinterpret_cast<PVOID*>(ppNewPage),
                                                            &pWriter)) &&
                SUCCEEDED(hr = pSaxRdr.CoCreateInstance(CLSID_SAXXMLReader60)))
            {
                //
                // We use a simple SAX handler which copies only the root
                // element and discards all other content.
                //
                CBkSaxHandler bkSaxHndlr(pWriter);
                CComPtr<IPrintReadStream> pReader(NULL);

                IFixedPage* pFP = NULL;

                pFP = m_cacheFP[0];

                if (SUCCEEDED(hr) &&
                    SUCCEEDED(hr = pSaxRdr->putContentHandler(&bkSaxHndlr)) &&
                    SUCCEEDED(hr = pFP->GetStream(&pReader)))
                {
                    CComPtr<ISequentialStream> pReadStreamToSeq(NULL);

                    pReadStreamToSeq.Attach(new pfp::PrintReadStreamToSeqStream(pReader));

                    if (SUCCEEDED(hr = CHECK_POINTER(pReadStreamToSeq, E_OUTOFMEMORY)))
                    {
                        hr = pSaxRdr->parse(CComVariant(static_cast<ISequentialStream*>(pReadStreamToSeq)));
                    }
                }

                pWriter->Close();
            }
        }
        catch (CXDException& e)
        {
            hr = e;
        }
    }

    ERR_ON_HR(hr);
    return hr;
}

/*++

Routine Name:

    CBookletFilter::SetBindingScope

Routine Description:

    Method to retrieve the binding scope from a PrintTicket

Arguments:

    pPT - Pointer to the PrintTicket to retrieve the scope from

Return Value:

    HRESULT
    S_OK    - On success
    S_FALSE - Booklet settings not present in the PT
    E_*     - On error

--*/
HRESULT
CBookletFilter::SetBindingScope(
    __in IXMLDOMDocument2* pPT
    )
{
    HRESULT hr = S_OK;

    if (SUCCEEDED(hr = CHECK_POINTER(pPT, E_POINTER)))
    {
        try
        {
            BindingData    bindingData;
            CBookPTHandler bkPTHandler(pPT);

            //
            // Retrieve the booklet properties from the ticket via the handler
            //
            if (SUCCEEDED(hr) &&
                SUCCEEDED(hr = bkPTHandler.GetData(&bindingData)))
            {
                CBkPTProperties bookletPTProps(bindingData);

                //
                // Retrieve the booklet scope
                //
                hr = bookletPTProps.GetScope(&m_bookScope);
            }
            else if (hr == E_ELEMENT_NOT_FOUND)
            {
                //
                // Booklet PT settings are not present - reset hr to S_FALSE and proceed
                //
                hr = S_FALSE;
            }
        }
        catch (CXDException& e)
        {
            hr = e;
        }
    }

    return hr;
}


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一区二区三区免费在线看| 丝袜a∨在线一区二区三区不卡| 国产一区二区h| 精品福利二区三区| 国产91综合一区在线观看| 国产日韩精品一区二区三区| 成人精品免费看| 中文字幕在线一区| 欧美三级三级三级爽爽爽| 天天综合网 天天综合色| 日韩精品一区二区三区在线| 国产毛片精品视频| 亚洲三级免费电影| 在线观看91av| 国产成人免费在线视频| 亚洲激情欧美激情| 日韩三级免费观看| 国产精品一色哟哟哟| 日韩理论片网站| 制服丝袜激情欧洲亚洲| 国产乱色国产精品免费视频| 亚洲色图欧美偷拍| 欧美一级黄色大片| 暴力调教一区二区三区| 日日欢夜夜爽一区| 日本一区二区三区免费乱视频| 91片黄在线观看| 日韩精彩视频在线观看| 欧美激情一区二区三区不卡| 日本韩国欧美一区二区三区| 蜜臀av一区二区在线免费观看| 国产精品久久久久久亚洲伦| 欧美日韩国产综合一区二区| 国产美女一区二区| 亚洲第一会所有码转帖| 久久久久国产精品厨房| 欧美在线视频全部完| 精品一区二区三区在线播放视频 | 欧美三级电影网站| 国产一区二区视频在线播放| 亚洲电影第三页| 国产精品网友自拍| 欧美xxxx老人做受| 欧美日韩aaa| 97精品电影院| 国产毛片精品视频| 日本午夜一本久久久综合| 日本一区二区视频在线观看| 日韩西西人体444www| 欧美性一区二区| heyzo一本久久综合| 经典三级视频一区| 亚洲va欧美va人人爽| 国产精品久久久久影院老司| 精品裸体舞一区二区三区| 欧美日韩国产免费| 99精品欧美一区| 成人免费高清在线| 国产乱理伦片在线观看夜一区| 蜜桃av一区二区在线观看| 亚洲一区中文在线| 自拍偷自拍亚洲精品播放| 国产三级精品三级| 久久久噜噜噜久噜久久综合| 56国语精品自产拍在线观看| 欧美最猛黑人xxxxx猛交| 91偷拍与自偷拍精品| www.亚洲激情.com| 成人免费高清在线| 99久精品国产| 成人av先锋影音| 成人激情开心网| 成人av动漫在线| a亚洲天堂av| 色香蕉久久蜜桃| 在线视频中文字幕一区二区| 色呦呦国产精品| 欧美在线观看你懂的| 91国偷自产一区二区使用方法| 99久久久精品| 91国模大尺度私拍在线视频| 在线亚洲欧美专区二区| 欧美系列日韩一区| 91精品一区二区三区久久久久久| 欧美精品日韩综合在线| 91精品在线免费| 精品国产乱码久久久久久久久| 日韩你懂的电影在线观看| 精品久久久久av影院| 久久久久久久综合| 国产精品传媒入口麻豆| 一区二区三区中文免费| 亚洲3atv精品一区二区三区| 日本在线不卡视频| 久久99这里只有精品| 国产一区二区三区精品欧美日韩一区二区三区 | 蜜臀a∨国产成人精品| 久久精品99久久久| 国产精品88888| 91浏览器在线视频| 欧美精品tushy高清| 精品国产91洋老外米糕| 日本一区二区久久| 夜夜嗨av一区二区三区| 日韩av中文字幕一区二区| 91论坛在线播放| 欧美一区二区视频在线观看2020| xnxx国产精品| 一级中文字幕一区二区| 青青草国产精品亚洲专区无| 国产成人av福利| 欧美亚洲综合久久| 久久影院午夜论| 一区二区三区精品视频在线| 久久电影网电视剧免费观看| 成人av午夜电影| 欧美一区二区福利在线| 国产精品久久久久久妇女6080| 一区二区在线免费观看| 久久99精品久久久久久国产越南 | 国产精品久久午夜夜伦鲁鲁| 一区二区三区中文字幕电影 | 67194成人在线观看| 国产色产综合产在线视频| 一级精品视频在线观看宜春院| 久久99久久99精品免视看婷婷| 99re66热这里只有精品3直播| 欧美精品一二三区| 亚洲人成网站色在线观看| 久久精品国产精品亚洲综合| 色婷婷久久综合| 久久精品一区二区三区av| 午夜精品久久久久久久久久久 | 亚洲男人天堂av| 国产毛片精品国产一区二区三区| 欧美视频在线不卡| 国产精品亲子乱子伦xxxx裸| 奇米亚洲午夜久久精品| 欧美日韩在线播放三区| 中文字幕在线观看一区二区| 国内成人免费视频| 欧美老年两性高潮| 亚洲另类在线一区| 狠狠v欧美v日韩v亚洲ⅴ| 久久久777精品电影网影网| 午夜精品久久久久久不卡8050| av电影在线观看不卡| 久久久精品2019中文字幕之3| 日本午夜精品一区二区三区电影 | 日韩国产欧美在线视频| 91搞黄在线观看| 国产精品人妖ts系列视频| 国产精品88av| 久久众筹精品私拍模特| 免费在线成人网| 欧美日韩国产精品成人| 亚洲一线二线三线视频| 日本乱人伦一区| 亚洲欧洲中文日韩久久av乱码| 国产成人午夜99999| 欧美精品一区二区三区在线播放| 日韩精品一二三四| 欧美二区在线观看| 日本亚洲电影天堂| 欧美一级片在线观看| 日韩极品在线观看| 日韩精品中文字幕在线不卡尤物| 日本伊人精品一区二区三区观看方式| 欧美日韩一区 二区 三区 久久精品| ...xxx性欧美| 日本韩国精品在线| 亚洲综合男人的天堂| 欧美色欧美亚洲另类二区| 亚洲综合丝袜美腿| 欧美剧情片在线观看| 免费视频最近日韩| 久久婷婷色综合| 成人av免费在线观看| 亚洲精品视频免费看| 欧美日本精品一区二区三区| 青青草原综合久久大伊人精品 | 久久久精品蜜桃| 国产成人免费在线视频| 国产精品久线观看视频| 在线视频综合导航| 蜜臀av一区二区在线观看| 久久久久久久久蜜桃| 99久久久免费精品国产一区二区 | 日韩午夜精品电影| 91成人免费网站| 天天色天天操综合| 久久蜜桃一区二区| 91麻豆.com| 麻豆成人91精品二区三区| 亚洲国产高清aⅴ视频| 色诱亚洲精品久久久久久| 免费成人在线网站| 中文字幕欧美日本乱码一线二线| 99精品欧美一区二区三区小说 | 亚洲一区二区三区爽爽爽爽爽|