Naruszenie pamieci przy kompresowaniu bitmapy z FreeImage

Naruszenie pamieci przy kompresowaniu bitmapy z FreeImage
bajos
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: UwUdź
  • Postów: 267
0

Dzień dobry,

Piszę program toola do GE, który wczytuje obraz, generuje mipmapy i kompresuje do DXT1/3/5 biblioteką libsquish, a później wrzuca do mojego formatu. Program wywala się już przy kompresji bazowego obrazu.

Kopiuj
 	// Ładuje obrazek
	FIBITMAP* image = FreeImage_Load(FIF_PNG, input.c_str());

	// Konwertuje obrazek na 32 bity jesli nie jest
	/*if(FreeImage_GetBPP(image) != 32)
		FreeImage_ConvertTo32Bits(image);*/
	// Poprawka
	if(FreeImage_GetBPP(image) != 32)
	{
		FIBITMAP* newImage = FreeImage_ConvertTo32Bits(image);
		FreeImage_Unload(image);
		image= newImage;
	}

	// Tworzy wymiary bazowego obrazu
	GLuint imageW, imageH, imageBpp;
	imageW = FreeImage_GetWidth(image);
	imageH = FreeImage_GetHeight(image);
	imageBpp = FreeImage_GetBPP(image);

	std::cout << "Stworzono wymiary" << std::endl; std::cout.flush();

	// Kompresuje bazowy obraz
	GLubyte basicCompressedSize = squish::GetStorageRequirements(imageW, imageH, squishFlags);
	GLubyte* basicCompressedImage = new GLubyte[basicCompressedSize];
	squish::CompressImage(FreeImage_GetBits(image), imageW, imageH, basicCompressedImage, squishFlags);

	std::cout << "Skompresowano baze" << std::endl; std::cout.flush();

W ostatniej linijce program już nie żyje i wyrzuca Naruszenie ochrony pamięci. Dziwne bo ..._GetBits() zwraca wskaźnik do NIE const i miejsce docelowe też nie jest const. ImageW i imageH wynoszą 512, a imageBpp to 32. Przed kompresją w obrazie nie jest RGBA tylko BGRA, ale to nie robi żadnej różnicy to i tak jest kolor tylko jakby inny.

PS. Znacie może jakąś lepszą libke do kompresji S3TC bo ta jest nieudokumentowana? Pisze w niej na ślepo.

MarekR22
  • Rejestracja: dni
  • Ostatnio: dni
0

Jak to nie jest?
Bierzesz źródła i patrzysz w doxygenową dokumentację
https://code.google.com/p/libsquish/source/browse/trunk/squish.h#192
Na dodatek, masz źródła. Dołącz je do swojego projektu i jak będziesz miał crash zobacz co jest nie tak, będzie jasne co robisz źle, albo wykryjesz bug-a i sam go naprawisz.

MarekR22
  • Rejestracja: dni
  • Ostatnio: dni
0

Troszkę inwencji. Pogooglałem co to jest to FreeImage_GetBits i wyszło coś takiego: http://stackoverflow.com/q/17877260/1387438
Więc wygląda na to, że winna jest inna biblioteka (sam doczytaj szczegóły).

bajos
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: UwUdź
  • Postów: 267
0

Teraz znalazłem, że był zły typ danych w basicCompressedSize zamiast GLubyte dałem GLuint.

PS. Najlepsze, że nie było żadnego warninga o utracie danych z int na GLubyte.

MarekR22
  • Rejestracja: dni
  • Ostatnio: dni
0
bajos napisał(a):

PS. Najlepsze, że nie było żadnego warninga o utracie danych z int na GLubyte.

Bo typ dla tego argumentu funkcji CompressImage to void* blocks, wiec nie ma prawie żadnej kontroli typów (sprawdzane jest tylko czy to jest wskaźnik).

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.