Changeset 6030 for trunk/src


Ignore:
Timestamp:
Jun 16, 2001, 6:12:03 PM (24 years ago)
Author:
sandervl
Message:

Partly implemented DrawEnumDisplayModes4

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/ddraw/OS2DDRAW.CPP

    r5472 r6030  
    1 /* $Id: OS2DDRAW.CPP,v 1.28 2001-04-04 09:02:14 sandervl Exp $ */
     1/* $Id: OS2DDRAW.CPP,v 1.29 2001-06-16 16:12:03 sandervl Exp $ */
    22
    33/*
     
    840840
    841841  }
    842 
    843 
    844 
    845842  return(DD_OK);
    846843}
     
    851848{
    852849  int iMode = 0;
    853 #if 0
    854   DDSURFACEDESC DDSurfAct;
     850  DDSURFACEDESC2 DDSurfAct;
    855851  BOOL fCallAgain;
    856 #endif
    857852  OS2IDirectDraw        *me = (OS2IDirectDraw *)This;
    858853
    859   dprintf(("DDRAW: EnumDisplayModes4 NIY\n"));
     854  dprintf(("DDRAW: EnumDisplayModes4"));
     855
     856  // Check for Pointer to callback function
     857  if (NULL == lpDDEnumModesCallback2)
     858  {
     859    dprintf(("DDRAW: EnumDisplayModes4 : Error NO EnumFunction passed in\n"));
     860
     861    return(DDERR_GENERIC);
     862  }
     863
     864
     865  // Setting up the surface
     866  // During enum we report resolution and bitdepth, maybe we should
     867  // also report back : Caps and Pitch
     868  memset(&DDSurfAct,0,sizeof(DDSURFACEDESC2));
     869  DDSurfAct.dwSize = sizeof(DDSURFACEDESC2);
     870  DDSurfAct.dwFlags = DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT ;
     871  // Only report the bitdepth hope this is ok this way, we must set the BitMask fields
     872
     873  DDSurfAct.ddpfPixelFormat.dwSize  = sizeof (DDPIXELFORMAT);
     874  DDSurfAct.ddpfPixelFormat.dwFlags = DDPF_RGB;
     875
     876  // Check if we use DIVE or Voodoo
     877  if(me->lpVtbl != (IDirectDraw4Vtbl *) &(me->Vtbl3D))
     878  {
     879    // DIVE modes
     880
     881    dprintf(("DDRAW: EnumDisplayModes : DIVE modes\n"));
     882
     883    // Enumerate all modes ?
     884    if (NULL==lpDDSurfaceDesc2)
     885    {
     886      // Check if we shall report 320x200 mode
     887
     888      dprintf(("DDRAW: EnumDisplayModes : ALL modes\n"));
     889
     890      if(dwFlags && DDEDM_STANDARDVGAMODES)
     891      {
     892        dprintf(("DDRAW: EnumDisplayModes : STANDARDVGAMODES\n"));
     893
     894        DDSurfAct.dwHeight = ModesDive[0].iYRes;
     895        DDSurfAct.dwWidth  = ModesDive[0].iXRes;
     896        DDSurfAct.ddpfPixelFormat.dwRGBBitCount = ModesDive[0].iBits;
     897        DDSurfAct.ddpfPixelFormat.dwFlags |= DDPF_PALETTEINDEXED8 ;
     898        if(!lpDDEnumModesCallback2(&DDSurfAct,lpContext))
     899        {
     900          dprintf(("DDRAW: EnumDisplayModes : Enum done\n"));
     901          return (DD_OK);
     902        }
     903      }
     904      // Don't know the flag for Mode X so we skip reporting it
     905
     906      // Now report all our modes
     907      iMode = 2;
     908      fCallAgain = TRUE;
     909      do
     910      {
     911        // if the mode fits in the current resolution report it
     912        // Change this if we support Fullscreen later !!!
     913
     914        if(ModesDive[iMode].iXRes < me->dCaps.ulHorizontalResolution)
     915        {
     916          DDSurfAct.dwHeight = ModesDive[iMode].iYRes;
     917          DDSurfAct.dwWidth  = ModesDive[iMode].iXRes;
     918          DDSurfAct.ddpfPixelFormat.dwRGBBitCount = ModesDive[iMode].iBits;
     919          switch(ModesDive[iMode].iBits)
     920          {
     921            case 8:
     922              DDSurfAct.ddpfPixelFormat.dwFlags |= DDPF_PALETTEINDEXED8;
     923              break;
     924            case 16:
     925              // VESA uses 565 encoding in 16 bit modes
     926              DDSurfAct.ddpfPixelFormat.dwFlags &= ~DDPF_PALETTEINDEXED8;
     927              DDSurfAct.ddpfPixelFormat.dwRBitMask = 0x0000F800;
     928              DDSurfAct.ddpfPixelFormat.dwGBitMask = 0x000007E0;
     929              DDSurfAct.ddpfPixelFormat.dwBBitMask = 0x0000001F;
     930              break;
     931            case 24:
     932              // VESA uses per default RGB4
     933              DDSurfAct.ddpfPixelFormat.dwFlags &= ~DDPF_PALETTEINDEXED8;
     934              DDSurfAct.ddpfPixelFormat.dwRBitMask = 0x00FF0000;
     935              DDSurfAct.ddpfPixelFormat.dwGBitMask = 0x0000FF00;
     936              DDSurfAct.ddpfPixelFormat.dwBBitMask = 0x000000FF;
     937              break;
     938            default:
     939              break;
     940          }
     941          dprintf( ("EnumDisplayModes : Enum Mode %dx%d @ %d\n",
     942                    DDSurfAct.dwHeight,
     943                    DDSurfAct.dwWidth,
     944                    DDSurfAct.ddpfPixelFormat.dwRGBBitCount));
     945          fCallAgain = lpDDEnumModesCallback2(&DDSurfAct,lpContext);
     946          dprintf( ("EnumDisplayModes : Callback returned with %d\n",
     947                    fCallAgain));
     948        }
     949        iMode++;
     950      }
     951      while( (iMode < NUM_MODES_DIVE) &&
     952             (ModesDive[iMode].iBits <= me->dCaps.ulDepth) &&
     953             (TRUE==fCallAgain) );
     954    }
     955    else
     956    {
     957      // No, so filter modes with lpDDSurfaceDesc2
     958
     959      // Return Error if the program want to use other than the 3 supported values
     960      // for filtering
     961
     962      if (lpDDSurfaceDesc2->dwFlags & !(DDSD_WIDTH|DDSD_HEIGHT|DDSD_PIXELFORMAT))
     963        return(DDERR_INVALIDPARAMS);
     964
     965      iMode = 0;
     966      if( (dwFlags && DDEDM_STANDARDVGAMODES) &&
     967         (
     968          (((lpDDSurfaceDesc2->dwFlags & DDSD_WIDTH)&&
     969            (ModesDive[iMode].iXRes==lpDDSurfaceDesc2->dwWidth)
     970           )||(!(lpDDSurfaceDesc2->dwFlags & DDSD_WIDTH)))&&
     971          (((lpDDSurfaceDesc2->dwFlags & DDSD_HEIGHT)&&
     972            (ModesDive[iMode].iYRes==lpDDSurfaceDesc2->dwHeight))||
     973           (!(lpDDSurfaceDesc2->dwFlags & DDSD_HEIGHT)))&&
     974          (((lpDDSurfaceDesc2->dwFlags & DDSD_PIXELFORMAT) &&
     975            (ModesDive[iMode].iBits==lpDDSurfaceDesc2->ddpfPixelFormat.dwRGBBitCount))||
     976           (!(lpDDSurfaceDesc2->dwFlags & DDSD_PIXELFORMAT)))
     977         )
     978        )
     979      {
     980        DDSurfAct.dwHeight = ModesDive[0].iYRes;
     981        DDSurfAct.dwWidth  = ModesDive[0].iXRes;
     982        DDSurfAct.ddpfPixelFormat.dwRGBBitCount = ModesDive[0].iBits;
     983        DDSurfAct.ddpfPixelFormat.dwFlags |= DDPF_PALETTEINDEXED8;
     984        if(!lpDDEnumModesCallback2(&DDSurfAct,lpContext))
     985        {
     986          return (DD_OK);
     987        }
     988      }
     989      // Don't know the flag for Mode X so we skip reporting it
     990
     991      // Now report all our modes
     992      iMode = 2;
     993      fCallAgain = TRUE;
     994      do
     995      {
     996        // if the mode fits in the current resolution and the filter applies report it
     997        // Change this if we support Fullscreen later !!!
     998        if( (ModesDive[iMode].iXRes < me->dCaps.ulHorizontalResolution)&&
     999           (
     1000            (((lpDDSurfaceDesc2->dwFlags & DDSD_WIDTH)&&
     1001              (ModesDive[iMode].iXRes==lpDDSurfaceDesc2->dwWidth))||
     1002             (!(lpDDSurfaceDesc2->dwFlags & DDSD_WIDTH)))&&
     1003            (((lpDDSurfaceDesc2->dwFlags & DDSD_HEIGHT)&&
     1004              (ModesDive[iMode].iYRes==lpDDSurfaceDesc2->dwHeight))||
     1005             (!(lpDDSurfaceDesc2->dwFlags & DDSD_HEIGHT)))&&
     1006            (((lpDDSurfaceDesc2->dwFlags & DDSD_PIXELFORMAT) &&
     1007              (ModesDive[iMode].iBits==lpDDSurfaceDesc2->ddpfPixelFormat.dwRGBBitCount))||
     1008             (!(lpDDSurfaceDesc2->dwFlags & DDSD_PIXELFORMAT)))
     1009           )
     1010          )
     1011        {
     1012          DDSurfAct.dwHeight = ModesDive[iMode].iYRes;
     1013          DDSurfAct.dwWidth  = ModesDive[iMode].iXRes;
     1014          DDSurfAct.ddpfPixelFormat.dwRGBBitCount = ModesDive[iMode].iBits;
     1015          switch(ModesDive[iMode].iBits)
     1016          {
     1017            case 8:
     1018              DDSurfAct.ddpfPixelFormat.dwFlags |= DDPF_PALETTEINDEXED8;
     1019              break;
     1020            case 16:
     1021              // VESA uses 565 encoding in 16 bit modes
     1022              DDSurfAct.ddpfPixelFormat.dwFlags &= ~DDPF_PALETTEINDEXED8;
     1023              DDSurfAct.ddpfPixelFormat.dwRBitMask = 0x0000F800;
     1024              DDSurfAct.ddpfPixelFormat.dwGBitMask = 0x000007E0;
     1025              DDSurfAct.ddpfPixelFormat.dwBBitMask = 0x0000001F;
     1026              break;
     1027            case 24:
     1028              // VESA uses per default RGB4
     1029              DDSurfAct.ddpfPixelFormat.dwFlags &= ~DDPF_PALETTEINDEXED8;
     1030              DDSurfAct.ddpfPixelFormat.dwRBitMask = 0x00FF0000;
     1031              DDSurfAct.ddpfPixelFormat.dwGBitMask = 0x0000FF00;
     1032              DDSurfAct.ddpfPixelFormat.dwBBitMask = 0x000000FF;
     1033              break;
     1034            default:
     1035              break;
     1036          }
     1037
     1038          fCallAgain = lpDDEnumModesCallback2(&DDSurfAct,lpContext);
     1039        }
     1040        iMode++;
     1041      }
     1042      while((ModesDive[iMode].iBits <= me->dCaps.ulDepth) &&
     1043            (iMode < NUM_MODES_DIVE) && (TRUE==fCallAgain));
     1044
     1045    }
     1046  }
     1047  else
     1048  {
     1049
     1050    // VOODOO modes
     1051
     1052    // Enumerate all modes ?
     1053    if (NULL==lpDDSurfaceDesc2)
     1054    {
     1055
     1056      // report all our modes
     1057      iMode = 0;
     1058      fCallAgain = TRUE;
     1059      do
     1060      {
     1061        DDSurfAct.dwHeight = ModesVoodoo[iMode].iYRes;
     1062        DDSurfAct.dwWidth  = ModesVoodoo[iMode].iXRes;
     1063        DDSurfAct.ddpfPixelFormat.dwRGBBitCount = ModesVoodoo[iMode].iBits;
     1064
     1065        fCallAgain = lpDDEnumModesCallback2(&DDSurfAct,lpContext);
     1066        iMode++;
     1067      }
     1068      while((iMode < NUM_MODES_VOODOO) && (TRUE==fCallAgain));
     1069    }
     1070    else
     1071    {
     1072      // No, so filter modes with lpDDSurfaceDesc2
     1073
     1074      // Return Error if the program want to use other than the 3 supported values
     1075      // for filtering
     1076
     1077      if (lpDDSurfaceDesc2->dwFlags & !(DDSD_WIDTH|DDSD_HEIGHT|DDSD_PIXELFORMAT))
     1078      {
     1079        return(DDERR_INVALIDPARAMS);
     1080      }
     1081
     1082      iMode = 2;
     1083      fCallAgain = TRUE;
     1084      // All reported mode are 16bit
     1085      DDSurfAct.ddpfPixelFormat.dwRBitMask = 0x0000F800;
     1086      DDSurfAct.ddpfPixelFormat.dwGBitMask = 0x000007E0;
     1087      DDSurfAct.ddpfPixelFormat.dwBBitMask = 0x0000001F;
     1088      do
     1089      {
     1090        // if the mode fits the filter applies report it
     1091        if(
     1092            (((lpDDSurfaceDesc2->dwFlags & DDSD_WIDTH)&&
     1093              (ModesVoodoo[iMode].iXRes==lpDDSurfaceDesc2->dwWidth))||
     1094             (!(lpDDSurfaceDesc2->dwFlags & DDSD_WIDTH)))&&
     1095            (((lpDDSurfaceDesc2->dwFlags & DDSD_HEIGHT)&&
     1096              (ModesVoodoo[iMode].iYRes==lpDDSurfaceDesc2->dwHeight))||
     1097             (!(lpDDSurfaceDesc2->dwFlags & DDSD_HEIGHT)))&&
     1098            (((lpDDSurfaceDesc2->dwFlags & DDSD_PIXELFORMAT) &&
     1099              (ModesVoodoo[iMode].iBits==lpDDSurfaceDesc2->ddpfPixelFormat.dwRGBBitCount))||
     1100             (!(lpDDSurfaceDesc2->dwFlags & DDSD_PIXELFORMAT)))
     1101          )
     1102        {
     1103          DDSurfAct.dwHeight = ModesVoodoo[iMode].iYRes;
     1104          DDSurfAct.dwWidth  = ModesVoodoo[iMode].iXRes;
     1105          DDSurfAct.ddpfPixelFormat.dwRGBBitCount = ModesVoodoo[iMode].iBits;
     1106
     1107          fCallAgain = lpDDEnumModesCallback2(&DDSurfAct,lpContext);
     1108        }
     1109        iMode++;
     1110      }
     1111      while((iMode < NUM_MODES_VOODOO) && (TRUE==fCallAgain));
     1112
     1113    }
     1114
     1115  }
    8601116  return(DD_OK);
    8611117}
Note: See TracChangeset for help on using the changeset viewer.