ReactOS Fundraising Campaign 2012
 
€ 3,873 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

offscreen.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.