/*++ 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) { } }