ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 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

ddenable.c
Go to the documentation of this file.
00001 /*
00002  * ReactOS Generic Framebuffer display driver directdraw interface
00003  *
00004  * Copyright (C) 2006 Magnus Olsen
00005  *
00006  * This program is free software; you can redistribute it and/or
00007  * modify it under the terms of the GNU General Public License
00008  * as published by the Free Software Foundation; either version 2
00009  * of the License, or (at your option) any later version.
00010  *
00011  * This program is distributed in the hope that it will be useful,
00012  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014  * GNU General Public License for more details.
00015  *
00016  * You should have received a copy of the GNU General Public License along
00017  * with this program; if not, write to the Free Software Foundation, Inc.,
00018  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
00019  */
00020 
00021 #include "framebuf.h"
00022 
00023 VOID APIENTRY
00024 DrvDisableDirectDraw( IN DHPDEV  dhpdev)
00025 {
00026    PPDEV ppdev = (PPDEV)dhpdev;
00027    ppdev->bDDInitialized = FALSE;
00028    /* Add Clean up code here if we need it
00029       when we shout down directx interface */
00030 }
00031 
00032 BOOL APIENTRY
00033 DrvEnableDirectDraw(
00034   IN DHPDEV  dhpdev,
00035   OUT DD_CALLBACKS  *pCallBacks,
00036   OUT DD_SURFACECALLBACKS  *pSurfaceCallBacks,
00037   OUT DD_PALETTECALLBACKS  *pPaletteCallBacks)
00038 {
00039      PPDEV ppdev = (PPDEV)dhpdev;
00040 
00041      if (ppdev->bDDInitialized == TRUE)
00042      {
00043          return TRUE;
00044      }
00045 
00046      /* Setup pixel format */
00047      ppdev->ddpfDisplay.dwSize = sizeof( DDPIXELFORMAT );
00048      ppdev->ddpfDisplay.dwFourCC = 0;
00049 
00050      ppdev->ddpfDisplay.dwRBitMask = ppdev->RedMask;
00051      ppdev->ddpfDisplay.dwGBitMask = ppdev->GreenMask;
00052      ppdev->ddpfDisplay.dwBBitMask = ppdev->BlueMask;
00053 
00054      ppdev->ddpfDisplay.dwRGBBitCount=ppdev->BitsPerPixel;
00055      ppdev->ddpfDisplay.dwRGBAlphaBitMask = 0;
00056      ppdev->ddpfDisplay.dwFlags = DDPF_RGB;
00057 
00058      ppdev->pvmList = NULL;
00059 
00060      switch(ppdev->iDitherFormat)
00061      {
00062         case BMF_8BPP:
00063              ppdev->ddpfDisplay.dwFlags  |= DDPF_PALETTEINDEXED8;
00064              break;
00065 
00066         case BMF_16BPP:
00067              switch(ppdev->RedMask)
00068              {
00069                 case 0x7C00:
00070                      ppdev->ddpfDisplay.dwRGBAlphaBitMask = 0x8000;
00071                      break;
00072 
00073                 default:
00074                      break;
00075              }
00076              break;
00077 
00078         case BMF_24BPP:
00079              break;
00080 
00081         case BMF_32BPP:
00082              ppdev->ddpfDisplay.dwRGBAlphaBitMask = 0xff000000;
00083              break;
00084 
00085         default:
00086            /* FIXME unknown pixel bits */
00087             ppdev->ddpfDisplay.dwRGBBitCount=0;
00088             break;
00089      }
00090 
00091      if (pCallBacks !=NULL)
00092      {
00093          memset(pCallBacks,0,sizeof(DD_CALLBACKS));
00094 
00095          /* FILL pCallBacks with hal stuff */
00096          pCallBacks->dwSize = sizeof(DDHAL_DDCALLBACKS);
00097          pCallBacks->CanCreateSurface = (PDD_CANCREATESURFACE)DdCanCreateSurface;
00098          pCallBacks->CreateSurface =  (PDD_CREATESURFACE)DdCreateSurface;
00099 
00100          /* Fill in the HAL Callback flags */
00101          pCallBacks->dwFlags = DDHAL_CB32_CANCREATESURFACE | DDHAL_CB32_CREATESURFACE;
00102      }
00103 
00104      if (pSurfaceCallBacks !=NULL)
00105      {
00106          memset(pSurfaceCallBacks,0,sizeof(DD_SURFACECALLBACKS));
00107 
00108          /* FILL pSurfaceCallBacks with hal stuff */
00109          // pSurfaceCallBacks.dwSize = sizeof(DDHAL_DDSURFACECALLBACKS);
00110          // pSurfaceCallBacks.DestroySurface = DdDestroySurface;
00111          // pSurfaceCallBacks.Lock = DdLock;
00112          // pSurfaceCallBacks.Blt = DdBlt;
00113 
00114         // pSurfaceCallBacks->dwFlags = DDHAL_SURFCB32_DESTROYSURFACE | DDHAL_SURFCB32_LOCK | DDHAL_SURFCB32_BLT ;
00115      }
00116 
00117      if (pPaletteCallBacks !=NULL)
00118      {
00119          memset(pPaletteCallBacks,0,sizeof(DD_PALETTECALLBACKS));
00120          /* FILL pPaletteCallBacks with hal stuff */
00121          /* We will not support this callback in the framebuf.dll */
00122      }
00123 
00124 
00125      /* Fixme fill the ppdev->dxHalInfo with the info we need */
00126      ppdev->bDDInitialized = TRUE;
00127      return ppdev->bDDInitialized;
00128 }
00129 
00130 BOOL APIENTRY
00131 DrvGetDirectDrawInfo(
00132   IN DHPDEV  dhpdev,
00133   OUT DD_HALINFO  *pHalInfo,
00134   OUT DWORD  *pdwNumHeaps,
00135   OUT VIDEOMEMORY  *pvmList,
00136   OUT DWORD  *pdwNumFourCCCodes,
00137   OUT DWORD  *pdwFourCC)
00138 {
00139     PPDEV ppdev = (PPDEV)dhpdev;
00140     LONG i;
00141     DWORD heap = 1; /* we always alloc one heap */
00142     BOOL bDDrawHeap = FALSE;
00143 
00144     if  (ppdev == NULL)
00145         return FALSE;
00146 
00147     /*   check so pHalInfo,  pdwNumHeaps, pdwNumFourCCCodes is not NULL
00148          pdwFourCC and pvmList can be null
00149      */
00150 
00151     if (pHalInfo == NULL)
00152         return FALSE;
00153 
00154     if (pdwNumHeaps == NULL)
00155         return FALSE;
00156 
00157     if (pdwNumFourCCCodes == NULL)
00158         return FALSE;
00159 
00160     /*  Setup heap */
00161     if ( (ppdev->ScreenWidth < ppdev->MemWidth) || (ppdev->ScreenHeight < ppdev->MemHeight))
00162     {
00163        bDDrawHeap = TRUE;
00164        heap++;
00165     }
00166 
00167     ppdev->dwHeap = heap;
00168     *pdwNumHeaps  = heap;
00169 
00170     /* We do not support other fourcc */
00171     *pdwNumFourCCCodes = 0;
00172 
00173 
00174     /*
00175        check see if pvmList and pdwFourCC are frist call
00176        or frist. Secon call  we fill in pHalInfo info
00177     */
00178 
00179     if(!(pvmList && pdwFourCC))
00180     {
00181 
00182          RtlZeroMemory(pHalInfo, sizeof(DD_HALINFO));
00183          pHalInfo->dwSize = sizeof(DD_HALINFO);
00184 
00185          pHalInfo->ddCaps.dwCaps =  DDCAPS_BLT        | DDCAPS_BLTQUEUE | DDCAPS_BLTCOLORFILL | DDCAPS_READSCANLINE |
00186                                     DDCAPS_BLTSTRETCH | DDCAPS_COLORKEY | DDCAPS_CANBLTSYSMEM;
00187 
00188          pHalInfo->ddCaps.dwFXCaps = DDFXCAPS_BLTSTRETCHY     | DDFXCAPS_BLTSTRETCHX        |
00189                                      DDFXCAPS_BLTSTRETCHYN    | DDFXCAPS_BLTSTRETCHXN       |
00190                                      DDFXCAPS_BLTSHRINKY      | DDFXCAPS_BLTSHRINKX         |
00191                                      DDFXCAPS_BLTSHRINKYN     | DDFXCAPS_BLTSHRINKXN        |
00192                                      DDFXCAPS_BLTMIRRORUPDOWN | DDFXCAPS_BLTMIRRORLEFTRIGHT;
00193 
00194         pHalInfo->ddCaps.dwCaps2 = DDCAPS2_NONLOCALVIDMEM | DDCAPS2_NONLOCALVIDMEMCAPS;
00195 
00196         pHalInfo->ddCaps.ddsCaps.dwCaps =  DDSCAPS_OFFSCREENPLAIN | DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP;
00197 
00198         pHalInfo->ddCaps.dwCKeyCaps = DDCKEYCAPS_SRCBLT | DDCKEYCAPS_SRCBLTCLRSPACE;
00199 
00200         pHalInfo->ddCaps.dwSVBCaps = DDCAPS_BLT;
00201         pHalInfo->ddCaps.ddsCaps.dwCaps |= DDSCAPS_LOCALVIDMEM | DDSCAPS_NONLOCALVIDMEM;
00202 
00203         /* Calc how much memmory is left on the video cards memmory */
00204         pHalInfo->ddCaps.dwVidMemTotal = (ppdev->MemHeight - ppdev->ScreenHeight) * ppdev->ScreenDelta;
00205 
00206         /* fill in some basic info that we need */
00207         pHalInfo->vmiData.pvPrimary                 = ppdev->ScreenPtr;
00208         pHalInfo->vmiData.dwDisplayWidth            = ppdev->ScreenWidth;
00209         pHalInfo->vmiData.dwDisplayHeight           = ppdev->ScreenHeight;
00210         pHalInfo->vmiData.lDisplayPitch             = ppdev->ScreenDelta;
00211         pHalInfo->vmiData.ddpfDisplay.dwSize        = sizeof(DDPIXELFORMAT);
00212         pHalInfo->vmiData.ddpfDisplay.dwFlags       = DDPF_RGB;
00213         pHalInfo->vmiData.ddpfDisplay.dwRGBBitCount = ppdev->BitsPerPixel;
00214         pHalInfo->vmiData.ddpfDisplay.dwRBitMask    = ppdev->RedMask;
00215         pHalInfo->vmiData.ddpfDisplay.dwGBitMask    = ppdev->GreenMask;
00216         pHalInfo->vmiData.ddpfDisplay.dwBBitMask    = ppdev->BlueMask;
00217         pHalInfo->vmiData.dwOffscreenAlign = 4;
00218 
00219         if ( ppdev->BitsPerPixel == 8 )
00220         {
00221             pHalInfo->vmiData.ddpfDisplay.dwFlags |= DDPF_PALETTEINDEXED8;
00222         }
00223 
00224         /*  FIXME
00225             Config the rops we do not doing that yet
00226              for we need write the rops table
00227         */
00228         for(i=0;i<DD_ROP_SPACE;i++ )
00229         {
00230            // pHALInfo->ddCaps.dwSVBRops[i] = rops[i];
00231           //  pHALInfo->ddCaps.dwRops[i] = rops[i];
00232         }
00233     }
00234 
00235     /* Now build pvmList info */
00236     if(pvmList)
00237     {
00238         ppdev->pvmList = pvmList;
00239 
00240         if ( bDDrawHeap == TRUE)
00241         {
00242             pvmList->dwFlags        = VIDMEM_ISLINEAR ;
00243             pvmList->fpStart        = ppdev->ScreenHeight * ppdev->ScreenDelta;
00244             pvmList->fpEnd          = ppdev->MemHeight * ppdev->ScreenDelta - 1;
00245             pvmList->ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
00246             pvmList++;
00247         }
00248 
00249         pvmList->fpStart = 0;
00250         pvmList->fpEnd = (ppdev->MemHeight * ppdev->ScreenDelta)  - 1;
00251         pvmList->dwFlags = VIDMEM_ISNONLOCAL | VIDMEM_ISLINEAR | VIDMEM_ISWC;
00252         pvmList->ddsCaps.dwCaps =  DDSCAPS_FRONTBUFFER | DDSCAPS_BACKBUFFER ;
00253         pvmList->ddsCapsAlt.dwCaps = DDSCAPS_FRONTBUFFER | DDSCAPS_BACKBUFFER;
00254 
00255         pvmList = ppdev->pvmList;
00256     }
00257 
00258     return TRUE;
00259 }
00260 

Generated on Sun May 27 2012 04:38:06 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.