From eb7a30473a78452a890bd453f80d4a90aee5d364 Mon Sep 17 00:00:00 2001 From: Sam Moore Date: Thu, 17 Apr 2014 02:00:36 +0800 Subject: [PATCH] Can render a BMP but things are still going wrong If Screen::RenderBMP is called before Screen::ScreenShot, the resulting BMP is blank. NOTE: Testing colours: If -c 1 0 0 1 is passed, rectangle is rendered RED. However, if Screen::ScreenShot is called, the rectangle is BLUE. Something stupid going on with colours? Tried messing with alpha channel, but things seem to always render regardless of their alpha value. Should give up and do something actually important. --- src/main.cpp | 15 ++++++++++----- src/main.h | 9 ++++----- src/screen.cpp | 38 ++++++++++++++++++++++++++------------ src/view.cpp | 2 +- 4 files changed, 41 insertions(+), 23 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 598de72..12d8d56 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -9,7 +9,8 @@ int main(int argc, char ** argv) Rect bounds(0,0,1,1); Colour c(0,0,0,1); - const char * output_to_bmp = NULL; + const char * input_bmp = NULL; + const char * output_bmp = NULL; const char * input_filename = NULL; int i = 0; @@ -25,8 +26,12 @@ int main(int argc, char ** argv) case 'o': mode = OUTPUT_TO_BMP; if (++i >= argc) - Fatal("No argument following -o switch"); - output_to_bmp = argv[i]; + Fatal("No input argument following -o switch"); + input_bmp = argv[i]; + if (++i >= argc) + Fatal("No output argument following -o switch"); + output_bmp = argv[i]; + break; case 'c': { @@ -51,7 +56,7 @@ int main(int argc, char ** argv) { doc.Load(input_filename); } - else + else { doc.Add(RECT_FILLED, Rect(0.2,0.2,0.6,0.6)); } @@ -59,6 +64,6 @@ int main(int argc, char ** argv) if (mode == LOOP) MainLoop(doc, bounds, c); else if (mode == OUTPUT_TO_BMP) - OverlayBMP(doc, output_to_bmp, bounds, c); + OverlayBMP(doc, input_bmp, output_bmp, bounds, c); return 0; } diff --git a/src/main.h b/src/main.h index afcffe8..6763042 100644 --- a/src/main.h +++ b/src/main.h @@ -9,16 +9,15 @@ using namespace std; using namespace IPDF; -inline void OverlayBMP(Document & doc, const char * filename, const Rect & bounds = Rect(0,0,1,1), const Colour & c = Colour(0.f,0.f,0.f,1.f)) +inline void OverlayBMP(Document & doc, const char * input, const char * output, const Rect & bounds = Rect(0,0,1,1), const Colour & c = Colour(0.f,0.f,0.f,1.f)) { View view(doc, bounds, c); Screen scr; //view.Render(); - scr.RenderBMP(filename); + scr.RenderBMP(input); scr.Present(); - //MainLoop(doc, bounds, c); - sleep(3); - scr.ScreenShot(filename); + sleep(5); + scr.ScreenShot(output); } inline void MainLoop(Document & doc, const Rect & bounds = Rect(0,0,1,1), const Colour & c = Colour(0.f,0.f,0.f,1.f)) diff --git a/src/screen.cpp b/src/screen.cpp index 624e55d..712bd26 100644 --- a/src/screen.cpp +++ b/src/screen.cpp @@ -18,6 +18,10 @@ Screen::Screen() } m_gl_context = SDL_GL_CreateContext(m_window); + + glClearColor(1.f,1.f,1.f,1.f); + glClear(GL_COLOR_BUFFER_BIT); + Present(); ResizeViewport(800, 600); @@ -135,6 +139,9 @@ void Screen::ScreenShot(const char * filename) const if (surf == NULL) Fatal("Failed to create SDL_Surface from pixel data - %s", SDL_GetError()); + GLenum texture_format = (surf->format->Rmask == 0x000000FF) ? GL_RGBA : GL_BGRA; + Debug("SDL_Surface %d BytesPerPixel, format %d (RGB = %d, BGR = %d, RGBA = %d, BGRA = %d)", surf->format->BytesPerPixel, texture_format, GL_RGB, GL_BGR, GL_RGBA, GL_BGRA); + if (SDL_SaveBMP(surf, filename) != 0) Fatal("SDL_SaveBMP failed - %s", SDL_GetError()); @@ -169,28 +176,35 @@ void Screen::RenderBMP(const char * filename) const Fatal("Could not understand SDL_Surface format (%d colours)", bmp->format->BytesPerPixel); break; } - Debug("SDL_Surface %d BytesPerPixel, format %d (RGB = %d, BGR = %d, RGBA = %d, BGRA = %d)", bmp->format->BytesPerPixel, texture_format, GL_RGB, GL_BGR, GL_RGBA, GL_BGRA); + //Debug("SDL_Surface %d BytesPerPixel, format %d (RGB = %d, BGR = %d, RGBA = %d, BGRA = %d)", bmp->format->BytesPerPixel, texture_format, GL_RGB, GL_BGR, GL_RGBA, GL_BGRA); - GLuint texID; + GLuint texID; + glEnable(GL_TEXTURE_2D); glGenTextures(1, &texID); glBindTexture(GL_TEXTURE_2D, texID); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + glTexImage2D(GL_TEXTURE_2D, 0, bmp->format->BytesPerPixel, w, h, 0, texture_format, GL_UNSIGNED_BYTE, bmp->pixels); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glEnable(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, texID); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(0.0, 1.0, 1.0, 0.0, -1.f, 1.f); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); glBegin(GL_QUADS); - glTexCoord2i(0,0); glVertex2f(-0.5f*w, -0.5f*h); - glTexCoord2i(1,0); glVertex2f(0.5f*w, -0.5f*h); - glTexCoord2i(1,1); glVertex2f(0.5f*w, 0.5f*h); - glTexCoord2i(0,1); glVertex2f(-0.5*w,0.5*h); + glTexCoord2i(0,0); glVertex2f(0,0); + glTexCoord2i(1,0); glVertex2f(1,0); + glTexCoord2i(1,1); glVertex2f(1,1); + glTexCoord2i(0,1); glVertex2f(0,1); glEnd(); glDisable(GL_TEXTURE_2D); - - //SDL_FreeSurface(bmp); + SDL_FreeSurface(bmp); } diff --git a/src/view.cpp b/src/view.cpp index cd4cc35..b8b8ab6 100644 --- a/src/view.cpp +++ b/src/view.cpp @@ -72,7 +72,7 @@ void View::Render() glClearColor(1.f,1.f,1.f,1.f); glClear(GL_COLOR_BUFFER_BIT); - DrawGrid(); // Draw the gridlines + //DrawGrid(); // Draw the gridlines glMatrixMode(GL_PROJECTION); glLoadIdentity(); -- 2.20.1