- Timestamp:
- Jul 1, 2002, 9:15:26 PM (23 years ago)
- Location:
- trunk/src/ddraw
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/ddraw/OS2SURFACE.CPP
r8816 r8818 1 /* $Id: OS2SURFACE.CPP,v 1.4 3 2002-07-01 16:02:04 sandervl Exp $ */1 /* $Id: OS2SURFACE.CPP,v 1.44 2002-07-01 19:15:24 sandervl Exp $ */ 2 2 3 3 /* … … 38 38 #include <winerror.h> 39 39 #include <os2win.h> 40 #include <cpuhlp.h> 41 #include "asmutil.h" 42 40 43 #ifndef __WATCOMC__ 41 44 #include <builtin.h> … … 1569 1572 } 1570 1573 1571 if(NULL!=ColorFill) 1574 if(NULL!=ColorFill) { 1572 1575 ColorFill( pDiveBuffer, pFrameBuffer, Top, Left, 1573 1576 FillWidth, FillHeight, dwPitchDB,dwPitchFB, 1574 1577 dwFillColor,(16==lpDraw->dCaps.ulDepth)?(VOID*)pPal16:(VOID*)pPal24); 1578 SurfChangeUniquenessValue(this); 1579 } 1575 1580 else 1576 1581 { … … 2538 2543 } 2539 2544 #endif 2545 SurfChangeUniquenessValue(dest); 2540 2546 return DD_OK; 2541 2547 } … … 3058 3064 break; 3059 3065 } // end switch 3060 //if(dest->lpVtbl == dest->Vtbl4) 3061 // dest->Vtbl4->ChangeUniquenessValue(dest); 3066 SurfChangeUniquenessValue(dest); 3062 3067 return DD_OK; 3063 3068 } … … 3304 3309 // Only Source colorkey 3305 3310 } 3306 // if(dest->lpVtbl == dest->Vtbl4) 3307 // dest->Vtbl4->ChangeUniquenessValue(dest); 3311 SurfChangeUniquenessValue(dest); 3308 3312 return DD_OK; 3309 3313 } … … 3419 3423 }// end handling destination not framebuffer 3420 3424 3421 // if(dest->lpVtbl == dest->Vtbl4) 3422 // dest->Vtbl4->ChangeUniquenessValue(dest); 3425 SurfChangeUniquenessValue(dest); 3423 3426 return(DD_OK); 3424 3427 } … … 4405 4408 DDSURFACEDESC2 LockedSurfaceDesc; 4406 4409 HRESULT rc; 4407 BITMAPINFOHEADER bmihHdr;4408 4410 BITMAP bmpSurface; 4409 4411 struct … … 4454 4456 BitmapInfo.bmiHead.biPlanes = 1; 4455 4457 BitmapInfo.bmiHead.biBitCount = (WORD)LockedSurfaceDesc.ddpfPixelFormat.dwRGBBitCount; 4456 memset(&bmihHdr, 0, sizeof(bmihHdr));4457 bmihHdr.biSize = sizeof(BITMAPINFOHEADER);4458 bmihHdr.biWidth = LockedSurfaceDesc.dwWidth;4459 bmihHdr.biHeight = LockedSurfaceDesc.dwHeight;4460 bmihHdr.biPlanes = 1;4461 bmihHdr.biBitCount = (WORD)LockedSurfaceDesc.ddpfPixelFormat.dwRGBBitCount;4462 4458 4463 4459 switch(LockedSurfaceDesc.ddpfPixelFormat.dwRGBBitCount) … … 4487 4483 } 4488 4484 me->hbmImage = CreateDIBitmap( me->hdcImage, 4489 & bmihHdr,4485 &BitmapInfo.bmiHead, 4490 4486 CBM_INIT, 4491 4487 LockedSurfaceDesc.lpSurface, … … 4503 4499 *((DWORD *) &(BitmapInfo.bmiCols[2])) = me->DDSurfaceDesc.ddpfPixelFormat.dwBBitMask; 4504 4500 me->hbmImage = CreateDIBitmap( me->hdcImage, 4505 & bmihHdr,4501 &BitmapInfo.bmiHead, 4506 4502 CBM_INIT, 4507 4503 LockedSurfaceDesc.lpSurface, … … 4908 4904 RGBQUAD bmiCols[256]; 4909 4905 } BitmapInfo; 4910 // BITMAP bmpData;4911 4906 int rc; 4912 4907 … … 4916 4911 return(DDERR_INVALIDOBJECT); 4917 4912 4918 #if 14919 4913 //unselect our bitmap 4920 4914 SelectObject(me->hdcImage, me->hgdiOld); 4915 4921 4916 memset(&BitmapInfo,0, sizeof(BitmapInfo)); 4922 4917 BitmapInfo.bmiHead.biSize = sizeof(BITMAPINFOHEADER); 4923 /* 4924 BitmapInfo.bmiHead.biWidth = me->DDSurfaceDesc.lPitch/ (me->DDSurfaceDesc.ddpfPixelFormat.dwRGBBitCount>>3); 4918 BitmapInfo.bmiHead.biBitCount = me->DDSurfaceDesc.ddpfPixelFormat.dwRGBBitCount; 4919 BitmapInfo.bmiHead.biPlanes = 1; 4920 BitmapInfo.bmiHead.biWidth = me->DDSurfaceDesc.dwWidth; /// (me->DDSurfaceDesc.ddpfPixelFormat.dwRGBBitCount>>3); 4925 4921 BitmapInfo.bmiHead.biHeight = me->DDSurfaceDesc.dwHeight; 4926 BitmapInfo.bmiHead.biPlanes = 1; 4927 BitmapInfo.bmiHead.biBitCount = 0; // me->DDSurfaceDesc.ddpfPixelFormat.dwRGBBitCount; 4928 */ 4922 4929 4923 switch(me->DDSurfaceDesc.ddpfPixelFormat.dwRGBBitCount) 4930 4924 { … … 4966 4960 break; 4967 4961 case 16: 4962 BitmapInfo.bmiHead.biCompression = BI_BITFIELDS; 4963 BitmapInfo.bmiHead.biClrUsed = 3; 4964 *((DWORD *) &(BitmapInfo.bmiCols[0])) = me->DDSurfaceDesc.ddpfPixelFormat.dwRBitMask; 4965 *((DWORD *) &(BitmapInfo.bmiCols[1])) = me->DDSurfaceDesc.ddpfPixelFormat.dwGBitMask; 4966 *((DWORD *) &(BitmapInfo.bmiCols[2])) = me->DDSurfaceDesc.ddpfPixelFormat.dwBBitMask; 4967 GetDIBits(hdc, me->hbmImage, 0, me->DDSurfaceDesc.dwHeight, 4968 me->DDSurfaceDesc.lpSurface,(PBITMAPINFO)&BitmapInfo,DIB_RGB_COLORS); 4969 4970 //GetDIBits returns data in RGB555 format; convert if surface is in RGB565 format 4971 if(me->DDSurfaceDesc.ddpfPixelFormat.dwGBitMask == 0x7E0) { 4972 int imgsize = BitmapInfo.bmiHead.biWidth*BitmapInfo.bmiHead.biHeight*2; 4973 4974 if(CPUFeatures & CPUID_MMX) { 4975 DDrawRGB555to565MMX((char *)me->DDSurfaceDesc.lpSurface, (char *)me->DDSurfaceDesc.lpSurface, imgsize/sizeof(WORD)); 4976 } 4977 else DDrawRGB555to565((char *)me->DDSurfaceDesc.lpSurface, (char *)me->DDSurfaceDesc.lpSurface, imgsize/sizeof(WORD)); 4978 } 4979 break; 4980 4968 4981 case 32: 4969 4982 BitmapInfo.bmiHead.biCompression = BI_BITFIELDS; … … 4975 4988 me->DDSurfaceDesc.lpSurface,(PBITMAPINFO)&BitmapInfo,DIB_RGB_COLORS); 4976 4989 break; 4990 4977 4991 case 24: 4978 4992 BitmapInfo.bmiHead.biCompression = BI_RGB; … … 4985 4999 break; 4986 5000 } // end switch (me->DDSurfaceDesc.ddpfPixelFormat.dwRGBBitCount) 4987 #else 4988 4989 rc = GetObjectA( me->hbmImage, 4990 sizeof(BITMAP), 4991 &bmpData); 4992 dprintf( ("GetObject returned rc=%d\n BitmapInfo:\n Size:(%dx%d)\n Pitch: %d\n Bits %d\n @mem %08X", 4993 rc, 4994 bmpData.bmWidth, bmpData.bmHeight, 4995 bmpData.bmWidthBytes, 4996 bmpData.bmBitsPixel, 4997 bmpData.bmBits)); 4998 #endif 5001 4999 5002 me->Vtbl.Unlock(me,NULL); 5000 5003 me->dwLastDCUnique = me->dwUniqueValue; // Store this to see if the surface was locked after we released the DC -
trunk/src/ddraw/asmutil.asm
r5326 r8818 1 ; $Id: asmutil.asm,v 1. 8 2001-03-18 21:44:44 mikeExp $1 ; $Id: asmutil.asm,v 1.9 2002-07-01 19:15:25 sandervl Exp $ 2 2 3 3 ; … … 31 31 CONST32 ENDS 32 32 33 DATA32 SEGMENT 34 35 align 4 36 and1mask dd 0001F001Fh 37 dd 0001F001Fh 38 and2mask dd 0FFC0FFC0h 39 dd 0FFC0FFC0h 40 and2mask565 dd 0FFE07FE0h 41 dd 07FE07FE0h 42 43 DATA32 ENDS 33 44 34 45 CODE32 SEGMENT … … 2097 2108 _MemFlip ENDP 2098 2109 2110 ; void _Optlink DDrawRGB555to565 (WORD *dest, WORD *src, ULONG num); 2111 2112 PUBLIC DDrawRGB555to565 2113 2114 DDrawRGB555to565 PROC NEAR 2115 2116 push esi 2117 push edi 2118 cld 2119 2120 mov edi, eax ; _Optlink arg1 = EAX 2121 mov esi, edx ; _Optlink arg2 = EDX 2122 shr ecx, 1 ; _Optlink arg3 = ECX 2123 pushf 2124 cvt: 2125 mov eax, [esi] 2126 mov edx, eax 2127 2128 add esi, 4 2129 shl eax, 1 2130 2131 and edx, 0001F001Fh 2132 and eax, 0FFC0FFC0h 2133 2134 add edi, 4 2135 or eax, edx 2136 2137 mov [edi-4], eax 2138 loop cvt 2139 2140 popf 2141 jnc SHORT done 2142 2143 mov ax, [esi] 2144 mov dx, ax 2145 and dx, 0001Fh 2146 shl ax, 1 2147 and ax, 0FFC0h 2148 or ax, dx 2149 mov [edi], ax 2150 2151 done: 2152 pop edi 2153 pop esi 2154 ret 2155 2156 DDrawRGB555to565 ENDP 2157 2158 PUBLIC DDrawRGB565to555 2159 2160 DDrawRGB565to555 PROC NEAR 2161 2162 push esi 2163 push edi 2164 cld 2165 2166 cmp ecx, 0 2167 jz done 2168 2169 mov edi, eax ; _Optlink arg1 = EAX 2170 mov esi, edx ; _Optlink arg2 = EDX 2171 shr ecx, 1 ; _Optlink arg3 = ECX 2172 pushf 2173 cvt: 2174 mov eax, [esi] 2175 mov edx, eax 2176 2177 add esi, 4 2178 shr eax, 1 2179 2180 and edx, 0001F001Fh 2181 and eax, 0FFE07FE0h 2182 2183 add edi, 4 2184 or eax, edx 2185 2186 mov [edi-4], eax 2187 loop cvt 2188 2189 popf 2190 jnc SHORT done 2191 2192 mov ax, [esi] 2193 mov dx, ax 2194 and dx, 0001Fh 2195 shr ax, 1 2196 and ax, 0FFE0h 2197 or ax, dx 2198 mov [edi], ax 2199 2200 done: 2201 pop edi 2202 pop esi 2203 ret 2204 2205 DDrawRGB565to555 ENDP 2206 2207 ; void _Optlink DDrawRGB555to565MMX(WORD *dest, WORD *src, ULONG num); 2208 2209 PUBLIC DDrawRGB555to565MMX 2210 2211 DDrawRGB555to565MMX PROC NEAR 2212 push esi 2213 push edi 2214 cld 2215 2216 cmp ecx, 0 2217 jz done 2218 2219 push ecx 2220 2221 mov edi, eax ; _Optlink arg1 = EAX 2222 mov esi, edx ; _Optlink arg2 = EDX 2223 shr ecx, 3 ; _Optlink arg3 = ECX 2224 jz lastpixels 2225 2226 sub esp, 108 2227 fsaved dword ptr [esp] 2228 2229 movq mm2, qword ptr and1mask ; 0001F001F001F001Fh 2230 movq mm3, qword ptr and2mask ; FFC0FFC00FFC0FFC0h 2231 2232 cvt: 2233 movq mm0, qword ptr [esi] 2234 add edi, 16 2235 2236 movq mm4, qword ptr [esi+8] 2237 movq mm1, mm0 2238 2239 movq mm5, mm4 2240 psllq mm0, 1 2241 2242 psllq mm4, 1 2243 pand mm1, mm2 2244 2245 pand mm0, mm3 2246 pand mm5, mm2 2247 2248 pand mm4, mm3 2249 por mm0, mm1 2250 2251 por mm4, mm5 2252 add esi, 16 2253 2254 movq qword ptr [edi-16], mm0 2255 dec ecx 2256 2257 movq qword ptr [edi-8], mm4 2258 jnz cvt 2259 2260 nop 2261 nop 2262 2263 frstord dword ptr [esp] 2264 add esp, 108 2265 2266 lastpixels: 2267 pop ecx 2268 and ecx, 3 2269 jz short done 2270 2271 cvt2loop: 2272 mov ax, [esi] 2273 mov dx, ax 2274 2275 add esi, 2 2276 and dx, 001Fh 2277 2278 shl ax, 1 2279 add edi, 2 2280 2281 and ax, 0FFC0h 2282 or ax, dx 2283 2284 mov [edi-2], ax 2285 loop cvt2loop 2286 2287 done: 2288 pop edi 2289 pop esi 2290 ret 2291 2292 DDrawRGB555to565MMX ENDP 2293 2294 2295 ; void _Optlink DDrawRGB565to555MMX(WORD *dest, WORD *src, ULONG num); 2296 2297 PUBLIC DDrawRGB565to555MMX 2298 2299 DDrawRGB565to555MMX PROC NEAR 2300 push esi 2301 push edi 2302 cld 2303 2304 cmp ecx, 0 2305 jz done 2306 2307 push ecx 2308 2309 mov edi, eax ; _Optlink arg1 = EAX 2310 mov esi, edx ; _Optlink arg2 = EDX 2311 shr ecx, 3 ; _Optlink arg3 = ECX 2312 jz lastpixels 2313 2314 sub esp, 108 2315 fsaved dword ptr [esp] 2316 2317 movq mm2, qword ptr and1mask ; 0001F001F001F001Fh 2318 movq mm3, qword ptr and2mask565 ; FFE07FE007FE07FE0h 2319 2320 cvt: 2321 movq mm0, qword ptr [esi] 2322 add edi, 16 2323 2324 movq mm4, qword ptr [esi+8] 2325 movq mm1, mm0 2326 2327 movq mm5, mm4 2328 psrlq mm0, 1 2329 2330 psrlq mm4, 1 2331 pand mm1, mm2 2332 2333 pand mm0, mm3 2334 pand mm5, mm2 2335 2336 pand mm4, mm3 2337 por mm0, mm1 2338 2339 por mm4, mm5 2340 add esi, 16 2341 2342 movq qword ptr [edi-16], mm0 2343 dec ecx 2344 2345 movq qword ptr [edi-8], mm4 2346 jnz cvt 2347 2348 nop 2349 nop 2350 2351 frstord dword ptr [esp] 2352 add esp, 108 2353 2354 lastpixels: 2355 pop ecx 2356 and ecx, 3 2357 jz short done 2358 2359 cvt2loop: 2360 mov ax, [esi] 2361 mov dx, ax 2362 2363 add esi, 2 2364 and dx, 001Fh 2365 2366 shr ax, 1 2367 add edi, 2 2368 2369 and ax, 0FFE0h 2370 or ax, dx 2371 2372 mov [edi-2], ax 2373 loop cvt2loop 2374 2375 done: 2376 pop edi 2377 pop esi 2378 ret 2379 2380 DDrawRGB565to555MMX ENDP 2381 2099 2382 CODE32 ENDS 2100 2383 -
trunk/src/ddraw/asmutil.h
r5326 r8818 1 /* $Id: asmutil.h,v 1. 6 2001-03-18 21:44:44 mikeExp $ */1 /* $Id: asmutil.h,v 1.7 2002-07-01 19:15:26 sandervl Exp $ */ 2 2 3 3 /* … … 28 28 extern int __cdecl CPUHasMMX(); 29 29 30 void _Optlink DDrawRGB555to565(char *dest, char *src, ULONG num); 31 void _Optlink DDrawRGB555to565MMX(char *dest, char *src, ULONG num); 32 33 void _Optlink DDrawRGB565to555(char *dest, char *src, ULONG num); 34 void _Optlink DDrawRGB565to555MMX(char *dest, char *src, ULONG num); 35 30 36 #ifdef __cplusplus 31 37 } -
trunk/src/ddraw/bltFunc.cpp
r5472 r8818 1 /* $Id: bltFunc.cpp,v 1. 4 2001-04-04 09:02:14sandervl Exp $ */1 /* $Id: bltFunc.cpp,v 1.5 2002-07-01 19:15:26 sandervl Exp $ */ 2 2 3 3 /* … … 16 16 #include <misc.h> 17 17 #include "bltFunc.h" 18 #include "asmutil.h" 18 19 19 20 // -
trunk/src/ddraw/fillfunc.cpp
r8816 r8818 1 /* $Id: fillfunc.cpp,v 1. 5 2002-07-01 16:02:05sandervl Exp $ */1 /* $Id: fillfunc.cpp,v 1.6 2002-07-01 19:15:26 sandervl Exp $ */ 2 2 3 3 /* … … 225 225 { 226 226 dprintf(("Fill16on16 %x (%d,%d)(%d,%d) %d %x", pDB+(dwTop*dwPitchDB)+(dwLeft*2), dwLeft, dwTop, dwWidth, dwHeight, dwPitchDB, dwColor)); 227 228 dwColor = MAKE_RGB565(dwColor); 227 229 dwColor = (dwColor&0xFFFF)+((dwColor&0xFFFF)<<16); 228 230 -
trunk/src/ddraw/fillfunc.h
r5326 r8818 1 /* $Id: fillfunc.h,v 1. 2 2001-03-18 21:44:45 mikeExp $ */1 /* $Id: fillfunc.h,v 1.3 2002-07-01 19:15:26 sandervl Exp $ */ 2 2 3 3 /* … … 9 9 * 10 10 */ 11 12 //RGB 555 -> RGB 565 13 #define MAKE_RGB565(a) (((a<<1)& 0xFFC0) | (a & 0x1F)) 11 14 12 15
Note:
See TracChangeset
for help on using the changeset viewer.