Ignore:
Timestamp:
Aug 19, 1999, 8:08:48 PM (26 years ago)
Author:
hugh
Message:

Implemented new colorconversion routine and fixed bug in fastblt function.
Changed the palettehandling code

File:
1 edited

Legend:

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

    r522 r587  
    66                  ( (DWORD)(BYTE)(ch2) << 16 ) | ( (DWORD)(BYTE)(ch3) << 24 ) )
    77#include <fourcc.h>
     8#define INITGUID
     9#include "os2ddraw.h"
     10#include "os2clipper.h"
     11#include "os2palette.h"
    812#include "os2surface.h"
    913#include "rectangle.h"
     
    154158  WriteLog("\n");
    155159}
     160
     161static void _dump_DDSCAPS2(DWORD flagmask) {
     162  int  i;
     163  const struct {
     164    DWORD  mask;
     165    char  *name;
     166  } flags[] = {
     167#define FE(x) { x, #x},
     168    FE(DDSCAPS2_HARDWAREDEINTERLACE)
     169    FE(DDSCAPS2_HINTANTIALIASING)
     170    FE(DDSCAPS2_HINTDYNAMIC)
     171    FE(DDSCAPS2_HINTSTATIC)
     172    FE(DDSCAPS2_OPAQUE)
     173    FE(DDSCAPS2_TEXTUREMANAGE)
     174  };
     175  for (i=0;i<sizeof(flags)/sizeof(flags[0]);i++)
     176    if (flags[i].mask & flagmask)
     177      WriteLog("%s ",flags[i].name);
     178  WriteLog("\n");
     179}
     180
    156181
    157182static void _dump_DDSD(DWORD flagmask) {
     
    553578      height = DDSurfaceDesc.dwHeight;
    554579
     580      lpDraw->pPrimSurf = this;
     581
    555582      lastError = DD_OK;
    556583      return;
     
    591618      {
    592619        WriteLog(" Use Screen Format :");
    593         dwBpp = dwBytesPPDive << 3; // No use Screenformat
     620        dwBpp = lpDraw->GetScreenBpp(); // No use Screenformat
    594621        lpDDSurfaceDesc->ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
    595622        lpDDSurfaceDesc->ddpfPixelFormat.dwFourCC = (DWORD) lpDraw->GetScreenFourCC();
     
    740767          dwPitchFB = lpDDSurfaceDesc->dwWidth * (dwBpp<8?1:dwBpp/8);
    741768          dwPitchFB = (dwPitchFB +7) & ~7;  // Align on QWords
    742 
    743769          DDSurfaceDesc.lPitch    = dwPitchFB;
    744770          lpDDSurfaceDesc->lPitch = dwPitchFB;
     
    764790          pFrameBuffer = (char*)(((int)pFBreal + 7) & ~7); // align to QWORD
    765791
    766           WriteLog( " Framebuffer @ %08X QWAligned @ %08X with a Pitch of %d",
     792          WriteLog( " Framebuffer @ %08X QWAligned @ %08X with a Pitch of %d\n",
    767793                    pFBreal, pFrameBuffer, dwPitchFB);
    768794
     
    780806          {
    781807            WriteLog(" Alloc CCBuf ");
     808            dwPitchDB = (lpDDSurfaceDesc->dwWidth * (lpDraw->dCaps.ulDepth/8) +7) & ~7;
    782809            if(Mainchain)
    783810            {
     
    790817                                    lpDDSurfaceDesc->dwWidth,
    791818                                    lpDDSurfaceDesc->dwHeight,
    792                                     (lpDDSurfaceDesc->dwWidth * (lpDraw->dCaps.ulDepth/8) +7) & ~7,
     819                                    dwPitchDB,
    793820                                    (PBYTE)pDiveBuffer);
    794821            }
    795822            else
    796823            {
    797               WriteLog("with malloc");
     824              WriteLog( "with malloc (%dx%d) Pitch %d ",
     825                        lpDDSurfaceDesc->dwHeight,
     826                        lpDDSurfaceDesc->dwWidth,
     827                        dwPitchDB);
    798828              // No so we must create the Divebuffer to do the colortranslation
    799829              // and blit to the real framebuffer on Unlock to do color conversion
    800830              pDiveBuffer = (char*)malloc( lpDDSurfaceDesc->dwHeight *
    801                                    ((lpDDSurfaceDesc->dwWidth * (lpDraw->dCaps.ulDepth/8) +7) & ~7) );
     831                                           dwPitchDB);
    802832            }
     833            WriteLog( "  @ %08X\n", pDiveBuffer);
    803834          }
    804835
     
    11541185void OS2IDirectDrawSurface::ColorConversion(LPRECT lpRect)
    11551186{
     1187  char *pSrc,*pDst,*pSLine,*pDLine;
     1188  DWORD CCwidth,CCheight,x,y;
     1189  DWORD *pPal24;
     1190  WORD  *pPal16;
     1191
     1192  if(NULL== lpDraw->pPrimSurf)
     1193  {
     1194    WriteLog("No Primary Surface! => No CC\n");
     1195    return;
     1196  }
     1197
     1198  if(NULL== ((OS2IDirectDrawSurface*)lpDraw->pPrimSurf)->lpPalette)
     1199  {
     1200    WriteLog("No DDrawpalette defined!=> No CC\n");
     1201    return;
     1202  }
     1203
     1204  if(NULL==lpRect)
     1205  {
     1206    pSrc = pFrameBuffer;
     1207    pDst = pDiveBuffer;
     1208    CCwidth  = width;
     1209    CCheight = height;
     1210  }
     1211  else
     1212  {
     1213    // ToDo: Check why the top/bottom values come in swaped here
     1214    // for now simply reverse them with the following 3 lines
     1215    y = lpRect->top;
     1216    lpRect->top = lpRect->bottom;
     1217    lpRect->bottom = y;
     1218    // end of hack
     1219    pSrc = pFrameBuffer +
     1220           (lpRect->top * dwPitchFB) +
     1221           (lpRect->left* (lpDraw->dCaps.ulDepth/8));
     1222    pDst = pDiveBuffer +
     1223           (lpRect->top * dwPitchDB) +
     1224           (lpRect->left* dwBytesPPDive);
     1225    CCwidth  = lpRect->right - lpRect->left;
     1226    CCheight = lpRect->bottom - lpRect->top;
     1227
     1228  }
     1229
     1230  WriteLog( "H: %d W: %d\n SRC @ %08X\n DST @ %08X\n",
     1231            CCheight, CCwidth, pSrc,pDst);
     1232
     1233  pSLine = pSrc;
     1234  pDLine = pDst;
     1235
     1236  switch(lpDraw->dCaps.ulDepth)
     1237  {
     1238    case 8:
     1239      WriteLog(" 8Bit target CC not implemented\n");
     1240      break;
     1241    case 15:
     1242      WriteLog(" 15 Bit not implemented using 16bit might look ugly\n");
     1243    case 16:
     1244      if(8==lpDraw->GetScreenBpp())
     1245      {
     1246        pPal16 = ((OS2IDirectDrawSurface*)lpDraw->pPrimSurf)->lpPalette->aPal16;
     1247        WriteLog("8->16Bit CC\n");
     1248        for(y=0;CCheight;CCheight--,y++)
     1249        {
     1250          WriteLog("Converting Line %d\n",y);
     1251          for(x=0;x<width;x++)
     1252          {
     1253            *((WORD*)pDLine) = pPal16[pSLine[x]];
     1254          }
     1255          pSLine += dwPitchFB;
     1256          pDLine += dwPitchDB;
     1257        }
     1258      }
     1259      else
     1260      {
     1261        WriteLog("%d ->16Bit Not implemented",lpDraw->GetScreenBpp());
     1262      }
     1263      break;
     1264    case 24:
     1265      if(8==lpDraw->GetScreenBpp())
     1266      {
     1267        WriteLog("8->24Bit CC");
     1268      }
     1269      else
     1270      {
     1271        WriteLog("%d ->16Bit Not implemented",lpDraw->GetScreenBpp());
     1272      }
     1273      break;
     1274    case 32:
     1275      if(8==lpDraw->GetScreenBpp())
     1276      {
     1277        WriteLog("8->32Bit CC");
     1278      }
     1279      else
     1280      {
     1281        WriteLog("%d ->16Bit Not implemented",lpDraw->GetScreenBpp());
     1282      }
     1283      break;
     1284    default:
     1285      #ifdef DEBUG
     1286        WriteLog( "Unexpected Screen Bitdepth %d\n",
     1287                  lpDraw->dCaps.ulDepth);
     1288      #endif
     1289      break;
     1290  }
     1291
     1292/*
    11561293  SETUP_BLITTER sBlt;
    11571294  ULONG ulDN1, ulDN2;
     
    11821319  sBlt.lDstPosY          = sBlt.ulSrcPosY;
    11831320  sBlt.ulNumDstRects     = DIVE_FULLY_VISIBLE;
     1321
     1322  WriteLog( "Colorconversion:\n FCC SRC %08X\n FCC DST %08X\n",
     1323            sBlt.fccSrcColorFormat,
     1324            sBlt.fccDstColorFormat );
    11841325
    11851326  rc = DiveAllocImageBuffer( hDiveCC,
     
    11901331                             dwPitchFB,
    11911332                             (PBYTE)pFrameBuffer);
    1192   WriteLog("AllocDiveSrc Buffer rc= %X\n",rc);
     1333  WriteLog("AllocDiveSrc Buffer rc= 0x%08X\n",rc);
    11931334
    11941335  rc = DiveAllocImageBuffer( hDiveCC,
     
    11991340                             dwPitchDB,
    12001341                             (PBYTE)pDiveBuffer);
    1201   WriteLog("AllocDiveDst Buffer rc= %Xd\n",rc);
     1342  WriteLog("AllocDiveDst Buffer rc= 0x%08X\n",rc);
    12021343
    12031344  rc = DiveSetupBlitter( hDiveCC,
     
    12191360
    12201361  WriteLog("Free dst rc= %X\n",rc);
    1221 
     1362*/
    12221363}
    12231364//******************************************************************************
     
    25712712  BlitWidth  = (SrcRect.right - SrcRect.left) * src->dwBytesPPDive;
    25722713
    2573   if(dwTrans & DDBLTFAST_NOCOLORKEY)
     2714  // Remove unsupported wait flag
     2715  dwTrans &= ~DDBLTFAST_WAIT;
     2716
     2717  if(DDBLTFAST_NOCOLORKEY == dwTrans )
    25742718  {
    25752719    WriteLog("Solid Blit");
     
    25932737  else
    25942738  {
    2595     WriteLog("TransBlit");
     2739    WriteLog("TransBlit\n");
    25962740
    25972741    if(dwTrans & DDBLTFAST_SRCCOLORKEY)
    25982742    {
     2743      WriteLog("Trans SRC\n");
    25992744      // transparent source
    26002745      dwSrcColor = src->DDSurfaceDesc.ddckCKSrcBlt.dwColorSpaceLowValue;
    26012746      if(dwTrans & DDBLTFAST_DESTCOLORKEY)
    26022747      {
     2748        WriteLog("And Dest Colorkey");
    26032749        dwDestColor = dest->DDSurfaceDesc.ddckCKDestBlt.dwColorSpaceLowValue;
    26042750        // Source and dest colorkeying
     
    26972843        // This MMX detection should be moved into OS2Draw
    26982844        // and into the surface constructor a setup for blitting pointers
    2699 
     2845        WriteLog("Only Src ColorKey");
    27002846        switch(dest->dwBytesPPDive)
    27012847        {
     
    27682914      if(dwTrans & DDBLTFAST_DESTCOLORKEY)
    27692915      {
     2916        WriteLog("DestColorKey\n");
     2917
    27702918        dwDestColor = dest->DDSurfaceDesc.ddckCKDestBlt.dwColorSpaceLowValue;
    27712919        switch(dest->dwBytesPPDive)
     
    28442992        }  // End switch
    28452993      }
     2994      else
     2995      {
     2996        WriteLog("Unexpected Flags");
     2997      }
    28462998    }
    28472999  }
     
    33493501
    33503502  lpDDCaps->dwCaps = me->DDSurfaceDesc.ddsCaps.dwCaps;
    3351 
     3503  #ifdef DEBUG
     3504    _dump_DDSCAPS(lpDDCaps->dwCaps);
     3505  #endif
    33523506  return(DD_OK);
    33533507}
     
    33653519
    33663520  memcpy(lpDDCaps, &(me->DDSurfaceDesc.ddsCaps), sizeof(DDSCAPS2) );
     3521  #ifdef DEBUG
     3522    _dump_DDSCAPS(lpDDCaps->dwCaps);
     3523    _dump_DDSCAPS2(lpDDCaps->dwCaps2);
     3524
     3525  #endif
    33673526
    33683527  return(DD_OK);
     
    40984257      // primary surface => doesn't modify physical palette
    40994258      if(me->surfaceType & DDSCAPS_PRIMARYSURFACE)
     4259      {
    41004260        me->lpPalette->SetIsPrimary(FALSE);
    4101 
     4261      }
    41024262      me->lpPalette->Vtbl.Release((IDirectDrawPalette*)me->lpPalette);
    41034263      me->lpPalette = NULL;
     
    41284288
    41294289  if(me->surfaceType & DDSCAPS_PRIMARYSURFACE)
     4290  {
    41304291    me->lpPalette->SetIsPrimary(TRUE);
    4131 
     4292  }
    41324293  me->lpVtbl->ChangeUniquenessValue(me);
    41334294
Note: See TracChangeset for help on using the changeset viewer.