Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

270 lines
7.0 KiB

/*++
Copyright (c) 1996-1997 Microsoft Corporation
Module Name:
devmode.c
Abstract:
Devmode related library functions
Environment:
Windows NT printer drivers
Revision History:
07/22/98 -fengy-
Move OEM related devmode functions into "oemutil.c".
02/04/97 -davidx-
Devmode changes to support OEM plugins.
09/20/96 -davidx-
Seperated from libutil.c and implement BValidateDevmodeFormFields.
--*/
#include "lib.h"
#ifndef KERNEL_MODE
#include <winddiui.h>
#endif
#include <printoem.h>
#include "oemutil.h"
//
// Default halftone parameters
//
DEVHTINFO gDefaultDevHTInfo =
{
HT_FLAG_HAS_BLACK_DYE,
HT_PATSIZE_6x6_M,
0, // DevPelsDPI
{ { 6380, 3350, 0 }, // xr, yr, Yr
{ 2345, 6075, 0 }, // xg, yg, Yg
{ 1410, 932, 0 }, // xb, yb, Yb
{ 2000, 2450, 0 }, // xc, yc, Yc Y=0=HT default
{ 5210, 2100, 0 }, // xm, ym, Ym
{ 4750, 5100, 0 }, // xy, yy, Yy
{ 3127, 3290, 0 }, // xw, yw, Yw=0=default
12500, // R gamma
12500, // G gamma
12500, // B gamma, 12500=Default
585, 120, // M/C, Y/C
0, 0, // C/M, Y/M
0, 10000 // C/Y, M/Y 10000=default
}
};
COLORADJUSTMENT gDefaultHTColorAdjustment =
{
sizeof(COLORADJUSTMENT),
0,
ILLUMINANT_DEVICE_DEFAULT,
10000,
10000,
10000,
REFERENCE_BLACK_MIN,
REFERENCE_WHITE_MAX,
0,
0,
0,
0
};
BOOL
BValidateDevmodeFormFields(
HANDLE hPrinter,
PDEVMODE pDevmode,
PRECTL prcImageArea,
FORM_INFO_1 *pForms,
DWORD dwForms
)
/*++
Routine Description:
Validate the form-related fields in the input devmode and
make sure they're consistent with each other.
Arguments:
hPrinter - Handle to a printer
pDevmode - Specifies the devmode whose form-related fields are to be validated
prcImageArea - Returns the logical imageable area associated with the form
pForms - Points to list of spooler forms
dwForms - Number of spooler spooler
Return Value:
TRUE if successful, FALSE if there is an error
Note:
prcImageArea could be NULL in which case the caller is not interested
in the imageable area information.
If the caller doesn't want to provide the list of spooler forms,
it can set pForms parameter to NULL and dwForms to 0.
--*/
#define FORMFLAG_ERROR 0
#define FORMFLAG_VALID 1
#define FORMFLAG_CUSTOM 2
{
DWORD dwIndex;
PFORM_INFO_1 pAllocedForms = NULL;
INT iResult = FORMFLAG_ERROR;
//
// Get the list of spooler forms if the caller hasn't provided it
//
if (pForms == NULL)
{
pAllocedForms = pForms = MyEnumForms(hPrinter, 1, &dwForms);
if (pForms == NULL)
return FALSE;
}
if ((pDevmode->dmFields & DM_PAPERWIDTH) &&
(pDevmode->dmFields & DM_PAPERLENGTH) &&
(pDevmode->dmPaperWidth > 0) &&
(pDevmode->dmPaperLength > 0))
{
LONG lWidth, lHeight;
//
// Devmode is requesting form using width and height.
// Go through the forms database and check if one of
// the forms has the same size as what's being requested.
//
// The tolerance is 1mm. Also remember that our internal
// unit for paper measurement is micron while the unit
// for width and height fields in a DEVMODE is 0.1mm.
//
lWidth = pDevmode->dmPaperWidth * DEVMODE_PAPER_UNIT;
lHeight = pDevmode->dmPaperLength * DEVMODE_PAPER_UNIT;
for (dwIndex = 0; dwIndex < dwForms; dwIndex++)
{
if (abs(lWidth - pForms[dwIndex].Size.cx) <= 1000 &&
abs(lHeight - pForms[dwIndex].Size.cy) <= 1000)
{
iResult = FORMFLAG_VALID;
break;
}
}
//
// Custom size doesn't match that of any predefined forms.
//
if (iResult != FORMFLAG_VALID)
{
iResult = FORMFLAG_CUSTOM;
pDevmode->dmFields &= ~(DM_PAPERSIZE|DM_FORMNAME);
pDevmode->dmPaperSize = DMPAPER_USER;
ZeroMemory(pDevmode->dmFormName, sizeof(pDevmode->dmFormName));
//
// Assume the logical imageable area is the entire page in this case
//
if (prcImageArea)
{
prcImageArea->left = prcImageArea->top = 0;
prcImageArea->right = lWidth;
prcImageArea->bottom = lHeight;
}
}
}
else if (pDevmode->dmFields & DM_PAPERSIZE)
{
//
// Devmode is requesting form using paper size index
//
dwIndex = pDevmode->dmPaperSize;
if ((dwIndex >= DMPAPER_FIRST) && (dwIndex < DMPAPER_FIRST + dwForms))
{
dwIndex -= DMPAPER_FIRST;
iResult = FORMFLAG_VALID;
}
else
{
ERR(("Paper size index out-of-range: %d\n", dwIndex));
}
}
else if (pDevmode->dmFields & DM_FORMNAME)
{
//
// Devmode is requesting form using form name. Go through
// the forms database and check if the requested form
// name matches that of a database form.
//
for (dwIndex = 0; dwIndex < dwForms; dwIndex++)
{
if (_wcsicmp(pDevmode->dmFormName, pForms[dwIndex].pName) == EQUAL_STRING)
{
iResult = FORMFLAG_VALID;
break;
}
}
if (iResult != FORMFLAG_VALID)
{
ERR(("Unrecognized form name: %ws\n", pDevmode->dmFormName));
}
}
else
{
ERR(("Invalid form requested in the devmode.\n"));
}
//
// If a valid form is found, fill in the form-related field
// in the devmode to make sure they're consistent.
//
// Remember the conversion from micron to 0.1mm here.
//
if (iResult == FORMFLAG_VALID)
{
pDevmode->dmFields &= ~(DM_PAPERWIDTH|DM_PAPERLENGTH);
pDevmode->dmFields |= (DM_PAPERSIZE|DM_FORMNAME);
pDevmode->dmPaperWidth = (SHORT) (pForms[dwIndex].Size.cx / DEVMODE_PAPER_UNIT);
pDevmode->dmPaperLength = (SHORT) (pForms[dwIndex].Size.cy / DEVMODE_PAPER_UNIT);
pDevmode->dmPaperSize = (SHORT) (dwIndex + DMPAPER_FIRST);
CopyString(pDevmode->dmFormName, pForms[dwIndex].pName, CCHFORMNAME);
if (prcImageArea)
*prcImageArea = pForms[dwIndex].ImageableArea;
}
MemFree(pAllocedForms);
return (iResult != FORMFLAG_ERROR);
}