2025-04-27 07:49:33 -04:00

233 lines
4.6 KiB
C

/****************************************************************************
* Module Name: lpk.c
*
* Created: 21-Oct-1996
* Author: Gerrit van Wingerden [gerritv]
*
* Copyright (c) 1990 Microsoft Corporation
*****************************************************************************/
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <stddef.h>
#include <windows.h>
#include <wingdip.h>
#define QUICK_BUFFER_SIZE 100
#ifdef DBG
#define WARNING(X) DbgPrint(X);
#else
#define WARNING(X)
#endif
BOOL LpkInitialize()
{
DbgPrint("Initialized LPK\n");
return(TRUE);
}
BOOL TranslateAndSubstitute(
HDC hdc,
WORD *pGlyphIndexBuffer,
WCHAR *pString,
INT cCount
)
{
BOOL bRet = FALSE;
WORD IndexForB = (WCHAR) 'B';
int i;
if(GetGlyphIndicesW(hdc, &IndexForB, 1, &IndexForB, 1) &&
GetGlyphIndicesW(hdc, pString, cCount, pGlyphIndexBuffer, 0))
{
for(i = 0; i < cCount; i++)
{
if(pString[i] == (WCHAR) 'a')
{
pGlyphIndexBuffer[i] = IndexForB;
}
}
bRet = TRUE;
}
return(bRet);
}
BOOL LpkExtTextOut(
HDC hdc,
int x,
int y,
UINT fuOptions,
CONST RECT *lprc,
LPWSTR lpString,
UINT cCount,
CONST INT *lpDx ,
int Charset
)
{
BOOL bRet = FALSE;
USHORT GlyphIndexBuffer[QUICK_BUFFER_SIZE];
USHORT *pGlyphIndexBuffer;
pGlyphIndexBuffer = (cCount < QUICK_BUFFER_SIZE) ?
GlyphIndexBuffer : LocalAlloc(LMEM_FIXED,cCount * sizeof(USHORT));
if(pGlyphIndexBuffer)
{
if(TranslateAndSubstitute(hdc, pGlyphIndexBuffer, lpString, cCount))
{
bRet = ExtTextOutW(hdc, x, y, fuOptions | ETO_GLYPH_INDEX,
lprc,(WCHAR*) pGlyphIndexBuffer, cCount, lpDx);
}
}
else
{
WARNING("LpkExtTextOut: out of memory\n");
GdiSetLastError(ERROR_OUTOFMEMORY);
}
if(pGlyphIndexBuffer != GlyphIndexBuffer)
{
LocalFree(pGlyphIndexBuffer);
}
return(bRet);
}
BOOL LpkGetTextExtentExPoint(
HDC hdc,
LPWSTR lpszStr,
int cchString ,
int nMaxExtent,
LPINT lpnFit,
LPINT alpDx,
LPSIZE lpSize,
FLONG fl,
int Charset
)
{
BOOL bRet = FALSE;
USHORT GlyphIndexBuffer[QUICK_BUFFER_SIZE];
USHORT *pGlyphIndexBuffer;
REALIZATION_INFO ri;
pGlyphIndexBuffer = (cchString < QUICK_BUFFER_SIZE) ?
GlyphIndexBuffer : LocalAlloc(LMEM_FIXED,cchString * sizeof(USHORT));
if(pGlyphIndexBuffer)
{
if(TranslateAndSubstitute(hdc, pGlyphIndexBuffer, lpszStr, cchString))
{
bRet = GetTextExtentExPointI(hdc, pGlyphIndexBuffer, cchString, nMaxExtent,
lpnFit, alpDx, lpSize);
}
}
else
{
WARNING("LpkGetTextExtentPointW: out of memory\n");
GdiSetLastError(ERROR_OUTOFMEMORY);
}
if(pGlyphIndexBuffer != GlyphIndexBuffer)
{
LocalFree(pGlyphIndexBuffer);
}
return(bRet);
}
DWORD LpkGetCharacterPlacement(
HDC hdc,
LPWSTR lpString,
int nCount,
int nMaxExtent,
LPGCP_RESULTS *lpResults,
DWORD dwFlags,
int Charset
)
{
// not implemented for the sample LPK
GdiSetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return(0);
}
LONG LpkTabbedTextOut(
HDC hdc,
int x,
int y,
LPWSTR lpString,
int nCount,
int nTabPositions,
LPINT lpnTabStopPositions,
int nTabOrigin,
BOOL fDrawTheText,
int cxCharWidth,
int cyCharHeight,
int Charset
)
{
// not implemented for the sample LPK
GdiSetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return(0);
}
void LpkPSMTextOut(
HDC hdc,
int xLeft,
int yTop,
LPWSTR lpString,
int nCount,
int Charset
)
{
// not implemented for the sample LPK
}
LpkDrawTextEx(
HDC hdc,
LPWSTR lpString,
int cchText,
LPRECT lpRect,
UINT format,
LPDRAWTEXTPARAMS lpdtp,
int Charset
)
{
// not implemented for the sample LPK
GdiSetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return(0);
}