#include "Pliki.h" #include bool CzyPlikIstnieje(const char* filename) { FILE* plik_test; if (fopen_s(&plik_test, filename, "r") != 0) return false; else fclose(plik_test); return true; } #include unsigned long* WczytajObrazZPlikuBitmap(HWND uchwytOkna, char* nazwaPliku, int& szerokośćObrazu, int& wysokośćObrazu, bool czytajZZasobów, unsigned char alfa) { //niezbyt elegancko jest tworzyc new w funkcji (zapomina sie o delete) //ale dzieki temu nie trzeba rozbijac na dwie czesci (pobieranie obrazu i czytanie) //nie trzeba zwracac informacji o obrazie, bo zawsze zwracamy tablice RGBA try { //czytanie bitmapy z pliku lub z zasobow char komunikat[1024] = "Brak pliku obrazu "; strcat_s(komunikat, nazwaPliku); if (!czytajZZasobów && !CzyPlikIstnieje(nazwaPliku)) throw std::invalid_argument(komunikat); HBITMAP uchwytObrazu = (HBITMAP)LoadImage(GetModuleHandle(NULL), nazwaPliku, IMAGE_BITMAP, 0, 0, (czytajZZasobów ? 0 : LR_LOADFROMFILE) | LR_CREATEDIBSECTION); //informacje o bitmapie BITMAP obraz; GetObject(uchwytObrazu, sizeof(BITMAP), &obraz); szerokośćObrazu = obraz.bmWidth; wysokośćObrazu = obraz.bmHeight; //informacja o ilosci bitow na piksel //char bufor[256]; //ShowMessage(_gcvt(obraz.bmBitsPixel,10,bufor)); unsigned long* piksele = new unsigned long[szerokośćObrazu*wysokośćObrazu]; switch (obraz.bmBitsPixel) { case 24: { unsigned char* piksele24bppBRG = new unsigned char[obraz.bmWidthBytes*wysokośćObrazu]; memcpy(piksele24bppBRG, obraz.bmBits, szerokośćObrazu*wysokośćObrazu * 3); //gdybym zwrocil tekstura24bppBRG zrzutowane na unsigned long*, to powinienem uzywac do wyswietlania GL_BGR_EXT //konwersja na RGBA for (int ih = 0; ih> 4) : (piksele4bppPalette[i] & 0x0F); unsigned char R = tabelaKolorow[numerKoloruZPalety].rgbRed; unsigned char G = tabelaKolorow[numerKoloruZPalety].rgbGreen; unsigned char B = tabelaKolorow[numerKoloruZPalety].rgbBlue; piksele[iw + (ih*szerokośćObrazu)] = (A << 24) + (B << 16) + (G << 8) + (R); } delete[] piksele4bppPalette; } break; default: throw std::exception("Nieobsługiwany format bitmapy"); break; } DeleteObject(uchwytObrazu); return piksele; } catch (const std::exception& exc) { char komunikat[256] = "Błąd podczas pobierania tekstury:\n"; strcat_s(komunikat, exc.what()); MessageBox(NULL, komunikat, "Błąd teksturowania", NULL); return NULL; } }