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.
216 lines
5.2 KiB
216 lines
5.2 KiB
|
|
/*++
|
|
|
|
Copyright (c) 1996 - 1999 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
qadvwdth.c
|
|
|
|
Abstract:
|
|
|
|
Implements the DrvQueryAdvanceWidths function - returns information
|
|
about glyph widths.
|
|
|
|
Environment:
|
|
|
|
Windows NT Unidrv driver
|
|
|
|
Revision History:
|
|
|
|
01/02/97 -ganeshp-
|
|
Created
|
|
|
|
--*/
|
|
|
|
#include "font.h"
|
|
|
|
|
|
BOOL
|
|
FMQueryAdvanceWidths(
|
|
PDEV *pPDev,
|
|
FONTOBJ *pfo,
|
|
ULONG iMode,
|
|
HGLYPH *phg,
|
|
PVOID *pvWidths,
|
|
ULONG cGlyphs
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
Return Width information about glyphs in the font.
|
|
|
|
Arguments:
|
|
|
|
pPDev Pointer to PDEV
|
|
pfo The font of interest
|
|
iMode Glyphdata or kerning information
|
|
phg handle to glyph
|
|
pvWidths Output area
|
|
cGlyphs The number of them
|
|
|
|
Return Value:
|
|
|
|
TRUE for success and FALSE if widths of all the glyphs cannot be computed.
|
|
It returns DD_ERROR if the function fails.
|
|
Note:
|
|
01/02/97 -ganeshp-
|
|
|
|
--*/
|
|
{
|
|
/*
|
|
* First version is for fixed pitch fonts, which are easy to do:
|
|
* the data is in the font's metrics!
|
|
*/
|
|
|
|
|
|
|
|
FONTPDEV *pFontPDev;
|
|
int iRot; /* Rotation multiple of 90 degrees */
|
|
BOOL bRet; /* Value returned */
|
|
FONTMAP *pFM; /* Font data */
|
|
IFIMETRICS *pIFI;
|
|
XFORMOBJ *pxo;
|
|
FONTCTL ctl; /* Scaling information */
|
|
USHORT *pusWidths;
|
|
FLOATOBJ fo;
|
|
|
|
pFontPDev = pPDev->pFontPDev;
|
|
bRet = DDI_ERROR;
|
|
pusWidths = (USHORT *) pvWidths;
|
|
|
|
|
|
if( pfo->iFace < 1 || (int)pfo->iFace > pPDev->iFonts )
|
|
{
|
|
ERR(("UniFont!FMQueryAdvanceWidths: Bad FONTOBJ, iFace is %d",pfo->iFace));
|
|
SetLastError( ERROR_INVALID_PARAMETER );
|
|
return bRet;
|
|
}
|
|
|
|
pFM = PfmGetDevicePFM( pPDev, pfo->iFace );
|
|
|
|
if( pFM == NULL )
|
|
return FALSE;
|
|
|
|
|
|
pIFI = pFM->pIFIMet; /* IFIMETRICS - useful to have */
|
|
|
|
|
|
if( !(pxo = FONTOBJ_pxoGetXform( pfo )) )
|
|
{
|
|
ERR(( "UniFont!FMQueryAdvanceWidths: FONTOBJ_pxoGetXform fails\n" ));
|
|
return bRet;
|
|
}
|
|
|
|
/*
|
|
* ALWAYS call the iSetScale function, because some printers can
|
|
* rotate bitmap fonts.
|
|
*/
|
|
|
|
//Added Check for HP Intellifont
|
|
iRot = ISetScale( &ctl, pxo, ((pFM->flFlags & FM_SCALABLE) &&
|
|
(((PFONTMAP_DEV)pFM->pSubFM)->wDevFontType ==
|
|
DF_TYPE_HPINTELLIFONT)),
|
|
(pFontPDev->flText & TC_CR_ANY)?TRUE:FALSE);
|
|
|
|
if( pFM->flFlags & FM_SCALABLE )
|
|
{
|
|
|
|
int iPtSize, iAdjustedPtSize; /* For scale factor adjustment */
|
|
|
|
#ifdef USEFLOATS
|
|
|
|
/* The limited font size resolution */
|
|
iPtSize = (int)(0.5 + ctl.eYScale * pIFI->fwdUnitsPerEm * 7200) / pPDev->ptGrxRes.y;
|
|
|
|
/* if the tranform is very small (Less than a quarter of point size)
|
|
* then make it atleast a quarter point. This was causing AV in certain
|
|
* cases.
|
|
*/
|
|
|
|
if (iPtSize < 25)
|
|
{
|
|
iPtSize = 25;
|
|
|
|
}
|
|
iAdjustedPtSize = ((iPtSize + 12) / 25) * 25;
|
|
|
|
//Adjust the Scale Factor for quarter point adjustment.
|
|
ctl.eXScale = (ctl.eXScale * iAdjustedPtSize) / iPtSize;
|
|
ctl.eYScale = (ctl.eYScale * iAdjustedPtSize) / iPtSize;
|
|
|
|
#else
|
|
|
|
fo = ctl.eYScale;
|
|
FLOATOBJ_MulLong(&fo,pIFI->fwdUnitsPerEm);
|
|
FLOATOBJ_MulLong(&fo,7200);
|
|
|
|
#ifndef WINNT_40 //NT 5.0
|
|
|
|
FLOATOBJ_AddFloat(&fo,(FLOATL)FLOATL_00_50);
|
|
|
|
#else // NT 4.0
|
|
|
|
FLOATOBJ_AddFloat(&fo,(FLOAT)0.5);
|
|
|
|
#endif //!WINNT_40
|
|
|
|
iPtSize = FLOATOBJ_GetLong(&fo);
|
|
iPtSize /= pPDev->ptGrxRes.y;
|
|
|
|
/* if the trannform is very small (Less than a quarter of point size)
|
|
* then make it atleast a quarter point. This was causing AV in certain
|
|
* cases.
|
|
*/
|
|
|
|
if (iPtSize < 25)
|
|
{
|
|
iPtSize = 25;
|
|
|
|
}
|
|
|
|
iAdjustedPtSize = ((iPtSize + 12) / 25) * 25;
|
|
|
|
//Adjust the Scale Factor for quarter point adjustment.
|
|
FLOATOBJ_MulLong(&ctl.eXScale,iAdjustedPtSize);
|
|
FLOATOBJ_DivLong(&ctl.eXScale,iPtSize);
|
|
|
|
FLOATOBJ_MulLong(&ctl.eYScale,iAdjustedPtSize);
|
|
FLOATOBJ_DivLong(&ctl.eYScale,iPtSize);
|
|
#endif
|
|
}
|
|
|
|
|
|
/* We need to adjust the width table entries to the current resolution.IGetGlyphWidth
|
|
* returns the scaled width for current resolution.
|
|
*/
|
|
|
|
switch( iMode )
|
|
{
|
|
case QAW_GETWIDTHS: /* Glyph width etc data */
|
|
case QAW_GETEASYWIDTHS:
|
|
|
|
while( cGlyphs-- > 0 )
|
|
{
|
|
|
|
int iWide; /* Glyph's width */
|
|
|
|
|
|
iWide = IGetGlyphWidth( pPDev, pFM, (HGLYPH)*phg++);
|
|
|
|
iWide = LMulFloatLong(&ctl.eXScale,iWide);
|
|
|
|
*pusWidths++ = LTOFX( iWide );
|
|
}
|
|
bRet = TRUE;
|
|
|
|
break;
|
|
|
|
default:
|
|
ERR(( "UniFont!FMQueryAdvanceWidths: illegal iMode value" ));
|
|
SetLastError( ERROR_INVALID_PARAMETER );
|
|
break;
|
|
}
|
|
|
|
return bRet;
|
|
}
|