[ Pobierz całość w formacie PDF ]
.lStructSize » sizeof (pd); pd.hwndOwner =owner; pd.Flags = PD_RETURNDC; pd.hlnstance = NULL; if ( IPrintDlg(spd) )return (0); /* U¿ytkownik wybra³ Anuluj.*//** OK, u¿ytkownik chce drukowaæ, ustawmy wiêc kursor zajêtoœci* i zacznijmy drukowanie*/busy = LoadCursor (NULL, IDC_WAIT) ; oldcursor = SetCursor (busy) ;SetMapModel pd.hDC, MM_TEXT) ; di.cbSize = sizeof (DOCINFO) ; di.IpszDocName ="OpenGL Image"; di.lpSzOutput = NULL;StartDoc (pd.hDC, sdi) ; StartPage (pd.hDC) ;/** Wyczyszczenie t³a bia³ym kolorem*/rect.top = 0;rect.left - 0;rect.right = GetDeviceCaps (pd.hDC, HORZRES);rect.bottom = GetDeviceCaps (pd.hDC, YERTRES);brush = CreateSolidBrush(OxOOffffff ) ;FillRect (pd.hDC, Srect, brush);/** Rozcia.gniecie bitmapy do rozmiarów kartki*/hdc = CreateCompatibleDC (pd.hDC) ;bitmap = CreateDIBitmap (hdc, S (info->bmiHeader) , CBM_INIT, bits,Oinfo,DIB_RGB_COLORS) ; SelectObject (hdc, bitmap);xsize = rect.right;ysize = xsize * inf o->bmiHeader.biHeight / info->bmiHeader.biwidth;if (ysize > rect.bottom){ysize = rect.bottom;xsize = ysize * info->bmiHeader.biwidth / info->bmiHeader.biHeight;xoffset = (rect.right - xsize) / 2;375Rozdzia³ 11.» Grafika rastrowayoffset = (rect.bottom - ysize) / 2;StretchBlt(pd.hDC, xoffset, yoffset, xsize, ysize, hdc, O, O,info->bmiHeader.biWidth, info •*->bmiHeader.biHeight, SRCCOPY);/** To wszystko.Koniec drukowanie i zwolnienie zaalokowanych zasobów.*/EndPage(pd.hDC); EndDoc(pd.hDC); DeleteDC(pd.hDC);DeleteObject(bitmap); DeleteObject(brush); DeleteObject(busy); DeleteDC(hdc);/** Odtworzenie kursora i powrót*/SetCursor(oldcursor); return (1);Wyœwietlanie bitmapyCzêœæ OpenGL naszego przyk³adowego programu rozpoczyna siê od wyœwietleniapliku.BMP.Podobnie jak wiêkszoœæ programów OpenGL, tak¿e ten zaczyna siê odustalenia bie¿¹cego widoku i przekszta³ceñ widoku.glViewport (O, O, rect->right, rect->bottom) ;glMatrixMode (GL_PROJECTION) ;glLoadldentity () ;glOrtho(0.0, rect->right - 1.0, 0.0, rect->bottom - 1.0, -1.0, 1.0);glMatrixMode (GL_MODELVIEW) ;Zaraz po tym rysujemy bitmapê.Skalujemy j¹ w celu dopasowania do okna, zzachowaniem stosunku boków 1:1.Poni¿szy kod powinien wygl¹daæ bardzo znajomo— u¿ywa³eœ go w opisanej powy¿ej funkcji PrintDIBitmap:xsize /xsize = rect->right;ysize = BitmapInfo->bmiHeader.biHeight Bitmaplnf o->bmiHeader.biWidth; if(ysize > rect->bottom)ysize = rect->bottom;}; xscalexsize = BitmapInfo->bmiHeader.biWidth * ysize / Bitmaplnf o->bmiHeader.biHeight;(float)xsize / (float)Bitmaplnfo->bmiHeader.biWidth;376____________________________________Czêœæ II » U¿ywanie OpenGL Ryscale = (float)ysize / (float)BitmapInfo->bmiHeader.biHeight;xoffset = (rect->right - xsize) * 0.5; yoffset = (rect->bottom - ysize) * 0.5;glPixelStorei(GL_UNPACK_ALIGNMENT, 4);glPixe!Zoom(xscale, yscale);glRasterPos2i(xoffset, yoffset);glDrawPixels(BitmapInfo->bmiHeader.biWidth, Bitmaplnfo->bmiHeader.biHeight,GL_RGB, GL_UNSIGNED_BYTE, BitmapBits);Co ciekawe, funkcja Windows StretchBlt wyœwietla bitmapy szybciej ni¿ funkcjaglDrawPi-xels.Oczywiœcie, StretchBlt nie uwzglêdnia dzia³ania funkcjiglPixelMap i glPixelTransfer.Pebiy kod funkcji RepaintWindow przedstawia listing 11.12.Listing 11.12.Funkcja RepaintWindow_____________________________________voidRepaintWindow(RECT *rect) /* We - Obszar roboczy okna */{GLint xoffset, /* Przesuniêcie obrazu w poziomie */yoffset; /* Przesuniêcie obrazu w pionie */ GLint xsize, /* Szerokoœæprzeskalowanego obrazu */ysize; /* Wysokoœæ przeskalowanego obrazu */ GLfloat xscale, /* Skalowanie wpoziomie */ yscale; /* Skalowanie w pionie *//** Wyzerowanie widoku i wyczyszczenie okna bia³ym t³em*/glViewport(O, O, rect->right, rect->bottom);glMatrixMode(GL_PROJECTION);glLoadldentity();glOrtho(0.0, rect->right - 1.0, 0.0, rect->bottom - 1.0, -1.0, 1.0);glMatrixMode(GL_MODELVIEW);glClearColord.O, 1.0, 1.0, 1.0); glClear(GL_COLOR_BUFFER_BIT);/** Jeœli za³adowaliœmy obraz bitmapy, przeskalowanie go do rozmiarów* okna*/if (BitmapBits != NOLL) {xsize = rect->right; ysize = BitmapInfo->bmiHeader.biHeight * xsize /Bitmaplnfo->bmiHeader.biWidth; if (ysize > rect->bottom) {ysize = rect->bottom;xsize = Bitmaplnfo->bmiHeader.biWidth * ysize /Rozdzia³ 11.» Grafika rastrowa_________________________________377BitmapInfo->bmiHeader.biHeight; };xscale = (float)xsize / (float)BitmapInfo->bmiHeader.biwidth; yscale -(float)ysize / (float)BitmapInfo->bmiHeader.biHeight;xoffset = (rect->right - xsize) * 0.5; yoffset = (rect->bottom - ysize) * 0.5;glPixelStorei(GL_UNPACK_ALIGNMENT, 4); glPixelZoom(xscale, yscale);glRasterPos2i(xoffset, yoffset); glDrawPixels(BitmapInfo->bmiHeader.biwidth,Bitmaplnfo->bmiHeader.biHeight, GL_RGB, GL_UNSIGNED_BYTE, BitmapBits); };glFinishO ;PodsumowanieW tym rozdziale pozna³eœ wiêkszoœæ zagadnieñ dotycz¹cych funkcji OpenGLoperuj¹cych na bitmapach.Poza prostymi zastosowaniami zwi¹zanymi zwyœwietlaniem bitma-powych znaków, bitmapy mog¹ byæ wykorzystywane jakope³nokolorowe obrazy do tworzenia t³a okna lub tekstur (które zostan¹ omówionew nastêpnym rozdziale).Funkcje OpenGL, takie jak glPixelMap, glPixelTransferczy glPixelZoom pozwalaj¹ tak¿e na uzyskanie wielu specjalnych efektów.PodrêcznikglCopyPixelsPrzeznaczenie Kopiuje prostok¹tny blok pikseli w buforze ramki.Plik nag³Ã³wkowySk³adnia void glCopyPixels(GLint x, GLint y, GLsizei width, GLsizei height,GLenum type);Opis Ta funkcja kopiuje dane pikseli ze wskazanego obszaru w buforze ramkido obszaru wskazywanego przez bie¿¹c¹ pozycjê rastra.Jeœli bie¿¹capozycja rastra nie jest poprawna, ¿adne dane nie s¹ kopiowane.Na dzia³anie funkcji glCopyPixels wp³ywaj¹ wywo³ania funkcji glPixelMap,glPixelTransfer oraz glPixelZoom.378Czêœæ II * U¿ywanie OpenGLParametry xwidthheighttypeZwracana wartoœæ Przyk³ad Patrz tak¿eGLint: Wspó³rzêdna pozioma lewego dolnego rogu kopiowanego obszaru.GLint: Wspó³rzêdna pionowa lewego dolnego rogu kopiowanego obszaru.GLsizei: Szerokoœæ kopiowanego obszaru w pikselach.GLsizei: Wysokoœækopiowanego obszaru w pikselach.GLenum: Typ danych, które maj¹ zostaæ skopiowane.Dostêpne s¹ poni¿szewartoœci:GL_COLOR Wartoœci bufora kolorów GL_STENCIL Wartoœci bufora szablonu GL_DEPTHWartoœci bufora g³êbokoœciBrak.Przejrzyj kod programu OGLYIEW.CglPixelMap, glPixelStore, glPixelTransfer, glPixelZoomglDrawPixelsPrzeznaczenie Plik nag³Ã³wkowy Sk³adniaOpisRysuje prostok¹tny blok pikseli w buforze ramki.void glDrawPixels(GLsizei width, GLsizei height, GLenum formay, GLenum type,const GLvoid *pixels);Ta funkcja kopiuje dane pikseli z pamiêci do obszaru wskazywanego przez bie¿¹c¹pozycjê rastra w buforze ramki.Do ustawiania pozycji rastra s³u¿y funkcjaglRasterPos
[ Pobierz całość w formacie PDF ]
Darmowy hosting zapewnia PRV.PL