Changeset 8818 for trunk/src


Ignore:
Timestamp:
Jul 1, 2002, 9:15:26 PM (23 years ago)
Author:
sandervl
Message:

fill, SurfGetDC, SurfReleaseDC fixes & changes (see ChangeLog for details)

Location:
trunk/src/ddraw
Files:
6 edited

Legend:

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

    r8816 r8818  
    1 /* $Id: OS2SURFACE.CPP,v 1.43 2002-07-01 16:02:04 sandervl Exp $ */
     1/* $Id: OS2SURFACE.CPP,v 1.44 2002-07-01 19:15:24 sandervl Exp $ */
    22
    33/*
     
    3838#include <winerror.h>
    3939#include <os2win.h>
     40#include <cpuhlp.h>
     41#include "asmutil.h"
     42
    4043#ifndef __WATCOMC__
    4144  #include <builtin.h>
     
    15691572  }
    15701573
    1571   if(NULL!=ColorFill)
     1574  if(NULL!=ColorFill) {
    15721575    ColorFill( pDiveBuffer, pFrameBuffer, Top, Left,
    15731576              FillWidth, FillHeight, dwPitchDB,dwPitchFB,
    15741577              dwFillColor,(16==lpDraw->dCaps.ulDepth)?(VOID*)pPal16:(VOID*)pPal24);
     1578    SurfChangeUniquenessValue(this);
     1579  }
    15751580  else
    15761581  {
     
    25382543          }
    25392544#endif
     2545          SurfChangeUniquenessValue(dest);
    25402546          return DD_OK;
    25412547      }
     
    30583064                break;
    30593065            }  // end switch
    3060             //if(dest->lpVtbl == dest->Vtbl4)
    3061             //  dest->Vtbl4->ChangeUniquenessValue(dest);
     3066            SurfChangeUniquenessValue(dest);
    30623067            return DD_OK;
    30633068          }
     
    33043309            // Only Source colorkey
    33053310          }
    3306           // if(dest->lpVtbl == dest->Vtbl4)
    3307           //  dest->Vtbl4->ChangeUniquenessValue(dest);
     3311          SurfChangeUniquenessValue(dest);
    33083312          return DD_OK;
    33093313        }
     
    34193423  }// end handling destination not framebuffer
    34203424
    3421   // if(dest->lpVtbl == dest->Vtbl4)
    3422   //   dest->Vtbl4->ChangeUniquenessValue(dest);
     3425  SurfChangeUniquenessValue(dest);
    34233426  return(DD_OK);
    34243427}
     
    44054408 DDSURFACEDESC2        LockedSurfaceDesc;
    44064409 HRESULT               rc;
    4407  BITMAPINFOHEADER      bmihHdr;
    44084410 BITMAP bmpSurface;
    44094411 struct
     
    44544456    BitmapInfo.bmiHead.biPlanes   = 1;
    44554457    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;
    44624458
    44634459    switch(LockedSurfaceDesc.ddpfPixelFormat.dwRGBBitCount)
     
    44874483        }
    44884484        me->hbmImage = CreateDIBitmap( me->hdcImage,
    4489                                        &bmihHdr,
     4485                                       &BitmapInfo.bmiHead,
    44904486                                       CBM_INIT,
    44914487                                       LockedSurfaceDesc.lpSurface,
     
    45034499        *((DWORD *) &(BitmapInfo.bmiCols[2])) = me->DDSurfaceDesc.ddpfPixelFormat.dwBBitMask;
    45044500        me->hbmImage = CreateDIBitmap( me->hdcImage,
    4505                                        &bmihHdr,
     4501                                       &BitmapInfo.bmiHead,
    45064502                                       CBM_INIT,
    45074503                                       LockedSurfaceDesc.lpSurface,
     
    49084904   RGBQUAD           bmiCols[256];
    49094905 } BitmapInfo;
    4910 // BITMAP bmpData;
    49114906 int rc;
    49124907
     
    49164911    return(DDERR_INVALIDOBJECT);
    49174912
    4918   #if 1
    49194913  //unselect our bitmap
    49204914  SelectObject(me->hdcImage, me->hgdiOld);
     4915
    49214916  memset(&BitmapInfo,0, sizeof(BitmapInfo));
    49224917  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);
    49254921  BitmapInfo.bmiHead.biHeight   = me->DDSurfaceDesc.dwHeight;
    4926   BitmapInfo.bmiHead.biPlanes   = 1;
    4927   BitmapInfo.bmiHead.biBitCount = 0; // me->DDSurfaceDesc.ddpfPixelFormat.dwRGBBitCount;
    4928   */
     4922
    49294923  switch(me->DDSurfaceDesc.ddpfPixelFormat.dwRGBBitCount)
    49304924  {
     
    49664960      break;
    49674961    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
    49684981    case 32:
    49694982      BitmapInfo.bmiHead.biCompression = BI_BITFIELDS;
     
    49754988                me->DDSurfaceDesc.lpSurface,(PBITMAPINFO)&BitmapInfo,DIB_RGB_COLORS);
    49764989      break;
     4990
    49774991    case 24:
    49784992      BitmapInfo.bmiHead.biCompression = BI_RGB;
     
    49854999      break;
    49865000  } // 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
    49995002  me->Vtbl.Unlock(me,NULL);
    50005003  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 mike Exp $
     1; $Id: asmutil.asm,v 1.9 2002-07-01 19:15:25 sandervl Exp $
    22
    33;
     
    3131  CONST32  ENDS
    3232
     33DATA32 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
     43DATA32  ENDS
    3344
    3445CODE32  SEGMENT
     
    20972108_MemFlip   ENDP
    20982109
     2110; void _Optlink DDrawRGB555to565 (WORD *dest, WORD *src, ULONG num);
     2111
     2112        PUBLIC DDrawRGB555to565
     2113
     2114DDrawRGB555to565 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
     2124cvt:
     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
     2151done:
     2152        pop     edi
     2153        pop     esi
     2154        ret
     2155
     2156DDrawRGB555to565 ENDP
     2157
     2158        PUBLIC DDrawRGB565to555
     2159
     2160DDrawRGB565to555 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
     2173cvt:
     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
     2200done:
     2201        pop     edi
     2202        pop     esi
     2203        ret
     2204
     2205DDrawRGB565to555 ENDP
     2206
     2207; void _Optlink DDrawRGB555to565MMX(WORD *dest, WORD *src, ULONG num);
     2208
     2209        PUBLIC DDrawRGB555to565MMX
     2210
     2211DDrawRGB555to565MMX 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
     2232cvt:
     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
     2266lastpixels:
     2267        pop     ecx
     2268        and     ecx, 3
     2269        jz      short done
     2270
     2271cvt2loop:
     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
     2287done:
     2288        pop     edi
     2289        pop     esi
     2290        ret
     2291
     2292DDrawRGB555to565MMX ENDP
     2293
     2294
     2295; void _Optlink DDrawRGB565to555MMX(WORD *dest, WORD *src, ULONG num);
     2296
     2297        PUBLIC DDrawRGB565to555MMX
     2298
     2299DDrawRGB565to555MMX 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
     2320cvt:
     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
     2354lastpixels:
     2355        pop     ecx
     2356        and     ecx, 3
     2357        jz      short done
     2358
     2359cvt2loop:
     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
     2375done:
     2376        pop     edi
     2377        pop     esi
     2378        ret
     2379
     2380DDrawRGB565to555MMX ENDP
     2381
    20992382CODE32          ENDS
    21002383
  • trunk/src/ddraw/asmutil.h

    r5326 r8818  
    1 /* $Id: asmutil.h,v 1.6 2001-03-18 21:44:44 mike Exp $ */
     1/* $Id: asmutil.h,v 1.7 2002-07-01 19:15:26 sandervl Exp $ */
    22
    33/*
     
    2828extern int __cdecl CPUHasMMX();
    2929
     30void _Optlink DDrawRGB555to565(char *dest, char *src, ULONG num);
     31void _Optlink DDrawRGB555to565MMX(char *dest, char *src, ULONG num);
     32
     33void _Optlink DDrawRGB565to555(char *dest, char *src, ULONG num);
     34void _Optlink DDrawRGB565to555MMX(char *dest, char *src, ULONG num);
     35
    3036#ifdef __cplusplus
    3137}
  • trunk/src/ddraw/bltFunc.cpp

    r5472 r8818  
    1 /* $Id: bltFunc.cpp,v 1.4 2001-04-04 09:02:14 sandervl Exp $ */
     1/* $Id: bltFunc.cpp,v 1.5 2002-07-01 19:15:26 sandervl Exp $ */
    22
    33/*
     
    1616#include <misc.h>
    1717#include "bltFunc.h"
     18#include "asmutil.h"
    1819
    1920//
  • trunk/src/ddraw/fillfunc.cpp

    r8816 r8818  
    1 /* $Id: fillfunc.cpp,v 1.5 2002-07-01 16:02:05 sandervl Exp $ */
     1/* $Id: fillfunc.cpp,v 1.6 2002-07-01 19:15:26 sandervl Exp $ */
    22
    33/*
     
    225225{
    226226  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);
    227229  dwColor = (dwColor&0xFFFF)+((dwColor&0xFFFF)<<16);
    228230
  • trunk/src/ddraw/fillfunc.h

    r5326 r8818  
    1 /* $Id: fillfunc.h,v 1.2 2001-03-18 21:44:45 mike Exp $ */
     1/* $Id: fillfunc.h,v 1.3 2002-07-01 19:15:26 sandervl Exp $ */
    22
    33/*
     
    99 *
    1010 */
     11
     12//RGB 555 -> RGB 565
     13#define MAKE_RGB565(a)  (((a<<1)& 0xFFC0) | (a & 0x1F))
    1114
    1215
Note: See TracChangeset for help on using the changeset viewer.