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

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

?? ddicntl.cpp

?? win2000打印機驅動代碼
?? CPP
字號:
/*
 * @file uni/ddicntl.cpp DDI hook control function.
 *
 * W2kPrintDrvSample
 *
 * Copyright (C) 2004, terrificskyfox <terrificskyfox@yahoo.com.cn>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

#include "precomp.h"
#include "debug.h"
#include "oemuni.h"
#include "devmode.h"
#include "dlgclbk.h"
#include "resource.h"
#include "output.h"
#include "ddicntl.h"


/*
 *  Internal implementations
 */

static void page_output(PDEVOBJ pdevobj)
{
	POEMPDEV pOemPDEV = (POEMPDEV)pdevobj->pdevOEM;


    // convert to down-top DIB
	convert_to_normal_dib(pdevobj);

	// clean
	for(LONG Loop = 0; Loop < pOemPDEV->DIBInfo.DIBSize.cy; Loop++)
	{
		if(pOemPDEV->DIBInfo.pScans[Loop].bFlag)
			HeapFree(pOemPDEV->hHeap, 0, pOemPDEV->DIBInfo.pScans[Loop].pBits);
	}
	HeapFree(pOemPDEV->hHeap, 0, pOemPDEV->DIBInfo.pScans);

	pOemPDEV->DIBInfo.bPageStarted = FALSE;
    if(!pOemPDEV->bAppendPageNum)
        ZeroMemory(pOemPDEV->szPreviewFileName, MAX_PATH * sizeof(TCHAR));
}


/*
 *  Implementations
 */

/*
 * Function: OEMStartDoc
 *
 * Purpose: Called by GDI when it is ready to start sending a document
 *		    to the driver for rendering.
 *
 * Return Value: BOOL
 */
BOOL APIENTRY
OEMStartDoc(
    SURFOBJ    *pso,
    PWSTR       pwszDocName,
    DWORD       dwJobId)
{
	TERSE(UNITEXT("OEMStartDoc() entry.\r\n"));


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


    // turn around to call Unidrv
    return (((PFN_DrvStartDoc)(pOemPDEV->pfnUnidrv[UD_DrvStartDoc])) (
			pso,
			pwszDocName,
			dwJobId
			));
}

/*
 * Function: OEMStartPage
 *
 * Purpose: Called by GDI when it is ready to start sending the contents of
 *		    a physical page to the driver for rendering.
 *
 * Action: Initialize page-related environment, call back to Unidrv.
 *
 * Return Value: BOOL
 */
BOOL APIENTRY
OEMStartPage(
    SURFOBJ    *pso)
{
    TERSE(UNITEXT("OEMStartPage() entry.\r\n"));


    PDEVOBJ  pdevobj = (PDEVOBJ)pso->dhpdev;
    POEMPDEV pOemPDEV = (POEMPDEV)pdevobj->pdevOEM;
    PDEVMODE pPubDev = (PDEVMODE)pdevobj->pPublicDM;
	POEMDEV  pOemDev = (POEMDEV)pdevobj->pOEMDM;


    // increment page number
    pOemPDEV->PageNum++;

    if(!pOemPDEV->bAppendPageNum)
    {
	    if(IDCANCEL == DialogBoxParam((HINSTANCE)pdevobj->hOEM, MAKEINTRESOURCE(IDD_OUTPUT), NULL,
                                      (DLGPROC)DlgOutputProc, (LPARAM)pdevobj))
            return FALSE;
    }


	// set resolution
	if(pPubDev->dmOrientation == DMORIENT_PORTRAIT)
	{
		pOemPDEV->DIBInfo.XPelsPerMeter = pPubDev->dmPrintQuality * 10000 / 254;
		pOemPDEV->DIBInfo.YPelsPerMeter = pPubDev->dmYResolution * 10000 / 254;
	}
	else
	{
		pOemPDEV->DIBInfo.XPelsPerMeter = pPubDev->dmYResolution * 10000 / 254;
		pOemPDEV->DIBInfo.YPelsPerMeter = pPubDev->dmPrintQuality * 10000 / 254;
	}

	// calculate approximate page height
	if(pPubDev->dmOrientation == DMORIENT_PORTRAIT)
		pOemPDEV->approHeight = pPubDev->dmPaperLength * pPubDev->dmYResolution / 254 + 10;
	else
		pOemPDEV->approHeight = pPubDev->dmPaperWidth * pPubDev->dmPrintQuality / 254 + 10;

	// allocate memory for scanline pointer array
	if(!(pOemPDEV->DIBInfo.pScans = (PSCANLINEPTR)HeapAlloc(pOemPDEV->hHeap, HEAP_ZERO_MEMORY,
															pOemPDEV->approHeight * sizeof(SCANLINEPTR))))
	{
		WARNING(UNITEXT("    error(%d) occured while allocating memory for pScans!\r\n"), GetLastError());
		return FALSE;
	}


    // turn around to call Unidrv
    return (((PFN_DrvStartPage)(pOemPDEV->pfnUnidrv[UD_DrvStartPage]))(pso));
}

/*
 * Function: OEMStartBanding
 *
 * Purpose: Called by GDI when it is ready to start sending bands of a
 *		    physical page to the driver for rendering.
 *
 * Return Value: BOOL
 */
BOOL APIENTRY
OEMStartBanding(
    SURFOBJ *pso,
    POINTL *pptl)
{
    TERSE(UNITEXT("OEMStartBanding() entry.\r\n"));


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

	
    // turn around to call Unidrv
    return (((PFN_DrvStartBanding)(pOemPDEV->pfnUnidrv[UD_DrvStartBanding])) (
			pso,
			pptl
			));
}

/*
 * Function: OEMNextBand
 *
 * Purpose: Called by GDI when it has finished drawing a band for a physical
 *		    page, so the driver can send the band to the printer.
 *
 * Action: Call back to Unidrv, if we are at the end of the page, send
 *		   page to file and clean page-related environment.
 *
 * Return Value: BOOL
 */
BOOL APIENTRY
OEMNextBand(
    SURFOBJ *pso,
    POINTL *pptl)
{
    TERSE(UNITEXT("OEMNextBand() entry.\r\n"));


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


    // turn around to call Unidrv
    BOOL bRet = (((PFN_DrvNextBand)(pOemPDEV->pfnUnidrv[UD_DrvNextBand])) (
				pso,
				pptl
				));

	// see if we are at the end of the page
	if(bRet && (pptl->x == -1L && pptl->y == -1L))
		page_output(pdevobj);

	return bRet;
}

/*
 * Function: OEMSendPage
 *
 * Purpose: Called by GDI when it has finished drawing a physical page, so
 *		    the driver can send the page to the printer.
 *
 * Return Value: BOOL
 */
BOOL APIENTRY
OEMSendPage(
    SURFOBJ    *pso)
{
	TERSE(UNITEXT("OEMSendPage() entry.\r\n"));


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


    // turn around to call Unidrv
    BOOL bRet = (((PFN_DrvSendPage)(pOemPDEV->pfnUnidrv[UD_DrvSendPage]))(pso));

    if(bRet)
	    page_output(pdevobj);

	return bRet;
}

/*
 * Function: OEMEndDoc
 *
 * Purpose: Called by GDI when it has finished sending a document to the
 *		    driver for rendering.
 *
 * Return Value: BOOL
 */
BOOL APIENTRY
OEMEndDoc(
    SURFOBJ    *pso,
    FLONG       fl)
{
    TERSE(UNITEXT("OEMEndDoc() entry.\r\n"));


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


    // turn around to call Unidrv
    return (((PFN_DrvEndDoc)(pOemPDEV->pfnUnidrv[UD_DrvEndDoc])) (
			pso,
			fl
			));
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲综合免费观看高清完整版在线 | 天天免费综合色| 亚洲精品国产精华液| 亚洲视频网在线直播| 国产精品人成在线观看免费| 国产精品网曝门| 国产精品免费视频观看| 欧美经典一区二区| 中文在线一区二区| 亚洲成va人在线观看| 亚洲精品国产无天堂网2021 | 五月激情综合网| 婷婷综合五月天| 美女视频第一区二区三区免费观看网站| 婷婷夜色潮精品综合在线| 日韩精品五月天| 日本三级亚洲精品| 亚洲精品乱码久久久久久久久| 92精品国产成人观看免费 | 三级久久三级久久久| 亚洲成人自拍网| 日本不卡高清视频| 美女网站色91| 高清不卡一二三区| 9人人澡人人爽人人精品| 色哟哟一区二区在线观看| 欧美日韩视频第一区| 欧美一区二区三区四区视频| 精品久久一区二区三区| 国产欧美一区二区精品性色超碰| 中文字幕亚洲欧美在线不卡| 亚洲国产精品综合小说图片区| 日韩精品电影一区亚洲| 国产自产视频一区二区三区| 91丨九色丨国产丨porny| 欧洲人成人精品| 欧美va亚洲va香蕉在线| 欧美国产日韩在线观看| 亚洲在线中文字幕| 久久99九九99精品| www.亚洲色图.com| 欧美欧美欧美欧美首页| 国产日韩综合av| 亚洲v中文字幕| 国产精品99久久久久久久vr| 日本道精品一区二区三区| 欧美大片免费久久精品三p| 亚洲三级视频在线观看| 久久超碰97中文字幕| 99re8在线精品视频免费播放| 欧美一级xxx| 亚洲欧美日韩小说| 老司机精品视频在线| 色狠狠一区二区三区香蕉| 日韩欧美在线网站| 亚洲激情五月婷婷| 国产福利不卡视频| 欧美日韩欧美一区二区| 国产精品激情偷乱一区二区∴| 日本亚洲欧美天堂免费| av在线不卡免费看| 精品少妇一区二区| 亚洲综合视频网| 成人一区在线看| 欧美videos中文字幕| 亚洲国产日韩一级| 99国产欧美久久久精品| 精品999在线播放| 午夜视频久久久久久| 91一区在线观看| 久久嫩草精品久久久精品| 五月天激情综合| 欧美福利一区二区| 1024精品合集| 国产寡妇亲子伦一区二区| 91精品久久久久久久99蜜桃 | 免费久久精品视频| 在线一区二区三区四区五区| 国产精品免费视频观看| 国产一区 二区 三区一级| 日韩一卡二卡三卡四卡| 香蕉久久夜色精品国产使用方法| av在线这里只有精品| 欧美国产综合色视频| 精品一区二区综合| 91精品国产色综合久久不卡电影| 一级日本不卡的影视| 91啪亚洲精品| 国产精品电影一区二区三区| 成人高清视频免费观看| 久久先锋影音av| 精品一区二区三区在线观看| 91精品啪在线观看国产60岁| 三级久久三级久久久| 欧美精品在线一区二区三区| 亚洲国产精品久久不卡毛片| 欧美亚洲禁片免费| 亚洲一区二区三区四区五区中文| 99国产麻豆精品| 亚洲黄色在线视频| 在线观看欧美精品| 亚洲资源在线观看| 欧美亚洲国产一区二区三区va| 一区二区三区色| 欧美专区在线观看一区| 亚洲线精品一区二区三区八戒| 欧美日韩视频在线第一区| 午夜久久久久久| 91精品国产综合久久国产大片| 日韩成人精品在线观看| 日韩亚洲欧美一区二区三区| 免费成人小视频| 精品电影一区二区三区| 国产精品亚洲一区二区三区妖精| 国产欧美精品一区二区色综合| 高清不卡一区二区在线| 亚洲欧美另类图片小说| 欧美在线综合视频| 蜜臀av性久久久久av蜜臀妖精| 久久综合狠狠综合久久综合88| 国产电影精品久久禁18| 国产精品久久久久四虎| 91极品视觉盛宴| 午夜精品久久久久久不卡8050| 日韩一区二区三区在线观看| 美女视频一区在线观看| 久久久www成人免费毛片麻豆| 成人av中文字幕| 亚洲国产精品久久人人爱蜜臀| 日韩三级在线观看| 国产成人在线色| 亚洲一二三区视频在线观看| 欧美一级在线观看| 国产乱码精品一品二品| 亚洲精品视频免费看| 欧美精品 日韩| 国产成人精品aa毛片| 亚洲国产综合人成综合网站| 欧美v国产在线一区二区三区| 成人在线综合网| 香蕉成人伊视频在线观看| 26uuu亚洲综合色欧美| 91色.com| 久久不见久久见免费视频1| 成人欧美一区二区三区黑人麻豆| 欧美人狂配大交3d怪物一区| 国产一区二区调教| 国产一区二区0| 成人欧美一区二区三区白人| 日韩一级在线观看| av中文字幕亚洲| 蜜乳av一区二区| 亚洲视频你懂的| 久久只精品国产| 欧美日韩小视频| 丁香六月久久综合狠狠色| 亚洲成a天堂v人片| 国产精品午夜免费| 日韩一级视频免费观看在线| 一本到一区二区三区| 国内精品视频666| 亚洲一区二区综合| 国产欧美日韩精品一区| 欧美精品黑人性xxxx| 91在线观看免费视频| 免费精品视频最新在线| 亚洲一卡二卡三卡四卡五卡| 国产亚洲精品7777| 欧美电影一区二区| 色婷婷av一区二区三区之一色屋| 国产呦精品一区二区三区网站| 亚洲一二三专区| 国产精品美女久久久久久久久久久| 在线综合+亚洲+欧美中文字幕| 99热99精品| 国产乱码精品一区二区三区av| 无吗不卡中文字幕| 伊人开心综合网| 国产精品欧美极品| 国产偷v国产偷v亚洲高清| 日韩欧美美女一区二区三区| 欧美日韩一级片在线观看| 99国产精品99久久久久久| 国产成人在线视频免费播放| 激情五月播播久久久精品| 亚洲bt欧美bt精品| 亚洲一区二区三区不卡国产欧美| 国产精品免费人成网站| 国产亚洲一区二区三区四区 | 一区二区三区在线高清| 中文久久乱码一区二区| 久久久久国产精品人| 久久在线免费观看| 日韩精品一区二区三区在线 | 亚洲午夜免费福利视频| ●精品国产综合乱码久久久久| 国产欧美日韩在线观看| 久久久激情视频| xfplay精品久久| 久久综合九色综合欧美亚洲|