Opengl - změna velikosti pixmapy – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Opengl - změna velikosti pixmapy – C / C++ – Fórum – Programujte.comOpengl - změna velikosti pixmapy – C / C++ – Fórum – Programujte.com

 

Bufo
~ Anonymní uživatel
5 příspěvků
12. 1. 2010   #1
-
0
-



...
pixIFS=createPixmap(410, 504); // libovolna velikost
drawPixmap(pixIFS); // vykresleni pixmapy
destroyPixmap(pixIFS);
drawPixmap(pixIFS);

pixIFS=createPixmap(200, 15); // libovolna velikost
drawPixmap(pixIFS); // vykresleni pixmapy
destroyPixmap(pixIFS);
drawPixmap(pixIFS);

...



tak zobrazení funguje..

Nahlásit jako SPAM
IP: 147.251.216.–
Bufo
~ Anonymní uživatel
5 příspěvků
12. 1. 2010   #2
-
0
-

první příspěvek ignorujte ;).. takže

mám funkce:

Citovat:

//-----------------------------------------------------------------------------
// Funkce pro vytvoreni pixmapy o zadane velikosti
//-----------------------------------------------------------------------------
pixmap * OpenGL::createPixmap(const unsigned int width, const unsigned int height)
{
pixmap *p = new pixmap;
if (!p) return NULL;
p->width=width; // naplneni struktury
p->height=height;
p->pixels = new unsigned char [3*width*height];
if (!p->pixels) { // alokace pole pro pixely
delete p; // alokace se nepovedla
return NULL;
}
else {
memset(p->pixels, 0, 3*width*height); // smazani pixmapy
}

return p;
}



//-----------------------------------------------------------------------------
// Funkce pro zruseni pixmapy
//-----------------------------------------------------------------------------
void OpenGL::destroyPixmap(pixmap *p)
{
if (p->pixels) {
delete[] p->pixels; // uvolnit vlastni pixmapu
}
if (p) {
delete p; // i okolni strukturu
}
p = NULL;
}

//-----------------------------------------------------------------------------
// Funkce pro vykresleni pixmapy do barvoveho bufferu
//-----------------------------------------------------------------------------
void OpenGL::drawPixmap(const pixmap *p)
{
if (!p || !p->pixels) return;
glDrawPixels( // vykresleni pixmapy
p->width, p->height, // sirka a vyska pixmapy
GL_RGB, // format dat pixelu
GL_UNSIGNED_BYTE, // datovy typ kazde barevne slozky
p->pixels); // ukazatel na pamet s barvami pixelu
}



při překreslení zavolám:

Citovat:

...
pixIFS=createPixmap(width, height); // velikost okna
drawPixmap(pixIFS); // vykresleni pixmapy
destroyPixmap(pixIFS);
drawPixmap(pixIFS);

...



ale při změně velikosti okna zde aplikace spadne a nevím proč confused smiley.. tušíte někdo? přitom když zadám za sebou zobrazení dvou pixel map takto:

Citovat:

...
pixIFS=createPixmap(410, 504); // libovolna velikost
drawPixmap(pixIFS); // vykresleni pixmapy
destroyPixmap(pixIFS);
drawPixmap(pixIFS);

pixIFS=createPixmap(200, 15); // libovolna velikost
drawPixmap(pixIFS); // vykresleni pixmapy
destroyPixmap(pixIFS);
drawPixmap(pixIFS);

...



tak zobrazení funguje..

Nahlásit jako SPAM
IP: 147.251.216.–
Wizard0
Stálý člen
12. 1. 2010   #3
-
0
-

akosi nechapem tomuto:



pixIFS=createPixmap(width, height);
drawPixmap(pixIFS);
destroyPixmap(pixIFS); // < --- data su teraz dealokovane?
drawPixmap(pixIFS); // <--- tak potom wtf? :)


Ked predpokladam spravne a funkcia destroyPixmap uvolni pamet alokovanu funkciou createPixmap a funkcia drawPixmap k nej pristupuje, tak pritupovanie k pameti po jej uvolneni z velmy velkou pravdepodobnostou sposobi pad aplikacie.

Nahlásit jako SPAM
IP: 85.216.193.–
Wizard0
Stálý člen
12. 1. 2010   #4
-
0
-

Aha ty to chces zastavit tym tvojim "if(!p) return;". No to ti bohuzial nepomouze, kedze funkcia destryPixmap si spravi vlastnu kopiu pointera a tu nastavy na NULL => pointer pixIFS zostane nedktuty. Ked to chces takto tak musis zmenit funkciu takto:



void OpenGL::destroyPixmap(pixmap& *p) { ... }

Nahlásit jako SPAM
IP: 85.216.193.–
Bufo
~ Anonymní uživatel
5 příspěvků
12. 1. 2010   #5
-
0
-

To Wizard :
ne, to je muj překlep.. ta druhý volání funkce drawPixmap(pixIFS); je tam navíc..
zkoušel sem upravit destroy na:
void OpenGL::destroyPixmap(pixmap** p)
{
pixmap* map = *p;
if (map->pixels) {
//MessageBox(_T(""), _T(""), NULL);
delete[] map->pixels; // uvolnit vlastni pixmapu
}
if (map) {
delete map; // i okolni strukturu
}
*p = NULL;
}
ale nepomaha to.

Nahlásit jako SPAM
IP: 147.251.216.–
Bufo
~ Anonymní uživatel
5 příspěvků
12. 1. 2010   #6
-
0
-

hmmm.. udělal jsem si stejnou aplikaci ve win api a funguje to.. ale tohle dělám jako klientský okno v ATL a nejde to.. zkusim najít důvod

Nahlásit jako SPAM
IP: 147.251.216.–
Bufo
~ Anonymní uživatel
5 příspěvků
12. 1. 2010   #7
-
0
-

tak sem to našel.. špatně umístěnej příkaz glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

Nahlásit jako SPAM
IP: 147.251.216.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 6 hostů

Podobná vlákna

Změna velikosti pole — založil Martin

Změna velikosti obrázku — založil Arlene

Změna velikosti obrázků — založil Michal Š.

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý