|
|
/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
forms.c
Abstract:
Functions for manipulating forms
Environment:
Fax driver, user and kernel mode
Revision History:
01/09/96 -davidx- Created it.
mm/dd/yy -author- description
--*/
#include "faxlib.h"
#include "forms.h"
BOOL ValidDevmodeForm( HANDLE hPrinter, PDEVMODE pdm, PFORM_INFO_1 pFormInfo )
/*++
Routine Description:
Validate the form specification in a devmode
Arguments:
hPrinter - Handle to the printer object pdm - Pointer to the input devmode pFormInfo - FORM_INFO_1 structure for returning form information
Return Value:
TRUE if the input devmode specifies a valid logical form FALSE otherwise
--*/
{ PFORM_INFO_1 pForm, pFormDB; DWORD cForms;
//
// Get a list of forms in the system
//
if (! (pForm = pFormDB = GetFormsDatabase(hPrinter, &cForms))) {
Error(("Couldn't get system forms\n")); return FALSE; }
if ((pdm->dmFields & DM_PAPERSIZE) && pdm->dmPaperSize >= DMPAPER_FIRST) {
//
// Devmode is specifying a form using paper size index
//
DWORD index = pdm->dmPaperSize - DMPAPER_FIRST;
if (index < cForms) pForm = pFormDB + index; else pForm = NULL;
} else if (pdm->dmFields & DM_FORMNAME) {
//
// Devmode is specifying a form using form name: go through the forms database
// and check if the requested form name matches that of a form in the database
//
while (cForms && _tcsicmp(pForm->pName, pdm->dmFormName) != EQUAL_STRING) {
pForm++; cForms--; }
if (cForms == 0) pForm = NULL; }
if (pForm && IsSupportedForm(pForm)) {
if (pFormInfo) *pFormInfo = *pForm;
//
// Convert paper size unit from microns to 0.1mm
//
pdm->dmPaperWidth = (SHORT)(pForm->Size.cx / 100); pdm->dmPaperLength = (SHORT)(pForm->Size.cy / 100);
if ((pdm->dmFields & DM_FORMNAME) == 0) {
pdm->dmFields |= DM_FORMNAME; CopyString(pdm->dmFormName, pForm->pName, CCHFORMNAME); } } else { //
// The form is not supported
//
pForm = NULL; }
MemFree(pFormDB); return pForm != NULL; }
PFORM_INFO_1 GetFormsDatabase( HANDLE hPrinter, PDWORD pCount )
/*++
Routine Description:
Return a collection of forms in the spooler database
Arguments:
hPrinter - Handle to a printer object pCount - Points to a variable for returning total number of forms
Return Value:
Pointer to an array of FORM_INFO_1 structures if successful NULL otherwise
--*/
{ PFORM_INFO_1 pFormDB = NULL; DWORD cb=0;
if (!EnumForms(hPrinter, 1, NULL, 0, &cb, pCount) && GetLastError() == ERROR_INSUFFICIENT_BUFFER && (pFormDB = MemAlloc(cb)) != NULL && EnumForms(hPrinter, 1, (PBYTE) pFormDB, cb, &cb, pCount)) { PFORM_INFO_1 pForm; DWORD count; LONG maxX, maxY;
//
// Calculate the maximum allowable form width and height (in microns)
//
maxX = MulDiv(MAX_WIDTH_PIXELS, 25400, FAXRES_HORIZONTAL); maxY = MulDiv(MAX_HEIGHT_PIXELS, 25400, FAXRES_VERTICAL);
for (count=*pCount, pForm=pFormDB; count--; pForm++) {
//
// Make sure the highest order bits are not used by the spooler
//
Assert(! IsSupportedForm(pForm));
//
// Determine if the form in question is supported on the device
//
if (pForm->ImageableArea.right - pForm->ImageableArea.left <= maxX && pForm->ImageableArea.bottom - pForm->ImageableArea.top <= maxY) { SetSupportedForm(pForm); } }
return pFormDB; }
Error(("EnumForms failed\n")); MemFree(pFormDB); return NULL; }
|