Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenoffscreen.c
Go to the documentation of this file.
00001 /* 00002 * PROJECT: ReactOS VGA display driver 00003 * LICENSE: GPL - See COPYING in the top level directory 00004 * FILE: drivers/video/displays/vga/objects/offscreen.c 00005 * PURPOSE: Manages off-screen video memory 00006 * PROGRAMMERS: Copyright (C) 1998-2001 ReactOS Team 00007 */ 00008 00009 /* INCLUDES ******************************************************************/ 00010 00011 #include <vgaddi.h> 00012 00013 /* GLOBALS *******************************************************************/ 00014 00015 static LIST_ENTRY SavedBitsList; 00016 00017 /* FUNCTIONS *****************************************************************/ 00018 00019 VOID 00020 VGADDI_BltFromSavedScreenBits( 00021 IN ULONG DestX, 00022 IN ULONG DestY, 00023 IN PSAVED_SCREEN_BITS Src, 00024 IN ULONG SizeX, 00025 IN ULONG SizeY) 00026 { 00027 PUCHAR DestOffset; 00028 PUCHAR SrcOffset; 00029 ULONG i, j; 00030 00031 /* Select write mode 1. */ 00032 WRITE_PORT_UCHAR((PUCHAR)GRA_I, 5); 00033 WRITE_PORT_UCHAR((PUCHAR)GRA_D, 1); 00034 00035 SrcOffset = (PUCHAR)vidmem + Src->Offset; 00036 for (i = 0; i < SizeY; i++) 00037 { 00038 DestOffset = (PUCHAR)vidmem + (i + DestY) * 80 + (DestX >> 3); 00039 //FIXME: in the loop below we should treat the case when SizeX is not divisible by 8, i.e. partial bytes 00040 for (j = 0; j < SizeX>>3; j++, SrcOffset++, DestOffset++) 00041 { 00042 (VOID)READ_REGISTER_UCHAR(SrcOffset); 00043 WRITE_REGISTER_UCHAR(DestOffset, 0); 00044 } 00045 } 00046 00047 /* Select write mode 2. */ 00048 WRITE_PORT_UCHAR((PUCHAR)GRA_I, 5); 00049 WRITE_PORT_UCHAR((PUCHAR)GRA_D, 2); 00050 } 00051 00052 VOID 00053 VGADDI_BltToSavedScreenBits( 00054 IN PSAVED_SCREEN_BITS Dest, 00055 IN ULONG SourceX, 00056 IN ULONG SourceY, 00057 IN ULONG SizeX, 00058 IN ULONG SizeY) 00059 { 00060 PUCHAR DestOffset; 00061 PUCHAR SrcOffset; 00062 ULONG i, j; 00063 00064 /* Select write mode 1. */ 00065 WRITE_PORT_UCHAR((PUCHAR)GRA_I, 5); 00066 WRITE_PORT_UCHAR((PUCHAR)GRA_D, 1); 00067 00068 DestOffset = (PUCHAR)vidmem + Dest->Offset; 00069 00070 for (i = 0; i < SizeY; i++) 00071 { 00072 SrcOffset = (PUCHAR)vidmem + (SourceY + i) * 80 + (SourceX >> 3); 00073 //FIXME: in the loop below we should treat the case when SizeX is not divisible by 8, i.e. partial bytes 00074 for (j = 0; j < SizeX>>3; j++, SrcOffset++, DestOffset++) 00075 { 00076 (VOID)READ_REGISTER_UCHAR(SrcOffset); 00077 WRITE_REGISTER_UCHAR(DestOffset, 0); 00078 } 00079 } 00080 00081 /* Select write mode 2. */ 00082 WRITE_PORT_UCHAR((PUCHAR)GRA_I, 5); 00083 WRITE_PORT_UCHAR((PUCHAR)GRA_D, 2); 00084 } 00085 00086 VOID 00087 VGADDI_FreeSavedScreenBits(PSAVED_SCREEN_BITS SavedBits) 00088 { 00089 SavedBits->Free = TRUE; 00090 00091 if (SavedBits->ListEntry.Blink != &SavedBitsList) 00092 { 00093 PSAVED_SCREEN_BITS Previous; 00094 00095 Previous = CONTAINING_RECORD(SavedBits->ListEntry.Blink, 00096 SAVED_SCREEN_BITS, ListEntry); 00097 if (Previous->Free) 00098 { 00099 Previous->Size += SavedBits->Size; 00100 RemoveEntryList(&SavedBits->ListEntry); 00101 EngFreeMem(SavedBits); 00102 SavedBits = Previous; 00103 } 00104 } 00105 if (SavedBits->ListEntry.Flink != &SavedBitsList) 00106 { 00107 PSAVED_SCREEN_BITS Next; 00108 00109 Next = CONTAINING_RECORD(SavedBits->ListEntry.Flink, SAVED_SCREEN_BITS, 00110 ListEntry); 00111 if (Next->Free) 00112 { 00113 SavedBits->Size += Next->Size; 00114 RemoveEntryList(&SavedBits->ListEntry); 00115 EngFreeMem(SavedBits); 00116 } 00117 } 00118 } 00119 00120 PSAVED_SCREEN_BITS 00121 VGADDI_AllocSavedScreenBits(ULONG Size) 00122 { 00123 PSAVED_SCREEN_BITS Current; 00124 PLIST_ENTRY CurrentEntry; 00125 PSAVED_SCREEN_BITS Best; 00126 PSAVED_SCREEN_BITS New; 00127 00128 Best = NULL; 00129 CurrentEntry = SavedBitsList.Flink; 00130 while (CurrentEntry != &SavedBitsList) 00131 { 00132 Current = CONTAINING_RECORD(CurrentEntry, SAVED_SCREEN_BITS, ListEntry); 00133 00134 if (Current->Free && Current->Size >= Size && 00135 (Best == NULL || (Current->Size - Size) < (Best->Size - Size))) 00136 { 00137 Best = Current; 00138 } 00139 00140 CurrentEntry = CurrentEntry->Flink; 00141 } 00142 00143 if (!Best) 00144 return NULL; 00145 00146 if (Best->Size == Size) 00147 { 00148 Best->Free = FALSE; 00149 return Best; 00150 } 00151 else 00152 { 00153 New = EngAllocMem(0, sizeof(SAVED_SCREEN_BITS), ALLOC_TAG); 00154 New->Free = FALSE; 00155 New->Offset = Best->Offset + Size; 00156 New->Size = Size; 00157 Best->Size -= Size; 00158 InsertHeadList(&Best->ListEntry, &New->ListEntry); 00159 return New; 00160 } 00161 } 00162 00163 VOID 00164 VGADDI_InitializeOffScreenMem( 00165 IN ULONG Start, 00166 IN ULONG Length) 00167 { 00168 PSAVED_SCREEN_BITS FreeBits; 00169 00170 InitializeListHead(&SavedBitsList); 00171 00172 FreeBits = EngAllocMem(0, sizeof(SAVED_SCREEN_BITS), ALLOC_TAG); 00173 FreeBits->Free = TRUE; 00174 FreeBits->Offset = Start; 00175 FreeBits->Size = Length; 00176 InsertHeadList(&SavedBitsList, &FreeBits->ListEntry); 00177 } Generated on Sat May 19 2012 04:35:51 for ReactOS by
1.7.6.1
|