Programmieren - alles kontrollieren 4.936 Themen, 20.625 Beiträge

DX7 und DirectDraw-Antialiasing

IDE-ATAPI / 10 Antworten / Flachansicht Nickles

Hallo, bezweifle zwar dass mir da jemand weiterhelfen kann aber trotzdem;


Hab ein Problem mit DirectDraw. Ich lade ein Bitmap mit Hilfe von Funktionen der "ddutil.h". (Also ganz der Standardweg)


Wenn ich das Bitmap jetzt mit bitblt vergrößert darstelle wirkt es verschwommen, wie durch Antialiasing, kann man das abstellen ?


Thx,


IDE-ATAPI

bei Antwort benachrichtigen
IDE-ATAPI PaoloP „Ich kenne dieses Problem mit Alpha-Blending und Direct3D. Hat die Bitmap und...“
Optionen

Hier der Code:

Geladen wird das Bitmap mit Hilfe von DDLoadBitmapFromDisk
(ist ne Standardfunktion aus der DirectX SDK ddutil)

extern "C" IDirectDrawSurface7*
DDLoadBitmapFromDisk( IDirectDraw7* pdd, LPCSTR szBitmap, int dx, int dy)
{
HBITMAP hbm;
BITMAP bm;
DDSURFACEDESC2 ddsd;
IDirectDrawSurface7 *pdds;

// Try to load the bitmap as a resource, if that fails, try it as a file
hbm = (HBITMAP) LoadImage(GetModuleHandle(NULL), szBitmap, IMAGE_BITMAP, dx,
dy, LR_CREATEDIBSECTION);
if (hbm == NULL)
hbm = (HBITMAP) LoadImage(NULL, szBitmap, IMAGE_BITMAP, dx, dy,
LR_LOADFROMFILE | LR_CREATEDIBSECTION);
if (hbm == NULL)
return NULL;
// Get size of the bitmap
GetObject(hbm, sizeof(bm), &bm);
// Create a DirectDrawSurface for this bitmap
ZeroMemory(&ddsd, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
ddsd.dwWidth = bm.bmWidth;
ddsd.dwHeight = bm.bmHeight;
if (pdd->CreateSurface(&ddsd, &pdds, NULL) != DD_OK)
return NULL;
DDCopyBitmap(pdds, hbm, 0, 0, 0, 0);
DeleteObject(hbm);
return pdds;
}

In der DDLoadBitmapFromDisk wird ausserdem noch DDCopyBitmap,
auch aus der SDK, aufgerufen:
extern "C" HRESULT
DDCopyBitmap(IDirectDrawSurface7* pdds, HBITMAP hbm, int x, int y,
int dx, int dy)
{
HDC hdcImage;
HDC hdc;
BITMAP bm;
DDSURFACEDESC2 ddsd;
HRESULT hr;

if (hbm == NULL || pdds == NULL)
return E_FAIL;

pdds->Restore();
// Select bitmap into a memoryDC so we can use it.
hdcImage = CreateCompatibleDC(NULL);
if (!hdcImage)
OutputDebugString("createcompatible dc failed\n");
SelectObject(hdcImage, hbm);
// Get size of the bitmap
GetObject(hbm, sizeof(bm), &bm);
dx = dx == 0 ? bm.bmWidth : dx; // Use the passed size, unless zero
dy = dy == 0 ? bm.bmHeight : dy;
// Get size of surface.
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_HEIGHT | DDSD_WIDTH;
pdds->GetSurfaceDesc(&ddsd);
if ((hr = pdds->GetDC(&hdc)) == DD_OK)
{
StretchBlt(hdc, 0, 0, ddsd.dwWidth, ddsd.dwHeight, hdcImage, x, y,
dx, dy, SRCCOPY);
pdds->ReleaseDC(hdc);
}
DeleteDC(hdcImage);
return hr;
}

Dann verpasse ich dem Bitmap noch einen Colorkey:
void AddColorKey (LPDIRECTDRAWSURFACE7 surface, DWORD Low, DWORD High) // Colorkey routine
{
DDCOLORKEY key;
ZeroMemory(&key, sizeof(key));
key.dwColorSpaceLowValue = Low;
key.dwColorSpaceHighValue = High;
surface->SetColorKey (DDCKEY_SRCBLT, &key);
}

und blitte es mit Hilfe von:
lpddsBack->Blt(&rectbitmap, lpddsBitmap, NULL, DDBLT_KEYSRC | DDBLT_WAIT, NULL);

Zu den Größenangaben:
Ich lade das Bild mit der Größe X -> 47 und Y -> 21,
das Problem tritt aber auch auf wenn ich es jetzt mit
der gleichen Größenangabe blitte.

Thx,

IDE-ATAPI

bei Antwort benachrichtigen