mirror of https://github.com/tongzx/nt5src
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.
148 lines
4.6 KiB
148 lines
4.6 KiB
/*++
|
|
|
|
Copyright (c) 1992 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
foncache.c
|
|
|
|
Abstract:
|
|
|
|
This is the console fullscreen driver for the VGA card.
|
|
|
|
Environment:
|
|
|
|
kernel mode only
|
|
|
|
Notes:
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "fsvga.h"
|
|
|
|
|
|
|
|
#define ADD_IMAGE 1
|
|
#define REPLACE_IMAGE 2
|
|
|
|
|
|
#define CALC_BITMAP_BITS_FOR_X( FontSizeX, dwAlign ) \
|
|
( ( ( FontSizeX * BITMAP_BITS_PIXEL + (dwAlign-1) ) & ~(dwAlign-1)) >> BITMAP_ARRAY_BYTE )
|
|
|
|
|
|
|
|
ULONG
|
|
CalcBitmapBufferSize(
|
|
IN COORD FontSize,
|
|
IN ULONG dwAlign
|
|
)
|
|
{
|
|
ULONG uiCount;
|
|
|
|
uiCount = CALC_BITMAP_BITS_FOR_X(FontSize.X,
|
|
(dwAlign==BYTE_ALIGN ? BITMAP_BITS_BYTE_ALIGN : BITMAP_BITS_WORD_ALIGN));
|
|
uiCount = uiCount * BITMAP_PLANES * FontSize.Y;
|
|
return uiCount;
|
|
}
|
|
|
|
|
|
VOID
|
|
AlignCopyMemory(
|
|
OUT PUCHAR pDestBits,
|
|
IN ULONG dwDestAlign,
|
|
IN PUCHAR pSrcBits,
|
|
IN ULONG dwSrcAlign,
|
|
IN COORD FontSize
|
|
)
|
|
{
|
|
ULONG dwDestBufferSize;
|
|
COORD coord;
|
|
|
|
try
|
|
{
|
|
|
|
if (dwDestAlign == dwSrcAlign) {
|
|
dwDestBufferSize = CalcBitmapBufferSize(FontSize, dwDestAlign);
|
|
RtlCopyMemory(pDestBits, pSrcBits, dwDestBufferSize);
|
|
return;
|
|
}
|
|
|
|
switch (dwDestAlign) {
|
|
default:
|
|
case WORD_ALIGN:
|
|
switch (dwSrcAlign) {
|
|
default:
|
|
//
|
|
// pDest = WORD, pSrc = WORD
|
|
//
|
|
case WORD_ALIGN:
|
|
dwDestBufferSize = CalcBitmapBufferSize(FontSize, dwDestAlign);
|
|
RtlCopyMemory(pDestBits, pSrcBits, dwDestBufferSize);
|
|
break;
|
|
//
|
|
// pDest = WORD, pSrc = BYTE
|
|
//
|
|
case BYTE_ALIGN:
|
|
dwDestBufferSize = CalcBitmapBufferSize(FontSize, dwDestAlign);
|
|
if (((FontSize.X % BITMAP_BITS_BYTE_ALIGN) == 0) &&
|
|
((FontSize.X % BITMAP_BITS_WORD_ALIGN) == 0) ) {
|
|
RtlCopyMemory(pDestBits, pSrcBits, dwDestBufferSize);
|
|
}
|
|
else {
|
|
RtlZeroMemory(pDestBits, dwDestBufferSize);
|
|
for (coord.Y=0; coord.Y < FontSize.Y; coord.Y++) {
|
|
for (coord.X=0;
|
|
coord.X < CALC_BITMAP_BITS_FOR_X(FontSize.X, BITMAP_BITS_BYTE_ALIGN);
|
|
coord.X++) {
|
|
*pDestBits++ = *pSrcBits++;
|
|
}
|
|
if (CALC_BITMAP_BITS_FOR_X(FontSize.X, BITMAP_BITS_BYTE_ALIGN) & 1)
|
|
pDestBits++;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
case BYTE_ALIGN:
|
|
switch (dwSrcAlign) {
|
|
//
|
|
// pDest = BYTE, pSrc = BYTE
|
|
//
|
|
case BYTE_ALIGN:
|
|
dwDestBufferSize = CalcBitmapBufferSize(FontSize, dwDestAlign);
|
|
RtlCopyMemory(pDestBits, pSrcBits, dwDestBufferSize);
|
|
break;
|
|
default:
|
|
//
|
|
// pDest = BYTE, pSrc = WORD
|
|
//
|
|
case WORD_ALIGN:
|
|
dwDestBufferSize = CalcBitmapBufferSize(FontSize, dwDestAlign);
|
|
if (((FontSize.X % BITMAP_BITS_BYTE_ALIGN) == 0) &&
|
|
((FontSize.X % BITMAP_BITS_WORD_ALIGN) == 0) ) {
|
|
RtlCopyMemory(pDestBits, pSrcBits, dwDestBufferSize);
|
|
}
|
|
else {
|
|
RtlZeroMemory(pDestBits, dwDestBufferSize);
|
|
for (coord.Y=0; coord.Y < FontSize.Y; coord.Y++) {
|
|
for (coord.X=0;
|
|
coord.X < CALC_BITMAP_BITS_FOR_X(FontSize.X, BITMAP_BITS_BYTE_ALIGN);
|
|
coord.X++) {
|
|
*pDestBits++ = *pSrcBits++;
|
|
}
|
|
if (CALC_BITMAP_BITS_FOR_X(FontSize.X, BITMAP_BITS_BYTE_ALIGN) & 1)
|
|
pSrcBits++;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
|
|
}
|
|
except (EXCEPTION_EXECUTE_HANDLER)
|
|
{
|
|
}
|
|
}
|