Main Page | Class Hierarchy | Class List | File List | Class Members | File Members

foncache.c

Go to the documentation of this file.
00001 /*++ 00002 00003 Copyright (c) 1992 Microsoft Corporation 00004 00005 Module Name: 00006 00007 foncache.c 00008 00009 Abstract: 00010 00011 This is the console fullscreen driver for the VGA card. 00012 00013 Environment: 00014 00015 kernel mode only 00016 00017 Notes: 00018 00019 Revision History: 00020 00021 --*/ 00022 00023 #include "stdarg.h" 00024 #include "stdio.h" 00025 #include "ntddk.h" 00026 #include "fsvga.h" 00027 #include "fsvgalog.h" 00028 00029 00030 00031 #define ADD_IMAGE 1 00032 #define REPLACE_IMAGE 2 00033 00034 00035 #define CALC_BITMAP_BITS_FOR_X( FontSizeX, dwAlign ) \ 00036 ( ( ( FontSizeX * BITMAP_BITS_PIXEL + (dwAlign-1) ) & ~(dwAlign-1)) >> BITMAP_ARRAY_BYTE ) 00037 00038 00039 00040 DWORD 00041 CalcBitmapBufferSize( 00042 IN COORD FontSize, 00043 IN DWORD dwAlign 00044 ) 00045 { 00046 DWORD uiCount; 00047 00048 uiCount = CALC_BITMAP_BITS_FOR_X(FontSize.X, 00049 (dwAlign==BYTE_ALIGN ? BITMAP_BITS_BYTE_ALIGN : BITMAP_BITS_WORD_ALIGN)); 00050 uiCount = uiCount * BITMAP_PLANES * FontSize.Y; 00051 return uiCount; 00052 } 00053 00054 00055 VOID 00056 AlignCopyMemory( 00057 OUT PBYTE pDestBits, 00058 IN DWORD dwDestAlign, 00059 IN PBYTE pSrcBits, 00060 IN DWORD dwSrcAlign, 00061 IN COORD FontSize 00062 ) 00063 { 00064 DWORD dwDestBufferSize; 00065 COORD coord; 00066 00067 try 00068 { 00069 00070 if (dwDestAlign == dwSrcAlign) { 00071 dwDestBufferSize = CalcBitmapBufferSize(FontSize, dwDestAlign); 00072 RtlCopyMemory(pDestBits, pSrcBits, dwDestBufferSize); 00073 return; 00074 } 00075 00076 switch (dwDestAlign) { 00077 default: 00078 case WORD_ALIGN: 00079 switch (dwSrcAlign) { 00080 default: 00081 // 00082 // pDest = WORD, pSrc = WORD 00083 // 00084 case WORD_ALIGN: 00085 dwDestBufferSize = CalcBitmapBufferSize(FontSize, dwDestAlign); 00086 RtlCopyMemory(pDestBits, pSrcBits, dwDestBufferSize); 00087 break; 00088 // 00089 // pDest = WORD, pSrc = BYTE 00090 // 00091 case BYTE_ALIGN: 00092 dwDestBufferSize = CalcBitmapBufferSize(FontSize, dwDestAlign); 00093 if (((FontSize.X % BITMAP_BITS_BYTE_ALIGN) == 0) && 00094 ((FontSize.X % BITMAP_BITS_WORD_ALIGN) == 0) ) { 00095 RtlCopyMemory(pDestBits, pSrcBits, dwDestBufferSize); 00096 } 00097 else { 00098 RtlZeroMemory(pDestBits, dwDestBufferSize); 00099 for (coord.Y=0; coord.Y < FontSize.Y; coord.Y++) { 00100 for (coord.X=0; 00101 coord.X < CALC_BITMAP_BITS_FOR_X(FontSize.X, BITMAP_BITS_BYTE_ALIGN); 00102 coord.X++) { 00103 *pDestBits++ = *pSrcBits++; 00104 } 00105 if (CALC_BITMAP_BITS_FOR_X(FontSize.X, BITMAP_BITS_BYTE_ALIGN) & 1) 00106 pDestBits++; 00107 } 00108 } 00109 break; 00110 } 00111 break; 00112 case BYTE_ALIGN: 00113 switch (dwSrcAlign) { 00114 // 00115 // pDest = BYTE, pSrc = BYTE 00116 // 00117 case BYTE_ALIGN: 00118 dwDestBufferSize = CalcBitmapBufferSize(FontSize, dwDestAlign); 00119 RtlCopyMemory(pDestBits, pSrcBits, dwDestBufferSize); 00120 break; 00121 default: 00122 // 00123 // pDest = BYTE, pSrc = WORD 00124 // 00125 case WORD_ALIGN: 00126 dwDestBufferSize = CalcBitmapBufferSize(FontSize, dwDestAlign); 00127 if (((FontSize.X % BITMAP_BITS_BYTE_ALIGN) == 0) && 00128 ((FontSize.X % BITMAP_BITS_WORD_ALIGN) == 0) ) { 00129 RtlCopyMemory(pDestBits, pSrcBits, dwDestBufferSize); 00130 } 00131 else { 00132 RtlZeroMemory(pDestBits, dwDestBufferSize); 00133 for (coord.Y=0; coord.Y < FontSize.Y; coord.Y++) { 00134 for (coord.X=0; 00135 coord.X < CALC_BITMAP_BITS_FOR_X(FontSize.X, BITMAP_BITS_BYTE_ALIGN); 00136 coord.X++) { 00137 *pDestBits++ = *pSrcBits++; 00138 } 00139 if (CALC_BITMAP_BITS_FOR_X(FontSize.X, BITMAP_BITS_BYTE_ALIGN) & 1) 00140 pSrcBits++; 00141 } 00142 } 00143 break; 00144 } 00145 break; 00146 } 00147 00148 } 00149 except (EXCEPTION_EXECUTE_HANDLER) 00150 { 00151 } 00152 }

Generated on Sat May 15 19:40:03 2004 for test by doxygen 1.3.7