Windows Драйвер растрового изображения winddk OEMNextBand, OEMSendPage - PullRequest
0 голосов
/ 25 апреля 2020

Я наблюдаю, что OEMSendPage не вызывается всегда. Когда вызывается OEMSendPage? У нас есть устаревший принтер, который выполняет некоторую обработку внутри OEMSendPage. Я ненавижу перемещать это в другое место в процессе. Это работало, но сейчас я работаю над некоторыми улучшениями и должен это выяснить. Другими командами являются OEMStartPage, OEMStartDo c, OEMTextOut, OEMStartBanding, OEMNextBand, OEMEndDo c. Все они называются, кроме SendPage. В настоящее время я подключаю VS к spool.exe, и принтер устанавливается в порт File :. Когда вызывается команда SendPage?

static const DRVFN s_aOemHookFuncs[] =

#if defined(IMPL_TEXTOUT)
    {INDEX_DrvTextOut, (PFN)OEMTextOut},
#endif

#if defined(IMPL_TRANSPARENTBLT)
    {INDEX_DrvTransparentBlt, (PFN)OEMTransparentBlt},
#endif

#if defined(IMPL_STARTDOC)
    {INDEX_DrvStartDoc, (PFN)OEMStartDoc},
#endif

#if defined(IMPL_ENDDOC)
    {INDEX_DrvEndDoc, (PFN)OEMEndDoc},
#endif

#if defined(IMPL_STARTPAGE)
    {INDEX_DrvStartPage, (PFN)OEMStartPage},
#endif

#if defined(IMPL_SENDPAGE)
    {INDEX_DrvSendPage, (PFN)OEMSendPage},
#endif

В качестве обновления я нашел по следующей ссылке https://docs.microsoft.com/en-us/windows-hardware/drivers/print/rendering-a-print-job# -полоса не используется Поэтому я добавил часть обработки в NextBand также включает SendPage. Но что-то не так. OEMNextBand вызывается несколько раз, а в PCL много страниц. Оригинал только одна страница, но PCL имеет так много страниц. Кто-нибудь может подсказать?

char  gszPageText[32767];
BOOL APIENTRY
OEMStartBanding(
    SURFOBJ     *pso,
    POINTL      *pptl
)

{
    return (pOemPDEV->m_pfnDrvStartBanding)(pso,
                                            pptl);
}

BOOL APIENTRY
OEMNextBand(
    SURFOBJ     *pso,
    POINTL      *pptl
)

/*++

{
    //VERBOSE(L"OEMNextBand entry.");

    PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev;
    POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM;

    // Punt call back to UNIDRV.
    BOOL b= (pOemPDEV->m_pfnDrvNextBand)(pso,
        pptl);
    if (pptl != NULL && pptl->x == -1 && pptl->y == -1)
    {
        BOOL c = DOPCLProcessingPerPage(pso, gFirstPage, gszPageText);
            if (!c)
                return TRUE;
    }
//if (!CreatePCLRasterGraphicPage(pso, gFirstPage, gszPageText))
    //return TRUE;

return b;

}

DrvEnableSurface для вызова EngModifySurface для отключения полос. Я не знаю плюсы и минусы отключения полосы по производительности. Это растровый драйвер

Edited 
**For Mono**
StartDoc
  -- then for as many pages in the document
  StartPage
  SendPage
EndDoc
**For Colour**
StartDoc
  -- then for as many pages in the document
  StartPage
  StartBanding
    -- then for so many bands
    NextBand
  SendPage ?? (what is the send page equivalent here for color)

EndDoc

**

Edited for EnableDriverSurface
    static const DRVFN s_aOemHookFuncs[] =
    {
        {INDEX_DrvEndDoc, (PFN)OEMEndDoc},
        {INDEX_DrvSendPage, (PFN)OEMSendPage},
        {INDEX_DrvStartBanding, (PFN)OEMStartBanding},
        {INDEX_DrvNextBand, (PFN)OEMNextBand},
        {INDEX_DrvTextOut, (PFN)OEMTextOut},
        {INDEX_DrvStartPage, (PFN)OEMStartPage},
        {INDEX_DrvStartDoc,(PFN)OEMStartDoc},
//added this
       {INDEX_DrvEnableSurface ,(PFN)DrvEnableSurface}
     //   {INDEX_DrvEnableSurface, (PFN)DrvEnableSurface},


    };


HSURF APIENTRY DrvEnableSurface(
    DHPDEV dhpdev)
{


    HSURF hsurf;
    SIZEL sizl;
    ULONG ulBitmapType;
    FLONG flHooks;

    // Create engine bitmap around frame buffer.
    PDEVOBJ ppdev = (PDEVOBJ)dhpdev;
    POEMPDEV pOemPDEV = (POEMPDEV)ppdev->pdevOEM;
    EngModifySurface(hsurf,......)
   return(hsurf);
}

**

...