- Timestamp:
- Jun 16, 2001, 6:12:03 PM (24 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/ddraw/OS2DDRAW.CPP
r5472 r6030 1 /* $Id: OS2DDRAW.CPP,v 1.2 8 2001-04-04 09:02:14sandervl Exp $ */1 /* $Id: OS2DDRAW.CPP,v 1.29 2001-06-16 16:12:03 sandervl Exp $ */ 2 2 3 3 /* … … 840 840 841 841 } 842 843 844 845 842 return(DD_OK); 846 843 } … … 851 848 { 852 849 int iMode = 0; 853 #if 0 854 DDSURFACEDESC DDSurfAct; 850 DDSURFACEDESC2 DDSurfAct; 855 851 BOOL fCallAgain; 856 #endif857 852 OS2IDirectDraw *me = (OS2IDirectDraw *)This; 858 853 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 } 860 1116 return(DD_OK); 861 1117 }
Note:
See TracChangeset
for help on using the changeset viewer.