000
08.03.2009, 12:10 Uhr
~PeterPanzki
Gast
|
Hallo,
ich arbeite grade an einer DirectDraw Klasse. Mein problem ist, dass wenn ich eine BMP in ein Surface laden will, die z.B. geld ist, wir diese mir in pink oder so ausgegeben. Ich habe zwar eine Palette ins Primary Surface geladen, aber irgendwas ist da wohl noch falsch.
Außerdem werden mir BMPs die nicht in der größe 1280 * 960 sind vollkommen schief ausgegeben.
Bsp:
XXXXOOOO ==> OOOOXXXX XXXXOOOO ==> OOOXXXXO XXXXOOOO ==> OOXXXXOO XXXXOOOO ==> OXXXXOOO XXXXOOOO ==> XXXXOOOO
Wäre schön, wenn mir vielleicht jemand helfen könnte.
Hier der Code:
C++: |
HANDLE DirectDraw::BMPDateiOeffnen(const char* Datei_Name) { HANDLE hDatei; hDatei = CreateFile(Datei_Name, GENERIC_READ, FILE_SHARE_READ, (LPSECURITY_ATTRIBUTES) NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, (HANDLE) NULL); if(hDatei != INVALID_HANDLE_VALUE) return hDatei; return INVALID_HANDLE_VALUE; }
bool DirectDraw::BMPInSurface( const char* BMPDatei, LPDIRECTDRAWSURFACE7 lpDDSurf, bool Palette_laden) { LPBYTE lpbyBild; HANDLE hDatei; BITMAPFILEHEADER BMPFileHead; BITMAPINFOHEADER BMPFileInfo; RGBQUAD Palette[256]; DWORD dwLeseSpeicher; DDSURFACEDESC2 ddsd; LPSTR lpZielRAM; LPSTR lpQuellRAM; int DDS_Breite; int DDS_Hoehe; //Surface (in die das BMP soll) verriegeln ZeroMemory(&ddsd, sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); lpDDSurf->Lock(NULL, &ddsd, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT, NULL); DDS_Breite = ddsd.dwWidth; DDS_Hoehe = ddsd.dwHeight; // Speicher für die Bild-dateie bereitstellen if( !(lpbyBild = (LPBYTE)malloc(DDS_Breite*DDS_Hoehe))) { MessageBox(hwnd, "BMP ERROR: BMP_in_Surface 1", "XXX", MB_OK); return false; } // BMP-Datei öffnen hDatei = BMPDateiOeffnen(BMPDatei); if(hDatei == INVALID_HANDLE_VALUE) { MessageBox(hwnd, "BMP ERROR: BMP_in_Surface 2", "XXX", MB_OK); return false; } // BMP-Header einlesen if( !ReadFile(hDatei, &BMPFileHead, sizeof(BMPFileHead), &dwLeseSpeicher, NULL)) { MessageBox(hwnd, "BMP ERROR: BMP_in_Surface 3", "XXX", MB_OK); CloseHandle(hDatei); return false; } //BMP-Info-Header einlesen if( !ReadFile(hDatei, &BMPFileInfo, sizeof(BMPFileInfo), &dwLeseSpeicher, NULL)) { MessageBox(hwnd, "BMP ERROR: BMP_in_Surface 4", "XXX", MB_OK); CloseHandle(hDatei); return false; } // Hat die BMP das richtige Format if((BMPFileInfo.biWidth != DDS_Breite) || (BMPFileInfo.biHeight != DDS_Hoehe) || (BMPFileInfo.biBitCount != 8)) { MessageBox(hwnd, "BMP ERROR: BMP_in_Surface 5", "XXX", MB_OK); CloseHandle(hDatei); return false; } // Lies und speicher die Palette if( !ReadFile(hDatei, Palette, sizeof(Palette), &dwLeseSpeicher, NULL)) { MessageBox(hwnd, "BMP ERROR: BMP_in_Surface 6", "XXX", MB_OK); CloseHandle(hDatei); return false; } // Lies die eigentlichen Bilddaten des BMP if(!ReadFile(hDatei, lpbyBild, DDS_Breite*DDS_Hoehe, &dwLeseSpeicher, NULL)); { CloseHandle(hDatei); } // Schließe die Datei wieder CloseHandle(hDatei); // Setze die Startadressen der Pointer lpZielRAM = (LPSTR)ddsd.lpSurface; lpQuellRAM = (LPSTR)(&lpbyBild[(DDS_Hoehe - 1) * DDS_Breite]); // Kopiere die Bilddatei aus der Variablen 'lpbyBild' // zeilenweise in den Vram der Surface for(int j = 0; j < DDS_Hoehe; j++) { memcpy(lpZielRAM, lpQuellRAM, DDS_Breite); lpZielRAM += ddsd.lPitch; lpQuellRAM -= DDS_Breite; } // Entriegeln der Surface nach dem Schreiben der Daten lpDDSurf->Unlock(NULL); // Speicher freigeben if(lpbyBild); free(lpbyBild); // Wenn Palette übernommen werden soll, dann DDraw Palette aus der // BMP Palette erzeugen und für Primary Surface setzen if(Palette_laden) { PALETTEENTRY pe[256]; HRESULT ddrval; ZeroMemory(pe, MAX_FARBEN * sizeof(PALETTEENTRY)); for(int i = 0; i < MAX_FARBEN; i++) { pe[i].peRed = Palette[i].rgbRed; pe[i].peGreen = Palette[i].rgbGreen; pe[i].peBlue = Palette[i].rgbBlue; pe[i].peFlags = PC_NOCOLLAPSE; } ddrval = lpDD->CreatePalette(DDPCAPS_8BIT | DDPCAPS_ALLOW256, pe, &lpDDPal, NULL); if(ddrval != DD_OK) { MessageBox(hwnd, "Bitmap Fehler: CreatePalette", "XXX", MB_OK); return false; } ddrval = lpDDSPrimary->SetPalette(lpDDPal); if(ddrval != DD_OK) { MessageBox(hwnd, "Bitmap Fehler: SetPalette", "XXX", MB_OK); return false; } } return true; }
|
|